diff --git a/AUTHORS b/AUTHORS
index 6a6a542..a619990 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -791,6 +791,7 @@
 Paweł Hajdan jr <phajdan.jr@gmail.com>
 Piotr Zarycki <piotr.zarycki@gmail.com>
 Payal Pandey <payal.pandey@samsung.com>
+Pedro Tôrres <t0rr3s.p3dr0@gmail.com>
 Peng Hu <penghu@tencent.com>
 Peng Jiang <leiyi.jp@gmail.com>
 Peng Xinchao <pxinchao@gmail.com>
diff --git a/DEPS b/DEPS
index dfa5c606..8321df55 100644
--- a/DEPS
+++ b/DEPS
@@ -200,11 +200,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': '5b589fd273516c38c7d00c81bdbaedcc7ab4db3f',
+  'skia_revision': '416fe32ce119762b58289e38d5d5149bd1ce724a',
   # 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': '779fa622348c3fab46d3337764c3eaf19e684a42',
+  'v8_revision': 'f1e2bbd80f2e2eacf7e043e18ee55f0b8cf22171',
   # 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.
@@ -212,7 +212,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': '619ae0038825cfc8c53ba50e292d2930af7f8cd8',
+  'angle_revision': '3f564fc76ea8a556d628517b055af85c27a60bc3',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -267,7 +267,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '146912bb62b7ca0f77478424a23c611a613480f2',
+  'catapult_revision': '5537c0394234a7fdd580c4c5b5a943d7c934e400',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -919,7 +919,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'f819411f2a3c1eef1e8c5f67fee84314adae4f2f',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '1af7968d686d4492359a695eb57636f9d355f488',
 
   'src/third_party/devtools-frontend/src':
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
@@ -1274,7 +1274,7 @@
     Var('chromium_git') + '/external/github.com/cisco/openh264' + '@' + '3dd5b80bc4f172dd82925bb259cb7c82348409c5',
 
   'src/third_party/openscreen/src':
-    Var('chromium_git') + '/openscreen' + '@' + '4d25bf856b135ed547abd259e7d7d9243d68bf74',
+    Var('chromium_git') + '/openscreen' + '@' + '4654f2b60f7a3fdb1a84d39d6504ba57be77f863',
 
   'src/third_party/openxr/src': {
     'url': Var('chromium_git') + '/external/github.com/KhronosGroup/OpenXR-SDK' + '@' + '97cfe495bb7a3853266b646d1c79e169387f9c7a',
@@ -1291,7 +1291,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'f37338cdaa2126eef2a11e1a6f0cb075888c20e6',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '42433abb9596f1f471251070f7fd7d135c3e9df0',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1369,7 +1369,7 @@
       'packages': [
           {
               'package': 'fuchsia/third_party/aemu/linux-amd64',
-              'version': 'cTNPR-L-CEUev7JulIzcVaJAnqnMLJNgtZ6WiwQlFi0C'
+              'version': 'uQdbvtcP840HCVMjrZtUTrYeUgSD_J2rxG1WcyDUbvMC'
           },
       ],
       'condition': 'host_os == "linux" and checkout_fuchsia',
@@ -1623,7 +1623,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@236d4f36e63d65e1dec7c54eb86b4ecefbf420e8',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@d96af00c928618697579b3829f6806ebc8ad0882',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java
index 9fdb641..233b43a 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwContents.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java
@@ -496,7 +496,9 @@
 
     private ContentCaptureConsumer mContentCaptureConsumer;
 
+    private AwDisplayCutoutController mDisplayCutoutController;
     private final AwDisplayModeController mDisplayModeController;
+    private final Rect mCachedSafeAreaRect = new Rect();
 
     private static class WebContentsInternalsHolder implements WebContents.InternalsHolder {
         private final WeakReference<AwContents> mAwContentsRef;
@@ -960,6 +962,25 @@
                             return windowAndroid.getDisplay().getDisplayHeight();
                         }
                     }, containerView);
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P
+                    && AwFeatureList.isEnabled(AwFeatures.WEBVIEW_DISPLAY_CUTOUT)) {
+                mDisplayCutoutController =
+                        new AwDisplayCutoutController(new AwDisplayCutoutController.Delegate() {
+                            @Override
+                            public float getDipScale() {
+                                WindowAndroid windowAndroid = mWindowAndroid.getWindowAndroid();
+                                return windowAndroid.getDisplay().getDipScale();
+                            }
+
+                            @Override
+                            public void setDisplayCutoutSafeArea(
+                                    AwDisplayCutoutController.Insets insets) {
+                                if (mWebContents == null) return;
+                                mWebContents.setDisplayCutoutSafeArea(
+                                        insets.toRect(mCachedSafeAreaRect));
+                            }
+                        }, containerView);
+            }
             mRendererPriority = RendererPriority.HIGH;
             mSettings = settings;
             updateDefaultLocale();
@@ -1205,6 +1226,9 @@
         mContainerView.requestLayout();
         if (mAutofillProvider != null) mAutofillProvider.onContainerViewChanged(mContainerView);
         mDisplayModeController.setCurrentContainerView(mContainerView);
+        if (mDisplayCutoutController != null) {
+            mDisplayCutoutController.setCurrentContainerView(mContainerView);
+        }
     }
 
     // This class destroys the WindowAndroid when after it is gc-ed.
@@ -3004,6 +3028,8 @@
             AwOnPreDrawListener listener = getOrCreateOnPreDrawListener(mContainerView);
             listener.trackContents(this);
         }
+
+        if (mDisplayCutoutController != null) mDisplayCutoutController.onAttachedToWindow();
     }
 
     private AwOnPreDrawListener getOrCreateOnPreDrawListener(ViewGroup viewGroup) {
@@ -3085,6 +3111,7 @@
      */
     public void onSizeChanged(int w, int h, int ow, int oh) {
         mAwViewMethods.onSizeChanged(w, h, ow, oh);
+        if (mDisplayCutoutController != null) mDisplayCutoutController.onSizeChanged();
     }
 
     /**
@@ -3378,6 +3405,11 @@
         return AwContentsJni.get().getRenderProcess(mNativeAwContents, AwContents.this);
     }
 
+    @VisibleForTesting
+    public AwDisplayCutoutController getDisplayCutoutController() {
+        return mDisplayCutoutController;
+    }
+
     public int getDisplayMode() {
         return mDisplayModeController.getDisplayMode();
     }
diff --git a/android_webview/java/src/org/chromium/android_webview/AwDisplayCutoutController.java b/android_webview/java/src/org/chromium/android_webview/AwDisplayCutoutController.java
index a48b6b9b..449a9def 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwDisplayCutoutController.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwDisplayCutoutController.java
@@ -4,9 +4,7 @@
 
 package org.chromium.android_webview;
 
-import android.annotation.SuppressLint;
 import android.annotation.TargetApi;
-import android.graphics.Matrix;
 import android.graphics.Rect;
 import android.os.Build;
 import android.view.DisplayCutout;
@@ -36,10 +34,6 @@
     public interface Delegate {
         /** @return The DIP scale. */
         float getDipScale();
-        /** @return The display width. */
-        int getDisplayWidth();
-        /** @return The display height. */
-        int getDisplayHeight();
         /**
          * Set display cutout safe area such that webpage can read safe-area-insets CSS properties.
          * Note that this can be called with the same parameter repeatedly, and the embedder needs
@@ -109,14 +103,6 @@
     private Delegate mDelegate;
     private View mContainerView;
 
-    // Reuse these structures to minimize memory impact.
-    private static int[] sCachedLocationOnScreen = {0, 0};
-    private Insets mCachedViewInsets = new Insets();
-    private Rect mCachedViewRect = new Rect();
-    private Rect mCachedWindowRect = new Rect();
-    private Rect mCachedDisplayRect = new Rect();
-    private Matrix mCachedMatrix = new Matrix();
-
     /**
      * Constructor for AwDisplayCutoutController.
      *
@@ -204,78 +190,18 @@
      */
     @VisibleForTesting
     public void onApplyWindowInsetsInternal(final Insets displayCutoutInsets) {
-        // Copy such that we can log the original value.
-        mCachedViewInsets.set(displayCutoutInsets);
-
-        getViewRectOnScreen(mContainerView, mCachedViewRect);
-        getViewRectOnScreen(mContainerView.getRootView(), mCachedWindowRect);
-
-        // Get display coordinates.
-        int displayWidth = mDelegate.getDisplayWidth();
-        int displayHeight = mDelegate.getDisplayHeight();
-        mCachedDisplayRect.set(0, 0, displayWidth, displayHeight);
-
         float dipScale = mDelegate.getDipScale();
-
-        if (!mCachedViewRect.equals(mCachedDisplayRect)) {
-            // We apply window insets only when webview is occupying the entire window and display.
-            // Checking the window rect is more complicated and therefore not doing it for now, but
-            // there can still be cases where the window is a bit off.
-            if (DEBUG) {
-                Log.i(TAG, "WebView is not occupying the entire screen, so no insets applied.");
-            }
-            mCachedViewInsets.set(0, 0, 0, 0);
-        } else if (!mCachedViewRect.equals(mCachedWindowRect)) {
-            if (DEBUG) {
-                Log.i(TAG, "WebView is not occupying the entire window, so no insets applied.");
-            }
-            mCachedViewInsets.set(0, 0, 0, 0);
-        } else if (hasTransform()) {
-            if (DEBUG) {
-                Log.i(TAG, "WebView is rotated or scaled, so no insets applied.");
-            }
-            mCachedViewInsets.set(0, 0, 0, 0);
-        } else {
-            // We only apply this logic when webview is occupying the entire screen.
-            adjustInsetsForScale(mCachedViewInsets, dipScale);
-        }
+        // We only apply this logic when webview is occupying the entire screen.
+        adjustInsetsForScale(displayCutoutInsets, dipScale);
 
         if (DEBUG) {
             Log.i(TAG,
-                    "onApplyWindowInsetsInternal. displayCutoutInsets: " + displayCutoutInsets
-                            + ", view rect: " + mCachedViewRect + ", display rect: "
-                            + mCachedDisplayRect + ", window rect: " + mCachedWindowRect
-                            + ", dip scale: " + dipScale + ", viewInsets: " + mCachedViewInsets);
+                    "onApplyWindowInsetsInternal. insets: " + displayCutoutInsets
+                            + ", dip scale: " + dipScale);
         }
-        mDelegate.setDisplayCutoutSafeArea(mCachedViewInsets);
-    }
-
-    private static void getViewRectOnScreen(View view, Rect rect) {
-        if (view == null) {
-            rect.set(0, 0, 0, 0);
-            return;
-        }
-        view.getLocationOnScreen(sCachedLocationOnScreen);
-        int width = view.getMeasuredWidth();
-        int height = view.getMeasuredHeight();
-
-        rect.set(sCachedLocationOnScreen[0], sCachedLocationOnScreen[1],
-                sCachedLocationOnScreen[0] + width, sCachedLocationOnScreen[1] + height);
-    }
-
-    @SuppressLint("NewApi") // need this exception since we will try using Q API in P
-    private boolean hasTransform() {
-        mCachedMatrix.reset(); // set to identity
-        // Check if a view coordinates transforms to screen coordinates that is not an identity
-        // matrix, which means that view is rotated or scaled in regards to the screen.
-        // This API got hidden from L, and readded in API 29 (Q). It seems that we can call this
-        // on P most of the time, but adding try-catch just in case.
-        try {
-            mContainerView.transformMatrixToGlobal(mCachedMatrix);
-        } catch (Throwable e) {
-            return true;
-        }
-        return !mCachedMatrix.isIdentity();
+        // Note that internally we apply this logic only when the display is in fullscreen mode.
+        // See AwDisplayModeController for more details on how we check the fullscreen mode.
+        mDelegate.setDisplayCutoutSafeArea(displayCutoutInsets);
     }
 
     private void onUpdateWindowInsets() {
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwActivityTestRule.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwActivityTestRule.java
index 315d15c..6e570c7 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwActivityTestRule.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwActivityTestRule.java
@@ -7,6 +7,7 @@
 import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout;
 
 import android.content.Context;
+import android.content.Intent;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.rule.ActivityTestRule;
 import android.util.AndroidRuntimeException;
@@ -120,9 +121,22 @@
         TestThreadUtils.runOnUiThreadBlocking(() -> { mAwContentsDestroyedInTearDown.clear(); });
     }
 
+    public boolean needsHideActionBar() {
+        return false;
+    }
+
+    private Intent getLaunchIntent() {
+        if (needsHideActionBar()) {
+            Intent intent = getActivityIntent();
+            intent.putExtra(AwTestRunnerActivity.FLAG_HIDE_ACTION_BAR, true);
+            return intent;
+        }
+        return null;
+    }
+
     public AwTestRunnerActivity launchActivity() {
         if (getActivity() == null) {
-            return launchActivity(null);
+            return launchActivity(getLaunchIntent());
         }
         return getActivity();
     }
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwDisplayCutoutTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwDisplayCutoutTest.java
new file mode 100644
index 0000000..a6153f9
--- /dev/null
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwDisplayCutoutTest.java
@@ -0,0 +1,146 @@
+// Copyright 2020 The Chromium 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.test;
+
+import android.app.Activity;
+import android.os.Build;
+import android.view.View;
+import android.view.WindowManager;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.android_webview.AwContents;
+import org.chromium.android_webview.AwDisplayCutoutController.Insets;
+import org.chromium.android_webview.common.AwFeatures;
+import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.MinAndroidSdkLevel;
+import org.chromium.content_public.browser.test.util.TestThreadUtils;
+import org.chromium.net.test.util.TestWebServer;
+
+/**
+ * Tests for DisplayCutout.
+ */
+@RunWith(AwJUnit4ClassRunner.class)
+@MinAndroidSdkLevel(Build.VERSION_CODES.P)
+@CommandLineFlags.Add({"enable-features=" + AwFeatures.WEBVIEW_DISPLAY_CUTOUT})
+public class AwDisplayCutoutTest {
+    private static final String TEST_HTML = "<html><head><style>\n"
+            + "body {\n"
+            + " margin: 0;\n"
+            + " padding: 0pt 0pt 0pt 0pt;\n"
+            + "}\n"
+            + "div {\n"
+            + " margin: 0;\n"
+            + " padding: env(safe-area-inset-top) "
+            + "          env(safe-area-inset-right)"
+            + "          env(safe-area-inset-bottom)"
+            + "          env(safe-area-inset-left);\n"
+            + "}\n"
+            + "</style></head><body>\n"
+            + "<div id='text'>"
+            + "On notched phones, there should be enough padding on the top"
+            + " to not have this text appear under the statusbar/notch.\n"
+            + "</div>\n"
+            + "</body></html>";
+
+    @Rule
+    public AwActivityTestRule mActivityTestRule = new AwActivityTestRule() {
+        @Override
+        public boolean needsHideActionBar() {
+            // If action bar is showing, WebView cannot be fully occupying the screen.
+            return true;
+        }
+    };
+
+    private TestWebServer mWebServer;
+    private TestAwContentsClient mContentsClient;
+    private AwTestContainerView mContainerView;
+    private AwContents mAwContents;
+
+    @Before
+    public void setUp() throws Exception {
+        mWebServer = TestWebServer.start();
+
+        mContentsClient = new TestAwContentsClient();
+        mContainerView = mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient);
+        mAwContents = mContainerView.getAwContents();
+        AwActivityTestRule.enableJavaScriptOnUiThread(mAwContents);
+
+        // In pre-R, we need to explicitly set this to draw under notch.
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            Activity activity = mActivityTestRule.getActivity();
+            activity.getWindow().getAttributes().layoutInDisplayCutoutMode =
+                    WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
+        });
+    }
+
+    @After
+    public void tearDown() {
+        mWebServer.shutdown();
+    }
+
+    private void setFullscreen(boolean fullscreen) {
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            Activity activity = mActivityTestRule.getActivity();
+            View decor = activity.getWindow().getDecorView();
+
+            int systemUiVisibility = decor.getSystemUiVisibility();
+            int flags = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
+                    | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
+            if (fullscreen) {
+                activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
+                        WindowManager.LayoutParams.FLAG_FULLSCREEN);
+                systemUiVisibility |= flags;
+            } else {
+                activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
+                systemUiVisibility &= flags;
+            }
+            decor.setSystemUiVisibility(systemUiVisibility);
+        });
+    }
+
+    @Test
+    @SmallTest
+    public void testNoSafeAreaSet() throws Throwable {
+        setFullscreen(true);
+        mActivityTestRule.loadHtmlSync(
+                mAwContents, mContentsClient.getOnPageFinishedHelper(), TEST_HTML);
+        // Reset safe area just in case we have a notch.
+        Insets insets = new Insets(0, 0, 0, 0);
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            mAwContents.getDisplayCutoutController().onApplyWindowInsetsInternal(insets);
+        });
+        final String code = "window.getComputedStyle(document.getElementById('text'))"
+                + ".getPropertyValue('padding-top')";
+        Assert.assertEquals("\"0px\"",
+                mActivityTestRule.executeJavaScriptAndWaitForResult(
+                        mAwContents, mContentsClient, code));
+    }
+
+    @Test
+    @SmallTest
+    public void testSafeAreaSet() throws Throwable {
+        setFullscreen(true);
+        mActivityTestRule.loadHtmlSync(
+                mAwContents, mContentsClient.getOnPageFinishedHelper(), TEST_HTML);
+        Insets insets = new Insets(0, 130, 0, 0);
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            mAwContents.getDisplayCutoutController().onApplyWindowInsetsInternal(insets);
+        });
+        final String code = "window.getComputedStyle(document.getElementById('text'))"
+                + ".getPropertyValue('padding-top')";
+        Assert.assertNotEquals("\"0px\"",
+                mActivityTestRule.executeJavaScriptAndWaitForResult(
+                        mAwContents, mContentsClient, code));
+    }
+}
\ No newline at end of file
diff --git a/android_webview/junit/src/org/chromium/android_webview/robolectric/AwDisplayCutoutControllerTest.java b/android_webview/junit/src/org/chromium/android_webview/robolectric/AwDisplayCutoutControllerTest.java
index 8fe17c2..5866d66 100644
--- a/android_webview/junit/src/org/chromium/android_webview/robolectric/AwDisplayCutoutControllerTest.java
+++ b/android_webview/junit/src/org/chromium/android_webview/robolectric/AwDisplayCutoutControllerTest.java
@@ -93,27 +93,11 @@
         // Set up default values.
         setWindowInsets(new Rect(20, 40, 60, 80));
         mDipScale = 2.0f;
-        mViewWidth = 300;
-        mViewHeight = 400;
-        mDisplayWidth = 300;
-        mDisplayHeight = 400;
-        mGlobalTransformMatrix = new Matrix(); // identity matrix
 
         // Set up the view.
         doAnswer(new Answer<Void>() {
             @Override
             public Void answer(InvocationOnMock invocation) throws Throwable {
-                int[] loc = (int[]) (invocation.getArguments()[0]);
-                loc[0] = mLocationOnScreen[0];
-                loc[1] = mLocationOnScreen[1];
-                return null;
-            }
-        })
-                .when(mView)
-                .getLocationOnScreen(any(int[].class));
-        doAnswer(new Answer<Void>() {
-            @Override
-            public Void answer(InvocationOnMock invocation) throws Throwable {
                 mListener = (View.OnApplyWindowInsetsListener) (invocation.getArguments()[0]);
                 return null;
             }
@@ -130,39 +114,8 @@
                 .when(mView)
                 .requestApplyInsets();
 
-        when(mView.getMeasuredWidth()).thenReturn(mViewWidth);
-        when(mView.getMeasuredHeight()).thenReturn(mViewHeight);
-        doAnswer(new Answer<Void>() {
-            @Override
-            public Void answer(InvocationOnMock invocation) throws Throwable {
-                Matrix matrix = (Matrix) (invocation.getArguments()[0]);
-                matrix.set(mGlobalTransformMatrix);
-                return null;
-            }
-        })
-                .when(mView)
-                .transformMatrixToGlobal(any(Matrix.class));
-
-        // Set up the root view.
-        doAnswer(new Answer<Void>() {
-            @Override
-            public Void answer(InvocationOnMock invocation) throws Throwable {
-                int[] loc = (int[]) (invocation.getArguments()[0]);
-                loc[0] = mLocationOnScreen[0];
-                loc[1] = mLocationOnScreen[1];
-                return null;
-            }
-        })
-                .when(mRootView)
-                .getLocationOnScreen(any(int[].class));
-        when(mRootView.getMeasuredWidth()).thenReturn(mViewWidth);
-        when(mRootView.getMeasuredHeight()).thenReturn(mViewHeight);
-        when(mView.getRootView()).thenReturn(mRootView);
-
         // Set up the delegate.
         when(mDelegate.getDipScale()).thenReturn(mDipScale);
-        when(mDelegate.getDisplayWidth()).thenReturn(mDisplayWidth);
-        when(mDelegate.getDisplayHeight()).thenReturn(mDisplayHeight);
 
         mInOrder = inOrder(mDelegate, mView, mAnotherView);
 
@@ -195,11 +148,6 @@
     public void testOnApplyWindowInsets() {
         mController.onApplyWindowInsets(mWindowInsets);
 
-        mInOrder.verify(mView).getLocationOnScreen(any(int[].class));
-        mInOrder.verify(mView).getMeasuredWidth();
-        mInOrder.verify(mView).getMeasuredHeight();
-        mInOrder.verify(mDelegate).getDisplayWidth();
-        mInOrder.verify(mDelegate).getDisplayHeight();
         mInOrder.verify(mDelegate).getDipScale();
 
         // Note that DIP of 2.0 is applied, so the values are halved.
@@ -209,69 +157,11 @@
     @Test
     @SmallTest
     @Feature({"AndroidWebView"})
-    public void testOnApplyWindowInsets_NotOccupyingFullDisplay() {
-        // View is not occupying the entire display, so no insets applied.
-        when(mView.getMeasuredHeight()).thenReturn(mDisplayHeight / 2);
-
-        mController.onApplyWindowInsets(mWindowInsets);
-
-        mInOrder.verify(mView).getLocationOnScreen(any(int[].class));
-        mInOrder.verify(mView).getMeasuredWidth();
-        mInOrder.verify(mView).getMeasuredHeight();
-        mInOrder.verify(mDelegate).getDisplayWidth();
-        mInOrder.verify(mDelegate).getDisplayHeight();
-
-        mInOrder.verify(mDelegate).setDisplayCutoutSafeArea(eq(new Insets(0, 0, 0, 0)));
-    }
-
-    @Test
-    @SmallTest
-    @Feature({"AndroidWebView"})
-    public void testOnApplyWindowInsets_NotOccupyingFullWindow() {
-        // View is not occupying the entire window, so no insets applied.
-        when(mRootView.getMeasuredHeight()).thenReturn(mViewHeight / 2);
-
-        mController.onApplyWindowInsets(mWindowInsets);
-
-        mInOrder.verify(mView).getLocationOnScreen(any(int[].class));
-        mInOrder.verify(mView).getMeasuredWidth();
-        mInOrder.verify(mView).getMeasuredHeight();
-        mInOrder.verify(mDelegate).getDisplayWidth();
-        mInOrder.verify(mDelegate).getDisplayHeight();
-
-        mInOrder.verify(mDelegate).setDisplayCutoutSafeArea(eq(new Insets(0, 0, 0, 0)));
-    }
-
-    @Test
-    @SmallTest
-    @Feature({"AndroidWebView"})
-    public void testOnApplyWindowInsets_ParentLayoutRotated() {
-        mGlobalTransformMatrix.postRotate(30.0f);
-
-        mController.onApplyWindowInsets(mWindowInsets);
-
-        mInOrder.verify(mView).getLocationOnScreen(any(int[].class));
-        mInOrder.verify(mView).getMeasuredWidth();
-        mInOrder.verify(mView).getMeasuredHeight();
-        mInOrder.verify(mDelegate).getDisplayWidth();
-        mInOrder.verify(mDelegate).getDisplayHeight();
-
-        mInOrder.verify(mDelegate).setDisplayCutoutSafeArea(eq(new Insets(0, 0, 0, 0)));
-    }
-
-    @Test
-    @SmallTest
-    @Feature({"AndroidWebView"})
     public void testOnSizeChanged() {
         mController.onSizeChanged();
 
         mInOrder.verify(mView).requestApplyInsets();
 
-        mInOrder.verify(mView).getLocationOnScreen(any(int[].class));
-        mInOrder.verify(mView).getMeasuredWidth();
-        mInOrder.verify(mView).getMeasuredHeight();
-        mInOrder.verify(mDelegate).getDisplayWidth();
-        mInOrder.verify(mDelegate).getDisplayHeight();
         mInOrder.verify(mDelegate).getDipScale();
 
         // Note that DIP of 2.0 is applied, so the values are halved.
@@ -286,11 +176,6 @@
 
         mInOrder.verify(mView).requestApplyInsets();
 
-        mInOrder.verify(mView).getLocationOnScreen(any(int[].class));
-        mInOrder.verify(mView).getMeasuredWidth();
-        mInOrder.verify(mView).getMeasuredHeight();
-        mInOrder.verify(mDelegate).getDisplayWidth();
-        mInOrder.verify(mDelegate).getDisplayHeight();
         mInOrder.verify(mDelegate).getDipScale();
 
         // Note that DIP of 2.0 is applied, so the values are halved.
diff --git a/android_webview/test/BUILD.gn b/android_webview/test/BUILD.gn
index f7af2972..f36026466 100644
--- a/android_webview/test/BUILD.gn
+++ b/android_webview/test/BUILD.gn
@@ -251,6 +251,7 @@
     "../javatests/src/org/chromium/android_webview/test/AwContentsRenderTest.java",
     "../javatests/src/org/chromium/android_webview/test/AwContentsStaticsTest.java",
     "../javatests/src/org/chromium/android_webview/test/AwContentsTest.java",
+    "../javatests/src/org/chromium/android_webview/test/AwDisplayCutoutTest.java",
     "../javatests/src/org/chromium/android_webview/test/AwFormDatabaseTest.java",
     "../javatests/src/org/chromium/android_webview/test/AwImeTest.java",
     "../javatests/src/org/chromium/android_webview/test/AwJavaBridgeTest.java",
diff --git a/android_webview/test/shell/src/org/chromium/android_webview/test/AwTestRunnerActivity.java b/android_webview/test/shell/src/org/chromium/android_webview/test/AwTestRunnerActivity.java
index 63923a7..cdecd8e 100644
--- a/android_webview/test/shell/src/org/chromium/android_webview/test/AwTestRunnerActivity.java
+++ b/android_webview/test/shell/src/org/chromium/android_webview/test/AwTestRunnerActivity.java
@@ -19,6 +19,7 @@
  * This is a lightweight activity for tests that only require WebView functionality.
  */
 public class AwTestRunnerActivity extends Activity {
+    public static final String FLAG_HIDE_ACTION_BAR = "hide_action_bar";
 
     private LinearLayout mLinearLayout;
     private Intent mLastSentIntent;
@@ -29,7 +30,7 @@
         super.onCreate(savedInstanceState);
 
         AwShellResourceProvider.registerResources(this);
-        try (StrictModeContext ctx = StrictModeContext.allowDiskReads()) {
+        try (StrictModeContext ignored = StrictModeContext.allowDiskReads()) {
             AwBrowserProcess.loadLibrary(null);
         }
 
@@ -39,9 +40,24 @@
         mLinearLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
                 LayoutParams.MATCH_PARENT));
 
+        hideActionBarIfNecessary();
+
         setContentView(mLinearLayout);
     }
 
+    private void hideActionBarIfNecessary() {
+        Intent intent = getIntent();
+        if (intent == null) return;
+        Bundle extras = intent.getExtras();
+        if (extras == null) return;
+        Boolean hideActionBar = extras.getBoolean(FLAG_HIDE_ACTION_BAR);
+        if (hideActionBar == null || !hideActionBar) return;
+
+        // This should be called before setContentView in onCreate() to take an
+        // effect.
+        getActionBar().hide();
+    }
+
     public int getRootLayoutWidth() {
         return mLinearLayout.getWidth();
     }
diff --git a/ash/capture_mode/capture_mode_bar_view.cc b/ash/capture_mode/capture_mode_bar_view.cc
index 9c2c6bc7..73446e97 100644
--- a/ash/capture_mode/capture_mode_bar_view.cc
+++ b/ash/capture_mode/capture_mode_bar_view.cc
@@ -13,6 +13,8 @@
 #include "ash/capture_mode/capture_mode_source_view.h"
 #include "ash/capture_mode/capture_mode_type_view.h"
 #include "ash/resources/vector_icons/vector_icons.h"
+#include "ash/shelf/shelf.h"
+#include "ash/shelf/shelf_layout_manager.h"
 #include "ash/style/ash_color_provider.h"
 #include "base/bind.h"
 #include "ui/aura/window.h"
@@ -38,8 +40,10 @@
 
 constexpr float kBlurQuality = 0.33f;
 
-// TODO(afakhry): Change this to depend on the height of the Shelf.
-constexpr int kDistanceFromScreenBottom = 56;
+// Distance from the bottom of the bar to the bottom of the display, top of the
+// hotseat or top of the shelf depending on the shelf alignment or hotseat
+// visibility.
+constexpr int kDistanceFromShelfOrHotseatTopDp = 16;
 
 }  // namespace
 
@@ -91,9 +95,23 @@
   DCHECK(root);
 
   auto bounds = root->GetBoundsInScreen();
-  const int y = bounds.bottom() - kDistanceFromScreenBottom - kBarSize.height();
+  int bar_y = bounds.bottom();
+  Shelf* shelf = Shelf::ForWindow(root);
+  if (shelf->IsHorizontalAlignment()) {
+    // Get the widget which has the shelf icons. This is the hotseat widget if
+    // the hotseat is extended, shelf widget otherwise.
+    const bool hotseat_extended =
+        shelf->shelf_layout_manager()->hotseat_state() ==
+        HotseatState::kExtended;
+    views::Widget* shelf_widget =
+        hotseat_extended ? static_cast<views::Widget*>(shelf->hotseat_widget())
+                         : static_cast<views::Widget*>(shelf->shelf_widget());
+    bar_y = shelf_widget->GetWindowBoundsInScreen().y();
+  }
+
+  bar_y -= (kDistanceFromShelfOrHotseatTopDp + kBarSize.height());
   bounds.ClampToCenteredSize(kBarSize);
-  bounds.set_y(y);
+  bounds.set_y(bar_y);
   return bounds;
 }
 
diff --git a/ash/capture_mode/capture_mode_session.cc b/ash/capture_mode/capture_mode_session.cc
index 51b9fef..4733997b 100644
--- a/ash/capture_mode/capture_mode_session.cc
+++ b/ash/capture_mode/capture_mode_session.cc
@@ -693,8 +693,15 @@
       case ui::ET_TOUCH_PRESSED:
       case ui::ET_TOUCH_MOVED: {
         if (is_capture_window) {
+          // Make sure the capture label widget will not get picked up by the
+          // get topmost window algorithm otherwise a crash will happen since
+          // the snapshot code tries snap a deleted window.
+          std::set<aura::Window*> ignore_windows;
+          if (capture_label_widget_)
+            ignore_windows.insert(capture_label_widget_->GetNativeWindow());
+
           capture_window_observer_->UpdateSelectedWindowAtPosition(
-              screen_location);
+              screen_location, ignore_windows);
         }
         UpdateCursor(screen_location, is_touch);
         break;
diff --git a/ash/capture_mode/capture_mode_unittests.cc b/ash/capture_mode/capture_mode_unittests.cc
index 857be405..4d447d57 100644
--- a/ash/capture_mode/capture_mode_unittests.cc
+++ b/ash/capture_mode/capture_mode_unittests.cc
@@ -1791,6 +1791,31 @@
       kTabletHistogram, CaptureModeConfiguration::kWindowScreenshot, 1);
 }
 
+// Tests that there is no crash when touching the capture label widget in tablet
+// mode when capturing a window. Regression test for https://crbug.com/1152938.
+TEST_F(CaptureModeTest, TabletTouchCaptureLabelWidgetWindowMode) {
+  TabletModeControllerTestApi tablet_mode_controller_test_api;
+  tablet_mode_controller_test_api.EnterTabletMode();
+
+  // Enter capture window mode.
+  CaptureModeController* controller =
+      StartCaptureSession(CaptureModeSource::kWindow, CaptureModeType::kImage);
+  ASSERT_TRUE(controller->IsActive());
+
+  // Press and release on where the capture label widget would be.
+  auto* event_generator = GetEventGenerator();
+  CaptureModeSessionTestApi test_api(controller->capture_mode_session());
+  DCHECK(test_api.capture_label_widget());
+  event_generator->set_current_screen_location(
+      test_api.capture_label_widget()->GetWindowBoundsInScreen().CenterPoint());
+  event_generator->PressTouch();
+  event_generator->ReleaseTouch();
+
+  // There are no windows so the window finder algorithm will find the app list
+  // window and take a picture of that, ending capture mode.
+  EXPECT_FALSE(controller->IsActive());
+}
+
 // A test class that uses a mock time task environment.
 class CaptureModeMockTimeTest : public CaptureModeTest {
  public:
diff --git a/ash/capture_mode/capture_window_observer.cc b/ash/capture_mode/capture_window_observer.cc
index 3dbba4e..5730f37 100644
--- a/ash/capture_mode/capture_window_observer.cc
+++ b/ash/capture_mode/capture_window_observer.cc
@@ -25,8 +25,26 @@
 }
 
 void CaptureWindowObserver::UpdateSelectedWindowAtPosition(
-    const gfx::Point& location_in_screen) {
-  UpdateSelectedWindowAtPosition(location_in_screen, /*ignore_windows=*/{});
+    const gfx::Point& location_in_screen,
+    const std::set<aura::Window*>& ignore_windows) {
+  location_in_screen_ = location_in_screen;
+  // Find the toplevel window under the mouse/touch position.
+  aura::Window* window =
+      GetTopmostWindowAtPoint(location_in_screen_, ignore_windows);
+  if (window_ == window)
+    return;
+
+  // Don't capture wallpaper window.
+  if (window && window->parent() &&
+      window->parent()->id() == kShellWindowId_WallpaperContainer) {
+    window = nullptr;
+  }
+
+  // Stop observing the current selected window if there is one.
+  StopObserving();
+  if (window)
+    StartObserving(window);
+  RepaintCaptureRegion();
 }
 
 void CaptureWindowObserver::OnWindowBoundsChanged(
@@ -76,29 +94,6 @@
   }
 }
 
-void CaptureWindowObserver::UpdateSelectedWindowAtPosition(
-    const gfx::Point& location_in_screen,
-    const std::set<aura::Window*>& ignore_windows) {
-  location_in_screen_ = location_in_screen;
-  // Find the toplevel window under the mouse/touch position.
-  aura::Window* window =
-      GetTopmostWindowAtPoint(location_in_screen_, ignore_windows);
-  if (window_ == window)
-    return;
-
-  // Don't capture wallpaper window.
-  if (window && window->parent() &&
-      window->parent()->id() == kShellWindowId_WallpaperContainer) {
-    window = nullptr;
-  }
-
-  // Stop observing the current selected window if there is one.
-  StopObserving();
-  if (window)
-    StartObserving(window);
-  RepaintCaptureRegion();
-}
-
 void CaptureWindowObserver::RepaintCaptureRegion() {
   ui::Layer* layer = capture_mode_session_->layer();
   layer->SchedulePaint(layer->bounds());
diff --git a/ash/capture_mode/capture_window_observer.h b/ash/capture_mode/capture_window_observer.h
index 1591bcd..48f1bb1 100644
--- a/ash/capture_mode/capture_window_observer.h
+++ b/ash/capture_mode/capture_window_observer.h
@@ -33,10 +33,12 @@
 
   ~CaptureWindowObserver() override;
 
-  // Updates selected window depending on the mouse/touch event location. If
-  // there is an eligible window under the current mouse/touch event location,
-  // its bounds will be highlighted.
-  void UpdateSelectedWindowAtPosition(const gfx::Point& location_in_screen);
+  // Updates selected window depending on the mouse/touch event location,
+  // ignoring |ignore_windows|. If there is an eligible window under the current
+  // mouse/touch event location, its bounds will be highlighted.
+  void UpdateSelectedWindowAtPosition(
+      const gfx::Point& location_in_screen,
+      const std::set<aura::Window*>& ignore_windows);
 
   // aura::WindowObserver:
   void OnWindowBoundsChanged(aura::Window* window,
@@ -57,12 +59,6 @@
   void StartObserving(aura::Window* window);
   void StopObserving();
 
-  // Updates selected window depending on the mouse/touch event location with
-  // ignoring |ignore_windows|.
-  void UpdateSelectedWindowAtPosition(
-      const gfx::Point& location_in_screen,
-      const std::set<aura::Window*>& ignore_windows);
-
   // Repaints the window capture region.
   void RepaintCaptureRegion();
 
diff --git a/ash/clipboard/views/clipboard_history_main_button.cc b/ash/clipboard/views/clipboard_history_main_button.cc
index 0b3cc6f4..e9cd83a2 100644
--- a/ash/clipboard/views/clipboard_history_main_button.cc
+++ b/ash/clipboard/views/clipboard_history_main_button.cc
@@ -9,6 +9,7 @@
 #include "ash/style/scoped_light_mode_as_default.h"
 #include "ui/gfx/canvas.h"
 #include "ui/views/accessibility/view_accessibility.h"
+#include "ui/views/animation/ink_drop.h"
 
 namespace ash {
 namespace {
@@ -28,6 +29,7 @@
           base::Unretained(container))),
       container_(container) {
   SetFocusBehavior(views::View::FocusBehavior::ALWAYS);
+  SetInkDropMode(views::InkDropHostView::InkDropMode::ON);
 
   // Let the parent handle accessibility features.
   GetViewAccessibility().OverrideIsIgnored(/*value=*/true);
@@ -47,9 +49,34 @@
   return "ClipboardHistoryMainButton";
 }
 
+std::unique_ptr<views::InkDrop> ClipboardHistoryMainButton::CreateInkDrop() {
+  std::unique_ptr<views::InkDrop> ink_drop = views::Button::CreateInkDrop();
+
+  // We do not use the ripple highlight due to the following reasons:
+  // (1) Events may be intercepted by the menu controller. As a result, the
+  // ripple highlight may not update properly.
+  // (2) The animation to fade in/out highlight does not look good when the menu
+  // selection is advanced by the up/down arrow key.
+  // Hence, highlighted background is implemented by customizing in
+  // `PaintButtonContents()`.
+  ink_drop->SetShowHighlightOnHover(false);
+
+  return ink_drop;
+}
+
 void ClipboardHistoryMainButton::OnThemeChanged() {
   views::Button::OnThemeChanged();
-  SchedulePaint();
+
+  // Use the light mode as default because the light mode is the default mode
+  // of the native theme which decides the context menu's background color.
+  // TODO(andrewxu): remove this line after https://crbug.com/1143009 is
+  // fixed.
+  ScopedLightModeAsDefault scoped_light_mode_as_default;
+
+  const AshColorProvider::RippleAttributes ripple_attributes =
+      AshColorProvider::Get()->GetRippleAttributes();
+  SetInkDropBaseColor(ripple_attributes.base_color);
+  SetInkDropVisibleOpacity(ripple_attributes.inkdrop_opacity);
 }
 
 void ClipboardHistoryMainButton::OnGestureEvent(ui::GestureEvent* event) {
diff --git a/ash/clipboard/views/clipboard_history_main_button.h b/ash/clipboard/views/clipboard_history_main_button.h
index 079f907b..59e6573 100644
--- a/ash/clipboard/views/clipboard_history_main_button.h
+++ b/ash/clipboard/views/clipboard_history_main_button.h
@@ -24,6 +24,7 @@
  private:
   // views::Button:
   const char* GetClassName() const override;
+  std::unique_ptr<views::InkDrop> CreateInkDrop() override;
   void OnThemeChanged() override;
   void OnGestureEvent(ui::GestureEvent* event) override;
   void PaintButtonContents(gfx::Canvas* canvas) override;
diff --git a/ash/public/cpp/app_list/internal_app_id_constants.h b/ash/public/cpp/app_list/internal_app_id_constants.h
index bfdeb33..94e13b21 100644
--- a/ash/public/cpp/app_list/internal_app_id_constants.h
+++ b/ash/public/cpp/app_list/internal_app_id_constants.h
@@ -22,11 +22,6 @@
 constexpr char kInternalAppIdContinueReading[] =
     "fbokpncipdhffndmljhhidahghagaonp";
 
-// Generated as
-// web_app::GenerateAppIdFromURL(GURL(
-// "https://google.com/chromebook/whatsnew/embedded/")).
-constexpr char kReleaseNotesAppId[] = "kddjchdmnnpakappplfnloipgcbioilo";
-
 }  // namespace ash
 
 #endif  // ASH_PUBLIC_CPP_APP_LIST_INTERNAL_APP_ID_CONSTANTS_H_
diff --git a/ash/public/cpp/resources/ash_public_unscaled_resources.grd b/ash/public/cpp/resources/ash_public_unscaled_resources.grd
index b2e31b5..c1a6297 100644
--- a/ash/public/cpp/resources/ash_public_unscaled_resources.grd
+++ b/ash/public/cpp/resources/ash_public_unscaled_resources.grd
@@ -17,7 +17,6 @@
       <!-- CrOS internal apps images -->
       <include name="IDR_SHORTCUT_VIEWER_LOGO_192" file="unscaled_resources/shortcut_viewer_logo_192.png" type="BINDATA" />
       <include name="IDR_SETTINGS_LOGO_192" file="unscaled_resources/settings_logo_192.png" type="BINDATA" />
-      <include name="IDR_RELEASE_NOTES_APP_192" file="unscaled_resources/release_notes_logo_192.png" type="BINDATA" />
       <include name="IDR_PHONE_HUB_ONBOARDING_IMAGE" file="unscaled_resources/phone_hub_onboarding_image.png" type="BINDATA" />
       <include name="IDR_PHONE_HUB_CONNECTING_IMAGE" file="unscaled_resources/phone_hub_connecting_image.png" type="BINDATA" />
       <include name="IDR_PHONE_HUB_ERROR_STATE_IMAGE" file="unscaled_resources/phone_hub_error_state_image.png" type="BINDATA" />
diff --git a/ash/public/cpp/resources/unscaled_resources/release_notes_logo_192.png b/ash/public/cpp/resources/unscaled_resources/release_notes_logo_192.png
deleted file mode 100644
index cb0d225d..0000000
--- a/ash/public/cpp/resources/unscaled_resources/release_notes_logo_192.png
+++ /dev/null
Binary files differ
diff --git a/ash/public/cpp/resources/unscaled_resources/settings_logo_192.png b/ash/public/cpp/resources/unscaled_resources/settings_logo_192.png
index 0966334..5fe10aaa 100644
--- a/ash/public/cpp/resources/unscaled_resources/settings_logo_192.png
+++ b/ash/public/cpp/resources/unscaled_resources/settings_logo_192.png
Binary files differ
diff --git a/ash/public/cpp/resources/unscaled_resources/shortcut_viewer_logo_192.png b/ash/public/cpp/resources/unscaled_resources/shortcut_viewer_logo_192.png
index eb154ba6c40..8add363 100644
--- a/ash/public/cpp/resources/unscaled_resources/shortcut_viewer_logo_192.png
+++ b/ash/public/cpp/resources/unscaled_resources/shortcut_viewer_logo_192.png
Binary files differ
diff --git a/base/allocator/partition_allocator/partition_alloc_unittest.cc b/base/allocator/partition_allocator/partition_alloc_unittest.cc
index b4776c43..a11f3c79 100644
--- a/base/allocator/partition_allocator/partition_alloc_unittest.cc
+++ b/base/allocator/partition_allocator/partition_alloc_unittest.cc
@@ -1796,7 +1796,7 @@
     allocator.root()->Free(ptr2);
   }
 
-  // This test checks single-slot slot span allocations.
+  // This test checks large-but-not-quite-direct allocations.
   {
     const size_t requested_size = 16 * SystemPageSize();
     void* ptr = allocator.root()->Alloc(requested_size + 1, type_name);
@@ -1842,12 +1842,12 @@
       EXPECT_FALSE(stats->is_direct_map);
       EXPECT_EQ(slot_size, stats->bucket_slot_size);
       EXPECT_EQ(0u, stats->active_bytes);
-      EXPECT_EQ(0u, stats->resident_bytes);
-      EXPECT_EQ(0u, stats->decommittable_bytes);
+      EXPECT_EQ(slot_size, stats->resident_bytes);
+      EXPECT_EQ(slot_size, stats->decommittable_bytes);
       EXPECT_EQ(0u, stats->num_full_slot_spans);
       EXPECT_EQ(0u, stats->num_active_slot_spans);
-      EXPECT_EQ(0u, stats->num_empty_slot_spans);
-      EXPECT_EQ(1u, stats->num_decommitted_slot_spans);
+      EXPECT_EQ(1u, stats->num_empty_slot_spans);
+      EXPECT_EQ(0u, stats->num_decommitted_slot_spans);
     }
 
     void* ptr2 = allocator.root()->Alloc(requested_size + SystemPageSize() + 1,
@@ -2101,12 +2101,8 @@
   const size_t kFirstAllocPages = kHasLargePages ? 32 : 64;
   const size_t kSecondAllocPages = kHasLargePages ? 31 : 61;
 
-  if (kFirstAllocPages > MaxSystemPagesPerSlotSpan()) {
-    GTEST_SKIP() << "Immediate decommitting interferes with this test.";
-  }
-
   // Detect case (1) from above.
-  ASSERT_LT(kFirstAllocPages * SystemPageSize(), 1UL << kMaxBucketedOrder);
+  DCHECK_LT(kFirstAllocPages * SystemPageSize(), 1UL << kMaxBucketedOrder);
 
   const size_t kDeltaPages = kFirstAllocPages - kSecondAllocPages;
 
@@ -2132,7 +2128,7 @@
   EXPECT_EQ(kFirstAllocPages * SystemPageSize(), stats->resident_bytes);
 
   for (size_t i = 0; i < kFirstAllocPages; i++)
-    CHECK_PAGE_IN_CORE(p.PageAtIndex(i), false);
+    CHECK_PAGE_IN_CORE(p.PageAtIndex(i), true);
 
   allocator.root()->PurgeMemory(PartitionPurgeDiscardUnusedSystemPages);
 
@@ -2574,12 +2570,10 @@
   EXPECT_EQ(expected_committed_size, root.total_size_of_committed_pages);
   EXPECT_EQ(expected_super_pages_size, root.total_size_of_super_pages);
 
-  // Freeing memory for larger buckets decommits pages right away. The address
-  // space isn't released though.
+  // Freeing memory doesn't result in decommitting pages right away.
   root.Free(ptr);
   root.Free(ptr2);
   root.Free(ptr3);
-  expected_committed_size -= 3 * bucket->get_bytes_per_span();
   EXPECT_EQ(expected_committed_size, root.total_size_of_committed_pages);
   EXPECT_EQ(expected_super_pages_size, root.total_size_of_super_pages);
 
diff --git a/base/allocator/partition_allocator/partition_page.cc b/base/allocator/partition_allocator/partition_page.cc
index d7be676..aafb7ba0 100644
--- a/base/allocator/partition_allocator/partition_page.cc
+++ b/base/allocator/partition_allocator/partition_page.cc
@@ -114,8 +114,8 @@
 
 template <bool thread_safe>
 DeferredUnmap SlotSpanMetadata<thread_safe>::FreeSlowPath() {
-  auto* root = PartitionRoot<thread_safe>::FromSlotSpan(this);
 #if DCHECK_IS_ON()
+  auto* root = PartitionRoot<thread_safe>::FromSlotSpan(this);
   root->lock_.AssertAcquired();
 #endif
   PA_DCHECK(this != get_sentinel_slot_span());
@@ -130,21 +130,10 @@
       bucket->SetNewActiveSlotSpan();
     PA_DCHECK(bucket->active_slot_spans_head != this);
 
-    // Decommit the slot span, but not unconditionally. For certain slot sizes
-    // there could be enough churn to result in slot spans transitioning between
-    // decommitted<->active states often enough to cause a perf regression. In
-    // these cases it's better to register them for lazy decommitting.
-    // However, decommitting single-slot slot spans immediately has been
-    // empirically confirmed not to cause a regression, but future optimizations
-    // may base the decision on slot size instead (see crrev.com/c/2549024for
-    // more details).
-    if (CanStoreRawSize()) {
+    if (CanStoreRawSize())
       SetRawSize(0);
 
-      Decommit(root);
-    } else {
-      PartitionRegisterEmptySlotSpan(this);
-    }
+    PartitionRegisterEmptySlotSpan(this);
   } else {
     PA_DCHECK(!bucket->is_direct_mapped());
     // Ensure that the slot span is full. That's the only valid case if we
@@ -176,7 +165,6 @@
 void SlotSpanMetadata<thread_safe>::Decommit(PartitionRoot<thread_safe>* root) {
   root->lock_.AssertAcquired();
   PA_DCHECK(is_empty());
-  PA_DCHECK(empty_cache_index == -1);
   PA_DCHECK(!bucket->is_direct_mapped());
   void* addr = SlotSpanMetadata::ToPointer(this);
   root->DecommitSystemPagesForData(addr, bucket->get_bytes_per_span(),
diff --git a/base/allocator/partition_allocator/partition_root.h b/base/allocator/partition_allocator/partition_root.h
index 5406b25d..018f2a2 100644
--- a/base/allocator/partition_allocator/partition_root.h
+++ b/base/allocator/partition_allocator/partition_root.h
@@ -307,8 +307,10 @@
   // Enables PCScan for this root.
   void EnablePCScan() {
     PA_CHECK(thread_safe);
-    PA_CHECK(IsScannable() && !IsScanEnabled());
     ScopedGuard guard{lock_};
+    PA_CHECK(IsScannable());
+    if (IsScanEnabled())
+      return;
     PCScan::Instance().RegisterRoot(this);
     pcscan_mode = PCScanMode::kEnabled;
   }
diff --git a/build/android/gyp/util/protoresources.py b/build/android/gyp/util/protoresources.py
index 4ffa979..7dd487a 100644
--- a/build/android/gyp/util/protoresources.py
+++ b/build/android/gyp/util/protoresources.py
@@ -33,7 +33,7 @@
 # The package ID hardcoded for shared libraries. See
 # _HardcodeSharedLibraryDynamicAttributes() for more details. If this value
 # changes make sure to change REQUIRED_PACKAGE_IDENTIFIER in WebLayerImpl.java.
-SHARED_LIBRARY_HARDCODED_ID = 12
+SHARED_LIBRARY_HARDCODED_ID = 36
 
 
 def _ProcessZip(zip_path, process_func):
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index 1fa1cdf9..d1df4db7 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-0.20201130.1.1
+0.20201130.2.1
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index 1fa1cdf9..d1df4db7 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-0.20201130.1.1
+0.20201130.2.1
diff --git a/build/linux/sysroot_scripts/find_incompatible_glibc_symbols.py b/build/linux/sysroot_scripts/find_incompatible_glibc_symbols.py
index ac9d76fc..32ea45d 100755
--- a/build/linux/sysroot_scripts/find_incompatible_glibc_symbols.py
+++ b/build/linux/sysroot_scripts/find_incompatible_glibc_symbols.py
@@ -22,7 +22,8 @@
     # Some versions of nm have a bug where the version gets printed twice.
     # Since the symbol may either be formatted like "name@@VERSION" or
     # "name@@VERSION@@VERSION", handle both cases.
-    symver = line.split('@@')
+    line = line.replace('@@', '@')
+    symver = line.split('@')
     symbol = symver[0].split(' ')[-1]
     version = symver[-1]
     if not re.match(version_format, version):
diff --git a/build/linux/sysroot_scripts/generated_package_lists/sid.mips64el b/build/linux/sysroot_scripts/generated_package_lists/sid.mips64el
index fcf6a8b..b1f5589 100644
--- a/build/linux/sysroot_scripts/generated_package_lists/sid.mips64el
+++ b/build/linux/sysroot_scripts/generated_package_lists/sid.mips64el
@@ -223,6 +223,7 @@
 https://snapshot.debian.org/archive/debian/20191212T145612Z/pool/main/libx/libxrender/libxrender1_0.9.10-1_mips64el.deb
 https://snapshot.debian.org/archive/debian/20191212T145612Z/pool/main/libx/libxrender/libxrender-dev_0.9.10-1_mips64el.deb
 https://snapshot.debian.org/archive/debian/20191212T145612Z/pool/main/libx/libxshmfence/libxshmfence1_1.3-1_mips64el.deb
+https://snapshot.debian.org/archive/debian/20191212T145612Z/pool/main/libx/libxshmfence/libxshmfence-dev_1.3-1_mips64el.deb
 https://snapshot.debian.org/archive/debian/20191212T145612Z/pool/main/libx/libxslt/libxslt1.1_1.1.32-2.2_mips64el.deb
 https://snapshot.debian.org/archive/debian/20191212T145612Z/pool/main/libx/libxslt/libxslt1-dev_1.1.32-2.2_mips64el.deb
 https://snapshot.debian.org/archive/debian/20191212T145612Z/pool/main/libx/libxss/libxss1_1.2.3-1_mips64el.deb
diff --git a/build/linux/sysroot_scripts/generated_package_lists/sid.mipsel b/build/linux/sysroot_scripts/generated_package_lists/sid.mipsel
index d2aec96..a82fd762 100644
--- a/build/linux/sysroot_scripts/generated_package_lists/sid.mipsel
+++ b/build/linux/sysroot_scripts/generated_package_lists/sid.mipsel
@@ -223,6 +223,7 @@
 https://snapshot.debian.org/archive/debian/20191212T145612Z/pool/main/libx/libxrender/libxrender1_0.9.10-1_mipsel.deb
 https://snapshot.debian.org/archive/debian/20191212T145612Z/pool/main/libx/libxrender/libxrender-dev_0.9.10-1_mipsel.deb
 https://snapshot.debian.org/archive/debian/20191212T145612Z/pool/main/libx/libxshmfence/libxshmfence1_1.3-1_mipsel.deb
+https://snapshot.debian.org/archive/debian/20191212T145612Z/pool/main/libx/libxshmfence/libxshmfence-dev_1.3-1_mipsel.deb
 https://snapshot.debian.org/archive/debian/20191212T145612Z/pool/main/libx/libxslt/libxslt1.1_1.1.32-2.2_mipsel.deb
 https://snapshot.debian.org/archive/debian/20191212T145612Z/pool/main/libx/libxslt/libxslt1-dev_1.1.32-2.2_mipsel.deb
 https://snapshot.debian.org/archive/debian/20191212T145612Z/pool/main/libx/libxss/libxss1_1.2.3-1_mipsel.deb
diff --git a/build/linux/sysroot_scripts/sysroots.json b/build/linux/sysroot_scripts/sysroots.json
index e7a9b326..0162d58d 100644
--- a/build/linux/sysroot_scripts/sysroots.json
+++ b/build/linux/sysroot_scripts/sysroots.json
@@ -1,36 +1,36 @@
 {
     "sid_amd64": {
-        "Sha1Sum": "5f64b417e1018dcf8fcc81dc2714e0f264b9b911",
+        "Sha1Sum": "22f2db7711f7426a364617bb6d78686cce09a8f9",
         "SysrootDir": "debian_sid_amd64-sysroot",
         "Tarball": "debian_sid_amd64_sysroot.tar.xz"
     },
     "sid_arm": {
-        "Sha1Sum": "c2e54f675b83a61301dcdb22e8e7a2b85c01d58c",
+        "Sha1Sum": "e7d7b3d23c21b8f46911b8428d38aba46cf58ba2",
         "SysrootDir": "debian_sid_arm-sysroot",
         "Tarball": "debian_sid_arm_sysroot.tar.xz"
     },
     "sid_arm64": {
-        "Sha1Sum": "ef67b6ca8fd6e2e51515a243d043d1ea4caf45e6",
+        "Sha1Sum": "ff4e6495cf3db79fc54addcb340f6f951885e4c1",
         "SysrootDir": "debian_sid_arm64-sysroot",
         "Tarball": "debian_sid_arm64_sysroot.tar.xz"
     },
     "sid_armel": {
-        "Sha1Sum": "4ccbe0db925a5ab39ba52cbe601535f97be05372",
+        "Sha1Sum": "d395cd5388c953082e8527ff4f01cc6f8b222184",
         "SysrootDir": "debian_sid_armel-sysroot",
         "Tarball": "debian_sid_armel_sysroot.tar.xz"
     },
     "sid_i386": {
-        "Sha1Sum": "d967bcef40477dbc39acef141ff22bf73f3e7cdb",
+        "Sha1Sum": "5a09b89bfdd9ff4c6b49f5f418124c325259c854",
         "SysrootDir": "debian_sid_i386-sysroot",
         "Tarball": "debian_sid_i386_sysroot.tar.xz"
     },
     "sid_mips": {
-        "Sha1Sum": "2758d766faa0c73da18128a4d46580ade68d3eea",
+        "Sha1Sum": "eaf2717aca47c4ae06e975f3c800f513f2b78e1d",
         "SysrootDir": "debian_sid_mips-sysroot",
         "Tarball": "debian_sid_mips_sysroot.tar.xz"
     },
     "sid_mips64el": {
-        "Sha1Sum": "0edb979c932d207076c3986403a198387a4a8aa9",
+        "Sha1Sum": "b161f2f50ed8392de963988f1d192a99cc4c6772",
         "SysrootDir": "debian_sid_mips64el-sysroot",
         "Tarball": "debian_sid_mips64el_sysroot.tar.xz"
     }
diff --git a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantActionHandler.java b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantActionHandler.java
index 3c604023..a059476d2 100644
--- a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantActionHandler.java
+++ b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantActionHandler.java
@@ -7,12 +7,16 @@
 import android.os.Bundle;
 
 import org.chromium.base.Callback;
+import org.chromium.base.annotations.DoNotInline;
 
 import java.util.List;
 
 /**
  * Interface that provides implementation for AA actions, triggered by direct actions.
  */
+// TODO(crbug.com/1145287): DexSplitter has issues with interfaces that have a single implementer
+// inside a DFM.
+@DoNotInline
 public interface AutofillAssistantActionHandler {
     /**
      * Start fetching potential actions for websites.
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java
index 58be031..f0214c50 100644
--- a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java
+++ b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java
@@ -930,6 +930,9 @@
                         ? StartSurfaceState.SHOWN_HOMEPAGE
                         : mPreviousStartSurfaceState;
             } else if (mStartSurfaceState == StartSurfaceState.SHOWING_START) {
+                if (mTabModelSelector.isIncognitoSelected() && !mShowStackTabSwitcher) {
+                    return StartSurfaceState.SHOWN_TABSWITCHER;
+                }
                 return StartSurfaceState.SHOWN_HOMEPAGE;
             } else if (mStartSurfaceState == StartSurfaceState.SHOWING_TABSWITCHER) {
                 return StartSurfaceState.SHOWN_TABSWITCHER;
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java
index c8541dd..a623bde 100644
--- a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java
+++ b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java
@@ -808,12 +808,14 @@
     @Test
     @MediumTest
     @Feature({"StartSurface"})
+    // clang-format off
     @CommandLineFlags.Add({BASE_PARAMS + "/single/exclude_mv_tiles/true"
             + "/show_last_active_tab_only/true/show_stack_tab_switcher/true"})
-    public void
-    testShow_SingleAsHomepageV2_FromResumeShowStart() throws Exception {
+    public void testShow_SingleAsHomepageV2_FromResumeShowStart() throws Exception {
         // clang-format on
-        if (!mImmediateReturn) return;
+        if (!mImmediateReturn) {
+            onView(withId(org.chromium.chrome.tab_ui.R.id.home_button)).perform(click());
+        }
 
         ChromeTabbedActivity cta = mActivityTestRule.getActivity();
         CriteriaHelper.pollUiThread(
@@ -833,11 +835,60 @@
         // Simulates pressing Chrome's icon and launching Chrome from warm start.
         mActivityTestRule.resumeMainActivityFromLauncher();
 
+        waitForTabModel();
+        if (mImmediateReturn) {
+            CriteriaHelper.pollUiThread(()
+                                                -> cta.getLayoutManager() != null
+                            && cta.getLayoutManager().overviewVisible());
+            // Verifies that with the vertical tab switcher, the regular Start surface is shown when
+            // resuming.
+            assertFalse(cta.getTabModelSelector().getCurrentModel().isIncognito());
+            assertThat(cta.getTabModelSelector().getCurrentModel().getCount(), equalTo(0));
+        } else {
+            assertTrue(cta.getTabModelSelector().getCurrentModel().isIncognito());
+            onViewWaiting(allOf(withId(R.id.new_tab_incognito_container), isDisplayed()));
+        }
+    }
+
+    @Test
+    @MediumTest
+    @Feature({"StartSurface"})
+    // clang-format off
+    @CommandLineFlags.Add({BASE_PARAMS + "/single"})
+    public void testShow_SingleAsHomepage_FromResumeShowStart() throws Exception {
+        // clang-format on
+        if (!mImmediateReturn) {
+            onView(withId(org.chromium.chrome.tab_ui.R.id.home_button)).perform(click());
+        }
+
+        ChromeTabbedActivity cta = mActivityTestRule.getActivity();
         CriteriaHelper.pollUiThread(
                 () -> cta.getLayoutManager() != null && cta.getLayoutManager().overviewVisible());
         waitForTabModel();
-        assertFalse(cta.getTabModelSelector().getCurrentModel().isIncognito());
-        assertThat(cta.getTabModelSelector().getCurrentModel().getCount(), equalTo(0));
+        TestThreadUtils.runOnUiThreadBlocking(
+                () -> { cta.getTabModelSelector().getModel(false).closeAllTabs(); });
+        TabUiTestHelper.verifyTabModelTabCount(cta, 0, 0);
+        assertTrue(cta.getLayoutManager().overviewVisible());
+        TestThreadUtils.runOnUiThreadBlocking(
+                () -> cta.getTabCreator(true /*incognito*/).launchNTP());
+        TabUiTestHelper.verifyTabModelTabCount(cta, 0, 1);
+
+        // Simulates pressing the Android's home button and bringing Chrome to the background.
+        pressHome();
+
+        // Simulates pressing Chrome's icon and launching Chrome from warm start.
+        mActivityTestRule.resumeMainActivityFromLauncher();
+
+        waitForTabModel();
+        assertTrue(cta.getTabModelSelector().getCurrentModel().isIncognito());
+        if (mImmediateReturn) {
+            CriteriaHelper.pollUiThread(()
+                                                -> cta.getLayoutManager() != null
+                            && cta.getLayoutManager().overviewVisible());
+            onViewWaiting(allOf(withId(R.id.secondary_tasks_surface_view), isDisplayed()));
+        } else {
+            onViewWaiting(allOf(withId(R.id.new_tab_incognito_container), isDisplayed()));
+        }
     }
 
     @Test
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogView.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogView.java
index e057b60..39496fa7 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogView.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogView.java
@@ -625,6 +625,8 @@
                     mContext.getResources().getDimensionPixelSize(R.dimen.tab_list_card_padding);
             animationCardFavicon.setPadding(padding, padding, padding, padding);
             animationCardFavicon.setImageDrawable(sourceCardFavicon.getDrawable());
+        } else {
+            animationCardFavicon.setImageDrawable(null);
         }
 
         ((TextView) (mAnimationCardView.findViewById(R.id.tab_title)))
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/ChromeMediaNotificationControllerDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/ChromeMediaNotificationControllerDelegate.java
index a8a1b0b..5b0d6cf 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/ChromeMediaNotificationControllerDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/ChromeMediaNotificationControllerDelegate.java
@@ -224,16 +224,9 @@
 
     @Override
     public void onMediaSessionUpdated(MediaSessionCompat session) {
-        try {
-            // Tell the MediaRouter about the session, so that Chrome can control the volume
-            // on the remote cast device (if any).
-            // Pre-MR1 versions of JB do not have the complete MediaRouter APIs,
-            // so getting the MediaRouter instance will throw an exception.
-            MediaRouter.getInstance(getContext()).setMediaSessionCompat(session);
-        } catch (NoSuchMethodError e) {
-            // Do nothing. Chrome can't be casting without a MediaRouter, so there is nothing
-            // to do here.
-        }
+        // Tell the MediaRouter about the session, so that Chrome can control the volume
+        // on the remote cast device (if any).
+        MediaRouter.getInstance(getContext()).setMediaSessionCompat(session);
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/handler/toolbar/PaymentHandlerToolbarCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/handler/toolbar/PaymentHandlerToolbarCoordinator.java
index d5f719c..8e75fe15 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/handler/toolbar/PaymentHandlerToolbarCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/handler/toolbar/PaymentHandlerToolbarCoordinator.java
@@ -125,8 +125,7 @@
     @Override
     @DrawableRes
     public int getSecurityIconResource(@ConnectionSecurityLevel int securityLevel) {
-        return SecurityStatusIcon.getSecurityIconResource(securityLevel,
-                SecurityStateModel.shouldShowDangerTriangleForWarningLevel(), mIsSmallDevice,
+        return SecurityStatusIcon.getSecurityIconResource(securityLevel, mIsSmallDevice,
                 /*skipIconForNeutralState=*/false);
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java
index 55cc509..9a0f3c1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java
@@ -475,9 +475,8 @@
                 !SearchEngineLogoUtils.shouldShowSearchEngineLogo(isIncognito())
                 || mNtpDelegate.isCurrentlyVisible();
 
-        return SecurityStatusIcon.getSecurityIconResource(securityLevel,
-                SecurityStateModel.shouldShowDangerTriangleForWarningLevel(), isSmallDevice,
-                skipIconForNeutralState);
+        return SecurityStatusIcon.getSecurityIconResource(
+                securityLevel, isSmallDevice, skipIconForNeutralState);
     }
 
     @Override
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarSecurityIconTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarSecurityIconTest.java
index 341d3702..3cf0386 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarSecurityIconTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarSecurityIconTest.java
@@ -7,7 +7,6 @@
 import static org.mockito.Mockito.any;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
 
 import androidx.test.filters.SmallTest;
 
@@ -107,7 +106,6 @@
     @SmallTest
     @UiThreadTest
     public void testGetSecurityIconResource() {
-        when(mSecurityStateMocks.shouldShowDangerTriangleForWarningLevel()).thenReturn(false);
         for (int securityLevel : SECURITY_LEVELS) {
             assertEquals("Wrong phone resource for security level " + securityLevel,
                     R.drawable.ic_offline_pin_24dp,
@@ -151,10 +149,10 @@
                 mLocationBarModel.getSecurityIconResource(ConnectionSecurityLevel.NONE,
                         !IS_SMALL_DEVICE, !IS_OFFLINE_PAGE, !IS_PREVIEW, !IS_PAINT_PREVIEW));
 
-        assertEquals(R.drawable.omnibox_info,
+        assertEquals(R.drawable.omnibox_not_secure_warning,
                 mLocationBarModel.getSecurityIconResource(ConnectionSecurityLevel.WARNING,
                         IS_SMALL_DEVICE, !IS_OFFLINE_PAGE, !IS_PREVIEW, !IS_PAINT_PREVIEW));
-        assertEquals(R.drawable.omnibox_info,
+        assertEquals(R.drawable.omnibox_not_secure_warning,
                 mLocationBarModel.getSecurityIconResource(ConnectionSecurityLevel.WARNING,
                         !IS_SMALL_DEVICE, !IS_OFFLINE_PAGE, !IS_PREVIEW, !IS_PAINT_PREVIEW));
 
@@ -181,25 +179,4 @@
                 mLocationBarModel.getSecurityIconResource(ConnectionSecurityLevel.SECURE,
                         !IS_SMALL_DEVICE, !IS_OFFLINE_PAGE, !IS_PREVIEW, !IS_PAINT_PREVIEW));
     }
-
-    @Test
-    @SmallTest
-    @UiThreadTest
-    public void testGetSecurityIconResourceForMarkHttpAsDangerWarning() {
-        when(mSecurityStateMocks.shouldShowDangerTriangleForWarningLevel()).thenReturn(false);
-        assertEquals(0,
-                mLocationBarModel.getSecurityIconResource(ConnectionSecurityLevel.NONE,
-                        IS_SMALL_DEVICE, !IS_OFFLINE_PAGE, !IS_PREVIEW, !IS_PAINT_PREVIEW));
-        assertEquals(R.drawable.omnibox_info,
-                mLocationBarModel.getSecurityIconResource(ConnectionSecurityLevel.NONE,
-                        !IS_SMALL_DEVICE, !IS_OFFLINE_PAGE, !IS_PREVIEW, !IS_PAINT_PREVIEW));
-
-        when(mSecurityStateMocks.shouldShowDangerTriangleForWarningLevel()).thenReturn(true);
-        assertEquals(R.drawable.omnibox_not_secure_warning,
-                mLocationBarModel.getSecurityIconResource(ConnectionSecurityLevel.WARNING,
-                        IS_SMALL_DEVICE, !IS_OFFLINE_PAGE, !IS_PREVIEW, !IS_PAINT_PREVIEW));
-        assertEquals(R.drawable.omnibox_not_secure_warning,
-                mLocationBarModel.getSecurityIconResource(ConnectionSecurityLevel.WARNING,
-                        !IS_SMALL_DEVICE, !IS_OFFLINE_PAGE, !IS_PREVIEW, !IS_PAINT_PREVIEW));
-    }
 }
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index e36196c..794ec3e 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -5657,9 +5657,6 @@
   <message name="IDS_RELEASE_NOTES_DEVICE_SPECIFIC_NOTIFICATION_TITLE" desc="Text for the notification title informing the user that the device has been updated and patch notes are available. Will specify the user's Chrome OS device.">
     See what's new on your <ph name="DEVICE_TYPE">$1<ex>Chromebook</ex></ph>
   </message>
-  <message name="IDS_RELEASE_NOTES_NOTIFICATION_TITLE" desc="Text for the notification title informing the user that the device has been updated and patch notes are available.">
-    See what's new on Chromebook
-  </message>
   <message name="IDS_RELEASE_NOTES_NOTIFICATION_MESSAGE" desc="Text for the notification message informing the user that the device has been updated and patch notes are available.">
     Get highlights from the latest update
   </message>
@@ -5927,4 +5924,17 @@
     <ph name="DOMAIN">$1<ex>example.com</ex></ph> requires you to keep your smart card inserted.
   </message>
 
+  <!-- Strings for full restore notifications -->
+  <if expr="chromeos">
+    <message name="IDS_RESTORE_NOTIFICATION_RESTORE_BUTTON" desc="The restore button label of the notification for the user to select restore apps and pages on startup.">
+      Restore
+    </message>
+    <message name="IDS_RESTORE_NOTIFICATION_CANCEL_BUTTON" desc="The cancel button label of the notification for the user to select not restore on startup.">
+      Cancel
+    </message>
+    <message name="IDS_RESTORE_NOTIFICATION_TITLE" desc="This is the title of the notification for the user to select restore or not on startup.">
+      Restore apps &amp; pages?
+    </message>
+  </if>
+
 </grit-part>
diff --git a/chrome/app/chromeos_strings_grdp/IDS_RELEASE_NOTES_NOTIFICATION_TITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_RELEASE_NOTES_NOTIFICATION_TITLE.png.sha1
deleted file mode 100644
index fa1fbfc..0000000
--- a/chrome/app/chromeos_strings_grdp/IDS_RELEASE_NOTES_NOTIFICATION_TITLE.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-51e6a2ba245da0527c4d1a77142448a6f9d42f35
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_RESTORE_NOTIFICATION_CANCEL_BUTTON.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_RESTORE_NOTIFICATION_CANCEL_BUTTON.png.sha1
new file mode 100644
index 0000000..46075f4
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_RESTORE_NOTIFICATION_CANCEL_BUTTON.png.sha1
@@ -0,0 +1 @@
+657acbf8f413bb610546b27dd5203a59f2b3c4f8
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_RESTORE_NOTIFICATION_RESTORE_BUTTON.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_RESTORE_NOTIFICATION_RESTORE_BUTTON.png.sha1
new file mode 100644
index 0000000..46075f4
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_RESTORE_NOTIFICATION_RESTORE_BUTTON.png.sha1
@@ -0,0 +1 @@
+657acbf8f413bb610546b27dd5203a59f2b3c4f8
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_RESTORE_NOTIFICATION_TITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_RESTORE_NOTIFICATION_TITLE.png.sha1
new file mode 100644
index 0000000..46075f4
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_RESTORE_NOTIFICATION_TITLE.png.sha1
@@ -0,0 +1 @@
+657acbf8f413bb610546b27dd5203a59f2b3c4f8
\ No newline at end of file
diff --git a/chrome/app/chromium_strings.grd b/chrome/app/chromium_strings.grd
index 46bb5f58..5de32a3a 100644
--- a/chrome/app/chromium_strings.grd
+++ b/chrome/app/chromium_strings.grd
@@ -1195,6 +1195,16 @@
           To use Rosetta to play protected media, you must restart Chromium.
         </message>
       </if>
+
+      <!-- Strings for full restore notifications -->
+      <if expr="chromeos">
+        <message name="IDS_RESTORE_NOTIFICATION_DISPLAY_SOURCE" desc="This is the string shown as the display source of the notification for the user to select restore or not on startup.">
+          Chromium OS system
+        </message>
+        <message name="IDS_RESTORE_FOR_CRASH_NOTIFICATION_MESSAGE" desc="This is the text message of the notification for the user to select restore or not on startup after crash.">
+          Chromium OS didn't shut down correctly.
+        </message>
+      </if>
     </messages>
   </release>
 </grit>
diff --git a/chrome/app/chromium_strings_grd/IDS_RESTORE_FOR_CRASH_NOTIFICATION_MESSAGE.png.sha1 b/chrome/app/chromium_strings_grd/IDS_RESTORE_FOR_CRASH_NOTIFICATION_MESSAGE.png.sha1
new file mode 100644
index 0000000..3b74886
--- /dev/null
+++ b/chrome/app/chromium_strings_grd/IDS_RESTORE_FOR_CRASH_NOTIFICATION_MESSAGE.png.sha1
@@ -0,0 +1 @@
+63cab9675eb6764fe65fc2b89c3002538d76dba2
\ No newline at end of file
diff --git a/chrome/app/chromium_strings_grd/IDS_RESTORE_NOTIFICATION_DISPLAY_SOURCE.png.sha1 b/chrome/app/chromium_strings_grd/IDS_RESTORE_NOTIFICATION_DISPLAY_SOURCE.png.sha1
new file mode 100644
index 0000000..3b74886
--- /dev/null
+++ b/chrome/app/chromium_strings_grd/IDS_RESTORE_NOTIFICATION_DISPLAY_SOURCE.png.sha1
@@ -0,0 +1 @@
+63cab9675eb6764fe65fc2b89c3002538d76dba2
\ No newline at end of file
diff --git a/chrome/app/google_chrome_strings.grd b/chrome/app/google_chrome_strings.grd
index 9f72421..d7466e9c 100644
--- a/chrome/app/google_chrome_strings.grd
+++ b/chrome/app/google_chrome_strings.grd
@@ -1211,6 +1211,16 @@
           To use Rosetta to play protected media, you must restart Chrome.
         </message>
       </if>
+
+      <!-- Strings for full restore notifications -->
+      <if expr="chromeos">
+        <message name="IDS_RESTORE_NOTIFICATION_DISPLAY_SOURCE" desc="This is the string shown as the display source of the notification for the user to select restore or not on startup.">
+          Chrome OS system
+        </message>
+        <message name="IDS_RESTORE_FOR_CRASH_NOTIFICATION_MESSAGE" desc="This is the text message of the notification for the user to select restore or not on startup after crash.">
+          Chrome OS didn't shut down correctly.
+        </message>
+      </if>
     </messages>
   </release>
 </grit>
diff --git a/chrome/app/google_chrome_strings_grd/IDS_RESTORE_FOR_CRASH_NOTIFICATION_MESSAGE.png.sha1 b/chrome/app/google_chrome_strings_grd/IDS_RESTORE_FOR_CRASH_NOTIFICATION_MESSAGE.png.sha1
new file mode 100644
index 0000000..46075f4
--- /dev/null
+++ b/chrome/app/google_chrome_strings_grd/IDS_RESTORE_FOR_CRASH_NOTIFICATION_MESSAGE.png.sha1
@@ -0,0 +1 @@
+657acbf8f413bb610546b27dd5203a59f2b3c4f8
\ No newline at end of file
diff --git a/chrome/app/google_chrome_strings_grd/IDS_RESTORE_NOTIFICATION_DISPLAY_SOURCE.png.sha1 b/chrome/app/google_chrome_strings_grd/IDS_RESTORE_NOTIFICATION_DISPLAY_SOURCE.png.sha1
new file mode 100644
index 0000000..46075f4
--- /dev/null
+++ b/chrome/app/google_chrome_strings_grd/IDS_RESTORE_NOTIFICATION_DISPLAY_SOURCE.png.sha1
@@ -0,0 +1 @@
+657acbf8f413bb610546b27dd5203a59f2b3c4f8
\ No newline at end of file
diff --git a/chrome/app/vector_icons/BUILD.gn b/chrome/app/vector_icons/BUILD.gn
index c97bb3c..50fec4d 100644
--- a/chrome/app/vector_icons/BUILD.gn
+++ b/chrome/app/vector_icons/BUILD.gn
@@ -175,6 +175,7 @@
   if (is_chromeos) {
     sources += [
       "autocorrect_undo.icon",
+      "full_restore_notification.icon",
       "notification_battery.icon",
       "notification_captive_portal.icon",
       "notification_cellular_alert.icon",
diff --git a/chrome/app/vector_icons/full_restore_notification.icon b/chrome/app/vector_icons/full_restore_notification.icon
new file mode 100644
index 0000000..f9e5cdf
--- /dev/null
+++ b/chrome/app/vector_icons/full_restore_notification.icon
@@ -0,0 +1,51 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 40,
+MOVE_TO, 32.23f, 21.57f,
+R_CUBIC_TO, 0.07f, -0.51f, 0.12f, -1.02f, 0.12f, -1.57f,
+R_CUBIC_TO, 0, -0.55f, -0.05f, -1.06f, -0.11f, -1.57f,
+R_LINE_TO, 3.47f, -2.64f,
+R_CUBIC_TO, 0.31f, -0.24f, 0.4f, -0.67f, 0.2f, -1.02f,
+R_LINE_TO, -3.29f, -5.54f,
+R_CUBIC_TO, -0.2f, -0.35f, -0.64f, -0.48f, -1, -0.35f,
+R_LINE_TO, -4.1f, 1.6f,
+R_CUBIC_TO, -0.85f, -0.64f, -1.78f, -1.17f, -2.78f, -1.57f,
+R_LINE_TO, -0.62f, -4.24f,
+R_CUBIC_TO, -0.05f, -0.38f, -0.39f, -0.67f, -0.81f, -0.67f,
+R_H_LINE_TO, -6.58f,
+R_CUBIC_TO, -0.41f, 0, -0.76f, 0.29f, -0.8f, 0.67f,
+R_LINE_TO, -0.62f, 4.24f,
+R_CUBIC_TO, -1, 0.4f, -1.92f, 0.94f, -2.78f, 1.57f,
+R_LINE_TO, -4.1f, -1.6f,
+R_CUBIC_TO, -0.38f, -0.14f, -0.81f, 0, -1, 0.35f,
+R_LINE_TO, -3.29f, 5.54f,
+R_CUBIC_TO, -0.21f, 0.35f, -0.11f, 0.78f, 0.2f, 1.02f,
+R_LINE_TO, 3.47f, 2.64f,
+R_CUBIC_TO, -0.07f, 0.51f, -0.11f, 1.04f, -0.11f, 1.57f,
+R_CUBIC_TO, 0, 0.53f, 0.05f, 1.06f, 0.12f, 1.57f,
+R_LINE_TO, -3.47f, 2.64f,
+R_CUBIC_TO, -0.31f, 0.24f, -0.39f, 0.67f, -0.2f, 1.02f,
+R_LINE_TO, 3.29f, 5.54f,
+R_CUBIC_TO, 0.2f, 0.35f, 0.64f, 0.48f, 1, 0.35f,
+R_LINE_TO, 4.1f, -1.6f,
+R_CUBIC_TO, 0.86f, 0.64f, 1.78f, 1.17f, 2.78f, 1.57f,
+R_LINE_TO, 0.63f, 4.24f,
+R_CUBIC_TO, 0.05f, 0.38f, 0.4f, 0.67f, 0.81f, 0.67f,
+R_H_LINE_TO, 6.58f,
+R_CUBIC_TO, 0.41f, 0, 0.76f, -0.29f, 0.81f, -0.67f,
+R_LINE_TO, 0.62f, -4.24f,
+R_CUBIC_TO, 1, -0.4f, 1.93f, -0.94f, 2.78f, -1.57f,
+R_LINE_TO, 4.1f, 1.6f,
+R_CUBIC_TO, 0.38f, 0.14f, 0.81f, 0, 1, -0.35f,
+R_LINE_TO, 3.29f, -5.54f,
+R_CUBIC_TO, 0.2f, -0.35f, 0.12f, -0.78f, -0.2f, -1.02f,
+R_LINE_TO, -3.47f, -2.64f,
+CLOSE,
+MOVE_TO, 20.01f, 25.6f,
+R_CUBIC_TO, -3.18f, 0, -5.76f, -2.51f, -5.76f, -5.6f,
+R_CUBIC_TO, 0, -3.09f, 2.58f, -5.6f, 5.76f, -5.6f,
+R_CUBIC_TO, 3.17f, 0, 5.76f, 2.51f, 5.76f, 5.6f,
+R_CUBIC_TO, 0, 3.09f, -2.58f, 5.6f, -5.76f, 5.6f,
+CLOSE
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 6649af1..2059466 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -3599,6 +3599,9 @@
     {"interest-feed-v2", flag_descriptions::kInterestFeedV2Name,
      flag_descriptions::kInterestFeedV2Description, kOsAndroid,
      FEATURE_VALUE_TYPE(feed::kInterestFeedV2)},
+    {"web-feed", flag_descriptions::kWebFeedName,
+     flag_descriptions::kWebFeedDescription, kOsAndroid,
+     FEATURE_VALUE_TYPE(feed::kWebFeed)},
     {"report-feed-user-actions", flag_descriptions::kReportFeedUserActionsName,
      flag_descriptions::kReportFeedUserActionsDescription, kOsAndroid,
      FEATURE_VALUE_TYPE(feed::kReportFeedUserActions)},
@@ -4752,7 +4755,11 @@
 
     {"enable-layout-ng", flag_descriptions::kEnableLayoutNGName,
      flag_descriptions::kEnableLayoutNGDescription, kOsAll,
-     FEATURE_VALUE_TYPE(blink::features::kLayoutNG)},
+     FEATURE_VALUE_TYPE(blink::features::kLayoutNGTable)},
+
+    {"enable-table-ng", flag_descriptions::kEnableLayoutNGTableName,
+     flag_descriptions::kEnableLayoutNGTableDescription, kOsAll,
+     FEATURE_VALUE_TYPE(blink::features::kLayoutNGTable)},
 
     {"enable-lazy-image-loading",
      flag_descriptions::kEnableLazyImageLoadingName,
@@ -4865,14 +4872,6 @@
      FEATURE_VALUE_TYPE(features::kUseAAudioDriver)},
 #endif
 
-    {"allow-sxg-certs-without-extension",
-     flag_descriptions::kAllowSignedHTTPExchangeCertsWithoutExtensionName,
-     flag_descriptions::
-         kAllowSignedHTTPExchangeCertsWithoutExtensionDescription,
-     kOsAll,
-     FEATURE_VALUE_TYPE(
-         features::kAllowSignedHTTPExchangeCertsWithoutExtension)},
-
     {"enable-sxg-subresource-prefetching",
      flag_descriptions::kEnableSignedExchangeSubresourcePrefetchName,
      flag_descriptions::kEnableSignedExchangeSubresourcePrefetchDescription,
diff --git a/chrome/browser/apps/app_service/app_service_metrics.cc b/chrome/browser/apps/app_service/app_service_metrics.cc
index f5a51a5..ff011e93 100644
--- a/chrome/browser/apps/app_service/app_service_metrics.cc
+++ b/chrome/browser/apps/app_service/app_service_metrics.cc
@@ -269,8 +269,6 @@
   } else if (app_id == plugin_vm::kPluginVmShelfAppId) {
     RecordBuiltInAppLaunch(BuiltInAppName::kPluginVm, launch_source);
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-  } else if (app_id == ash::kReleaseNotesAppId) {
-    RecordBuiltInAppLaunch(BuiltInAppName::kReleaseNotes, launch_source);
   } else if (app_id == web_app::kMockSystemAppId) {
     RecordDefaultAppLaunch(DefaultAppName::kMockSystemApp, launch_source);
   }
@@ -291,9 +289,6 @@
     base::UmaHistogramEnumeration("Apps.AppListSearchResultInternalApp.Show",
                                   BuiltInAppName::kPluginVm);
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-  } else if (app_id == ash::kReleaseNotesAppId) {
-    base::UmaHistogramEnumeration("Apps.AppListSearchResultInternalApp.Show",
-                                  BuiltInAppName::kReleaseNotes);
   }
 }
 
diff --git a/chrome/browser/apps/app_service/built_in_chromeos_apps.cc b/chrome/browser/apps/app_service/built_in_chromeos_apps.cc
index 56695e4..c616dfa 100644
--- a/chrome/browser/apps/app_service/built_in_chromeos_apps.cc
+++ b/chrome/browser/apps/app_service/built_in_chromeos_apps.cc
@@ -11,14 +11,12 @@
 #include "ash/public/cpp/app_list/internal_app_id_constants.h"
 #include "ash/public/cpp/app_menu_constants.h"
 #include "ash/public/cpp/keyboard_shortcut_viewer.h"
-#include "base/metrics/user_metrics.h"
 #include "base/time/time.h"
 #include "chrome/browser/apps/app_service/app_icon_factory.h"
 #include "chrome/browser/apps/app_service/app_service_metrics.h"
 #include "chrome/browser/apps/app_service/menu_util.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/app_list/internal_app/internal_app_metadata.h"
-#include "chrome/browser/ui/chrome_pages.h"
 #include "chrome/browser/ui/settings_window_manager_chromeos.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/services/app_service/public/mojom/types.mojom.h"
@@ -126,10 +124,6 @@
                                  int64_t display_id) {
   if (app_id == ash::kInternalAppIdKeyboardShortcutViewer) {
     ash::ToggleKeyboardShortcutViewer();
-  } else if (app_id == ash::kReleaseNotesAppId) {
-    base::RecordAction(
-        base::UserMetricsAction("ReleaseNotes.SuggestionChipLaunched"));
-    chrome::LaunchReleaseNotes(profile_, launch_source);
   }
 }
 
diff --git a/chrome/browser/chromeos/android_sms/android_sms_app_setup_controller_impl.cc b/chrome/browser/chromeos/android_sms/android_sms_app_setup_controller_impl.cc
index 27f883a..4639ea3b 100644
--- a/chrome/browser/chromeos/android_sms/android_sms_app_setup_controller_impl.cc
+++ b/chrome/browser/chromeos/android_sms/android_sms_app_setup_controller_impl.cc
@@ -17,7 +17,6 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/web_applications/components/external_install_options.h"
 #include "chrome/browser/web_applications/components/install_finalizer.h"
-#include "chrome/browser/web_applications/components/pending_app_manager.h"
 #include "chrome/browser/web_applications/components/web_app_constants.h"
 #include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/browser/web_applications/components/web_app_provider_base.h"
@@ -265,9 +264,9 @@
     size_t num_attempts_so_far,
     const GURL& app_url,
     const GURL& install_url,
-    web_app::InstallResultCode code) {
-  UMA_HISTOGRAM_ENUMERATION("AndroidSms.PWAInstallationResult", code);
-  const bool install_succeeded = web_app::IsSuccess(code);
+    web_app::PendingAppManager::InstallResult result) {
+  UMA_HISTOGRAM_ENUMERATION("AndroidSms.PWAInstallationResult", result.code);
+  const bool install_succeeded = web_app::IsSuccess(result.code);
 
   if (!install_succeeded && num_attempts_so_far < kMaxInstallRetryCount) {
     base::TimeDelta retry_delay =
@@ -275,7 +274,7 @@
     PA_LOG(VERBOSE)
         << "AndroidSmsAppSetupControllerImpl::OnAppInstallResult(): "
         << "PWA for " << install_url << " failed to install."
-        << "InstallResultCode: " << static_cast<int>(code)
+        << "InstallResultCode: " << static_cast<int>(result.code)
         << " Retrying again in " << retry_delay;
     base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
         FROM_HERE,
@@ -292,7 +291,7 @@
     PA_LOG(WARNING)
         << "AndroidSmsAppSetupControllerImpl::OnAppInstallResult(): "
         << "PWA for " << install_url << " failed to install. "
-        << "InstallResultCode: " << static_cast<int>(code);
+        << "InstallResultCode: " << static_cast<int>(result.code);
     std::move(callback).Run(false /* success */);
     return;
   }
diff --git a/chrome/browser/chromeos/android_sms/android_sms_app_setup_controller_impl.h b/chrome/browser/chromeos/android_sms/android_sms_app_setup_controller_impl.h
index 5751813..41c0ac1b 100644
--- a/chrome/browser/chromeos/android_sms/android_sms_app_setup_controller_impl.h
+++ b/chrome/browser/chromeos/android_sms/android_sms_app_setup_controller_impl.h
@@ -9,6 +9,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/unguessable_token.h"
 #include "chrome/browser/chromeos/android_sms/android_sms_app_setup_controller.h"
+#include "chrome/browser/web_applications/components/pending_app_manager.h"
 #include "chrome/browser/web_applications/components/web_app_id.h"
 #include "net/cookies/canonical_cookie.h"
 #include "net/cookies/cookie_access_result.h"
@@ -98,7 +99,7 @@
                           size_t num_attempts_so_far,
                           const GURL& app_url,
                           const GURL& install_url,
-                          web_app::InstallResultCode code);
+                          web_app::PendingAppManager::InstallResult result);
   void SetMigrationCookie(const GURL& app_url,
                           const GURL& migrated_to_app_url,
                           SuccessCallback callback);
diff --git a/chrome/browser/chromeos/arc/arc_optin_uma.cc b/chrome/browser/chromeos/arc/arc_optin_uma.cc
index 6828016d..68d75f0 100644
--- a/chrome/browser/chromeos/arc/arc_optin_uma.cc
+++ b/chrome/browser/chromeos/arc/arc_optin_uma.cc
@@ -214,7 +214,7 @@
   if (provisioning_result.is_timedout())
     return ProvisioningResultUMA::OVERALL_SIGN_IN_TIMEOUT;
 
-  const mojom::ArcSignInResult* result = provisioning_result.signin_result();
+  const mojom::ArcSignInResult* result = provisioning_result.sign_in_result();
   if (result->is_success()) {
     if (result->get_success() == mojom::ArcSignInSuccess::SUCCESS)
       return ProvisioningResultUMA::SUCCESS;
@@ -233,7 +233,7 @@
     switch (result->get_error()->get_general_error()) {
       MAP_GENERAL_ERROR(UNKNOWN_ERROR);
       MAP_GENERAL_ERROR(MOJO_VERSION_MISMATCH);
-      MAP_GENERAL_ERROR(PROVISIONING_TIMEOUT);
+      MAP_GENERAL_ERROR(GENERIC_PROVISIONING_TIMEOUT);
       MAP_GENERAL_ERROR(NO_NETWORK_CONNECTION);
       MAP_GENERAL_ERROR(CHROME_SERVER_COMMUNICATION_ERROR);
       MAP_GENERAL_ERROR(ARC_DISABLED);
@@ -243,28 +243,28 @@
 #undef MAP_GENERAL_ERROR
   }
 
-  if (result->get_error()->is_checkin_error()) {
-#define MAP_CHECKIN_ERROR(name)         \
-  case mojom::DeviceCheckInError::name: \
+  if (result->get_error()->is_check_in_error()) {
+#define MAP_CHECKIN_ERROR(name)      \
+  case mojom::GMSCheckInError::name: \
     return ProvisioningResultUMA::name
 
-    switch (result->get_error()->get_checkin_error()) {
-      MAP_CHECKIN_ERROR(DEVICE_CHECK_IN_FAILED);
-      MAP_CHECKIN_ERROR(DEVICE_CHECK_IN_TIMEOUT);
-      MAP_CHECKIN_ERROR(DEVICE_CHECK_IN_INTERNAL_ERROR);
+    switch (result->get_error()->get_check_in_error()) {
+      MAP_CHECKIN_ERROR(GMS_CHECK_IN_FAILED);
+      MAP_CHECKIN_ERROR(GMS_CHECK_IN_TIMEOUT);
+      MAP_CHECKIN_ERROR(GMS_CHECK_IN_INTERNAL_ERROR);
     }
 #undef MAP_CHECKIN_ERROR
   }
 
-  if (result->get_error()->is_gms_error()) {
-#define MAP_GMS_ERROR(name)   \
-  case mojom::GMSError::name: \
+  if (result->get_error()->is_sign_in_error()) {
+#define MAP_GMS_ERROR(name)         \
+  case mojom::GMSSignInError::name: \
     return ProvisioningResultUMA::name
 
-    switch (result->get_error()->get_gms_error()) {
-      MAP_GMS_ERROR(GMS_NETWORK_ERROR);
-      MAP_GMS_ERROR(GMS_SERVICE_UNAVAILABLE);
-      MAP_GMS_ERROR(GMS_BAD_AUTHENTICATION);
+    switch (result->get_error()->get_sign_in_error()) {
+      MAP_GMS_ERROR(GMS_SIGN_IN_NETWORK_ERROR);
+      MAP_GMS_ERROR(GMS_SIGN_IN_SERVICE_UNAVAILABLE);
+      MAP_GMS_ERROR(GMS_SIGN_IN_BAD_AUTHENTICATION);
       MAP_GMS_ERROR(GMS_SIGN_IN_FAILED);
       MAP_GMS_ERROR(GMS_SIGN_IN_TIMEOUT);
       MAP_GMS_ERROR(GMS_SIGN_IN_INTERNAL_ERROR);
@@ -285,14 +285,14 @@
   switch (result) {
     MAP_PROVISIONING_RESULT(SUCCESS);
     MAP_PROVISIONING_RESULT(UNKNOWN_ERROR);
-    MAP_PROVISIONING_RESULT(GMS_NETWORK_ERROR);
-    MAP_PROVISIONING_RESULT(GMS_SERVICE_UNAVAILABLE);
-    MAP_PROVISIONING_RESULT(GMS_BAD_AUTHENTICATION);
-    MAP_PROVISIONING_RESULT(DEVICE_CHECK_IN_FAILED);
+    MAP_PROVISIONING_RESULT(GMS_SIGN_IN_NETWORK_ERROR);
+    MAP_PROVISIONING_RESULT(GMS_SIGN_IN_SERVICE_UNAVAILABLE);
+    MAP_PROVISIONING_RESULT(GMS_SIGN_IN_BAD_AUTHENTICATION);
+    MAP_PROVISIONING_RESULT(GMS_CHECK_IN_FAILED);
     MAP_PROVISIONING_RESULT(MOJO_VERSION_MISMATCH);
-    MAP_PROVISIONING_RESULT(PROVISIONING_TIMEOUT);
-    MAP_PROVISIONING_RESULT(DEVICE_CHECK_IN_TIMEOUT);
-    MAP_PROVISIONING_RESULT(DEVICE_CHECK_IN_INTERNAL_ERROR);
+    MAP_PROVISIONING_RESULT(GENERIC_PROVISIONING_TIMEOUT);
+    MAP_PROVISIONING_RESULT(GMS_CHECK_IN_TIMEOUT);
+    MAP_PROVISIONING_RESULT(GMS_CHECK_IN_INTERNAL_ERROR);
     MAP_PROVISIONING_RESULT(GMS_SIGN_IN_FAILED);
     MAP_PROVISIONING_RESULT(GMS_SIGN_IN_TIMEOUT);
     MAP_PROVISIONING_RESULT(GMS_SIGN_IN_INTERNAL_ERROR);
diff --git a/chrome/browser/chromeos/arc/arc_optin_uma.h b/chrome/browser/chromeos/arc/arc_optin_uma.h
index 7326fb5..17aa45e 100644
--- a/chrome/browser/chromeos/arc/arc_optin_uma.h
+++ b/chrome/browser/chromeos/arc/arc_optin_uma.h
@@ -114,22 +114,22 @@
   UNKNOWN_ERROR = 1,
 
   // GMS errors. More errors defined below.
-  GMS_NETWORK_ERROR = 2,
-  GMS_SERVICE_UNAVAILABLE = 3,
-  GMS_BAD_AUTHENTICATION = 4,
+  GMS_SIGN_IN_NETWORK_ERROR = 2,
+  GMS_SIGN_IN_SERVICE_UNAVAILABLE = 3,
+  GMS_SIGN_IN_BAD_AUTHENTICATION = 4,
 
   // Check in error. More errors defined below.
-  DEVICE_CHECK_IN_FAILED = 5,
+  GMS_CHECK_IN_FAILED = 5,
 
   // Mojo errors.
   MOJO_VERSION_MISMATCH = 7,
 
-  // Misc
-  PROVISIONING_TIMEOUT = 8,
+  // ARC did not finish provisioning within a reasonable amount of time.
+  GENERIC_PROVISIONING_TIMEOUT = 8,
 
   // Check in error.
-  DEVICE_CHECK_IN_TIMEOUT = 9,
-  DEVICE_CHECK_IN_INTERNAL_ERROR = 10,
+  GMS_CHECK_IN_TIMEOUT = 9,
+  GMS_CHECK_IN_INTERNAL_ERROR = 10,
 
   // GMS errors:
   GMS_SIGN_IN_FAILED = 11,
diff --git a/chrome/browser/chromeos/arc/session/arc_provisioning_result.cc b/chrome/browser/chromeos/arc/session/arc_provisioning_result.cc
index d8d1263..309120e 100644
--- a/chrome/browser/chromeos/arc/session/arc_provisioning_result.cc
+++ b/chrome/browser/chromeos/arc/session/arc_provisioning_result.cc
@@ -13,38 +13,38 @@
     : result_(std::move(result)) {}
 ArcProvisioningResult::ArcProvisioningResult(ArcStopReason reason)
     : result_(reason) {}
-ArcProvisioningResult::ArcProvisioningResult(OverallSignInTimeout timeout)
+ArcProvisioningResult::ArcProvisioningResult(ChromeProvisioningTimeout timeout)
     : result_(timeout) {}
 ArcProvisioningResult::ArcProvisioningResult(ArcProvisioningResult&& other) =
     default;
 ArcProvisioningResult::~ArcProvisioningResult() = default;
 
-bool ArcProvisioningResult::has_signin_result() const {
+bool ArcProvisioningResult::has_sign_in_result() const {
   return absl::holds_alternative<mojom::ArcSignInResultPtr>(result_);
 }
 
-const mojom::ArcSignInResult* ArcProvisioningResult::signin_result() const {
-  DCHECK(has_signin_result());
+const mojom::ArcSignInResult* ArcProvisioningResult::sign_in_result() const {
+  DCHECK(has_sign_in_result());
   return absl::get<mojom::ArcSignInResultPtr>(result_).get();
 }
 
-bool ArcProvisioningResult::has_signin_error() const {
-  return has_signin_result() && signin_result()->is_error();
+bool ArcProvisioningResult::has_sign_in_error() const {
+  return has_sign_in_result() && sign_in_result()->is_error();
 }
 
-const mojom::ArcSignInError* ArcProvisioningResult::signin_error() const {
-  DCHECK(has_signin_error());
-  return signin_result()->get_error().get();
+const mojom::ArcSignInError* ArcProvisioningResult::sign_in_error() const {
+  DCHECK(has_sign_in_error());
+  return sign_in_result()->get_error().get();
 }
 
 bool ArcProvisioningResult::is_success() const {
-  return has_signin_result() && signin_result()->is_success();
+  return has_sign_in_result() && sign_in_result()->is_success();
 }
 
 bool ArcProvisioningResult::has_general_error(
     mojom::GeneralSignInError error) const {
-  return has_signin_error() && signin_error()->is_general_error() &&
-         signin_error()->get_general_error() == error;
+  return has_sign_in_error() && sign_in_error()->is_general_error() &&
+         sign_in_error()->get_general_error() == error;
 }
 
 bool ArcProvisioningResult::is_stopped() const {
@@ -57,7 +57,7 @@
 }
 
 bool ArcProvisioningResult::is_timedout() const {
-  return absl::holds_alternative<OverallSignInTimeout>(result_);
+  return absl::holds_alternative<ChromeProvisioningTimeout>(result_);
 }
 
 std::ostream& operator<<(std::ostream& os,
diff --git a/chrome/browser/chromeos/arc/session/arc_provisioning_result.h b/chrome/browser/chromeos/arc/session/arc_provisioning_result.h
index 5edd44c6..3fc6931 100644
--- a/chrome/browser/chromeos/arc/session/arc_provisioning_result.h
+++ b/chrome/browser/chromeos/arc/session/arc_provisioning_result.h
@@ -16,28 +16,28 @@
 namespace arc {
 
 // A struct that represents timeout of ARC provisioning from Chrome.
-struct OverallSignInTimeout {};
+struct ChromeProvisioningTimeout {};
 
 // A class that encapsulates the result of provisioning ARC.
 class ArcProvisioningResult {
  public:
   explicit ArcProvisioningResult(mojom::ArcSignInResultPtr result);
   explicit ArcProvisioningResult(ArcStopReason reason);
-  explicit ArcProvisioningResult(OverallSignInTimeout timeout);
+  explicit ArcProvisioningResult(ChromeProvisioningTimeout timeout);
   ArcProvisioningResult(ArcProvisioningResult&& other);
   ~ArcProvisioningResult();
 
   // Returns true if signin_result from ARC is present.
-  bool has_signin_result() const;
+  bool has_sign_in_result() const;
 
   // Returns the result of provisioning from inside ARC.
-  const mojom::ArcSignInResult* signin_result() const;
+  const mojom::ArcSignInResult* sign_in_result() const;
 
   // Returns true if signin_result is present with an error.
-  bool has_signin_error() const;
+  bool has_sign_in_error() const;
 
   // Returns the error of signin_result coming from ARC.
-  const mojom::ArcSignInError* signin_error() const;
+  const mojom::ArcSignInError* sign_in_error() const;
 
   // Returns true if result has given general sign-in error.
   bool has_general_error(mojom::GeneralSignInError error) const;
@@ -55,7 +55,9 @@
   bool is_timedout() const;
 
  private:
-  absl::variant<mojom::ArcSignInResultPtr, ArcStopReason, OverallSignInTimeout>
+  absl::variant<mojom::ArcSignInResultPtr,
+                ArcStopReason,
+                ChromeProvisioningTimeout>
       result_;
 };
 
diff --git a/chrome/browser/chromeos/arc/session/arc_provisioning_result_unittest.cc b/chrome/browser/chromeos/arc/session/arc_provisioning_result_unittest.cc
index 20d7dafb..c1840e0 100644
--- a/chrome/browser/chromeos/arc/session/arc_provisioning_result_unittest.cc
+++ b/chrome/browser/chromeos/arc/session/arc_provisioning_result_unittest.cc
@@ -11,21 +11,21 @@
 
 TEST(ArcProvisioningResultTest, HasSignInResult) {
   ArcProvisioningResult result1(ArcStopReason::CRASH);
-  EXPECT_FALSE(result1.has_signin_result());
+  EXPECT_FALSE(result1.has_sign_in_result());
 
   ArcProvisioningResult result2(arc::mojom::ArcSignInResult::NewSuccess(
       arc::mojom::ArcSignInSuccess::SUCCESS));
-  EXPECT_TRUE(result2.has_signin_result());
+  EXPECT_TRUE(result2.has_sign_in_result());
 }
 
 TEST(ArcProvisioningResultTest, HasSignInError) {
   ArcProvisioningResult result1(ArcStopReason::CRASH);
-  EXPECT_FALSE(result1.has_signin_error());
+  EXPECT_FALSE(result1.has_sign_in_error());
 
   ArcProvisioningResult result2(arc::mojom::ArcSignInResult::NewError(
       arc::mojom::ArcSignInError::NewGeneralError(
           arc::mojom::GeneralSignInError::CHROME_SERVER_COMMUNICATION_ERROR)));
-  EXPECT_TRUE(result2.has_signin_error());
+  EXPECT_TRUE(result2.has_sign_in_error());
 }
 
 TEST(ArcProvisioningResultTest, Success) {
@@ -63,7 +63,7 @@
   ArcProvisioningResult result1(ArcStopReason::CRASH);
   EXPECT_FALSE(result1.is_timedout());
 
-  ArcProvisioningResult result2(OverallSignInTimeout{});
+  ArcProvisioningResult result2(ChromeProvisioningTimeout{});
   EXPECT_TRUE(result2.is_timedout());
 }
 
diff --git a/chrome/browser/chromeos/arc/session/arc_session_manager.cc b/chrome/browser/chromeos/arc/session/arc_session_manager.cc
index 89b0083..b61980e 100644
--- a/chrome/browser/chromeos/arc/session/arc_session_manager.cc
+++ b/chrome/browser/chromeos/arc/session/arc_session_manager.cc
@@ -292,25 +292,25 @@
   return true;
 }
 
-int GetSignInErrorCode(const arc::mojom::ArcSignInError* signin_error) {
-  if (!signin_error)
+int GetSignInErrorCode(const arc::mojom::ArcSignInError* sign_in_error) {
+  if (!sign_in_error)
     return 0;
 
 #define IF_ERROR_RETURN_CODE(name, type)                          \
-  if (signin_error->is_##name()) {                                \
+  if (sign_in_error->is_##name()) {                               \
     return static_cast<std::underlying_type_t<arc::mojom::type>>( \
-        signin_error->get_##name());                              \
+        sign_in_error->get_##name());                             \
   }
 
   IF_ERROR_RETURN_CODE(cloud_provision_flow_error, CloudProvisionFlowError)
   IF_ERROR_RETURN_CODE(general_error, GeneralSignInError)
-  IF_ERROR_RETURN_CODE(checkin_error, DeviceCheckInError)
-  IF_ERROR_RETURN_CODE(gms_error, GMSError)
+  IF_ERROR_RETURN_CODE(check_in_error, GMSCheckInError)
+  IF_ERROR_RETURN_CODE(sign_in_error, GMSSignInError)
 #undef IF_ERROR_RETURN_CODE
 
   LOG(ERROR) << "Unknown sign-in error "
              << std::underlying_type_t<arc::mojom::ArcSignInError::Tag>(
-                    signin_error->which())
+                    sign_in_error->which())
              << ".";
 
   return -1;
@@ -578,8 +578,8 @@
     return;
   }
 
-  const mojom::ArcSignInError* signin_error =
-      result.has_signin_error() ? result.signin_error() : nullptr;
+  const mojom::ArcSignInError* sign_in_error =
+      result.has_sign_in_error() ? result.sign_in_error() : nullptr;
 
   // Due asynchronous nature of stopping the ARC instance,
   // OnProvisioningFinished may arrive after setting the |State::STOPPED| state
@@ -625,9 +625,9 @@
     UpdateProvisioningTiming(base::TimeTicks::Now() - sign_in_start_time_,
                              provisioning_successful, profile_);
     UpdateProvisioningResultUMA(GetProvisioningResultUMA(result), profile_);
-    if (signin_error && signin_error->is_cloud_provision_flow_error()) {
+    if (sign_in_error && sign_in_error->is_cloud_provision_flow_error()) {
       UpdateCloudProvisionFlowErrorUMA(
-          signin_error->get_cloud_provision_flow_error(), profile_);
+          sign_in_error->get_cloud_provision_flow_error(), profile_);
     }
 
     if (!provisioning_successful)
@@ -670,20 +670,21 @@
 
   ArcSupportHost::Error support_error;
   VLOG(1) << "ARC provisioning failed: " << result << ".";
-  if (signin_error && signin_error->is_gms_error() &&
-      signin_error->get_gms_error() == mojom::GMSError::GMS_NETWORK_ERROR) {
+  if (sign_in_error && sign_in_error->is_sign_in_error() &&
+      sign_in_error->get_sign_in_error() ==
+          mojom::GMSSignInError::GMS_SIGN_IN_NETWORK_ERROR) {
     support_error = ArcSupportHost::Error::SIGN_IN_NETWORK_ERROR;
-  } else if (signin_error && signin_error->is_gms_error() &&
-             signin_error->get_gms_error() ==
-                 mojom::GMSError::GMS_BAD_AUTHENTICATION) {
+  } else if (sign_in_error && sign_in_error->is_sign_in_error() &&
+             sign_in_error->get_sign_in_error() ==
+                 mojom::GMSSignInError::GMS_SIGN_IN_BAD_AUTHENTICATION) {
     support_error = ArcSupportHost::Error::SIGN_IN_BAD_AUTHENTICATION_ERROR;
-  } else if (signin_error && signin_error->is_gms_error()) {
+  } else if (sign_in_error && sign_in_error->is_sign_in_error()) {
     support_error = ArcSupportHost::Error::SIGN_IN_SERVICE_UNAVAILABLE_ERROR;
-  } else if (signin_error && signin_error->is_checkin_error()) {
+  } else if (sign_in_error && sign_in_error->is_check_in_error()) {
     support_error = ArcSupportHost::Error::SIGN_IN_GMS_NOT_AVAILABLE_ERROR;
-  } else if (signin_error && signin_error->is_cloud_provision_flow_error()) {
+  } else if (sign_in_error && sign_in_error->is_cloud_provision_flow_error()) {
     support_error = GetCloudProvisionFlowError(
-        signin_error->get_cloud_provision_flow_error());
+        sign_in_error->get_cloud_provision_flow_error());
   } else if (result.has_general_error(mojom::GeneralSignInError::
                                           CHROME_SERVER_COMMUNICATION_ERROR)) {
     support_error = ArcSupportHost::Error::SERVER_COMMUNICATION_ERROR;
@@ -714,7 +715,7 @@
     ShutdownSession();
   }
 
-  if ((signin_error && signin_error->is_cloud_provision_flow_error()) ||
+  if ((sign_in_error && sign_in_error->is_cloud_provision_flow_error()) ||
       // OVERALL_SIGN_IN_TIMEOUT might be an indication that ARC believes it is
       // fully setup, but Chrome does not.
       result.is_timedout() ||
@@ -728,8 +729,8 @@
   if (support_error == ArcSupportHost::Error::SIGN_IN_UNKNOWN_ERROR) {
     error_code = static_cast<std::underlying_type_t<ProvisioningResultUMA>>(
         GetProvisioningResultUMA(result));
-  } else if (signin_error) {
-    error_code = GetSignInErrorCode(signin_error);
+  } else if (sign_in_error) {
+    error_code = GetSignInErrorCode(sign_in_error);
   }
   ShowArcSupportHostError({support_error, error_code} /* error_info */,
                           true /* should_show_send_feedback */);
@@ -917,7 +918,7 @@
 
 void ArcSessionManager::OnArcSignInTimeout() {
   LOG(ERROR) << "Timed out waiting for first sign in.";
-  OnProvisioningFinished(ArcProvisioningResult(OverallSignInTimeout()));
+  OnProvisioningFinished(ArcProvisioningResult(ChromeProvisioningTimeout()));
 }
 
 void ArcSessionManager::CancelAuthCode() {
diff --git a/chrome/browser/chromeos/arc/session/arc_session_manager_unittest.cc b/chrome/browser/chromeos/arc/session/arc_session_manager_unittest.cc
index b9f90bcd..c476016 100644
--- a/chrome/browser/chromeos/arc/session/arc_session_manager_unittest.cc
+++ b/chrome/browser/chromeos/arc/session/arc_session_manager_unittest.cc
@@ -691,8 +691,8 @@
 
   // Report failure.
   arc::mojom::ArcSignInResultPtr result = arc::mojom::ArcSignInResult::NewError(
-      arc::mojom::ArcSignInError::NewGmsError(
-          arc::mojom::GMSError::GMS_NETWORK_ERROR));
+      arc::mojom::ArcSignInError::NewSignInError(
+          arc::mojom::GMSSignInError::GMS_SIGN_IN_NETWORK_ERROR));
   arc_session_manager()->OnProvisioningFinished(
       ArcProvisioningResult(std::move(result)));
 
@@ -897,8 +897,8 @@
 
   // Report some failure that does not stop the bridge.
   arc::mojom::ArcSignInResultPtr result = arc::mojom::ArcSignInResult::NewError(
-      arc::mojom::ArcSignInError::NewGmsError(
-          arc::mojom::GMSError::GMS_SIGN_IN_FAILED));
+      arc::mojom::ArcSignInError::NewSignInError(
+          arc::mojom::GMSSignInError::GMS_SIGN_IN_FAILED));
   arc_session_manager()->OnProvisioningFinished(
       ArcProvisioningResult(std::move(result)));
   EXPECT_EQ(ArcSessionManager::State::ACTIVE, arc_session_manager()->state());
@@ -1636,11 +1636,11 @@
   bool data_removed;
 
   absl::variant<arc::mojom::GeneralSignInError,
-                arc::mojom::GMSError,
-                arc::mojom::DeviceCheckInError,
+                arc::mojom::GMSSignInError,
+                arc::mojom::GMSCheckInError,
                 arc::mojom::CloudProvisionFlowError,
                 ArcStopReason,
-                OverallSignInTimeout>
+                ChromeProvisioningTimeout>
       error;
 };
 
@@ -1648,29 +1648,29 @@
     {ArcSessionRetryTestParam::Negotiation::REQUIRED, true, true,
      arc::mojom::GeneralSignInError::UNKNOWN_ERROR},
     {ArcSessionRetryTestParam::Negotiation::REQUIRED, true, false,
-     arc::mojom::GMSError::GMS_NETWORK_ERROR},
+     arc::mojom::GMSSignInError::GMS_SIGN_IN_NETWORK_ERROR},
     {ArcSessionRetryTestParam::Negotiation::REQUIRED, true, false,
-     arc::mojom::GMSError::GMS_SERVICE_UNAVAILABLE},
+     arc::mojom::GMSSignInError::GMS_SIGN_IN_SERVICE_UNAVAILABLE},
     {ArcSessionRetryTestParam::Negotiation::REQUIRED, true, false,
-     arc::mojom::GMSError::GMS_BAD_AUTHENTICATION},
+     arc::mojom::GMSSignInError::GMS_SIGN_IN_BAD_AUTHENTICATION},
     {ArcSessionRetryTestParam::Negotiation::REQUIRED, true, false,
-     arc::mojom::DeviceCheckInError::DEVICE_CHECK_IN_FAILED},
+     arc::mojom::GMSCheckInError::GMS_CHECK_IN_FAILED},
     {ArcSessionRetryTestParam::Negotiation::SKIPPED, true, true,
      arc::mojom::CloudProvisionFlowError::ERROR_OTHER},
     {ArcSessionRetryTestParam::Negotiation::REQUIRED, true, false,
      arc::mojom::GeneralSignInError::MOJO_VERSION_MISMATCH},
     {ArcSessionRetryTestParam::Negotiation::REQUIRED, true, false,
-     arc::mojom::GeneralSignInError::PROVISIONING_TIMEOUT},
+     arc::mojom::GeneralSignInError::GENERIC_PROVISIONING_TIMEOUT},
     {ArcSessionRetryTestParam::Negotiation::REQUIRED, true, false,
-     arc::mojom::DeviceCheckInError::DEVICE_CHECK_IN_TIMEOUT},
+     arc::mojom::GMSCheckInError::GMS_CHECK_IN_TIMEOUT},
     {ArcSessionRetryTestParam::Negotiation::REQUIRED, true, false,
-     arc::mojom::DeviceCheckInError::DEVICE_CHECK_IN_INTERNAL_ERROR},
+     arc::mojom::GMSCheckInError::GMS_CHECK_IN_INTERNAL_ERROR},
     {ArcSessionRetryTestParam::Negotiation::REQUIRED, true, false,
-     arc::mojom::GMSError::GMS_SIGN_IN_FAILED},
+     arc::mojom::GMSSignInError::GMS_SIGN_IN_FAILED},
     {ArcSessionRetryTestParam::Negotiation::REQUIRED, true, false,
-     arc::mojom::GMSError::GMS_SIGN_IN_TIMEOUT},
+     arc::mojom::GMSSignInError::GMS_SIGN_IN_TIMEOUT},
     {ArcSessionRetryTestParam::Negotiation::REQUIRED, true, false,
-     arc::mojom::GMSError::GMS_SIGN_IN_INTERNAL_ERROR},
+     arc::mojom::GMSSignInError::GMS_SIGN_IN_INTERNAL_ERROR},
     {ArcSessionRetryTestParam::Negotiation::SKIPPED, true, true,
      arc::mojom::CloudProvisionFlowError::ERROR_TIMEOUT},
     {ArcSessionRetryTestParam::Negotiation::SKIPPED, true, true,
@@ -1678,7 +1678,7 @@
     {ArcSessionRetryTestParam::Negotiation::REQUIRED, false, false,
      ArcStopReason::CRASH},
     {ArcSessionRetryTestParam::Negotiation::REQUIRED, true, true,
-     OverallSignInTimeout{}},
+     ChromeProvisioningTimeout{}},
     {ArcSessionRetryTestParam::Negotiation::REQUIRED, false, false,
      arc::mojom::GeneralSignInError::CHROME_SERVER_COMMUNICATION_ERROR},
     {ArcSessionRetryTestParam::Negotiation::REQUIRED, true, false,
@@ -1752,10 +1752,10 @@
   arc_session_manager()->StartArcForTesting();
   EXPECT_EQ(ArcSessionManager::State::ACTIVE, arc_session_manager()->state());
 
-  absl::variant<arc::mojom::GeneralSignInError, arc::mojom::GMSError,
-                arc::mojom::DeviceCheckInError,
+  absl::variant<arc::mojom::GeneralSignInError, arc::mojom::GMSSignInError,
+                arc::mojom::GMSCheckInError,
                 arc::mojom::CloudProvisionFlowError, ArcStopReason,
-                OverallSignInTimeout>
+                ChromeProvisioningTimeout>
       error = std::move(GetParam().error);
 
   if (absl::holds_alternative<arc::mojom::CloudProvisionFlowError>(error)) {
@@ -1771,19 +1771,19 @@
         arc::mojom::ArcSignInError::NewGeneralError(
             absl::get<arc::mojom::GeneralSignInError>(error))));
     arc_session_manager()->OnProvisioningFinished(result);
-  } else if (absl::holds_alternative<arc::mojom::GMSError>(error)) {
+  } else if (absl::holds_alternative<arc::mojom::GMSSignInError>(error)) {
     ArcProvisioningResult result(arc::mojom::ArcSignInResult::NewError(
-        arc::mojom::ArcSignInError::NewGmsError(
-            absl::get<arc::mojom::GMSError>(error))));
+        arc::mojom::ArcSignInError::NewSignInError(
+            absl::get<arc::mojom::GMSSignInError>(error))));
     arc_session_manager()->OnProvisioningFinished(result);
-  } else if (absl::holds_alternative<arc::mojom::DeviceCheckInError>(error)) {
+  } else if (absl::holds_alternative<arc::mojom::GMSCheckInError>(error)) {
     ArcProvisioningResult result(arc::mojom::ArcSignInResult::NewError(
-        arc::mojom::ArcSignInError::NewCheckinError(
-            absl::get<arc::mojom::DeviceCheckInError>(error))));
+        arc::mojom::ArcSignInError::NewCheckInError(
+            absl::get<arc::mojom::GMSCheckInError>(error))));
     arc_session_manager()->OnProvisioningFinished(result);
-  } else if (absl::holds_alternative<OverallSignInTimeout>(error)) {
+  } else if (absl::holds_alternative<ChromeProvisioningTimeout>(error)) {
     arc_session_manager()->OnProvisioningFinished(
-        ArcProvisioningResult(OverallSignInTimeout{}));
+        ArcProvisioningResult(ChromeProvisioningTimeout{}));
   }
 
   // In case of permanent error data removal request is scheduled.
diff --git a/chrome/browser/chromeos/crostini/crostini_manager.cc b/chrome/browser/chromeos/crostini/crostini_manager.cc
index 894a7e0..caf0a4d 100644
--- a/chrome/browser/chromeos/crostini/crostini_manager.cc
+++ b/chrome/browser/chromeos/crostini/crostini_manager.cc
@@ -1215,7 +1215,7 @@
     std::move(callback).Run(CrostiniResult::CLIENT_ERROR);
     return;
   }
-  if (!GetCiceroneClient()->IsLxdContainerStartingSignalConnected()) {
+  if (!GetCiceroneClient()->IsStartLxdProgressSignalConnected()) {
     LOG(ERROR) << "Async call to StartLxd can't complete when signals "
                   "are not connected.";
     std::move(callback).Run(CrostiniResult::CLIENT_ERROR);
diff --git a/chrome/browser/chromeos/full_restore/full_restore_service.cc b/chrome/browser/chromeos/full_restore/full_restore_service.cc
index f5aff1f..2c83e76 100644
--- a/chrome/browser/chromeos/full_restore/full_restore_service.cc
+++ b/chrome/browser/chromeos/full_restore/full_restore_service.cc
@@ -4,19 +4,93 @@
 
 #include "chrome/browser/chromeos/full_restore/full_restore_service.h"
 
+#include "ash/public/cpp/notification_utils.h"
+#include "base/strings/string_util.h"
+#include "chrome/app/vector_icons/vector_icons.h"
 #include "chrome/browser/chromeos/full_restore/full_restore_service_factory.h"
+#include "chrome/browser/chromeos/profiles/profile_helper.h"
+#include "chrome/browser/notifications/notification_display_service.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/grit/chromium_strings.h"
+#include "chrome/grit/generated_resources.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/message_center/public/cpp/notification.h"
+
+namespace {
+
+constexpr char kRestoreForCrashNotificationId[] =
+    "restore_for_crash_notification";
+
+}  // namespace
 
 namespace chromeos {
 namespace full_restore {
 
-FullRestoreService::FullRestoreService(Profile* profile) {
-  // TODO(crbug.com/909794):If the system crashed before reboot, show the
-  // notification notification. Otherwise, read |kRestoreAppsAndPagesPrefName|
-  // from the user pref.
+FullRestoreService::FullRestoreService(Profile* profile) : profile_(profile) {
+  // If the system crashed before reboot, show the restore notification.
+  if (profile->GetLastSessionExitType() == Profile::EXIT_CRASHED) {
+    ShowRestoreNotification(kRestoreForCrashNotificationId);
+    return;
+  }
+
+  // TODO(crbug.com/909794):On startup for normal reboot, read
+  // |kRestoreAppsAndPagesPrefName| from the user pref, show the restore
+  // notification for the 'ask every time' option.
 }
 
 FullRestoreService::~FullRestoreService() = default;
 
+void FullRestoreService::Shutdown() {
+  is_shut_down_ = true;
+}
+
+void FullRestoreService::ShowRestoreNotification(const std::string& id) {
+  message_center::RichNotificationData notification_data;
+  message_center::ButtonInfo restore_button(l10n_util::GetStringUTF16(
+      base::ToUpperASCII(IDS_RESTORE_NOTIFICATION_RESTORE_BUTTON)));
+  notification_data.buttons.push_back(restore_button);
+  message_center::ButtonInfo cancel_button(l10n_util::GetStringUTF16(
+      base::ToUpperASCII(IDS_RESTORE_NOTIFICATION_CANCEL_BUTTON)));
+  notification_data.buttons.push_back(cancel_button);
+
+  std::unique_ptr<message_center::Notification> notification =
+      ash::CreateSystemNotification(
+          message_center::NOTIFICATION_TYPE_SIMPLE, id,
+          l10n_util::GetStringUTF16(IDS_RESTORE_NOTIFICATION_TITLE),
+          l10n_util::GetStringUTF16(IDS_RESTORE_FOR_CRASH_NOTIFICATION_MESSAGE),
+          l10n_util::GetStringUTF16(IDS_RESTORE_NOTIFICATION_DISPLAY_SOURCE),
+          GURL(),
+          message_center::NotifierId(
+              message_center::NotifierType::SYSTEM_COMPONENT,
+              kRestoreForCrashNotificationId),
+          notification_data,
+          base::MakeRefCounted<message_center::HandleNotificationClickDelegate>(
+              base::BindRepeating(
+                  &FullRestoreService::HandleRestoreNotificationClicked,
+                  weak_ptr_factory_.GetWeakPtr(),
+                  kRestoreForCrashNotificationId)),
+          kFullRestoreNotificationIcon,
+          message_center::SystemNotificationWarningLevel::NORMAL);
+  notification->set_priority(message_center::SYSTEM_PRIORITY);
+
+  auto* notification_display_service =
+      NotificationDisplayService::GetForProfile(profile_);
+  DCHECK(notification_display_service);
+  notification_display_service->Display(NotificationHandler::Type::TRANSIENT,
+                                        *notification,
+                                        /*metadata=*/nullptr);
+}
+
+void FullRestoreService::HandleRestoreNotificationClicked(
+    const std::string& id,
+    base::Optional<int> button_index) {
+  // TODO(crbug.com/909794):Get the user selection and start the restoration.
+
+  if (!is_shut_down_) {
+    NotificationDisplayService::GetForProfile(profile_)->Close(
+        NotificationHandler::Type::TRANSIENT, id);
+  }
+}
+
 }  // namespace full_restore
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/full_restore/full_restore_service.h b/chrome/browser/chromeos/full_restore/full_restore_service.h
index bc98edc..655df5b 100644
--- a/chrome/browser/chromeos/full_restore/full_restore_service.h
+++ b/chrome/browser/chromeos/full_restore/full_restore_service.h
@@ -5,6 +5,8 @@
 #ifndef CHROME_BROWSER_CHROMEOS_FULL_RESTORE_FULL_RESTORE_SERVICE_H_
 #define CHROME_BROWSER_CHROMEOS_FULL_RESTORE_FULL_RESTORE_SERVICE_H_
 
+#include "base/memory/weak_ptr.h"
+#include "base/optional.h"
 #include "components/keyed_service/core/keyed_service.h"
 
 class Profile;
@@ -32,6 +34,22 @@
 
   FullRestoreService(const FullRestoreService&) = delete;
   FullRestoreService& operator=(const FullRestoreService&) = delete;
+
+ private:
+  // KeyedService overrides.
+  void Shutdown() override;
+
+  // Show the restore notification on startup.
+  void ShowRestoreNotification(const std::string& id);
+
+  void HandleRestoreNotificationClicked(const std::string& id,
+                                        base::Optional<int> button_index);
+
+  Profile* profile_ = nullptr;
+
+  bool is_shut_down_ = false;
+
+  base::WeakPtrFactory<FullRestoreService> weak_ptr_factory_{this};
 };
 
 }  // namespace full_restore
diff --git a/chrome/browser/chromeos/full_restore/full_restore_service_factory.cc b/chrome/browser/chromeos/full_restore/full_restore_service_factory.cc
index 9ea4936..b505253b 100644
--- a/chrome/browser/chromeos/full_restore/full_restore_service_factory.cc
+++ b/chrome/browser/chromeos/full_restore/full_restore_service_factory.cc
@@ -7,6 +7,7 @@
 #include "ash/public/cpp/ash_features.h"
 #include "chrome/browser/chromeos/full_restore/full_restore_service.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
+#include "chrome/browser/notifications/notification_display_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 
@@ -40,7 +41,9 @@
 FullRestoreServiceFactory::FullRestoreServiceFactory()
     : BrowserContextKeyedServiceFactory(
           "FullRestoreService",
-          BrowserContextDependencyManager::GetInstance()) {}
+          BrowserContextDependencyManager::GetInstance()) {
+  DependsOn(NotificationDisplayServiceFactory::GetInstance());
+}
 
 FullRestoreServiceFactory::~FullRestoreServiceFactory() = default;
 
diff --git a/chrome/browser/chromeos/input_method/input_method_engine_unittest.cc b/chrome/browser/chromeos/input_method/input_method_engine_unittest.cc
index 982e692..163b99ec 100644
--- a/chrome/browser/chromeos/input_method/input_method_engine_unittest.cc
+++ b/chrome/browser/chromeos/input_method/input_method_engine_unittest.cc
@@ -53,7 +53,6 @@
 };
 
 void InitInputMethod() {
-  auto* comp_ime_manager = new ComponentExtensionIMEManager;
   auto* delegate = new MockComponentExtensionIMEManagerDelegate;
 
   ComponentExtensionIME ext1;
@@ -68,7 +67,8 @@
   std::vector<ComponentExtensionIME> ime_list;
   ime_list.push_back(ext1);
   delegate->set_ime_list(ime_list);
-  comp_ime_manager->Initialize(
+
+  auto* comp_ime_manager = new ComponentExtensionIMEManager(
       std::unique_ptr<ComponentExtensionIMEManagerDelegate>(delegate));
 
   auto* manager = new MockInputMethodManagerImpl;
diff --git a/chrome/browser/chromeos/input_method/input_method_manager_impl.cc b/chrome/browser/chromeos/input_method/input_method_manager_impl.cc
index dc9ff1f..658cde08 100644
--- a/chrome/browser/chromeos/input_method/input_method_manager_impl.cc
+++ b/chrome/browser/chromeos/input_method/input_method_manager_impl.cc
@@ -960,7 +960,6 @@
     bool enable_extension_loading)
     : delegate_(std::move(delegate)),
       util_(delegate_.get()),
-      component_extension_ime_manager_(new ComponentExtensionIMEManager()),
       enable_extension_loading_(enable_extension_loading),
       features_enabled_state_(InputMethodManager::FEATURE_ALL) {
   if (IsRunningAsSystemCompositor()) {
@@ -970,8 +969,9 @@
     keyboard_ = std::make_unique<FakeImeKeyboard>();
   }
   // Initializes the system IME list.
-  component_extension_ime_manager_->Initialize(
-      std::move(component_extension_ime_manager_delegate));
+  component_extension_ime_manager_ =
+      std::make_unique<ComponentExtensionIMEManager>(
+          std::move(component_extension_ime_manager_delegate));
   const InputMethodDescriptors& descriptors =
       component_extension_ime_manager_->GetAllIMEAsInputMethodDescriptor();
   util_.ResetInputMethods(descriptors);
diff --git a/chrome/browser/chromeos/login/enrollment/enterprise_enrollment_helper_impl.cc b/chrome/browser/chromeos/login/enrollment/enterprise_enrollment_helper_impl.cc
index 99b1b7a..3c25051 100644
--- a/chrome/browser/chromeos/login/enrollment/enterprise_enrollment_helper_impl.cc
+++ b/chrome/browser/chromeos/login/enrollment/enterprise_enrollment_helper_impl.cc
@@ -26,6 +26,8 @@
 #include "chrome/browser/policy/enrollment_status.h"
 #include "chromeos/constants/chromeos_switches.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/dbus/tpm_manager/tpm_manager.pb.h"
+#include "chromeos/dbus/tpm_manager/tpm_manager_client.h"
 #include "components/policy/core/common/cloud/cloud_policy_constants.h"
 #include "components/policy/core/common/cloud/dm_auth.h"
 #include "components/policy/proto/device_management_backend.pb.h"
@@ -78,7 +80,8 @@
 EnterpriseEnrollmentHelperImpl::EnterpriseEnrollmentHelperImpl() {
   // Init the TPM if it has not been done until now (in debug build we might
   // have not done that yet).
-  CryptohomeClient::Get()->TpmCanAttemptOwnership(base::DoNothing());
+  TpmManagerClient::Get()->TakeOwnership(::tpm_manager::TakeOwnershipRequest(),
+                                         base::DoNothing());
 }
 
 EnterpriseEnrollmentHelperImpl::~EnterpriseEnrollmentHelperImpl() {
diff --git a/chrome/browser/chromeos/preferences_unittest.cc b/chrome/browser/chromeos/preferences_unittest.cc
index 237f7f32..b4bb609b 100644
--- a/chrome/browser/chromeos/preferences_unittest.cc
+++ b/chrome/browser/chromeos/preferences_unittest.cc
@@ -254,8 +254,8 @@
     std::unique_ptr<ComponentExtensionIMEManagerDelegate> delegate(
         mock_delegate);
     std::unique_ptr<ComponentExtensionIMEManager>
-        component_extension_ime_manager(new ComponentExtensionIMEManager);
-    component_extension_ime_manager->Initialize(std::move(delegate));
+        component_extension_ime_manager(
+            new ComponentExtensionIMEManager(std::move(delegate)));
 
     // Add the ComponentExtensionIMEManager to the mock InputMethodManager.
     mock_manager_->SetComponentExtensionIMEManager(
diff --git a/chrome/browser/devtools/protocol/security_handler.cc b/chrome/browser/devtools/protocol/security_handler.cc
index 472686c..5fb1006 100644
--- a/chrome/browser/devtools/protocol/security_handler.cc
+++ b/chrome/browser/devtools/protocol/security_handler.cc
@@ -43,9 +43,7 @@
     case security_state::NONE:
       return protocol::Security::SecurityStateEnum::Neutral;
     case security_state::WARNING:
-      if (security_state::ShouldShowDangerTriangleForWarningLevel())
-        return protocol::Security::SecurityStateEnum::Insecure;
-      return protocol::Security::SecurityStateEnum::Neutral;
+      return protocol::Security::SecurityStateEnum::Insecure;
     case security_state::SECURE_WITH_POLICY_INSTALLED_CERT:
     case security_state::SECURE:
       return protocol::Security::SecurityStateEnum::Secure;
diff --git a/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc b/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc
index 2dfb43e..bf90bae 100644
--- a/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc
+++ b/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc
@@ -98,6 +98,7 @@
 #include "extensions/common/api/declarative_net_request/test_utils.h"
 #include "extensions/common/api/extension_action/action_info.h"
 #include "extensions/common/constants.h"
+#include "extensions/common/error_utils.h"
 #include "extensions/common/extension_features.h"
 #include "extensions/common/extension_id.h"
 #include "extensions/common/file_util.h"
@@ -396,17 +397,20 @@
                 UnorderedElementsAreArray(expected_ruleset_ids));
   }
 
-  void SetActionsAsBadgeText(const ExtensionId& extension_id, bool pref) {
-    const char* pref_string = pref ? "true" : "false";
+  std::string SetExtensionActionOptions(const ExtensionId& extension_id,
+                                        const std::string& options) {
     static constexpr char kSetExtensionActionOptionsScript[] = R"(
-      chrome.declarativeNetRequest.setExtensionActionOptions(
-        {displayActionCountAsBadgeText: %s});
-      window.domAutomationController.send("done");
+      chrome.declarativeNetRequest.setExtensionActionOptions(%s,
+        () => {
+          window.domAutomationController.send(chrome.runtime.lastError ?
+              chrome.runtime.lastError.message : 'success');
+        }
+      );
     )";
 
-    ExecuteScriptInBackgroundPage(
+    return ExecuteScriptInBackgroundPage(
         extension_id,
-        base::StringPrintf(kSetExtensionActionOptionsScript, pref_string));
+        base::StringPrintf(kSetExtensionActionOptionsScript, options.c_str()));
   }
 
   // Navigates frame with name |frame_name| to |url|.
@@ -3160,8 +3164,12 @@
   EXPECT_EQ(default_badge_text,
             query_badge_text(extension_2->id(), first_tab_id));
 
-  SetActionsAsBadgeText(extension_1->id(), true);
-  SetActionsAsBadgeText(extension_2->id(), true);
+  EXPECT_EQ(SetExtensionActionOptions(extension_1->id(),
+                                      "{displayActionCountAsBadgeText: true}"),
+            "success");
+  EXPECT_EQ(SetExtensionActionOptions(extension_2->id(),
+                                      "{displayActionCountAsBadgeText: true}"),
+            "success");
 
   // After enabling the preference the visible badge text should remain as the
   // default initially, as the action count for the tab is still 0 for both
@@ -3215,8 +3223,12 @@
   EXPECT_EQ(declarative_net_request::kActionCountPlaceholderBadgeText,
             query_badge_text(extension_1->id(), first_tab_id));
 
-  SetActionsAsBadgeText(extension_1->id(), false);
-  SetActionsAsBadgeText(extension_2->id(), false);
+  EXPECT_EQ(SetExtensionActionOptions(extension_1->id(),
+                                      "{displayActionCountAsBadgeText: false}"),
+            "success");
+  EXPECT_EQ(SetExtensionActionOptions(extension_2->id(),
+                                      "{displayActionCountAsBadgeText: false}"),
+            "success");
 
   // Switching the preference off should cause the extension queried badge text
   // to be the explicitly set badge text for this tab if it exists. In this
@@ -3286,7 +3298,9 @@
   TestExtensionActionAPIObserver test_api_observer(
       profile(), extension_id, {web_contents(), second_browser_contents});
 
-  SetActionsAsBadgeText(extension_id, true);
+  EXPECT_EQ(SetExtensionActionOptions(extension_id,
+                                      "{displayActionCountAsBadgeText: true}"),
+            "success");
 
   // Wait until ExtensionActionAPI::NotifyChange is called, then perform a
   // sanity check that one action was matched, and this is reflected in the
@@ -3594,6 +3608,124 @@
   }
 }
 
+// Test that the setExtensionActionOptions tabUpdate option works correctly.
+IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
+                       ActionsMatchedCountAsBadgeTextTabUpdate) {
+  // Load the extension with a background script so scripts can be run from its
+  // generated background page.
+  set_config_flags(ConfigFlag::kConfig_HasBackgroundScript);
+
+  // Set up an extension with a blocking rule.
+  TestRule rule = CreateGenericRule();
+  rule.condition->url_filter = std::string("||abc.com");
+  rule.condition->resource_types = std::vector<std::string>({"sub_frame"});
+
+  ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules(
+      {rule}, "extension", {URLPattern::kAllUrlsPattern}));
+  const Extension* extension = last_loaded_extension();
+  ExtensionAction* action =
+      ExtensionActionManager::Get(web_contents()->GetBrowserContext())
+          ->GetExtensionAction(*extension);
+
+  const std::string default_badge_text = "asdf";
+  action->SetBadgeText(ExtensionAction::kDefaultTabId, default_badge_text);
+
+  // Display action count as badge text for |extension|.
+  EXPECT_EQ(SetExtensionActionOptions(extension->id(),
+                                      "{displayActionCountAsBadgeText: true}"),
+            "success");
+
+  // Navigate to a page with two frames, the same-origin one should be blocked.
+  const GURL page_url =
+      embedded_test_server()->GetURL("abc.com", "/page_with_two_frames.html");
+  ui_test_utils::NavigateToURL(browser(), page_url);
+
+  int tab_id = ExtensionTabUtil::GetTabId(web_contents());
+
+  // Verify that the initial badge text reflects that the same-origin frame was
+  // blocked.
+  EXPECT_EQ("1", action->GetDisplayBadgeText(tab_id));
+
+  // Increment the action count.
+  EXPECT_EQ(SetExtensionActionOptions(
+                extension->id(),
+                base::StringPrintf("{tabUpdate: {tabId: %d, increment: 10}}",
+                                   tab_id)),
+            "success");
+  EXPECT_EQ("11", action->GetDisplayBadgeText(tab_id));
+
+  // An increment of 0 is ignored.
+  EXPECT_EQ(
+      SetExtensionActionOptions(
+          extension->id(),
+          base::StringPrintf("{tabUpdate: {tabId: %d, increment: 0}}", tab_id)),
+      "success");
+  EXPECT_EQ("11", action->GetDisplayBadgeText(tab_id));
+
+  // If the tab doesn't exist an error should be shown.
+  EXPECT_EQ(
+      SetExtensionActionOptions(
+          extension->id(),
+          base::StringPrintf("{tabUpdate: {tabId: %d, increment: 10}}", 999)),
+      ErrorUtils::FormatErrorMessage(declarative_net_request::kTabNotFoundError,
+                                     "999"));
+  EXPECT_EQ("11", action->GetDisplayBadgeText(tab_id));
+
+  // The action count should continue to increment when an action is taken.
+  NavigateFrame("frame1", page_url);
+  EXPECT_EQ("12", action->GetDisplayBadgeText(tab_id));
+
+  // The action count can be decremented.
+  EXPECT_EQ(SetExtensionActionOptions(
+                extension->id(),
+                base::StringPrintf("{tabUpdate: {tabId: %d, increment: -5}}",
+                                   tab_id)),
+            "success");
+  EXPECT_EQ("7", action->GetDisplayBadgeText(tab_id));
+
+  // Check that the action count cannot be decremented below 0. We fallback to
+  // displaying the default badge text when the action count is 0.
+  EXPECT_EQ(SetExtensionActionOptions(
+                extension->id(),
+                base::StringPrintf("{tabUpdate: {tabId: %d, increment: -10}}",
+                                   tab_id)),
+            "success");
+  EXPECT_EQ(default_badge_text, action->GetDisplayBadgeText(tab_id));
+  EXPECT_EQ(SetExtensionActionOptions(
+                extension->id(),
+                base::StringPrintf("{tabUpdate: {tabId: %d, increment: -1}}",
+                                   tab_id)),
+            "success");
+  EXPECT_EQ(default_badge_text, action->GetDisplayBadgeText(tab_id));
+  EXPECT_EQ(
+      SetExtensionActionOptions(
+          extension->id(),
+          base::StringPrintf("{tabUpdate: {tabId: %d, increment: 3}}", tab_id)),
+      "success");
+  EXPECT_EQ("3", action->GetDisplayBadgeText(tab_id));
+
+  // The action count cannot be incremented if the display action as badge text
+  // feature is not enabled.
+  EXPECT_EQ(
+      SetExtensionActionOptions(
+          extension->id(),
+          base::StringPrintf("{displayActionCountAsBadgeText: false, "
+                             "tabUpdate: {tabId: %d, increment: 10}}",
+                             tab_id)),
+      declarative_net_request::kIncrementActionCountWithoutUseAsBadgeTextError);
+  EXPECT_EQ(default_badge_text, action->GetDisplayBadgeText(tab_id));
+
+  // Any increment to the action count should not be ignored if we're enabling
+  // the preference.
+  EXPECT_EQ(SetExtensionActionOptions(
+                extension->id(),
+                base::StringPrintf("{displayActionCountAsBadgeText: true, "
+                                   "tabUpdate: {tabId: %d, increment: 5}}",
+                                   tab_id)),
+            "success");
+  EXPECT_EQ("8", action->GetDisplayBadgeText(tab_id));
+}
+
 // Test that the onRuleMatchedDebug event is only available for unpacked
 // extensions.
 IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
diff --git a/chrome/browser/extensions/api/language_settings_private/language_settings_private_api_unittest.cc b/chrome/browser/extensions/api/language_settings_private/language_settings_private_api_unittest.cc
index 07eeaa4..122a68e 100644
--- a/chrome/browser/extensions/api/language_settings_private/language_settings_private_api_unittest.cc
+++ b/chrome/browser/extensions/api/language_settings_private/language_settings_private_api_unittest.cc
@@ -309,6 +309,7 @@
 namespace input_method = chromeos::input_method;
 using input_method::InputMethodDescriptor;
 using input_method::InputMethodManager;
+using input_method::MockComponentExtensionIMEManagerDelegate;
 
 std::string GetExtensionImeId() {
   std::string kExtensionImeId = chromeos::extension_ime_util::GetInputMethodID(
@@ -368,11 +369,9 @@
 
   TestInputMethodManager() : state_(new TestState), util_(&delegate_) {
     util_.AppendInputMethods(state_->input_methods_);
-    mock_delegate_ =
-        new chromeos::input_method::MockComponentExtensionIMEManagerDelegate();
     component_ext_mgr_ =
-        std::make_unique<chromeos::ComponentExtensionIMEManager>();
-    component_ext_mgr_->Initialize(base::WrapUnique(mock_delegate_));
+        std::make_unique<chromeos::ComponentExtensionIMEManager>(
+            std::make_unique<MockComponentExtensionIMEManagerDelegate>());
   }
 
   scoped_refptr<InputMethodManager::State> GetActiveIMEState() override {
@@ -393,8 +392,6 @@
   input_method::FakeInputMethodDelegate delegate_;
   input_method::InputMethodUtil util_;
   std::unique_ptr<chromeos::ComponentExtensionIMEManager> component_ext_mgr_;
-  chromeos::input_method::MockComponentExtensionIMEManagerDelegate*
-      mock_delegate_;
 
   DISALLOW_COPY_AND_ASSIGN(TestInputMethodManager);
 };
diff --git a/chrome/browser/extensions/chrome_extensions_browser_client.cc b/chrome/browser/extensions/chrome_extensions_browser_client.cc
index 1844374..7c6d74ff 100644
--- a/chrome/browser/extensions/chrome_extensions_browser_client.cc
+++ b/chrome/browser/extensions/chrome_extensions_browser_client.cc
@@ -35,6 +35,7 @@
 #include "chrome/browser/extensions/event_router_forwarder.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/extension_system_factory.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/extensions/extension_util.h"
 #include "chrome/browser/extensions/menu_manager.h"
 #include "chrome/browser/extensions/updater/chrome_update_client_config.h"
@@ -581,6 +582,13 @@
   return tabs_util::IsScreenshotRestricted(web_contents);
 }
 
+bool ChromeExtensionsBrowserClient::IsValidTabId(
+    content::BrowserContext* context,
+    int tab_id) const {
+  return ExtensionTabUtil::GetTabById(
+      tab_id, context, true /* include_incognito */, nullptr /* contents */);
+}
+
 // static
 void ChromeExtensionsBrowserClient::SetMediaRouterAccessLoggerForTesting(
     MediaRouterExtensionAccessLogger* media_router_access_logger) {
diff --git a/chrome/browser/extensions/chrome_extensions_browser_client.h b/chrome/browser/extensions/chrome_extensions_browser_client.h
index d448a39..683afba 100644
--- a/chrome/browser/extensions/chrome_extensions_browser_client.h
+++ b/chrome/browser/extensions/chrome_extensions_browser_client.h
@@ -159,6 +159,8 @@
                           content::BrowserContext* context) override;
   bool IsScreenshotRestricted(
       content::WebContents* web_contents) const override;
+  bool IsValidTabId(content::BrowserContext* context,
+                    int tab_id) const override;
 
   static void set_did_chrome_update_for_testing(bool did_update);
 
diff --git a/chrome/browser/extensions/corb_and_cors_extension_browsertest.cc b/chrome/browser/extensions/corb_and_cors_extension_browsertest.cc
index a970c52d..147c0c8 100644
--- a/chrome/browser/extensions/corb_and_cors_extension_browsertest.cc
+++ b/chrome/browser/extensions/corb_and_cors_extension_browsertest.cc
@@ -1964,13 +1964,20 @@
   std::string web_view_navigation_script =
       content::JsReplace(kWebViewNavigationScriptTemplate, guest_url);
   {
-    content::DOMMessageQueue queue;
+    metrics::SubprocessMetricsProvider::MergeHistogramDeltasForTesting();
     base::HistogramTester histograms;
+
+    content::DOMMessageQueue queue;
     content::ExecuteScriptAsync(app_contents, web_view_navigation_script);
     std::string fetch_result = PopString(&queue);
 
     // Verify that no CORB blocking occurred.
     EXPECT_EQ("nosniff.xml - body\n", fetch_result);
+
+    // Verify UMA histograms.
+    metrics::SubprocessMetricsProvider::MergeHistogramDeltasForTesting();
+    histograms.ExpectBucketCount(
+        "NetworkService.CorsForcedOffForIsolatedWorldOrigin", true, 1);
   }
 }
 
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index ddcb1cc..fbdcee04 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -90,13 +90,6 @@
     "expiry_milestone": 88
   },
   {
-    "name": "allow-sxg-certs-without-extension",
-    "owners": [ "//content/browser/web_package/OWNERS" ],
-    // Used by developers for testing signed exchange loading using normal
-    // certs. See https://crbug.com/862003
-    "expiry_milestone": 92
-  },
-  {
     "name": "allow-sync-xhr-in-page-dismissal",
     "owners": [ "kdillon@chromium.org" ],
     "expiry_milestone": 88
@@ -2269,6 +2262,11 @@
     "expiry_milestone": 90
   },
   {
+    "name": "enable-table-ng",
+    "owners": [ "atotic@google.com" ],
+    "expiry_milestone": 96
+  },
+  {
     "name": "enable-text-fragment-anchor",
     "owners": [ "bokan", "input-dev" ],
     "expiry_milestone": 83
@@ -4852,6 +4850,11 @@
     "expiry_milestone": 84
   },
   {
+    "name": "web-feed",
+    "owners": [ "//chrome/android/feed/OWNERS", "feed@chromium.org" ],
+    "expiry_milestone": 99
+  },
+  {
     "name": "web-otp-backend",
     "owners": [ "yigu", "majidvp" ],
     "expiry_milestone": 90
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index ed53cb6..7f7ea4c 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -46,13 +46,6 @@
     "Allows requests to localhost over HTTPS even when an invalid certificate "
     "is presented.";
 
-const char kAllowSignedHTTPExchangeCertsWithoutExtensionName[] =
-    "Allow Signed HTTP Exchange certificates without extension";
-const char kAllowSignedHTTPExchangeCertsWithoutExtensionDescription[] =
-    "Accepts Origin-Signed HTTP Exchanges to be signed with certificates "
-    "that do not have CanSignHttpExchangesDraft extension. Warning: Enabling "
-    "this may pose a security risk.";
-
 const char kAllowSyncXHRInPageDismissalName[] =
     "Allows synchronous XHR requests in page dismissal";
 const char kAllowSyncXHRInPageDismissalDescription[] =
@@ -800,6 +793,10 @@
 const char kEnableLayoutNGDescription[] =
     "Enable Blink's next generation layout engine.";
 
+const char kEnableLayoutNGTableName[] = "Enable TableNG";
+const char kEnableLayoutNGTableDescription[] =
+    "Enable Blink's next generation table layout.";
+
 const char kEnableLazyFrameLoadingName[] = "Enable lazy frame loading";
 const char kEnableLazyFrameLoadingDescription[] =
     "Defers the loading of iframes marked with the attribute 'loading=lazy' "
@@ -3263,6 +3260,10 @@
     "first-sync-setup to be complete. Only has an effect if "
     "enable-autofill-account-wallet-storage is also enabled.";
 
+const char kWebFeedName[] = "Web Feed";
+const char kWebFeedDescription[] =
+    "Allows users to keep up with and consume web content.";
+
 // Non-Android -----------------------------------------------------------------
 
 #else  // !defined(OS_ANDROID)
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index ebee761..494edb6 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -66,9 +66,6 @@
 extern const char kAllowInsecureLocalhostName[];
 extern const char kAllowInsecureLocalhostDescription[];
 
-extern const char kAllowSignedHTTPExchangeCertsWithoutExtensionName[];
-extern const char kAllowSignedHTTPExchangeCertsWithoutExtensionDescription[];
-
 extern const char kAllowSyncXHRInPageDismissalName[];
 extern const char kAllowSyncXHRInPageDismissalDescription[];
 
@@ -459,6 +456,9 @@
 extern const char kEnableLayoutNGName[];
 extern const char kEnableLayoutNGDescription[];
 
+extern const char kEnableLayoutNGTableName[];
+extern const char kEnableLayoutNGTableDescription[];
+
 extern const char kEnableLazyFrameLoadingName[];
 extern const char kEnableLazyFrameLoadingDescription[];
 
@@ -1883,6 +1883,9 @@
 extern const char kWalletRequiresFirstSyncSetupCompleteName[];
 extern const char kWalletRequiresFirstSyncSetupCompleteDescription[];
 
+extern const char kWebFeedName[];
+extern const char kWebFeedDescription[];
+
 // Non-Android ----------------------------------------------------------------
 
 #else  // !defined(OS_ANDROID)
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
index ac90b99..4312e74 100644
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -110,6 +110,7 @@
     &feed::kInterestFeedV1ClicksAndViewsConditionalUpload,
     &feed::kInterestFeedV2,
     &feed::kReportFeedUserActions,
+    &feed::kWebFeed,
     &history::kHideFromApi3Transitions,
     &kAdjustWebApkInstallationSpace,
     &kAllowNewIncognitoTabIntents,
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
index 5f2907a..9d9dde8 100644
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -458,6 +458,7 @@
     public static final String VR_BROWSING_FEEDBACK = "VrBrowsingFeedback";
     public static final String WEB_AUTH = "WebAuthentication";
     public static final String WEB_AUTH_PHONE_SUPPORT = "WebAuthenticationPhoneSupport";
+    public static final String WEB_FEED = "WebFeed";
 
     @NativeMethods
     interface Natives {
diff --git a/chrome/browser/media/kaleidoscope/kaleidoscope_identity_manager_impl.cc b/chrome/browser/media/kaleidoscope/kaleidoscope_identity_manager_impl.cc
index 4cda574..bf8f0af 100644
--- a/chrome/browser/media/kaleidoscope/kaleidoscope_identity_manager_impl.cc
+++ b/chrome/browser/media/kaleidoscope/kaleidoscope_identity_manager_impl.cc
@@ -8,12 +8,17 @@
 #include "chrome/browser/media/kaleidoscope/kaleidoscope_prefs.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
+#include "chrome/browser/ui/browser_finder.h"
+#include "chrome/browser/ui/chrome_pages.h"
 #include "chrome/common/channel_info.h"
 #include "components/prefs/pref_service.h"
+#include "components/signin/public/base/signin_metrics.h"
 #include "components/signin/public/identity_manager/access_token_info.h"
+#include "components/signin/public/identity_manager/consent_level.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
 #include "components/signin/public/identity_manager/primary_account_access_token_fetcher.h"
 #include "components/version_info/version_info.h"
+#include "content/public/browser/web_ui.h"
 #include "google_apis/google_api_keys.h"
 
 namespace {
@@ -118,3 +123,25 @@
 
   pending_callbacks_.clear();
 }
+
+void KaleidoscopeIdentityManagerImpl::SignIn() {
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  NOTREACHED() << "SignIn() shouldn't be called on Chrome OS.";
+#else
+  // The identity manager may not be created in a context where it has access
+  // to the UI. The client should not request a sign-in in that case.
+  DCHECK(web_ui_);
+
+  content::WebContents* web_contents = web_ui_->GetWebContents();
+  DCHECK(web_contents);
+
+  Browser* browser = chrome::FindBrowserWithWebContents(web_contents);
+  DCHECK(browser);
+
+  chrome::ShowBrowserSignin(
+      browser, signin_metrics::AccessPoint::ACCESS_POINT_KALEIDOSCOPE,
+      signin::ConsentLevel::kNotRequired);
+  signin_metrics::RecordSigninImpressionUserActionForAccessPoint(
+      signin_metrics::AccessPoint::ACCESS_POINT_KALEIDOSCOPE);
+#endif  // defined(OS_CHROMEOS)
+}
diff --git a/chrome/browser/media/kaleidoscope/kaleidoscope_identity_manager_impl.h b/chrome/browser/media/kaleidoscope/kaleidoscope_identity_manager_impl.h
index 9743bbcd..599ce72 100644
--- a/chrome/browser/media/kaleidoscope/kaleidoscope_identity_manager_impl.h
+++ b/chrome/browser/media/kaleidoscope/kaleidoscope_identity_manager_impl.h
@@ -42,6 +42,7 @@
 
   // media::mojom::KaleidoscopeIdentityManager implementation.
   void GetCredentials(GetCredentialsCallback cb) override;
+  void SignIn() override;
 
  private:
   // Called when an access token request completes (successfully or not).
diff --git a/chrome/browser/media/kaleidoscope/mojom/kaleidoscope.mojom b/chrome/browser/media/kaleidoscope/mojom/kaleidoscope.mojom
index 50acaf91..eff73d5 100644
--- a/chrome/browser/media/kaleidoscope/mojom/kaleidoscope.mojom
+++ b/chrome/browser/media/kaleidoscope/mojom/kaleidoscope.mojom
@@ -117,6 +117,9 @@
 interface KaleidoscopeIdentityManager {
   // Retrieves the current credentials.
   GetCredentials() => (Credentials? credentials, CredentialsResult result);
+
+  // Will trigger a browser signin.
+  SignIn();
 };
 
 enum GetCollectionsResult {
diff --git a/chrome/browser/platform_util_lacros.cc b/chrome/browser/platform_util_lacros.cc
index 81af39ff..3c41cb6a 100644
--- a/chrome/browser/platform_util_lacros.cc
+++ b/chrome/browser/platform_util_lacros.cc
@@ -26,7 +26,7 @@
   LOG(ERROR) << "Unable to open " << path.AsUTF8Unsafe() << " " << result;
 }
 
-// File manager remote can only be accessed on UI thread.
+// Requests that ash open an item at |path|.
 void OpenItemOnUiThread(const base::FilePath& path, OpenItemType type) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   auto* service = chromeos::LacrosChromeServiceImpl::Get();
@@ -51,7 +51,7 @@
 namespace internal {
 
 void PlatformOpenVerifiedItem(const base::FilePath& path, OpenItemType type) {
-  // This function is called on a blocking thread, so open on the UI thread.
+  // The file manager remote can only be accessed on the UI thread.
   content::GetUIThreadTaskRunner({})->PostTask(
       FROM_HERE, base::BindOnce(&OpenItemOnUiThread, path, type));
 }
diff --git a/chrome/browser/resources/bookmarks/list.js b/chrome/browser/resources/bookmarks/list.js
index 40e170c7..5e8b5c47 100644
--- a/chrome/browser/resources/bookmarks/list.js
+++ b/chrome/browser/resources/bookmarks/list.js
@@ -297,6 +297,17 @@
         if (e.shiftKey && this.getState().selection.anchor === null) {
           this.dispatch(updateAnchor(this.displayedIds_[oldFocusedIndex]));
         }
+
+        // If the focus moved from something other than a Ctrl + move event,
+        // update the selection.
+        const config = {
+          clear: !cursorModifier,
+          range: e.shiftKey,
+          toggle: false,
+        };
+
+        this.dispatch(selectItem(
+            this.displayedIds_[focusedIndex], this.getState(), config));
       }
     }
 
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_test.js
index 095b481..18b7155 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_test.js
@@ -144,17 +144,33 @@
 });
 
 TEST_F('ChromeVoxPanelTest', 'SearchMenu', function() {
+  const mockFeedback = this.createMockFeedback();
   this.runWithLoadedTree(this.linksDoc, async function(root) {
     new PanelCommand(PanelCommandType.OPEN_MENUS).send();
     await this.waitForMenu('panel_search_menu');
-    this.fireMockQuery('jump')();
-    this.assertActiveSearchMenuItem('Jump To Details');
-    this.fireMockEvent('ArrowDown')();
-    this.assertActiveSearchMenuItem('Jump To The Bottom Of The Page');
-    this.fireMockEvent('ArrowDown')();
-    this.assertActiveSearchMenuItem('Jump To The Top Of The Page');
-    this.fireMockEvent('ArrowDown')();
-    this.assertActiveSearchMenuItem('Jump To Details');
+    await mockFeedback
+        .expectSpeech('Search the menus', /Type to search the menus/)
+        .call(() => {
+          this.fireMockQuery('jump')();
+          this.assertActiveSearchMenuItem('Jump To Details');
+        })
+        .expectSpeech(/Jump/, 'Menu item', /[0-9]+ of [0-9]+/)
+        .call(() => {
+          this.fireMockEvent('ArrowDown')();
+          this.assertActiveSearchMenuItem('Jump To The Bottom Of The Page');
+        })
+        .expectSpeech(/Jump/, 'Menu item', /[0-9]+ of [0-9]+/)
+        .call(() => {
+          this.fireMockEvent('ArrowDown')();
+          this.assertActiveSearchMenuItem('Jump To The Top Of The Page');
+        })
+        .expectSpeech(/Jump/, 'Menu item', /[0-9]+ of [0-9]+/)
+        .call(() => {
+          this.fireMockEvent('ArrowDown')();
+          this.assertActiveSearchMenuItem('Jump To Details');
+        })
+        .expectSpeech(/Jump/, 'Menu item', /[0-9]+ of [0-9]+/)
+        .replay();
   });
 });
 
diff --git a/chrome/browser/resources/chromeos/wallpaper_manager/images/icon192.png b/chrome/browser/resources/chromeos/wallpaper_manager/images/icon192.png
index 95aecff..86cc40b1 100644
--- a/chrome/browser/resources/chromeos/wallpaper_manager/images/icon192.png
+++ b/chrome/browser/resources/chromeos/wallpaper_manager/images/icon192.png
Binary files differ
diff --git a/chrome/browser/ssl/security_state_tab_helper_browsertest.cc b/chrome/browser/ssl/security_state_tab_helper_browsertest.cc
index 677b06f..9bc9d08 100644
--- a/chrome/browser/ssl/security_state_tab_helper_browsertest.cc
+++ b/chrome/browser/ssl/security_state_tab_helper_browsertest.cc
@@ -1626,12 +1626,7 @@
   GURL mixed_content_url(https_server_.GetURL(replacement_path));
   ui_test_utils::NavigateToURL(browser(), mixed_content_url);
 
-  blink::SecurityStyle expected_mixed_content_security_style =
-      security_state::ShouldShowDangerTriangleForWarningLevel()
-          ? blink::SecurityStyle::kInsecure
-          : blink::SecurityStyle::kNeutral;
-  EXPECT_EQ(expected_mixed_content_security_style,
-            observer.latest_security_style());
+  EXPECT_EQ(blink::SecurityStyle::kInsecure, observer.latest_security_style());
 
   const content::SecurityStyleExplanations& mixed_content_explanation =
       observer.latest_explanations();
@@ -1923,10 +1918,7 @@
 
   ui_test_utils::NavigateToURL(browser(), GURL(kLegacyTLSURL));
 
-  EXPECT_EQ(security_state::ShouldShowDangerTriangleForWarningLevel()
-                ? blink::SecurityStyle::kInsecure
-                : blink::SecurityStyle::kNeutral,
-            observer.latest_security_style());
+  EXPECT_EQ(blink::SecurityStyle::kInsecure, observer.latest_security_style());
 
   for (const auto& explanation :
        observer.latest_explanations().secure_explanations) {
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index f179b21..76d97c42 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -1974,6 +1974,8 @@
       "ash/launcher/chrome_launcher_controller_util.h",
       "ash/launcher/crostini_app_display.cc",
       "ash/launcher/crostini_app_display.h",
+      "ash/launcher/crostini_app_window.cc",
+      "ash/launcher/crostini_app_window.h",
       "ash/launcher/extension_shelf_context_menu.cc",
       "ash/launcher/extension_shelf_context_menu.h",
       "ash/launcher/extension_uninstaller.cc",
diff --git a/chrome/browser/ui/app_list/extension_app_utils.cc b/chrome/browser/ui/app_list/extension_app_utils.cc
index 6f2d2bd4..1ef17c20c 100644
--- a/chrome/browser/ui/app_list/extension_app_utils.cc
+++ b/chrome/browser/ui/app_list/extension_app_utils.cc
@@ -21,28 +21,12 @@
 
 namespace app_list {
 
-namespace {
-
-constexpr char const* kAppIdsHiddenInLauncher[] = {web_app::kReleaseNotesAppId};
-
-}  // namespace
-
 bool ShouldShowInLauncher(const extensions::Extension* extension,
                           content::BrowserContext* context) {
-  return !HideInLauncherById(extension->id()) &&
-         chromeos::DemoSession::ShouldDisplayInAppLauncher(extension->id()) &&
+  return chromeos::DemoSession::ShouldDisplayInAppLauncher(extension->id()) &&
          extensions::ui_util::ShouldDisplayInAppLauncher(extension, context);
 }
 
-bool HideInLauncherById(std::string extension_id) {
-  for (auto* const id : kAppIdsHiddenInLauncher) {
-    if (id == extension_id) {
-      return true;
-    }
-  }
-  return false;
-}
-
 void AddMenuItemIconsForSystemApps(const std::string& app_id,
                                    ui::SimpleMenuModel* menu_model,
                                    int start_index,
diff --git a/chrome/browser/ui/app_list/extension_app_utils.h b/chrome/browser/ui/app_list/extension_app_utils.h
index e2a7bf0..00bde8b 100644
--- a/chrome/browser/ui/app_list/extension_app_utils.h
+++ b/chrome/browser/ui/app_list/extension_app_utils.h
@@ -23,7 +23,6 @@
 
 bool ShouldShowInLauncher(const extensions::Extension* extension,
                           content::BrowserContext* context);
-bool HideInLauncherById(std::string extension_id);
 
 // chrome.contextMenus API does not support menu item icons. This function
 // compensates for that by adding icons to menus for prominent system apps
diff --git a/chrome/browser/ui/app_list/search/app_search_provider.cc b/chrome/browser/ui/app_list/search/app_search_provider.cc
index 5144a67..48c0348b 100644
--- a/chrome/browser/ui/app_list/search/app_search_provider.cc
+++ b/chrome/browser/ui/app_list/search/app_search_provider.cc
@@ -31,7 +31,6 @@
 #include "chrome/browser/chromeos/crostini/crostini_features.h"
 #include "chrome/browser/chromeos/crostini/crostini_manager.h"
 #include "chrome/browser/chromeos/extensions/gfx_utils.h"
-#include "chrome/browser/chromeos/release_notes/release_notes_storage.h"
 #include "chrome/browser/extensions/extension_util.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/sync/session_sync_service_factory.h"
@@ -498,11 +497,6 @@
         title = navigation_title;
         app->AddSearchableText(title);
       }
-    } else if (app->id() == ash::kReleaseNotesAppId) {
-      auto release_notes_storage =
-          std::make_unique<chromeos::ReleaseNotesStorage>(profile_);
-      if (!release_notes_storage->ShouldShowSuggestionChip())
-        continue;
     }
 
     std::unique_ptr<AppResult> result =
diff --git a/chrome/browser/ui/app_list/search/app_service_app_result.cc b/chrome/browser/ui/app_list/search/app_service_app_result.cc
index f717c37..f1b6e82 100644
--- a/chrome/browser/ui/app_list/search/app_service_app_result.cc
+++ b/chrome/browser/ui/app_list/search/app_service_app_result.cc
@@ -14,7 +14,6 @@
 #include "chrome/browser/apps/app_service/app_service_metrics.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/release_notes/release_notes_storage.h"
 #include "chrome/browser/favicon/large_icon_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/app_list/app_list_client_impl.h"
@@ -247,16 +246,6 @@
   // in the proper position.
   SetDisplayIndex(ash::SearchResultDisplayIndex::kFirstIndex);
   SetDisplayType(ash::SearchResultDisplayType::kChip);
-
-  if (id() == ash::kReleaseNotesAppId) {
-    // TODO(b/169711884): Decrease times left only when the chip becomes
-    // visible.
-    chromeos::ReleaseNotesStorage(profile)
-        .DecreaseTimesLeftToShowSuggestionChip();
-    // Make sure that if both Continue Reading and Release Notes are available,
-    // Release Notes shows up first in the suggestion chip container.
-    SetPositionPriority(1.0f);
-  }
 }
 
 void AppServiceAppResult::UpdateContinueReadingFavicon(
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 fb0d62c..8743e50 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
@@ -29,6 +29,7 @@
 #include "chrome/browser/ui/ash/launcher/app_window_launcher_item_controller.h"
 #include "chrome/browser/ui/ash/launcher/arc_app_window.h"
 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h"
+#include "chrome/browser/ui/ash/launcher/crostini_app_window.h"
 #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/browser/ui/browser.h"
@@ -423,6 +424,13 @@
             owner()->profile());
     app_window = app_window_ptr.get();
     aura_window_to_app_window_[window] = std::move(app_window_ptr);
+  } else if (crostini_tracker_ &&
+             !crostini_tracker_->GetShelfAppId(window).empty()) {
+    auto app_window_ptr = std::make_unique<CrostiniAppWindow>(
+        owner()->profile(), shelf_id,
+        views::Widget::GetWidgetForNativeWindow(window));
+    app_window = app_window_ptr.get();
+    aura_window_to_app_window_[window] = std::move(app_window_ptr);
   } else {
     auto app_window_ptr = std::make_unique<AppWindowBase>(
         shelf_id, views::Widget::GetWidgetForNativeWindow(window));
diff --git a/chrome/browser/ui/ash/launcher/crostini_app_window.cc b/chrome/browser/ui/ash/launcher/crostini_app_window.cc
new file mode 100644
index 0000000..841acaa
--- /dev/null
+++ b/chrome/browser/ui/ash/launcher/crostini_app_window.cc
@@ -0,0 +1,35 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/ash/launcher/crostini_app_window.h"
+
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/app_list/app_service/app_service_app_icon_loader.h"
+#include "extensions/common/constants.h"
+#include "ui/gfx/image/image_skia.h"
+#include "ui/views/widget/widget.h"
+#include "ui/views/widget/widget_delegate.h"
+
+namespace {
+constexpr int kIconSize = extension_misc::EXTENSION_ICON_MEDIUM;
+}  // namespace
+
+CrostiniAppWindow::CrostiniAppWindow(Profile* profile,
+                                     const ash::ShelfID& shelf_id,
+                                     views::Widget* widget)
+    : AppWindowBase(shelf_id, widget) {
+  app_icon_loader_ =
+      std::make_unique<AppServiceAppIconLoader>(profile, kIconSize, this);
+  app_icon_loader_->FetchImage(shelf_id.app_id);
+}
+
+CrostiniAppWindow::~CrostiniAppWindow() = default;
+
+void CrostiniAppWindow::OnAppImageUpdated(const std::string& app_id,
+                                          const gfx::ImageSkia& image) {
+  if (!widget() || !widget()->widget_delegate())
+    return;
+
+  widget()->widget_delegate()->SetIcon(image);
+}
diff --git a/chrome/browser/ui/ash/launcher/crostini_app_window.h b/chrome/browser/ui/ash/launcher/crostini_app_window.h
new file mode 100644
index 0000000..b933d35
--- /dev/null
+++ b/chrome/browser/ui/ash/launcher/crostini_app_window.h
@@ -0,0 +1,47 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_ASH_LAUNCHER_CROSTINI_APP_WINDOW_H_
+#define CHROME_BROWSER_UI_ASH_LAUNCHER_CROSTINI_APP_WINDOW_H_
+
+#include <memory>
+#include <string>
+
+#include "ash/public/cpp/shelf_types.h"
+#include "chrome/browser/ui/app_icon_loader.h"
+#include "chrome/browser/ui/ash/launcher/app_window_base.h"
+
+namespace gfx {
+class ImageSkia;
+}
+
+namespace views {
+class Widget;
+}
+
+class AppServiceAppIconLoader;
+class Profile;
+
+// A ui::BaseWindow for a chromeos launcher to control Crostini applications.
+class CrostiniAppWindow : public AppWindowBase, public AppIconLoaderDelegate {
+ public:
+  CrostiniAppWindow(Profile* profile,
+                    const ash::ShelfID& shelf_id,
+                    views::Widget* widget);
+
+  ~CrostiniAppWindow() override;
+
+  CrostiniAppWindow(const CrostiniAppWindow&) = delete;
+  CrostiniAppWindow& operator=(const CrostiniAppWindow&) = delete;
+
+  // AppIconLoaderDelegate:
+  void OnAppImageUpdated(const std::string& app_id,
+                         const gfx::ImageSkia& image) override;
+
+ private:
+  // Loads the app icon to the window icon key.
+  std::unique_ptr<AppServiceAppIconLoader> app_icon_loader_;
+};
+
+#endif  // CHROME_BROWSER_UI_ASH_LAUNCHER_CROSTINI_APP_WINDOW_H_
diff --git a/chrome/browser/ui/startup/bad_flags_prompt.cc b/chrome/browser/ui/startup/bad_flags_prompt.cc
index 2d18213..9d55a1e 100644
--- a/chrome/browser/ui/startup/bad_flags_prompt.cc
+++ b/chrome/browser/ui/startup/bad_flags_prompt.cc
@@ -146,7 +146,6 @@
 // "stability and security will suffer".
 static const base::Feature* kBadFeatureFlagsInAboutFlags[] = {
     &blink::features::kRawClipboard,
-    &features::kAllowSignedHTTPExchangeCertsWithoutExtension,
     &features::kWebBundlesFromNetwork,
 #if defined(OS_ANDROID)
     &chrome::android::kCommandLineOnNonRooted,
diff --git a/chrome/browser/ui/web_applications/test/web_app_browsertest_util.cc b/chrome/browser/ui/web_applications/test/web_app_browsertest_util.cc
index 74ab79d..61ac40f 100644
--- a/chrome/browser/ui/web_applications/test/web_app_browsertest_util.cc
+++ b/chrome/browser/ui/web_applications/test/web_app_browsertest_util.cc
@@ -220,8 +220,8 @@
       std::move(install_options),
       base::BindLambdaForTesting(
           [&result_code, &run_loop](const GURL& provided_url,
-                                    InstallResultCode code) {
-            result_code = code;
+                                    PendingAppManager::InstallResult result) {
+            result_code = result.code;
             run_loop.Quit();
           }));
   run_loop.Run();
diff --git a/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc b/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc
index 8acc7d7..a12ee0b 100644
--- a/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc
+++ b/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc
@@ -92,15 +92,6 @@
 }
 
 // static
-bool WebAppUiManager::ShouldHideAppFromUser(const AppId& app_id) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-  return app_list::HideInLauncherById(app_id);
-#else
-  return false;
-#endif
-}
-
-// static
 WebAppUiManagerImpl* WebAppUiManagerImpl::Get(Profile* profile) {
   auto* provider = WebAppProvider::Get(profile);
   return provider ? provider->ui_manager().AsImpl() : nullptr;
@@ -173,10 +164,11 @@
   windows_closed_requests_map_[app_id].push_back(std::move(callback));
 }
 
-void WebAppUiManagerImpl::UninstallAndReplaceIfExists(
+bool WebAppUiManagerImpl::UninstallAndReplaceIfExists(
     const std::vector<AppId>& from_apps,
     const AppId& to_app) {
   bool has_migrated = false;
+  bool did_uninstall = false;
   for (const AppId& from_app : from_apps) {
     apps::AppServiceProxy* proxy =
         apps::AppServiceProxyFactory::GetForProfile(profile_);
@@ -230,7 +222,10 @@
 
     proxy->UninstallSilently(from_app,
                              apps::mojom::UninstallSource::kMigration);
+    did_uninstall = true;
   }
+
+  return did_uninstall;
 }
 
 bool WebAppUiManagerImpl::CanAddAppToQuickLaunchBar() const {
diff --git a/chrome/browser/ui/web_applications/web_app_ui_manager_impl.h b/chrome/browser/ui/web_applications/web_app_ui_manager_impl.h
index 03be401..1f9b910 100644
--- a/chrome/browser/ui/web_applications/web_app_ui_manager_impl.h
+++ b/chrome/browser/ui/web_applications/web_app_ui_manager_impl.h
@@ -47,7 +47,7 @@
   size_t GetNumWindowsForApp(const AppId& app_id) override;
   void NotifyOnAllAppWindowsClosed(const AppId& app_id,
                                    base::OnceClosure callback) override;
-  void UninstallAndReplaceIfExists(const std::vector<AppId>& from_apps,
+  bool UninstallAndReplaceIfExists(const std::vector<AppId>& from_apps,
                                    const AppId& to_app) override;
   bool CanAddAppToQuickLaunchBar() const override;
   void AddAppToQuickLaunchBar(const AppId& app_id) override;
diff --git a/chrome/browser/ui/webui/chromeos/login/l10n_util_unittest.cc b/chrome/browser/ui/webui/chromeos/login/l10n_util_unittest.cc
index 25586cf3..313a878 100644
--- a/chrome/browser/ui/webui/chromeos/login/l10n_util_unittest.cc
+++ b/chrome/browser/ui/webui/chromeos/login/l10n_util_unittest.cc
@@ -19,6 +19,7 @@
 #include "chromeos/system/fake_statistics_provider.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/base/ime/chromeos/component_extension_ime_manager.h"
+#include "ui/base/ime/chromeos/mock_component_extension_ime_manager_delegate.h"
 
 namespace chromeos {
 
@@ -68,8 +69,11 @@
 L10nUtilTest::L10nUtilTest()
     : input_manager_(new MockInputMethodManagerWithInputMethods) {
   chromeos::input_method::InitializeForTesting(input_manager_);
+  auto mock_component_extension_ime_manager_delegate = std::make_unique<
+      input_method::MockComponentExtensionIMEManagerDelegate>();
   input_manager_->SetComponentExtensionIMEManager(
-      std::make_unique<ComponentExtensionIMEManager>());
+      std::make_unique<ComponentExtensionIMEManager>(
+          std::move(mock_component_extension_ime_manager_delegate)));
 
   base::RunLoop().RunUntilIdle();
 }
diff --git a/chrome/browser/ui/webui/flags_ui.cc b/chrome/browser/ui/webui/flags_ui.cc
index fb662e12..698c5c6 100644
--- a/chrome/browser/ui/webui/flags_ui.cc
+++ b/chrome/browser/ui/webui/flags_ui.cc
@@ -163,6 +163,7 @@
   source->AddLocalizedString("reset", IDS_FLAGS_UI_PAGE_RESET);
   source->AddLocalizedString("reset-acknowledged",
                              IDS_FLAGS_UI_RESET_ACKNOWLEDGED);
+  source->AddLocalizedString("search-label", IDS_FLAGS_UI_SEARCH_LABEL);
   source->AddLocalizedString("search-placeholder",
                              IDS_FLAGS_UI_SEARCH_PLACEHOLDER);
   source->AddLocalizedString("title", IDS_FLAGS_UI_TITLE);
@@ -197,6 +198,7 @@
   source->AddLocalizedString("reset", IDS_DEPRECATED_FEATURES_PAGE_RESET);
   source->AddLocalizedString("reset-acknowledged",
                              IDS_DEPRECATED_UI_RESET_ACKNOWLEDGED);
+  source->AddLocalizedString("search-label", IDS_FLAGS_UI_SEARCH_LABEL);
   source->AddLocalizedString("search-placeholder",
                              IDS_DEPRECATED_FEATURES_SEARCH_PLACEHOLDER);
   source->AddLocalizedString("title", IDS_DEPRECATED_FEATURES_TITLE);
diff --git a/chrome/browser/ui/webui/settings/chromeos/multidevice_handler.cc b/chrome/browser/ui/webui/settings/chromeos/multidevice_handler.cc
index 18988da4..f271889 100644
--- a/chrome/browser/ui/webui/settings/chromeos/multidevice_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/multidevice_handler.cc
@@ -16,6 +16,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.h"
 #include "chromeos/components/multidevice/logging/logging.h"
+#include "chromeos/components/phonehub/util/histogram_util.h"
 #include "chromeos/components/proximity_auth/proximity_auth_pref_names.h"
 #include "chromeos/constants/chromeos_features.h"
 #include "chromeos/services/multidevice_setup/public/cpp/prefs.h"
@@ -273,6 +274,11 @@
       feature, enabled, auth_token,
       base::BindOnce(&MultideviceHandler::OnSetFeatureStateEnabledResult,
                      callback_weak_ptr_factory_.GetWeakPtr(), callback_id));
+
+  if (feature == multidevice_setup::mojom::Feature::kPhoneHub) {
+    phonehub::util::LogFeatureOptInEntryPoint(
+        phonehub::util::OptInEntryPoint::kSettings);
+  }
 }
 
 void MultideviceHandler::HandleRemoveHostDevice(const base::ListValue* args) {
diff --git a/chrome/browser/web_applications/components/os_integration_manager.cc b/chrome/browser/web_applications/components/os_integration_manager.cc
index 898bb480..104df09f 100644
--- a/chrome/browser/web_applications/components/os_integration_manager.cc
+++ b/chrome/browser/web_applications/components/os_integration_manager.cc
@@ -178,46 +178,39 @@
   scoped_refptr<OsHooksBarrier> barrier =
       base::MakeRefCounted<OsHooksBarrier>(os_hooks, std::move(callback));
 
-  if (os_hooks[OsHookType::kShortcutsMenu] &&
-      ShouldRegisterShortcutsMenuWithOs()) {
-    bool success = UnregisterShortcutsMenuWithOs(app_id, profile_->GetPath());
+  if (os_hooks[OsHookType::kShortcutsMenu]) {
+    bool success = UnregisterShortcutsMenu(app_id);
     if (!success)
       barrier->OnError(OsHookType::kShortcutsMenu);
   }
 
   if (os_hooks[OsHookType::kShortcuts] || os_hooks[OsHookType::kRunOnOsLogin]) {
-    std::unique_ptr<ShortcutInfo> shortcut_info =
-        shortcut_manager_->BuildShortcutInfo(app_id);
+    std::unique_ptr<ShortcutInfo> shortcut_info = BuildShortcutInfo(app_id);
     base::FilePath shortcut_data_dir =
         internals::GetShortcutDataDir(*shortcut_info);
 
     if (os_hooks[OsHookType::kRunOnOsLogin] &&
         base::FeatureList::IsEnabled(features::kDesktopPWAsRunOnOsLogin)) {
-      ScheduleUnregisterRunOnOsLogin(
+      UnregisterRunOnOsLogin(
           shortcut_info->profile_path, shortcut_info->title,
           barrier->CreateBarrierCallbackForType(OsHookType::kRunOnOsLogin));
     }
 
     if (os_hooks[OsHookType::kShortcuts]) {
-      internals::ScheduleDeletePlatformShortcuts(
-          shortcut_data_dir, std::move(shortcut_info),
-          base::BindOnce(
-              &OsIntegrationManager::OnShortcutsDeleted,
-              weak_ptr_factory_.GetWeakPtr(), app_id,
-              barrier->CreateBarrierCallbackForType(OsHookType::kShortcuts)));
+      DeleteShortcuts(
+          app_id, shortcut_data_dir, std::move(shortcut_info),
+          barrier->CreateBarrierCallbackForType(OsHookType::kShortcuts));
     }
   }
   // TODO(https://crbug.com/1108109) we should return the result of file handler
   // unregistration and record errors during unregistration.
   if (os_hooks[OsHookType::kFileHandlers])
-    file_handler_manager_->DisableAndUnregisterOsFileHandlers(app_id);
+    UnregisterFileHandlers(app_id);
 
   // There is a chance uninstallation point was created with feature flag
   // enabled so we need to clean it up regardless of feature flag state.
-  if (os_hooks[OsHookType::kUninstallationViaOsSettings] &&
-      ShouldRegisterUninstallationViaOsSettingsWithOs()) {
-    UnegisterUninstallationViaOsSettingsWithOs(app_id, profile_);
-  }
+  if (os_hooks[OsHookType::kUninstallationViaOsSettings])
+    UnregisterWebAppOsUninstallation(app_id);
 }
 
 void OsIntegrationManager::UpdateOsHooks(
@@ -339,6 +332,8 @@
         shortcuts_menu_item_infos,
     const ShortcutsMenuIconsBitmaps& shortcuts_menu_icons_bitmaps,
     base::OnceCallback<void(bool success)> callback) {
+  if (!ShouldRegisterShortcutsMenuWithOs())
+    std::move(callback).Run(true);
 
   shortcut_manager_->RegisterShortcutsMenuWithOs(
       app_id, shortcuts_menu_item_infos, shortcuts_menu_icons_bitmaps);
@@ -351,6 +346,9 @@
 void OsIntegrationManager::ReadAllShortcutsMenuIconsAndRegisterShortcutsMenu(
     const AppId& app_id,
     base::OnceCallback<void(bool success)> callback) {
+  if (!ShouldRegisterShortcutsMenuWithOs())
+    std::move(callback).Run(true);
+
   shortcut_manager_->ReadAllShortcutsMenuIconsAndRegisterShortcutsMenu(
       app_id, std::move(callback));
 }
@@ -389,6 +387,48 @@
   }
 }
 
+bool OsIntegrationManager::UnregisterShortcutsMenu(const AppId& app_id) {
+  if (!ShouldRegisterShortcutsMenuWithOs())
+    return true;
+  return UnregisterShortcutsMenuWithOs(app_id, profile_->GetPath());
+}
+
+void OsIntegrationManager::UnregisterRunOnOsLogin(
+    const base::FilePath& profile_path,
+    const base::string16& shortcut_title,
+    UnregisterRunOnOsLoginCallback callback) {
+  ScheduleUnregisterRunOnOsLogin(profile_path, shortcut_title,
+                                 std::move(callback));
+}
+
+void OsIntegrationManager::DeleteShortcuts(
+    const AppId& app_id,
+    const base::FilePath& shortcuts_data_dir,
+    std::unique_ptr<ShortcutInfo> shortcut_info,
+    DeleteShortcutsCallback callback) {
+  internals::ScheduleDeletePlatformShortcuts(
+      shortcuts_data_dir, std::move(shortcut_info),
+      base::BindOnce(&OsIntegrationManager::OnShortcutsDeleted,
+                     weak_ptr_factory_.GetWeakPtr(), app_id,
+                     std::move(callback)));
+}
+
+void OsIntegrationManager::UnregisterFileHandlers(const AppId& app_id) {
+  file_handler_manager_->DisableAndUnregisterOsFileHandlers(app_id);
+}
+
+void OsIntegrationManager::UnregisterWebAppOsUninstallation(
+    const AppId& app_id) {
+  if (ShouldRegisterUninstallationViaOsSettingsWithOs())
+    UnegisterUninstallationViaOsSettingsWithOs(app_id, profile_);
+}
+
+std::unique_ptr<ShortcutInfo> OsIntegrationManager::BuildShortcutInfo(
+    const AppId& app_id) {
+  DCHECK(shortcut_manager_);
+  return shortcut_manager_->BuildShortcutInfo(app_id);
+}
+
 void OsIntegrationManager::OnShortcutsCreated(
     const AppId& app_id,
     std::unique_ptr<WebApplicationInfo> web_app_info,
diff --git a/chrome/browser/web_applications/components/os_integration_manager.h b/chrome/browser/web_applications/components/os_integration_manager.h
index b768b99..ad5df33a 100644
--- a/chrome/browser/web_applications/components/os_integration_manager.h
+++ b/chrome/browser/web_applications/components/os_integration_manager.h
@@ -160,6 +160,7 @@
                                bool add_to_desktop,
                                CreateShortcutsCallback callback);
 
+  // Installation:
   virtual void RegisterFileHandlers(
       const AppId& app_id,
       base::OnceCallback<void(bool success)> callback);
@@ -179,6 +180,21 @@
   virtual void RegisterWebAppOsUninstallation(const AppId& app_id,
                                               const std::string& name);
 
+  // Uninstallation:
+  virtual bool UnregisterShortcutsMenu(const AppId& app_id);
+  virtual void UnregisterRunOnOsLogin(const base::FilePath& profile_path,
+                                      const base::string16& shortcut_title,
+                                      UnregisterRunOnOsLoginCallback callback);
+  virtual void DeleteShortcuts(const AppId& app_id,
+                               const base::FilePath& shortcuts_data_dir,
+                               std::unique_ptr<ShortcutInfo> shortcut_info,
+                               DeleteShortcutsCallback callback);
+  virtual void UnregisterFileHandlers(const AppId& app_id);
+  virtual void UnregisterWebAppOsUninstallation(const AppId& app_id);
+
+  // Utility mathods:
+  virtual std::unique_ptr<ShortcutInfo> BuildShortcutInfo(const AppId& app_id);
+
  private:
   class OsHooksBarrier;
 
diff --git a/chrome/browser/web_applications/components/os_integration_manager_unittest.cc b/chrome/browser/web_applications/components/os_integration_manager_unittest.cc
index ec0bb7a..0ef6c71 100644
--- a/chrome/browser/web_applications/components/os_integration_manager_unittest.cc
+++ b/chrome/browser/web_applications/components/os_integration_manager_unittest.cc
@@ -7,23 +7,29 @@
 #include <memory>
 
 #include "base/bind.h"
+#include "base/files/file_path.h"
 #include "base/run_loop.h"
 #include "base/test/bind.h"
 #include "base/test/gmock_callback_support.h"
 #include "base/test/task_environment.h"
+#include "build/build_config.h"
 #include "chrome/browser/web_applications/components/web_app_constants.h"
 #include "chrome/browser/web_applications/web_app.h"
+#include "chrome/common/chrome_constants.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/features.h"
 
 namespace web_app {
+namespace {
+
 class MockOsIntegrationManager : public OsIntegrationManager {
  public:
   MockOsIntegrationManager()
       : OsIntegrationManager(nullptr, nullptr, nullptr, nullptr) {}
   ~MockOsIntegrationManager() override = default;
 
+  // Installation:
   MOCK_METHOD(void,
               CreateShortcuts,
               (const AppId& app_id,
@@ -68,12 +74,65 @@
               RegisterWebAppOsUninstallation,
               (const AppId& app_id, const std::string& name),
               (override));
+
+  // Uninstallation:
+  MOCK_METHOD(bool, UnregisterShortcutsMenu, (const AppId& app_id), (override));
+  MOCK_METHOD(void,
+              UnregisterRunOnOsLogin,
+              (const base::FilePath& profile_path,
+               const base::string16& shortcut_title,
+               UnregisterRunOnOsLoginCallback callback),
+              (override));
+  MOCK_METHOD(void,
+              DeleteShortcuts,
+              (const AppId& app_id,
+               const base::FilePath& shortcuts_data_dir,
+               std::unique_ptr<ShortcutInfo> shortcut_info,
+               DeleteShortcutsCallback callback),
+              (override));
+  MOCK_METHOD(void, UnregisterFileHandlers, (const AppId& app_id), (override));
+  MOCK_METHOD(void,
+              UnregisterWebAppOsUninstallation,
+              (const AppId& app_id),
+              (override));
+
+  // Utility methods:
+  MOCK_METHOD(std::unique_ptr<ShortcutInfo>,
+              BuildShortcutInfo,
+              (const AppId& app_id),
+              (override));
 };
 
-TEST(OsIntegrationManagerTest, InstallOsHooksOnlyShortcuts) {
+#if defined(OS_WIN)
+const base::FilePath::CharType kFakeProfilePath[] =
+    FILE_PATH_LITERAL("\\profile\\path");
+#else
+const base::FilePath::CharType kFakeProfilePath[] =
+    FILE_PATH_LITERAL("/profile/path");
+#endif  // defined(OS_WIN)
+
+const char kFakeAppUrl[] = "https://fake.com";
+
+std::unique_ptr<ShortcutInfo> CreateTestShorcutInfo(
+    const web_app::AppId& app_id) {
+  auto shortcut_info = std::make_unique<ShortcutInfo>();
+  shortcut_info->profile_path = base::FilePath(kFakeProfilePath);
+  shortcut_info->extension_id = app_id;
+  shortcut_info->url = GURL(kFakeAppUrl);
+  return shortcut_info;
+}
+
+class OsIntegrationManagerTest : public testing::Test {
+ public:
+  OsIntegrationManagerTest() = default;
+  ~OsIntegrationManagerTest() override = default;
+
+ private:
   base::test::TaskEnvironment task_environment_{
       base::test::TaskEnvironment::MainThreadType::UI};
+};
 
+TEST_F(OsIntegrationManagerTest, InstallOsHooksOnlyShortcuts) {
   base::RunLoop run_loop;
 
   OsHooksResults install_results;
@@ -98,10 +157,7 @@
   EXPECT_TRUE(install_results[OsHookType::kShortcuts]);
 }
 
-TEST(OsIntegrationManagerTest, InstallOsHooksEverything) {
-  base::test::TaskEnvironment task_environment_{
-      base::test::TaskEnvironment::MainThreadType::UI};
-
+TEST_F(OsIntegrationManagerTest, InstallOsHooksEverything) {
   base::RunLoop run_loop;
 
   OsHooksResults install_results;
@@ -123,7 +179,7 @@
   EXPECT_CALL(manager, AddAppToQuickLaunchBar(app_id)).Times(1);
   EXPECT_CALL(manager, ReadAllShortcutsMenuIconsAndRegisterShortcutsMenu(
                            app_id, testing::_))
-      .Times(1);
+      .WillOnce(base::test::RunOnceCallback<1>(true));
 
   InstallOsHooksOptions options;
   options.add_to_desktop = true;
@@ -141,4 +197,44 @@
   EXPECT_TRUE(install_results[OsHookType::kShortcutsMenu]);
   EXPECT_TRUE(install_results[OsHookType::kUninstallationViaOsSettings]);
 }
+
+TEST_F(OsIntegrationManagerTest, UninstallOsHooksEverything) {
+  base::RunLoop run_loop;
+
+  OsHooksResults uninstall_results;
+  UninstallOsHooksCallback callback =
+      base::BindLambdaForTesting([&](OsHooksResults results) {
+        uninstall_results = results;
+        run_loop.Quit();
+      });
+
+  const AppId app_id = "test";
+
+  const base::FilePath kExpectedShortcutPath =
+      base::FilePath(kFakeProfilePath)
+          .Append(chrome::kWebAppDirname)
+          .AppendASCII("_crx_test");
+
+  testing::StrictMock<MockOsIntegrationManager> manager;
+  EXPECT_CALL(manager, BuildShortcutInfo(app_id))
+      .WillOnce(
+          testing::Return(testing::ByMove(CreateTestShorcutInfo(app_id))));
+  EXPECT_CALL(manager, DeleteShortcuts(app_id, kExpectedShortcutPath,
+                                       testing::_, testing::_))
+      .WillOnce(base::test::RunOnceCallback<3>(true));
+  EXPECT_CALL(manager, UnregisterFileHandlers(app_id)).Times(1);
+  EXPECT_CALL(manager, UnregisterWebAppOsUninstallation(app_id)).Times(1);
+  EXPECT_CALL(manager, UnregisterShortcutsMenu(app_id))
+      .WillOnce(testing::Return(true));
+
+  manager.UninstallAllOsHooks(app_id, std::move(callback));
+  run_loop.Run();
+  EXPECT_TRUE(uninstall_results[OsHookType::kShortcuts]);
+  EXPECT_TRUE(uninstall_results[OsHookType::kFileHandlers]);
+  EXPECT_TRUE(uninstall_results[OsHookType::kRunOnOsLogin]);
+  EXPECT_TRUE(uninstall_results[OsHookType::kShortcutsMenu]);
+  EXPECT_TRUE(uninstall_results[OsHookType::kUninstallationViaOsSettings]);
+}
+
+}  // namespace
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/components/pending_app_manager.cc b/chrome/browser/web_applications/components/pending_app_manager.cc
index be5db1b6..477590c 100644
--- a/chrome/browser/web_applications/components/pending_app_manager.cc
+++ b/chrome/browser/web_applications/components/pending_app_manager.cc
@@ -17,6 +17,12 @@
 
 namespace web_app {
 
+bool PendingAppManager::InstallResult::operator==(
+    const InstallResult& other) const {
+  return std::tie(code, did_uninstall_and_replace) ==
+         std::tie(other.code, other.did_uninstall_and_replace);
+}
+
 PendingAppManager::SynchronizeRequest::SynchronizeRequest(
     SynchronizeCallback callback,
     int remaining_requests)
@@ -83,7 +89,7 @@
   if (urls_to_remove.empty() && desired_apps_install_options.empty()) {
     base::ThreadTaskRunnerHandle::Get()->PostTask(
         FROM_HERE,
-        base::BindOnce(std::move(callback), std::map<GURL, InstallResultCode>(),
+        base::BindOnce(std::move(callback), std::map<GURL, InstallResult>(),
                        std::map<GURL, bool>()));
     return;
   }
@@ -127,16 +133,17 @@
 void PendingAppManager::InstallForSynchronizeCallback(
     ExternalInstallSource source,
     const GURL& app_url,
-    InstallResultCode code) {
-  if (!IsSuccess(code)) {
+    PendingAppManager::InstallResult result) {
+  if (!IsSuccess(result.code)) {
     LOG(ERROR) << app_url << " from install source " << static_cast<int>(source)
-               << " failed to install with reason " << static_cast<int>(code);
+               << " failed to install with reason "
+               << static_cast<int>(result.code);
   }
 
   auto source_and_request = synchronize_requests_.find(source);
   DCHECK(source_and_request != synchronize_requests_.end());
   SynchronizeRequest& request = source_and_request->second;
-  request.install_results[app_url] = code;
+  request.install_results[app_url] = result;
 
   OnAppSynchronized(source, app_url);
 }
diff --git a/chrome/browser/web_applications/components/pending_app_manager.h b/chrome/browser/web_applications/components/pending_app_manager.h
index cc9151d..5ba6cd31 100644
--- a/chrome/browser/web_applications/components/pending_app_manager.h
+++ b/chrome/browser/web_applications/components/pending_app_manager.h
@@ -38,18 +38,23 @@
 // should wait for the update request to finish before uninstalling the app.
 class PendingAppManager {
  public:
+  struct InstallResult {
+    InstallResultCode code;
+    bool did_uninstall_and_replace = false;
+    bool operator==(const InstallResult& other) const;
+  };
+
   using OnceInstallCallback =
-      base::OnceCallback<void(const GURL& app_url, InstallResultCode code)>;
+      base::OnceCallback<void(const GURL& app_url, InstallResult result)>;
   using RepeatingInstallCallback =
-      base::RepeatingCallback<void(const GURL& app_url,
-                                   InstallResultCode code)>;
+      base::RepeatingCallback<void(const GURL& app_url, InstallResult result)>;
   using RegistrationCallback =
       base::RepeatingCallback<void(const GURL& launch_url,
                                    RegistrationResultCode code)>;
   using UninstallCallback =
       base::RepeatingCallback<void(const GURL& app_url, bool succeeded)>;
   using SynchronizeCallback =
-      base::OnceCallback<void(std::map<GURL, InstallResultCode> install_results,
+      base::OnceCallback<void(std::map<GURL, InstallResult> install_results,
                               std::map<GURL, bool> uninstall_results)>;
 
   PendingAppManager();
@@ -144,14 +149,14 @@
 
     SynchronizeCallback callback;
     int remaining_requests;
-    std::map<GURL, InstallResultCode> install_results;
+    std::map<GURL, InstallResult> install_results;
     std::map<GURL, bool> uninstall_results;
 
   };
 
   void InstallForSynchronizeCallback(ExternalInstallSource source,
                                      const GURL& app_url,
-                                     InstallResultCode code);
+                                     PendingAppManager::InstallResult result);
   void UninstallForSynchronizeCallback(ExternalInstallSource source,
                                        const GURL& app_url,
                                        bool succeeded);
diff --git a/chrome/browser/web_applications/components/pending_app_manager_unittest.cc b/chrome/browser/web_applications/components/pending_app_manager_unittest.cc
index dfd8b928..65d8b6767 100644
--- a/chrome/browser/web_applications/components/pending_app_manager_unittest.cc
+++ b/chrome/browser/web_applications/components/pending_app_manager_unittest.cc
@@ -39,7 +39,8 @@
         std::move(install_options_list),
         ExternalInstallSource::kInternalDefault,
         base::BindLambdaForTesting(
-            [&run_loop, urls](std::map<GURL, InstallResultCode> install_results,
+            [&run_loop, urls](std::map<GURL, PendingAppManager::InstallResult>
+                                  install_results,
                               std::map<GURL, bool> uninstall_results) {
               run_loop.Quit();
             }));
@@ -114,7 +115,8 @@
         std::move(install_options_list),
         ExternalInstallSource::kInternalDefault,
         base::BindLambdaForTesting(
-            [&](std::map<GURL, InstallResultCode> install_results,
+            [&](std::map<GURL, PendingAppManager::InstallResult>
+                    install_results,
                 std::map<GURL, bool> uninstall_results) { run_loop.Quit(); }));
     run_loop.Run();
   }
diff --git a/chrome/browser/web_applications/components/policy/web_app_policy_manager.cc b/chrome/browser/web_applications/components/policy/web_app_policy_manager.cc
index 98a61ab..83e3505 100644
--- a/chrome/browser/web_applications/components/policy/web_app_policy_manager.cc
+++ b/chrome/browser/web_applications/components/policy/web_app_policy_manager.cc
@@ -10,6 +10,7 @@
 
 #include "base/bind.h"
 #include "base/callback_helpers.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/values.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/web_applications/components/external_install_options.h"
@@ -166,14 +167,16 @@
 }
 
 void WebAppPolicyManager::OnAppsSynchronized(
-    std::map<GURL, InstallResultCode> install_results,
+    std::map<GURL, PendingAppManager::InstallResult> install_results,
     std::map<GURL, bool> uninstall_results) {
   is_refreshing_ = false;
   if (needs_refresh_)
     RefreshPolicyInstalledApps();
 
-  RecordExternalAppInstallResultCode(kInstallResultHistogramName,
-                                     install_results);
+  for (const auto& url_and_result : install_results) {
+    base::UmaHistogramEnumeration(kInstallResultHistogramName,
+                                  url_and_result.second.code);
+  }
 }
 
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/components/policy/web_app_policy_manager.h b/chrome/browser/web_applications/components/policy/web_app_policy_manager.h
index f0e7392..2e4de42 100644
--- a/chrome/browser/web_applications/components/policy/web_app_policy_manager.h
+++ b/chrome/browser/web_applications/components/policy/web_app_policy_manager.h
@@ -51,8 +51,9 @@
   void InitChangeRegistrarAndRefreshPolicyInstalledApps();
 
   void RefreshPolicyInstalledApps();
-  void OnAppsSynchronized(std::map<GURL, InstallResultCode> install_results,
-                          std::map<GURL, bool> uninstall_results);
+  void OnAppsSynchronized(
+      std::map<GURL, PendingAppManager::InstallResult> install_results,
+      std::map<GURL, bool> uninstall_results);
 
   Profile* profile_;
   PrefService* pref_service_;
diff --git a/chrome/browser/web_applications/components/web_app_id_constants.h b/chrome/browser/web_applications/components/web_app_id_constants.h
index dca7de88..dbf3f7a 100644
--- a/chrome/browser/web_applications/components/web_app_id_constants.h
+++ b/chrome/browser/web_applications/components/web_app_id_constants.h
@@ -72,10 +72,6 @@
 constexpr char kPlayBooksAppId[] = "jglfhlbohpgcbefmhdmpancnijacbbji";
 
 // Generated as: web_app::GenerateAppIdFromURL(GURL(
-//     "https://google.com/chromebook/whatsnew/embedded/"))
-constexpr char kReleaseNotesAppId[] = "lddhblppcjmenljhdleiahjighahdcje";
-
-// Generated as: web_app::GenerateAppIdFromURL(GURL(
 //     "chrome://settings/"))
 constexpr char kSettingsAppId[] = "inogagmajamaleonmanpkpkkigmklfad";
 
diff --git a/chrome/browser/web_applications/components/web_app_install_utils.cc b/chrome/browser/web_applications/components/web_app_install_utils.cc
index 68f6a95..eeead0f 100644
--- a/chrome/browser/web_applications/components/web_app_install_utils.cc
+++ b/chrome/browser/web_applications/components/web_app_install_utils.cc
@@ -9,7 +9,6 @@
 #include <utility>
 
 #include "base/feature_list.h"
-#include "base/metrics/histogram_functions.h"
 #include "base/optional.h"
 #include "base/stl_util.h"
 #include "base/strings/string16.h"
@@ -428,11 +427,4 @@
   return install_source;
 }
 
-void RecordExternalAppInstallResultCode(
-    const char* histogram_name,
-    std::map<GURL, InstallResultCode> install_results) {
-  for (const auto& url_and_result : install_results)
-    base::UmaHistogramEnumeration(histogram_name, url_and_result.second);
-}
-
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/components/web_app_install_utils.h b/chrome/browser/web_applications/components/web_app_install_utils.h
index 7c774074e..39ab386 100644
--- a/chrome/browser/web_applications/components/web_app_install_utils.h
+++ b/chrome/browser/web_applications/components/web_app_install_utils.h
@@ -64,10 +64,6 @@
 WebappInstallSource ConvertExternalInstallSourceToInstallSource(
     ExternalInstallSource external_install_source);
 
-void RecordExternalAppInstallResultCode(
-    const char* histogram_name,
-    std::map<GURL, InstallResultCode> install_results);
-
 }  // namespace web_app
 
 #endif  // CHROME_BROWSER_WEB_APPLICATIONS_COMPONENTS_WEB_APP_INSTALL_UTILS_H_
diff --git a/chrome/browser/web_applications/components/web_app_ui_manager.h b/chrome/browser/web_applications/components/web_app_ui_manager.h
index 4a1d2587..ecca1fa 100644
--- a/chrome/browser/web_applications/components/web_app_ui_manager.h
+++ b/chrome/browser/web_applications/components/web_app_ui_manager.h
@@ -29,8 +29,6 @@
  public:
   static std::unique_ptr<WebAppUiManager> Create(Profile* profile);
 
-  static bool ShouldHideAppFromUser(const AppId& app_id);
-
   virtual ~WebAppUiManager() = default;
 
   virtual void SetSubsystems(
@@ -49,7 +47,8 @@
   // Uninstalls the the apps in |from_apps| and migrates an |to_app|'s OS
   // attributes (e.g pin position, app list folder/position, shortcuts) to the
   // first |from_app| found.
-  virtual void UninstallAndReplaceIfExists(const std::vector<AppId>& from_apps,
+  // Returns whether any |from_apps| were uninstalled.
+  virtual bool UninstallAndReplaceIfExists(const std::vector<AppId>& from_apps,
                                            const AppId& to_app) = 0;
 
   virtual bool CanAddAppToQuickLaunchBar() const = 0;
diff --git a/chrome/browser/web_applications/extensions/pending_app_install_task_unittest.cc b/chrome/browser/web_applications/extensions/pending_app_install_task_unittest.cc
index 9d169ff..c715efa 100644
--- a/chrome/browser/web_applications/extensions/pending_app_install_task_unittest.cc
+++ b/chrome/browser/web_applications/extensions/pending_app_install_task_unittest.cc
@@ -49,8 +49,6 @@
 
 namespace web_app {
 
-using Result = PendingAppInstallTask::Result;
-
 namespace {
 
 // Returns a factory that will return |data_retriever| the first time it gets
@@ -393,17 +391,18 @@
 
   task->Install(
       web_contents(), WebAppUrlLoader::Result::kUrlLoaded,
-      base::BindLambdaForTesting([&](PendingAppInstallTask::Result result) {
+      base::BindLambdaForTesting([&](base::Optional<AppId> app_id,
+                                     PendingAppManager::InstallResult result) {
         base::Optional<AppId> id =
             ExternallyInstalledWebAppPrefs(profile()->GetPrefs())
                 .LookupAppId(WebAppUrl());
 
         EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
-        EXPECT_TRUE(result.app_id.has_value());
+        EXPECT_TRUE(app_id.has_value());
 
         EXPECT_FALSE(IsPlaceholderApp(profile(), WebAppUrl()));
 
-        EXPECT_EQ(result.app_id.value(), id.value());
+        EXPECT_EQ(app_id.value(), id.value());
 
         EXPECT_EQ(1u, os_integration_manager()->num_create_shortcuts_calls());
         EXPECT_TRUE(os_integration_manager()->did_add_to_desktop().value());
@@ -434,13 +433,14 @@
 
   task->Install(
       web_contents(), WebAppUrlLoader::Result::kUrlLoaded,
-      base::BindLambdaForTesting([&](PendingAppInstallTask::Result result) {
+      base::BindLambdaForTesting([&](base::Optional<AppId> app_id,
+                                     PendingAppManager::InstallResult result) {
         base::Optional<AppId> id =
             ExternallyInstalledWebAppPrefs(profile()->GetPrefs())
                 .LookupAppId(WebAppUrl());
 
         EXPECT_EQ(InstallResultCode::kGetWebApplicationInfoFailed, result.code);
-        EXPECT_FALSE(result.app_id.has_value());
+        EXPECT_FALSE(app_id.has_value());
 
         EXPECT_FALSE(id.has_value());
 
@@ -462,9 +462,10 @@
 
   task->Install(
       web_contents(), WebAppUrlLoader::Result::kUrlLoaded,
-      base::BindLambdaForTesting([&](PendingAppInstallTask::Result result) {
+      base::BindLambdaForTesting([&](base::Optional<AppId> app_id,
+                                     PendingAppManager::InstallResult result) {
         EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
-        EXPECT_TRUE(result.app_id.has_value());
+        EXPECT_TRUE(app_id.has_value());
 
         EXPECT_EQ(1u, os_integration_manager()->num_create_shortcuts_calls());
         EXPECT_FALSE(os_integration_manager()->did_add_to_desktop().value());
@@ -491,9 +492,10 @@
   base::RunLoop run_loop;
   task->Install(
       web_contents(), WebAppUrlLoader::Result::kUrlLoaded,
-      base::BindLambdaForTesting([&](PendingAppInstallTask::Result result) {
+      base::BindLambdaForTesting([&](base::Optional<AppId> app_id,
+                                     PendingAppManager::InstallResult result) {
         EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
-        EXPECT_TRUE(result.app_id.has_value());
+        EXPECT_TRUE(app_id.has_value());
 
         EXPECT_EQ(1u, os_integration_manager()->num_create_shortcuts_calls());
         EXPECT_TRUE(os_integration_manager()->did_add_to_desktop().value());
@@ -522,9 +524,10 @@
   base::RunLoop run_loop;
   task->Install(
       web_contents(), WebAppUrlLoader::Result::kUrlLoaded,
-      base::BindLambdaForTesting([&](PendingAppInstallTask::Result result) {
+      base::BindLambdaForTesting([&](base::Optional<AppId> app_id,
+                                     PendingAppManager::InstallResult result) {
         EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
-        EXPECT_TRUE(result.app_id.has_value());
+        EXPECT_TRUE(app_id.has_value());
 
         EXPECT_EQ(1u, os_integration_manager()->num_create_shortcuts_calls());
         EXPECT_FALSE(os_integration_manager()->did_add_to_desktop().value());
@@ -550,9 +553,10 @@
   base::RunLoop run_loop;
   task->Install(
       web_contents(), WebAppUrlLoader::Result::kUrlLoaded,
-      base::BindLambdaForTesting([&](PendingAppInstallTask::Result result) {
+      base::BindLambdaForTesting([&](base::Optional<AppId> app_id,
+                                     PendingAppManager::InstallResult result) {
         EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
-        EXPECT_TRUE(result.app_id.has_value());
+        EXPECT_TRUE(app_id.has_value());
         EXPECT_TRUE(web_app_info().open_as_window);
         run_loop.Quit();
       }));
@@ -570,9 +574,10 @@
   base::RunLoop run_loop;
   task->Install(
       web_contents(), WebAppUrlLoader::Result::kUrlLoaded,
-      base::BindLambdaForTesting([&](PendingAppInstallTask::Result result) {
+      base::BindLambdaForTesting([&](base::Optional<AppId> app_id,
+                                     PendingAppManager::InstallResult result) {
         EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
-        EXPECT_TRUE(result.app_id.has_value());
+        EXPECT_TRUE(app_id.has_value());
         EXPECT_FALSE(web_app_info().open_as_window);
         run_loop.Quit();
       }));
@@ -589,9 +594,10 @@
   base::RunLoop run_loop;
   task->Install(
       web_contents(), WebAppUrlLoader::Result::kUrlLoaded,
-      base::BindLambdaForTesting([&](PendingAppInstallTask::Result result) {
+      base::BindLambdaForTesting([&](base::Optional<AppId> app_id,
+                                     PendingAppManager::InstallResult result) {
         EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
-        EXPECT_TRUE(result.app_id.has_value());
+        EXPECT_TRUE(app_id.has_value());
 
         EXPECT_EQ(WebappInstallSource::INTERNAL_DEFAULT,
                   finalize_options().install_source);
@@ -610,9 +616,10 @@
   base::RunLoop run_loop;
   task->Install(
       web_contents(), WebAppUrlLoader::Result::kUrlLoaded,
-      base::BindLambdaForTesting([&](PendingAppInstallTask::Result result) {
+      base::BindLambdaForTesting([&](base::Optional<AppId> app_id,
+                                     PendingAppManager::InstallResult result) {
         EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
-        EXPECT_TRUE(result.app_id.has_value());
+        EXPECT_TRUE(app_id.has_value());
 
         EXPECT_EQ(WebappInstallSource::EXTERNAL_POLICY,
                   finalize_options().install_source);
@@ -631,9 +638,10 @@
   base::RunLoop run_loop;
   task->Install(
       web_contents(), WebAppUrlLoader::Result::kRedirectedUrlLoaded,
-      base::BindLambdaForTesting([&](PendingAppInstallTask::Result result) {
+      base::BindLambdaForTesting([&](base::Optional<AppId> app_id,
+                                     PendingAppManager::InstallResult result) {
         EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
-        EXPECT_TRUE(result.app_id.has_value());
+        EXPECT_TRUE(app_id.has_value());
 
         EXPECT_TRUE(IsPlaceholderApp(profile(), WebAppUrl()));
 
@@ -667,9 +675,10 @@
   base::RunLoop run_loop;
   task->Install(
       web_contents(), WebAppUrlLoader::Result::kRedirectedUrlLoaded,
-      base::BindLambdaForTesting([&](PendingAppInstallTask::Result result) {
+      base::BindLambdaForTesting([&](base::Optional<AppId> app_id,
+                                     PendingAppManager::InstallResult result) {
         EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
-        EXPECT_TRUE(result.app_id.has_value());
+        EXPECT_TRUE(app_id.has_value());
 
         EXPECT_TRUE(IsPlaceholderApp(profile(), WebAppUrl()));
 
@@ -703,13 +712,15 @@
     base::RunLoop run_loop;
     task->Install(
         web_contents(), WebAppUrlLoader::Result::kRedirectedUrlLoaded,
-        base::BindLambdaForTesting([&](PendingAppInstallTask::Result result) {
-          EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
-          placeholder_app_id = result.app_id.value();
+        base::BindLambdaForTesting(
+            [&](base::Optional<AppId> app_id,
+                PendingAppManager::InstallResult result) {
+              EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
+              placeholder_app_id = app_id.value();
 
-          EXPECT_EQ(1u, finalizer()->finalize_options_list().size());
-          run_loop.Quit();
-        }));
+              EXPECT_EQ(1u, finalizer()->finalize_options_list().size());
+              run_loop.Quit();
+            }));
     run_loop.Run();
   }
 
@@ -718,9 +729,10 @@
   base::RunLoop run_loop;
   task->Install(
       web_contents(), WebAppUrlLoader::Result::kRedirectedUrlLoaded,
-      base::BindLambdaForTesting([&](PendingAppInstallTask::Result result) {
+      base::BindLambdaForTesting([&](base::Optional<AppId> app_id,
+                                     PendingAppManager::InstallResult result) {
         EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
-        EXPECT_EQ(placeholder_app_id, result.app_id.value());
+        EXPECT_EQ(placeholder_app_id, app_id.value());
 
         // There shouldn't be a second call to the finalizer.
         EXPECT_EQ(1u, finalizer()->finalize_options_list().size());
@@ -743,13 +755,15 @@
     base::RunLoop run_loop;
     task->Install(
         web_contents(), WebAppUrlLoader::Result::kRedirectedUrlLoaded,
-        base::BindLambdaForTesting([&](PendingAppInstallTask::Result result) {
-          EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
-          placeholder_app_id = result.app_id.value();
+        base::BindLambdaForTesting(
+            [&](base::Optional<AppId> app_id,
+                PendingAppManager::InstallResult result) {
+              EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
+              placeholder_app_id = app_id.value();
 
-          EXPECT_EQ(1u, finalizer()->finalize_options_list().size());
-          run_loop.Quit();
-        }));
+              EXPECT_EQ(1u, finalizer()->finalize_options_list().size());
+              run_loop.Quit();
+            }));
     run_loop.Run();
   }
 
@@ -761,9 +775,10 @@
   base::RunLoop run_loop;
   task->Install(
       web_contents(), WebAppUrlLoader::Result::kUrlLoaded,
-      base::BindLambdaForTesting([&](PendingAppInstallTask::Result result) {
+      base::BindLambdaForTesting([&](base::Optional<AppId> app_id,
+                                     PendingAppManager::InstallResult result) {
         EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
-        EXPECT_TRUE(result.app_id.has_value());
+        EXPECT_TRUE(app_id.has_value());
         EXPECT_FALSE(IsPlaceholderApp(profile(), WebAppUrl()));
 
         EXPECT_EQ(1u, finalizer()->uninstall_external_web_app_urls().size());
@@ -787,14 +802,16 @@
     base::RunLoop run_loop;
     task->Install(
         web_contents(), WebAppUrlLoader::Result::kRedirectedUrlLoaded,
-        base::BindLambdaForTesting([&](PendingAppInstallTask::Result result) {
-          EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
-          placeholder_app_id = result.app_id.value();
+        base::BindLambdaForTesting(
+            [&](base::Optional<AppId> app_id,
+                PendingAppManager::InstallResult result) {
+              EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
+              placeholder_app_id = app_id.value();
 
-          EXPECT_EQ(1u, finalizer()->finalize_options_list().size());
+              EXPECT_EQ(1u, finalizer()->finalize_options_list().size());
 
-          run_loop.Quit();
-        }));
+              run_loop.Quit();
+            }));
     run_loop.Run();
   }
 
@@ -807,9 +824,10 @@
   base::RunLoop run_loop;
   task->Install(
       web_contents(), WebAppUrlLoader::Result::kUrlLoaded,
-      base::BindLambdaForTesting([&](PendingAppInstallTask::Result result) {
+      base::BindLambdaForTesting([&](base::Optional<AppId> app_id,
+                                     PendingAppManager::InstallResult result) {
         EXPECT_EQ(InstallResultCode::kFailedPlaceholderUninstall, result.code);
-        EXPECT_FALSE(result.app_id.has_value());
+        EXPECT_FALSE(app_id.has_value());
         EXPECT_TRUE(IsPlaceholderApp(profile(), WebAppUrl()));
 
         EXPECT_EQ(1u, finalizer()->uninstall_external_web_app_urls().size());
@@ -836,8 +854,10 @@
     auto task = GetInstallationTaskWithTestMocks(options);
     task->Install(
         web_contents(), WebAppUrlLoader::Result::kUrlLoaded,
-        base::BindLambdaForTesting([&](PendingAppInstallTask::Result result) {
-          app_id = *result.app_id;
+        base::BindLambdaForTesting([&](base::Optional<AppId> installed_app_id,
+                                       PendingAppManager::InstallResult
+                                           result) {
+          app_id = *installed_app_id;
 
           EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
           EXPECT_EQ(app_id,
@@ -859,14 +879,16 @@
     auto task = GetInstallationTaskWithTestMocks(options);
     task->Install(
         web_contents(), WebAppUrlLoader::Result::kUrlLoaded,
-        base::BindLambdaForTesting([&](PendingAppInstallTask::Result result) {
-          EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
-          EXPECT_EQ(app_id, *result.app_id);
+        base::BindLambdaForTesting(
+            [&](base::Optional<AppId> installed_app_id,
+                PendingAppManager::InstallResult result) {
+              EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
+              EXPECT_EQ(app_id, *installed_app_id);
 
-          EXPECT_TRUE(ui_manager()->DidUninstallAndReplace("app3", app_id));
+              EXPECT_TRUE(ui_manager()->DidUninstallAndReplace("app3", app_id));
 
-          run_loop.Quit();
-        }));
+              run_loop.Quit();
+            }));
     run_loop.Run();
   }
 }
@@ -892,12 +914,14 @@
         profile(), registrar(), os_integration_manager(), ui_manager(),
         finalizer(), install_manager(), install_options);
 
-    install_task.Install(
-        web_contents(), result_pair.loader_result,
-        base::BindLambdaForTesting([&](PendingAppInstallTask::Result result) {
-          EXPECT_EQ(result.code, result_pair.install_result);
-          run_loop.Quit();
-        }));
+    install_task.Install(web_contents(), result_pair.loader_result,
+                         base::BindLambdaForTesting(
+                             [&](base::Optional<AppId> app_id,
+                                 PendingAppManager::InstallResult result) {
+                               EXPECT_EQ(result.code,
+                                         result_pair.install_result);
+                               run_loop.Quit();
+                             }));
 
     run_loop.Run();
   }
@@ -914,7 +938,9 @@
   install_task.Install(
       web_contents(), WebAppUrlLoader::Result::kFailedWebContentsDestroyed,
       base::BindLambdaForTesting(
-          [&](PendingAppInstallTask::Result) { NOTREACHED(); }));
+          [&](base::Optional<AppId>, PendingAppManager::InstallResult) {
+            NOTREACHED();
+          }));
 
   base::RunLoop().RunUntilIdle();
 }
@@ -932,9 +958,10 @@
 
   task->Install(
       web_contents(), WebAppUrlLoader::Result::kUrlLoaded,
-      base::BindLambdaForTesting([&](PendingAppInstallTask::Result result) {
+      base::BindLambdaForTesting([&](base::Optional<AppId> app_id,
+                                     PendingAppManager::InstallResult result) {
         EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
-        EXPECT_TRUE(result.app_id.has_value());
+        EXPECT_TRUE(app_id.has_value());
 
         EXPECT_EQ(1u, os_integration_manager()->num_create_shortcuts_calls());
         EXPECT_TRUE(os_integration_manager()->did_add_to_desktop().value());
@@ -965,9 +992,10 @@
 
   task->Install(
       web_contents(), WebAppUrlLoader::Result::kUrlLoaded,
-      base::BindLambdaForTesting([&](PendingAppInstallTask::Result result) {
+      base::BindLambdaForTesting([&](base::Optional<AppId> app_id,
+                                     PendingAppManager::InstallResult result) {
         EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
-        EXPECT_TRUE(result.app_id.has_value());
+        EXPECT_TRUE(app_id.has_value());
 
         EXPECT_EQ(1u, os_integration_manager()->num_create_shortcuts_calls());
         EXPECT_TRUE(os_integration_manager()->did_add_to_desktop().value());
diff --git a/chrome/browser/web_applications/external_web_app_manager.cc b/chrome/browser/web_applications/external_web_app_manager.cc
index 239d57d..d633bb4 100644
--- a/chrome/browser/web_applications/external_web_app_manager.cc
+++ b/chrome/browser/web_applications/external_web_app_manager.cc
@@ -18,7 +18,7 @@
 #include "base/files/file_util.h"
 #include "base/json/json_file_value_serializer.h"
 #include "base/json/json_reader.h"
-#include "base/metrics/histogram_functions.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/no_destructor.h"
 #include "base/path_service.h"
 #include "base/stl_util.h"
@@ -142,6 +142,8 @@
     "WebApp.Preinstalled.DisabledCount";
 const char* ExternalWebAppManager::kHistogramConfigErrorCount =
     "WebApp.Preinstalled.ConfigErrorCount";
+const char* ExternalWebAppManager::kHistogramUninstallAndReplaceCount =
+    "WebApp.Preinstalled.UninstallAndReplaceCount";
 
 void ExternalWebAppManager::RegisterProfilePrefs(
     user_prefs::PrefRegistrySyncable* registry) {
@@ -315,12 +317,12 @@
         return false;
       });
 
-  base::UmaHistogramCounts100(ExternalWebAppManager::kHistogramEnabledCount,
-                              total_count - disabled_count);
-  base::UmaHistogramCounts100(ExternalWebAppManager::kHistogramDisabledCount,
-                              disabled_count);
-  base::UmaHistogramCounts100(ExternalWebAppManager::kHistogramConfigErrorCount,
-                              parsed_configs.error_count);
+  UMA_HISTOGRAM_COUNTS_100(ExternalWebAppManager::kHistogramEnabledCount,
+                           total_count - disabled_count);
+  UMA_HISTOGRAM_COUNTS_100(ExternalWebAppManager::kHistogramDisabledCount,
+                           disabled_count);
+  UMA_HISTOGRAM_COUNTS_100(ExternalWebAppManager::kHistogramConfigErrorCount,
+                           parsed_configs.error_count);
 
   std::move(callback).Run(std::move(parsed_configs.options_list));
 }
@@ -339,7 +341,7 @@
 
 void ExternalWebAppManager::OnExternalWebAppsSynchronized(
     PendingAppManager::SynchronizeCallback callback,
-    std::map<GURL, InstallResultCode> install_results,
+    std::map<GURL, PendingAppManager::InstallResult> install_results,
     std::map<GURL, bool> uninstall_results) {
   // Note that we are storing the Chrome version instead of a "has synchronised"
   // bool in order to do version update specific logic in the future.
@@ -347,8 +349,17 @@
       prefs::kWebAppsLastPreinstallSynchronizeVersion,
       version_info::GetMajorVersionNumber());
 
-  RecordExternalAppInstallResultCode("Webapp.InstallResult.Default",
-                                     install_results);
+  size_t uninstall_and_replace_count = 0;
+  for (const auto& url_and_result : install_results) {
+    UMA_HISTOGRAM_ENUMERATION("Webapp.InstallResult.Default",
+                              url_and_result.second.code);
+    if (url_and_result.second.did_uninstall_and_replace)
+      ++uninstall_and_replace_count;
+  }
+  UMA_HISTOGRAM_COUNTS_100(
+      ExternalWebAppManager::kHistogramUninstallAndReplaceCount,
+      uninstall_and_replace_count);
+
   if (callback) {
     std::move(callback).Run(std::move(install_results),
                             std::move(uninstall_results));
diff --git a/chrome/browser/web_applications/external_web_app_manager.h b/chrome/browser/web_applications/external_web_app_manager.h
index 3f87612..90e14d9e 100644
--- a/chrome/browser/web_applications/external_web_app_manager.h
+++ b/chrome/browser/web_applications/external_web_app_manager.h
@@ -48,6 +48,7 @@
   static const char* kHistogramEnabledCount;
   static const char* kHistogramDisabledCount;
   static const char* kHistogramConfigErrorCount;
+  static const char* kHistogramUninstallAndReplaceCount;
 
   static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
 
@@ -85,7 +86,7 @@
                    std::vector<ExternalInstallOptions>);
   void OnExternalWebAppsSynchronized(
       PendingAppManager::SynchronizeCallback callback,
-      std::map<GURL, InstallResultCode> install_results,
+      std::map<GURL, PendingAppManager::InstallResult> install_results,
       std::map<GURL, bool> uninstall_results);
 
   base::FilePath GetConfigDir();
diff --git a/chrome/browser/web_applications/external_web_app_manager_browsertest.cc b/chrome/browser/web_applications/external_web_app_manager_browsertest.cc
index c3537a6a..c10a959c 100644
--- a/chrome/browser/web_applications/external_web_app_manager_browsertest.cc
+++ b/chrome/browser/web_applications/external_web_app_manager_browsertest.cc
@@ -62,7 +62,8 @@
     WebAppProvider::Get(browser()->profile())
         ->external_web_app_manager_for_testing()
         .LoadAndSynchronizeForTesting(base::BindLambdaForTesting(
-            [&](std::map<GURL, InstallResultCode> install_results,
+            [&](std::map<GURL, PendingAppManager::InstallResult>
+                    install_results,
                 std::map<GURL, bool> uninstall_results) {
               EXPECT_EQ(install_results.size(), 0u);
               EXPECT_EQ(uninstall_results.size(), 0u);
@@ -99,11 +100,12 @@
     WebAppProvider::Get(browser()->profile())
         ->external_web_app_manager_for_testing()
         .LoadAndSynchronizeForTesting(base::BindLambdaForTesting(
-            [&](std::map<GURL, InstallResultCode> install_results,
+            [&](std::map<GURL, PendingAppManager::InstallResult>
+                    install_results,
                 std::map<GURL, bool> uninstall_results) {
               auto it = install_results.find(install_url);
               if (it != install_results.end())
-                code = it->second;
+                code = it->second.code;
               sync_run_loop.Quit();
             }));
     sync_run_loop.Run();
@@ -497,59 +499,73 @@
 
   auto& provider = *WebAppProvider::Get(browser()->profile());
 
+  struct Expectation {
+    const char* app_id;
+    const char* install_url;
+    const char* launch_url;
+  } kExpectations[] = {
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+    {
+        kGoogleCalendarAppId,
+        "https://calendar.google.com/calendar/installwebapp?usp=chrome_default",
+        "https://calendar.google.com/calendar/r?usp=installed_webapp",
+    },
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+    {
+        kGoogleDocsAppId,
+        "https://docs.google.com/document/installwebapp?usp=chrome_default",
+        "https://docs.google.com/document/?usp=installed_webapp",
+    },
+    {
+        kGoogleSlidesAppId,
+        "https://docs.google.com/presentation/installwebapp?usp=chrome_default",
+        "https://docs.google.com/presentation/?usp=installed_webapp",
+    },
+    {
+        kGoogleSheetsAppId,
+        "https://docs.google.com/spreadsheets/installwebapp?usp=chrome_default",
+        "https://docs.google.com/spreadsheets/?usp=installed_webapp",
+    },
+    {
+        kGoogleDriveAppId,
+        "https://drive.google.com/drive/installwebapp?usp=chrome_default",
+        "https://drive.google.com/?lfhs=2&usp=installed_webapp",
+    },
+    {
+        kGmailAppId,
+        "https://mail.google.com/mail/installwebapp?usp=chrome_default",
+        "https://mail.google.com/?usp=installed_webapp",
+    },
+    {
+        kYoutubeAppId,
+        "https://www.youtube.com/s/notifications/manifest/cr_install.html",
+        "https://www.youtube.com/?feature=ytca",
+    },
+  };
+
   base::RunLoop run_loop;
   provider.external_web_app_manager_for_testing().LoadAndSynchronizeForTesting(
       base::BindLambdaForTesting(
-          [&](std::map<GURL, InstallResultCode> install_results,
+          [&](std::map<GURL, PendingAppManager::InstallResult> install_results,
               std::map<GURL, bool> uninstall_results) {
-            EXPECT_THAT(
-                install_results,
-                UnorderedElementsAre(
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-                    Pair(GURL("https://calendar.google.com/calendar/"
-                              "installwebapp?usp=chrome_default"),
-                         InstallResultCode::kSuccessOfflineOnlyInstall),
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-                    Pair(GURL("https://docs.google.com/document/"
-                              "installwebapp?usp=chrome_default"),
-                         InstallResultCode::kSuccessOfflineOnlyInstall),
-                    Pair(GURL("https://docs.google.com/presentation/"
-                              "installwebapp?usp=chrome_default"),
-                         InstallResultCode::kSuccessOfflineOnlyInstall),
-                    Pair(GURL("https://docs.google.com/spreadsheets/"
-                              "installwebapp?usp=chrome_default"),
-                         InstallResultCode::kSuccessOfflineOnlyInstall),
-                    Pair(GURL("https://drive.google.com/drive/"
-                              "installwebapp?usp=chrome_default"),
-                         InstallResultCode::kSuccessOfflineOnlyInstall),
-                    Pair(GURL("https://mail.google.com/mail/"
-                              "installwebapp?usp=chrome_default"),
-                         InstallResultCode::kSuccessOfflineOnlyInstall),
-                    Pair(GURL("https://www.youtube.com/s/notifications/"
-                              "manifest/cr_install.html"),
-                         InstallResultCode::kSuccessOfflineOnlyInstall)));
+            EXPECT_EQ(install_results.size(),
+                      base::span<Expectation>(kExpectations).size());
+
+            for (const Expectation& expectation : kExpectations) {
+              EXPECT_EQ(install_results[GURL(expectation.install_url)].code,
+                        InstallResultCode::kSuccessOfflineOnlyInstall);
+            }
+
             EXPECT_EQ(uninstall_results.size(), 0u);
+
             run_loop.Quit();
           }));
   run_loop.Run();
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-  EXPECT_EQ(
-      provider.registrar().GetAppLaunchUrl(kGoogleCalendarAppId),
-      GURL("https://calendar.google.com/calendar/r?usp=installed_webapp"));
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-  EXPECT_EQ(provider.registrar().GetAppLaunchUrl(kGoogleDocsAppId),
-            GURL("https://docs.google.com/document/?usp=installed_webapp"));
-  EXPECT_EQ(provider.registrar().GetAppLaunchUrl(kGoogleSlidesAppId),
-            GURL("https://docs.google.com/presentation/?usp=installed_webapp"));
-  EXPECT_EQ(provider.registrar().GetAppLaunchUrl(kGoogleSheetsAppId),
-            GURL("https://docs.google.com/spreadsheets/?usp=installed_webapp"));
-  EXPECT_EQ(provider.registrar().GetAppLaunchUrl(kGoogleDriveAppId),
-            GURL("https://drive.google.com/?lfhs=2&usp=installed_webapp"));
-  EXPECT_EQ(provider.registrar().GetAppLaunchUrl(kGmailAppId),
-            GURL("https://mail.google.com/?usp=installed_webapp"));
-  EXPECT_EQ(provider.registrar().GetAppLaunchUrl(kYoutubeAppId),
-            GURL("https://www.youtube.com/?feature=ytca"));
+  for (const Expectation& expectation : kExpectations) {
+    EXPECT_EQ(provider.registrar().GetAppLaunchUrl(expectation.app_id),
+              GURL(expectation.launch_url));
+  }
 }
 #endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING)
 
diff --git a/chrome/browser/web_applications/external_web_app_migration_browsertest.cc b/chrome/browser/web_applications/external_web_app_migration_browsertest.cc
index 464060d..25bbf4a 100644
--- a/chrome/browser/web_applications/external_web_app_migration_browsertest.cc
+++ b/chrome/browser/web_applications/external_web_app_migration_browsertest.cc
@@ -168,13 +168,12 @@
     base::RunLoop run_loop;
 
     auto callback = base::BindLambdaForTesting(
-        [&](std::map<GURL, InstallResultCode> install_results,
+        [&](std::map<GURL, PendingAppManager::InstallResult> install_results,
             std::map<GURL, bool> uninstall_results) {
           if (expect_install) {
-            InstallResultCode result = install_results.at(GetWebAppUrl());
-            EXPECT_TRUE(result == InstallResultCode::kSuccessNewInstall ||
-                        result ==
-                            InstallResultCode::kSuccessOfflineOnlyInstall);
+            InstallResultCode code = install_results.at(GetWebAppUrl()).code;
+            EXPECT_TRUE(code == InstallResultCode::kSuccessNewInstall ||
+                        code == InstallResultCode::kSuccessOfflineOnlyInstall);
           } else {
             EXPECT_EQ(install_results.find(GetWebAppUrl()),
                       install_results.end());
@@ -247,6 +246,7 @@
     EXPECT_TRUE(IsExtensionAppInstalled());
 
     {
+      base::HistogramTester histograms;
       extensions::TestExtensionRegistryObserver uninstall_observer(
           extensions::ExtensionRegistry::Get(profile()));
 
@@ -257,6 +257,8 @@
           uninstall_observer.WaitForExtensionUninstalled();
       EXPECT_EQ(uninstalled_app->id(), kExtensionId);
       EXPECT_FALSE(IsExtensionAppInstalled());
+      histograms.ExpectUniqueSample(
+          ExternalWebAppManager::kHistogramUninstallAndReplaceCount, 1, 1);
     }
   }
 
@@ -273,6 +275,7 @@
 
   // Re-run migration.
   {
+    base::HistogramTester histograms;
     base::AutoReset<bool> testing_scope =
         SetExternalAppInstallFeatureAlwaysEnabledForTesting();
     ASSERT_TRUE(IsExternalAppInstallFeatureEnabled(kMigrationFlag));
@@ -287,6 +290,8 @@
         uninstall_observer.WaitForExtensionUninstalled();
     EXPECT_EQ(uninstalled_app->id(), kExtensionId);
     EXPECT_FALSE(IsExtensionAppInstalled());
+    histograms.ExpectUniqueSample(
+        ExternalWebAppManager::kHistogramUninstallAndReplaceCount, 1, 1);
   }
 }
 
@@ -342,6 +347,7 @@
     EXPECT_TRUE(IsExtensionAppInstalled());
 
     {
+      base::HistogramTester histograms;
       extensions::TestExtensionRegistryObserver uninstall_observer(
           extensions::ExtensionRegistry::Get(profile()));
 
@@ -352,6 +358,8 @@
           uninstall_observer.WaitForExtensionUninstalled();
       EXPECT_EQ(uninstalled_app->id(), kExtensionId);
       EXPECT_FALSE(IsExtensionAppInstalled());
+      histograms.ExpectUniqueSample(
+          ExternalWebAppManager::kHistogramUninstallAndReplaceCount, 1, 1);
     }
   }
 
@@ -495,6 +503,8 @@
           ExternalWebAppManager::kHistogramDisabledCount, 0, 1);
       histograms.ExpectUniqueSample(
           ExternalWebAppManager::kHistogramConfigErrorCount, 0, 1);
+      histograms.ExpectUniqueSample(
+          ExternalWebAppManager::kHistogramUninstallAndReplaceCount, 1, 1);
     }
   }
 }
diff --git a/chrome/browser/web_applications/manifest_update_manager_browsertest.cc b/chrome/browser/web_applications/manifest_update_manager_browsertest.cc
index d68545ad..bee93011 100644
--- a/chrome/browser/web_applications/manifest_update_manager_browsertest.cc
+++ b/chrome/browser/web_applications/manifest_update_manager_browsertest.cc
@@ -293,9 +293,10 @@
     GetProvider().pending_app_manager().Install(
         std::move(install_options),
         base::BindLambdaForTesting(
-            [&](const GURL& installed_app_url, InstallResultCode code) {
+            [&](const GURL& installed_app_url,
+                PendingAppManager::InstallResult result) {
               EXPECT_EQ(installed_app_url, app_url);
-              EXPECT_EQ(code, InstallResultCode::kSuccessNewInstall);
+              EXPECT_EQ(result.code, InstallResultCode::kSuccessNewInstall);
               run_loop.Quit();
             }));
     run_loop.Run();
diff --git a/chrome/browser/web_applications/pending_app_install_task.cc b/chrome/browser/web_applications/pending_app_install_task.cc
index c879884..3d48a8e 100644
--- a/chrome/browser/web_applications/pending_app_install_task.cc
+++ b/chrome/browser/web_applications/pending_app_install_task.cc
@@ -10,6 +10,7 @@
 #include "base/bind.h"
 #include "base/callback.h"
 #include "base/callback_helpers.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/favicon/favicon_utils.h"
@@ -27,16 +28,6 @@
 
 namespace web_app {
 
-PendingAppInstallTask::Result::Result(InstallResultCode code,
-                                      base::Optional<AppId> app_id)
-    : code(code), app_id(std::move(app_id)) {
-  DCHECK_EQ(IsNewInstall(code), app_id.has_value());
-}
-
-PendingAppInstallTask::Result::Result(Result&&) = default;
-
-PendingAppInstallTask::Result::~Result() = default;
-
 // static
 void PendingAppInstallTask::CreateTabHelpers(
     content::WebContents* web_contents) {
@@ -123,7 +114,8 @@
 
   base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE,
-      base::BindOnce(std::move(retry_on_failure), Result(code, base::nullopt)));
+      base::BindOnce(std::move(retry_on_failure), /*app_id=*/base::nullopt,
+                     PendingAppManager::InstallResult{.code = code}));
 }
 
 void PendingAppInstallTask::InstallFromInfo(ResultCallback result_callback) {
@@ -172,8 +164,8 @@
     LOG(ERROR) << "Failed to uninstall placeholder for: "
                << install_options_.install_url;
     std::move(result_callback)
-        .Run(Result(InstallResultCode::kFailedPlaceholderUninstall,
-                    base::nullopt));
+        .Run(/*app_id=*/base::nullopt,
+             {.code = InstallResultCode::kFailedPlaceholderUninstall});
     return;
   }
   ContinueWebAppInstall(web_contents, std::move(result_callback));
@@ -203,8 +195,9 @@
     // No need to install a placeholder app again.
     base::ThreadTaskRunnerHandle::Get()->PostTask(
         FROM_HERE,
-        base::BindOnce(std::move(callback),
-                       Result(InstallResultCode::kSuccessNewInstall, app_id)));
+        base::BindOnce(std::move(callback), app_id,
+                       PendingAppManager::InstallResult{
+                           .code = InstallResultCode::kSuccessNewInstall}));
     return;
   }
 
@@ -241,11 +234,11 @@
                                               const AppId& app_id,
                                               InstallResultCode code) {
   if (!IsNewInstall(code)) {
-    std::move(result_callback).Run(Result(code, base::nullopt));
+    std::move(result_callback).Run(/*app_id=*/base::nullopt, {.code = code});
     return;
   }
 
-  ui_manager_->UninstallAndReplaceIfExists(
+  bool did_uninstall_and_replace = ui_manager_->UninstallAndReplaceIfExists(
       install_options().uninstall_and_replace, app_id);
 
   externally_installed_app_prefs_.Insert(install_options_.install_url, app_id,
@@ -258,8 +251,11 @@
                ? InstallResultCode::kSuccessOfflineOnlyInstall
                : InstallResultCode::kSuccessOfflineFallbackInstall;
   }
-  base::ScopedClosureRunner scoped_closure(
-      base::BindOnce(std::move(result_callback), Result(code, app_id)));
+  base::ScopedClosureRunner scoped_closure(base::BindOnce(
+      std::move(result_callback), app_id,
+      PendingAppManager::InstallResult{
+          .code = code,
+          .did_uninstall_and_replace = did_uninstall_and_replace}));
 
   if (!is_placeholder) {
     return;
@@ -297,12 +293,13 @@
 
 void PendingAppInstallTask::TryAppInfoFactoryOnFailure(
     ResultCallback result_callback,
-    Result result) {
+    base::Optional<AppId> app_id,
+    PendingAppManager::InstallResult result) {
   if (!IsSuccess(result.code) && install_options().app_info_factory) {
     InstallFromInfo(std::move(result_callback));
     return;
   }
-  std::move(result_callback).Run(std::move(result));
+  std::move(result_callback).Run(std::move(app_id), std::move(result));
 }
 
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/pending_app_install_task.h b/chrome/browser/web_applications/pending_app_install_task.h
index f41362a..22b3386 100644
--- a/chrome/browser/web_applications/pending_app_install_task.h
+++ b/chrome/browser/web_applications/pending_app_install_task.h
@@ -14,6 +14,7 @@
 #include "chrome/browser/web_applications/components/external_install_options.h"
 #include "chrome/browser/web_applications/components/externally_installed_web_app_prefs.h"
 #include "chrome/browser/web_applications/components/os_integration_manager.h"
+#include "chrome/browser/web_applications/components/pending_app_manager.h"
 #include "chrome/browser/web_applications/components/web_app_id.h"
 #include "chrome/browser/web_applications/components/web_app_install_utils.h"
 #include "chrome/browser/web_applications/components/web_app_url_loader.h"
@@ -37,20 +38,9 @@
 // PendingAppManager. Can only be called from the UI thread.
 class PendingAppInstallTask {
  public:
-  // TODO(loyso): Use InstallManager::OnceInstallCallback directly.
-  struct Result {
-    Result(InstallResultCode code, base::Optional<AppId> app_id);
-    Result(Result&&);
-    Result(const Result&) = delete;
-    Result& operator=(const Result&) = delete;
-    ~Result();
-
-    const InstallResultCode code;
-    const base::Optional<AppId> app_id;
-
-  };
-
-  using ResultCallback = base::OnceCallback<void(Result)>;
+  using ResultCallback =
+      base::OnceCallback<void(base::Optional<AppId> app_id,
+                              PendingAppManager::InstallResult result)>;
 
   // Ensures the tab helpers necessary for installing an app are present.
   static void CreateTabHelpers(content::WebContents* web_contents);
@@ -101,7 +91,8 @@
                          const AppId& app_id,
                          InstallResultCode code);
   void TryAppInfoFactoryOnFailure(ResultCallback result_callback,
-                                  Result result);
+                                  base::Optional<AppId> app_id,
+                                  PendingAppManager::InstallResult result);
   void OnOsHooksCreated(const AppId& app_id,
                         base::ScopedClosureRunner scoped_closure,
                         const OsHooksResults os_hooks_results);
diff --git a/chrome/browser/web_applications/pending_app_manager_impl.cc b/chrome/browser/web_applications/pending_app_manager_impl.cc
index b23c213..43425d5 100644
--- a/chrome/browser/web_applications/pending_app_manager_impl.cc
+++ b/chrome/browser/web_applications/pending_app_manager_impl.cc
@@ -179,7 +179,8 @@
       // Otherwise no need to do anything.
       std::move(front->callback)
           .Run(install_options.install_url,
-               InstallResultCode::kSuccessAlreadyInstalled);
+               {.code = InstallResultCode::kSuccessAlreadyInstalled,
+                .did_uninstall_and_replace = false});
       continue;
     }
 
@@ -190,7 +191,8 @@
         !install_options.override_previous_user_uninstall) {
       std::move(front->callback)
           .Run(install_options.install_url,
-               InstallResultCode::kPreviouslyUninstalled);
+               {.code = InstallResultCode::kPreviouslyUninstalled,
+                .did_uninstall_and_replace = false});
       continue;
     }
 
@@ -272,14 +274,10 @@
                      weak_ptr_factory_.GetWeakPtr()));
 }
 
-void PendingAppManagerImpl::OnInstalled(PendingAppInstallTask::Result result) {
-  CurrentInstallationFinished(result.app_id, result.code);
-}
-
-void PendingAppManagerImpl::CurrentInstallationFinished(
-    const base::Optional<AppId>& app_id,
-    InstallResultCode code) {
-  if (app_id && IsSuccess(code)) {
+void PendingAppManagerImpl::OnInstalled(
+    base::Optional<AppId> app_id,
+    PendingAppManager::InstallResult result) {
+  if (app_id && IsSuccess(result.code)) {
     MaybeEnqueueServiceWorkerRegistration(
         current_install_->task->install_options());
   }
@@ -292,7 +290,7 @@
   std::unique_ptr<TaskAndCallback> task_and_callback;
   task_and_callback.swap(current_install_);
   std::move(task_and_callback->callback)
-      .Run(task_and_callback->task->install_options().install_url, code);
+      .Run(task_and_callback->task->install_options().install_url, result);
 }
 
 void PendingAppManagerImpl::MaybeEnqueueServiceWorkerRegistration(
diff --git a/chrome/browser/web_applications/pending_app_manager_impl.h b/chrome/browser/web_applications/pending_app_manager_impl.h
index 2b7093e..af3e144d 100644
--- a/chrome/browser/web_applications/pending_app_manager_impl.h
+++ b/chrome/browser/web_applications/pending_app_manager_impl.h
@@ -34,7 +34,6 @@
 // only be used from the UI thread.
 class PendingAppManagerImpl : public PendingAppManager {
  public:
-
   explicit PendingAppManagerImpl(Profile* profile);
   PendingAppManagerImpl(const PendingAppManagerImpl&) = delete;
   PendingAppManagerImpl& operator=(const PendingAppManagerImpl&) = delete;
@@ -83,10 +82,8 @@
 
   void OnUrlLoaded(WebAppUrlLoader::Result result);
 
-  void OnInstalled(PendingAppInstallTask::Result result);
-
-  void CurrentInstallationFinished(const base::Optional<std::string>& app_id,
-                                   InstallResultCode code);
+  void OnInstalled(base::Optional<AppId> app_id,
+                   PendingAppManager::InstallResult result);
 
   void MaybeEnqueueServiceWorkerRegistration(
       const ExternalInstallOptions& install_options);
diff --git a/chrome/browser/web_applications/pending_app_manager_impl_browsertest.cc b/chrome/browser/web_applications/pending_app_manager_impl_browsertest.cc
index 1c8ac34..2e117d8 100644
--- a/chrome/browser/web_applications/pending_app_manager_impl_browsertest.cc
+++ b/chrome/browser/web_applications/pending_app_manager_impl_browsertest.cc
@@ -404,12 +404,12 @@
       ExternalInstallSource::kExternalPolicy,
       base::BindLambdaForTesting(
           [&run_loop, &app_url](
-              std::map<GURL, InstallResultCode> install_results,
+              std::map<GURL, PendingAppManager::InstallResult> install_results,
               std::map<GURL, bool> uninstall_results) {
             EXPECT_TRUE(uninstall_results.empty());
             EXPECT_EQ(install_results.size(), 1U);
-            EXPECT_EQ(install_results[app_url],
-                      InstallResultCode ::kSuccessNewInstall);
+            EXPECT_EQ(install_results[app_url].code,
+                      InstallResultCode::kSuccessNewInstall);
             run_loop.Quit();
           }));
   run_loop.Run();
diff --git a/chrome/browser/web_applications/pending_app_manager_impl_unittest.cc b/chrome/browser/web_applications/pending_app_manager_impl_unittest.cc
index fc7c1dd1..46f0ca32 100644
--- a/chrome/browser/web_applications/pending_app_manager_impl_unittest.cc
+++ b/chrome/browser/web_applications/pending_app_manager_impl_unittest.cc
@@ -269,7 +269,7 @@
         externally_installed_app_prefs_.SetIsPlaceholder(install_url,
                                                          is_placeholder);
       }
-      std::move(callback).Run({result_code, app_id});
+      std::move(callback).Run(app_id, {.code = result_code});
     }
     void Install(content::WebContents* web_contents,
                  WebAppUrlLoader::Result url_loaded_result,
@@ -393,20 +393,21 @@
 
     pending_app_manager_impl()->Install(
         std::move(install_options),
-        base::BindLambdaForTesting([&](const GURL& u, InstallResultCode c) {
-          url = u;
-          code = c;
-          run_loop.Quit();
-        }));
+        base::BindLambdaForTesting(
+            [&](const GURL& u, PendingAppManager::InstallResult result) {
+              url = u;
+              code = result.code;
+              run_loop.Quit();
+            }));
     run_loop.Run();
 
     return {url.value(), code.value()};
   }
 
-  std::vector<std::pair<GURL, InstallResultCode>> InstallAppsAndWait(
+  InstallAppsResults InstallAppsAndWait(
       PendingAppManager* pending_app_manager,
       std::vector<ExternalInstallOptions> apps_to_install) {
-    std::vector<std::pair<GURL, InstallResultCode>> results;
+    InstallAppsResults results;
 
     base::RunLoop run_loop;
     auto barrier_closure =
@@ -414,8 +415,8 @@
     pending_app_manager_impl()->InstallApps(
         std::move(apps_to_install),
         base::BindLambdaForTesting(
-            [&](const GURL& url, InstallResultCode code) {
-              results.emplace_back(url, code);
+            [&](const GURL& url, PendingAppManager::InstallResult result) {
+              results.emplace_back(url, result.code);
               barrier_closure.Run();
             }));
     run_loop.Run();
@@ -597,29 +598,31 @@
   base::RunLoop run_loop;
   pending_app_manager_impl()->Install(
       GetFooInstallOptions(),
-      base::BindLambdaForTesting([&](const GURL& url, InstallResultCode code) {
-        EXPECT_EQ(InstallResultCode::kSuccessNewInstall, code);
-        EXPECT_EQ(FooWebAppUrl(), url);
+      base::BindLambdaForTesting(
+          [&](const GURL& url, PendingAppManager::InstallResult result) {
+            EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
+            EXPECT_EQ(FooWebAppUrl(), url);
 
-        // Two installations tasks should have run at this point,
-        // one from the last call to install (which gets higher priority),
-        // and another one for this call to install.
-        EXPECT_EQ(2u, install_run_count());
-        EXPECT_EQ(GetFooInstallOptions(), last_install_options());
+            // Two installations tasks should have run at this point,
+            // one from the last call to install (which gets higher priority),
+            // and another one for this call to install.
+            EXPECT_EQ(2u, install_run_count());
+            EXPECT_EQ(GetFooInstallOptions(), last_install_options());
 
-        run_loop.Quit();
-      }));
+            run_loop.Quit();
+          }));
   pending_app_manager_impl()->Install(
       GetBarInstallOptions(),
-      base::BindLambdaForTesting([&](const GURL& url, InstallResultCode code) {
-        EXPECT_EQ(InstallResultCode::kSuccessNewInstall, code);
-        EXPECT_EQ(BarWebAppUrl(), url);
+      base::BindLambdaForTesting(
+          [&](const GURL& url, PendingAppManager::InstallResult result) {
+            EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
+            EXPECT_EQ(BarWebAppUrl(), url);
 
-        // The last call gets higher priority so only one
-        // installation task should have run at this point.
-        EXPECT_EQ(1u, install_run_count());
-        EXPECT_EQ(GetBarInstallOptions(), last_install_options());
-      }));
+            // The last call gets higher priority so only one
+            // installation task should have run at this point.
+            EXPECT_EQ(1u, install_run_count());
+            EXPECT_EQ(GetBarInstallOptions(), last_install_options());
+          }));
   run_loop.Run();
 }
 
@@ -639,30 +642,32 @@
 
   pending_app_manager_impl()->Install(
       GetFooInstallOptions(),
-      base::BindLambdaForTesting([&](const GURL& url, InstallResultCode code) {
-        EXPECT_EQ(InstallResultCode::kSuccessNewInstall, code);
-        EXPECT_EQ(FooWebAppUrl(), url);
+      base::BindLambdaForTesting(
+          [&](const GURL& url, PendingAppManager::InstallResult result) {
+            EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
+            EXPECT_EQ(FooWebAppUrl(), url);
 
-        EXPECT_EQ(1u, install_run_count());
-        EXPECT_EQ(GetFooInstallOptions(), last_install_options());
+            EXPECT_EQ(1u, install_run_count());
+            EXPECT_EQ(GetFooInstallOptions(), last_install_options());
 
-        foo_run_loop.Quit();
-      }));
+            foo_run_loop.Quit();
+          }));
   // Make sure the installation has started.
   base::RunLoop().RunUntilIdle();
 
   url_loader()->AddPrepareForLoadResults({WebAppUrlLoader::Result::kUrlLoaded});
   pending_app_manager_impl()->Install(
       GetBarInstallOptions(),
-      base::BindLambdaForTesting([&](const GURL& url, InstallResultCode code) {
-        EXPECT_EQ(InstallResultCode::kSuccessNewInstall, code);
-        EXPECT_EQ(BarWebAppUrl(), url);
+      base::BindLambdaForTesting(
+          [&](const GURL& url, PendingAppManager::InstallResult result) {
+            EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
+            EXPECT_EQ(BarWebAppUrl(), url);
 
-        EXPECT_EQ(2u, install_run_count());
-        EXPECT_EQ(GetBarInstallOptions(), last_install_options());
+            EXPECT_EQ(2u, install_run_count());
+            EXPECT_EQ(GetBarInstallOptions(), last_install_options());
 
-        bar_run_loop.Quit();
-      }));
+            bar_run_loop.Quit();
+          }));
 
   url_loader()->ProcessLoadUrlRequests();
   foo_run_loop.Run();
@@ -683,8 +688,9 @@
 
   pending_app_manager_impl()->Install(
       GetFooInstallOptionsWithWebAppInfo(),
-      base::BindLambdaForTesting([&](const GURL& url, InstallResultCode code) {
-        EXPECT_EQ(InstallResultCode::kSuccessNewInstall, code);
+      base::BindLambdaForTesting([&](const GURL& url,
+                                     PendingAppManager::InstallResult result) {
+        EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
         EXPECT_EQ(FooWebAppUrl(), url);
 
         EXPECT_EQ(1u, install_run_count());
@@ -733,8 +739,9 @@
 
   pending_app_manager_impl()->Install(
       GetFooInstallOptionsWithWebAppInfo(),
-      base::BindLambdaForTesting([&](const GURL& url, InstallResultCode code) {
-        EXPECT_EQ(InstallResultCode::kSuccessNewInstall, code);
+      base::BindLambdaForTesting([&](const GURL& url,
+                                     PendingAppManager::InstallResult result) {
+        EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
         EXPECT_EQ(FooWebAppUrl(), url);
 
         EXPECT_EQ(1u, install_run_count());
@@ -746,8 +753,9 @@
 
   pending_app_manager_impl()->Install(
       GetFooInstallOptionsWithWebAppInfo(),
-      base::BindLambdaForTesting([&](const GURL& url, InstallResultCode code) {
-        EXPECT_EQ(InstallResultCode::kSuccessAlreadyInstalled, code);
+      base::BindLambdaForTesting([&](const GURL& url,
+                                     PendingAppManager::InstallResult result) {
+        EXPECT_EQ(InstallResultCode::kSuccessAlreadyInstalled, result.code);
         EXPECT_EQ(FooWebAppUrl(), url);
 
         EXPECT_EQ(1u, install_run_count());
@@ -777,28 +785,30 @@
   url_loader()->SetPrepareForLoadResultLoaded();
   pending_app_manager_impl()->Install(
       GetFooInstallOptions(),
-      base::BindLambdaForTesting([&](const GURL& url, InstallResultCode code) {
-        EXPECT_EQ(InstallResultCode::kWebAppDisabled, code);
-        EXPECT_EQ(FooWebAppUrl(), url);
+      base::BindLambdaForTesting(
+          [&](const GURL& url, PendingAppManager::InstallResult result) {
+            EXPECT_EQ(InstallResultCode::kWebAppDisabled, result.code);
+            EXPECT_EQ(FooWebAppUrl(), url);
 
-        EXPECT_EQ(1u, install_run_count());
+            EXPECT_EQ(1u, install_run_count());
 
-        foo_run_loop.Quit();
-      }));
+            foo_run_loop.Quit();
+          }));
   // Make sure the installation has started.
   base::RunLoop().RunUntilIdle();
 
   pending_app_manager_impl()->Install(
       GetBarInstallOptions(),
-      base::BindLambdaForTesting([&](const GURL& url, InstallResultCode code) {
-        EXPECT_EQ(InstallResultCode::kSuccessNewInstall, code);
-        EXPECT_EQ(BarWebAppUrl(), url);
+      base::BindLambdaForTesting(
+          [&](const GURL& url, PendingAppManager::InstallResult result) {
+            EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
+            EXPECT_EQ(BarWebAppUrl(), url);
 
-        EXPECT_EQ(2u, install_run_count());
-        EXPECT_EQ(GetBarInstallOptions(), last_install_options());
+            EXPECT_EQ(2u, install_run_count());
+            EXPECT_EQ(GetBarInstallOptions(), last_install_options());
 
-        bar_run_loop.Quit();
-      }));
+            bar_run_loop.Quit();
+          }));
 
   url_loader()->ProcessLoadUrlRequests();
   foo_run_loop.Run();
@@ -826,18 +836,18 @@
                                      WebAppUrlLoader::Result::kUrlLoaded);
 
   base::RunLoop run_loop;
-  auto final_callback =
-      base::BindLambdaForTesting([&](const GURL& url, InstallResultCode code) {
-        EXPECT_EQ(InstallResultCode::kSuccessNewInstall, code);
+  auto final_callback = base::BindLambdaForTesting(
+      [&](const GURL& url, PendingAppManager::InstallResult result) {
+        EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
         EXPECT_EQ(BarWebAppUrl(), url);
 
         EXPECT_EQ(2u, install_run_count());
         EXPECT_EQ(GetBarInstallOptions(), last_install_options());
         run_loop.Quit();
       });
-  auto reentrant_callback =
-      base::BindLambdaForTesting([&](const GURL& url, InstallResultCode code) {
-        EXPECT_EQ(InstallResultCode::kSuccessNewInstall, code);
+  auto reentrant_callback = base::BindLambdaForTesting(
+      [&](const GURL& url, PendingAppManager::InstallResult result) {
+        EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
         EXPECT_EQ(FooWebAppUrl(), url);
 
         EXPECT_EQ(1u, install_run_count());
@@ -899,31 +909,33 @@
 
   pending_app_manager_impl()->Install(
       GetFooInstallOptions(),
-      base::BindLambdaForTesting([&](const GURL& url, InstallResultCode code) {
-        // kSuccessAlreadyInstalled because the last call to Install gets higher
-        // priority.
-        EXPECT_EQ(InstallResultCode::kSuccessAlreadyInstalled, code);
-        EXPECT_EQ(FooWebAppUrl(), url);
+      base::BindLambdaForTesting(
+          [&](const GURL& url, PendingAppManager::InstallResult result) {
+            // kSuccessAlreadyInstalled because the last call to Install gets
+            // higher priority.
+            EXPECT_EQ(InstallResultCode::kSuccessAlreadyInstalled, result.code);
+            EXPECT_EQ(FooWebAppUrl(), url);
 
-        // Only one installation task should run because the app was already
-        // installed.
-        EXPECT_EQ(1u, install_run_count());
+            // Only one installation task should run because the app was already
+            // installed.
+            EXPECT_EQ(1u, install_run_count());
 
-        EXPECT_TRUE(first_callback_ran);
+            EXPECT_TRUE(first_callback_ran);
 
-        run_loop.Quit();
-      }));
+            run_loop.Quit();
+          }));
 
   pending_app_manager_impl()->Install(
       GetFooInstallOptions(),
-      base::BindLambdaForTesting([&](const GURL& url, InstallResultCode code) {
-        EXPECT_EQ(InstallResultCode::kSuccessNewInstall, code);
-        EXPECT_EQ(FooWebAppUrl(), url);
+      base::BindLambdaForTesting(
+          [&](const GURL& url, PendingAppManager::InstallResult result) {
+            EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
+            EXPECT_EQ(FooWebAppUrl(), url);
 
-        EXPECT_EQ(1u, install_run_count());
-        EXPECT_EQ(GetFooInstallOptions(), last_install_options());
-        first_callback_ran = true;
-      }));
+            EXPECT_EQ(1u, install_run_count());
+            EXPECT_EQ(GetFooInstallOptions(), last_install_options());
+            first_callback_ran = true;
+          }));
   run_loop.Run();
 
   EXPECT_EQ(1u, install_run_count());
@@ -1133,8 +1145,8 @@
     pending_app_manager_impl()->InstallApps(
         std::move(apps_to_install),
         base::BindLambdaForTesting(
-            [&](const GURL& url, InstallResultCode code) {
-              EXPECT_EQ(InstallResultCode::kSuccessNewInstall, code);
+            [&](const GURL& url, PendingAppManager::InstallResult result) {
+              EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
               EXPECT_EQ(FooWebAppUrl(), url);
 
               EXPECT_EQ(1u, install_run_count());
@@ -1149,8 +1161,8 @@
     pending_app_manager_impl()->InstallApps(
         std::move(apps_to_install),
         base::BindLambdaForTesting(
-            [&](const GURL& url, InstallResultCode code) {
-              EXPECT_EQ(InstallResultCode::kSuccessNewInstall, code);
+            [&](const GURL& url, PendingAppManager::InstallResult result) {
+              EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
               EXPECT_EQ(BarWebAppUrl(), url);
 
               EXPECT_EQ(2u, install_run_count());
@@ -1194,36 +1206,38 @@
   int callback_calls = 0;
   pending_app_manager_impl()->InstallApps(
       std::move(apps_to_install),
-      base::BindLambdaForTesting([&](const GURL& url, InstallResultCode code) {
-        ++callback_calls;
-        if (callback_calls == 1) {
-          EXPECT_EQ(InstallResultCode::kSuccessNewInstall, code);
-          EXPECT_EQ(FooWebAppUrl(), url);
+      base::BindLambdaForTesting(
+          [&](const GURL& url, PendingAppManager::InstallResult result) {
+            ++callback_calls;
+            if (callback_calls == 1) {
+              EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
+              EXPECT_EQ(FooWebAppUrl(), url);
 
-          EXPECT_EQ(2u, install_run_count());
-          EXPECT_EQ(GetFooInstallOptions(), last_install_options());
-        } else if (callback_calls == 2) {
-          EXPECT_EQ(InstallResultCode::kSuccessNewInstall, code);
-          EXPECT_EQ(BarWebAppUrl(), url);
+              EXPECT_EQ(2u, install_run_count());
+              EXPECT_EQ(GetFooInstallOptions(), last_install_options());
+            } else if (callback_calls == 2) {
+              EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
+              EXPECT_EQ(BarWebAppUrl(), url);
 
-          EXPECT_EQ(3u, install_run_count());
-          EXPECT_EQ(GetBarInstallOptions(), last_install_options());
-        } else {
-          NOTREACHED();
-        }
-      }));
+              EXPECT_EQ(3u, install_run_count());
+              EXPECT_EQ(GetBarInstallOptions(), last_install_options());
+            } else {
+              NOTREACHED();
+            }
+          }));
 
   // Queue through Install.
   pending_app_manager_impl()->Install(
       GetQuxInstallOptions(),
-      base::BindLambdaForTesting([&](const GURL& url, InstallResultCode code) {
-        EXPECT_EQ(InstallResultCode::kSuccessNewInstall, code);
-        EXPECT_EQ(QuxWebAppUrl(), url);
+      base::BindLambdaForTesting(
+          [&](const GURL& url, PendingAppManager::InstallResult result) {
+            EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
+            EXPECT_EQ(QuxWebAppUrl(), url);
 
-        // The install request from Install should be processed first.
-        EXPECT_EQ(1u, install_run_count());
-        EXPECT_EQ(GetQuxInstallOptions(), last_install_options());
-      }));
+            // The install request from Install should be processed first.
+            EXPECT_EQ(1u, install_run_count());
+            EXPECT_EQ(GetQuxInstallOptions(), last_install_options());
+          }));
 
   WebAppRegistrationWaiter(pending_app_manager_impl())
       .AwaitNextRegistration(QuxWebAppUrl(), RegistrationResultCode::kSuccess);
@@ -1257,14 +1271,15 @@
   // Queue through Install.
   pending_app_manager_impl()->Install(
       GetQuxInstallOptions(),
-      base::BindLambdaForTesting([&](const GURL& url, InstallResultCode code) {
-        EXPECT_EQ(InstallResultCode::kSuccessNewInstall, code);
-        EXPECT_EQ(QuxWebAppUrl(), url);
+      base::BindLambdaForTesting(
+          [&](const GURL& url, PendingAppManager::InstallResult result) {
+            EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
+            EXPECT_EQ(QuxWebAppUrl(), url);
 
-        // The install request from Install should be processed first.
-        EXPECT_EQ(1u, install_run_count());
-        EXPECT_EQ(GetQuxInstallOptions(), last_install_options());
-      }));
+            // The install request from Install should be processed first.
+            EXPECT_EQ(1u, install_run_count());
+            EXPECT_EQ(GetQuxInstallOptions(), last_install_options());
+          }));
 
   // Queue through InstallApps.
   std::vector<ExternalInstallOptions> apps_to_install;
@@ -1274,30 +1289,31 @@
   int callback_calls = 0;
   pending_app_manager_impl()->InstallApps(
       std::move(apps_to_install),
-      base::BindLambdaForTesting([&](const GURL& url, InstallResultCode code) {
-        ++callback_calls;
-        if (callback_calls == 1) {
-          EXPECT_EQ(InstallResultCode::kSuccessNewInstall, code);
-          EXPECT_EQ(FooWebAppUrl(), url);
+      base::BindLambdaForTesting(
+          [&](const GURL& url, PendingAppManager::InstallResult result) {
+            ++callback_calls;
+            if (callback_calls == 1) {
+              EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
+              EXPECT_EQ(FooWebAppUrl(), url);
 
-          // The install requests from InstallApps should be processed next.
-          EXPECT_EQ(2u, install_run_count());
-          EXPECT_EQ(GetFooInstallOptions(), last_install_options());
+              // The install requests from InstallApps should be processed next.
+              EXPECT_EQ(2u, install_run_count());
+              EXPECT_EQ(GetFooInstallOptions(), last_install_options());
 
-          return;
-        }
-        if (callback_calls == 2) {
-          EXPECT_EQ(InstallResultCode::kSuccessNewInstall, code);
-          EXPECT_EQ(BarWebAppUrl(), url);
+              return;
+            }
+            if (callback_calls == 2) {
+              EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
+              EXPECT_EQ(BarWebAppUrl(), url);
 
-          EXPECT_EQ(3u, install_run_count());
-          EXPECT_EQ(GetBarInstallOptions(), last_install_options());
+              EXPECT_EQ(3u, install_run_count());
+              EXPECT_EQ(GetBarInstallOptions(), last_install_options());
 
-          run_loop.Quit();
-          return;
-        }
-        NOTREACHED();
-      }));
+              run_loop.Quit();
+              return;
+            }
+            NOTREACHED();
+          }));
   run_loop.Run();
 }
 
@@ -1460,11 +1476,12 @@
   base::RunLoop run_loop;
   pending_app_manager_impl()->Install(
       GetFooInstallOptions(),
-      base::BindLambdaForTesting([&](const GURL& url, InstallResultCode code) {
-        EXPECT_EQ(InstallResultCode::kSuccessNewInstall, code);
-        EXPECT_EQ(FooWebAppUrl(), url);
-        run_loop.Quit();
-      }));
+      base::BindLambdaForTesting(
+          [&](const GURL& url, PendingAppManager::InstallResult result) {
+            EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result.code);
+            EXPECT_EQ(FooWebAppUrl(), url);
+            run_loop.Quit();
+          }));
 
   install_finalizer()->SetNextUninstallExternalWebAppResult(FooWebAppUrl(),
                                                             false);
diff --git a/chrome/browser/web_applications/system_web_app_manager.cc b/chrome/browser/web_applications/system_web_app_manager.cc
index 2a7ff73..75ec659c 100644
--- a/chrome/browser/web_applications/system_web_app_manager.cc
+++ b/chrome/browser/web_applications/system_web_app_manager.cc
@@ -715,16 +715,17 @@
 }
 
 void SystemWebAppManager::RecordSystemWebAppInstallResults(
-    const std::map<GURL, InstallResultCode>& install_results) const {
+    const std::map<GURL, PendingAppManager::InstallResult>& install_results)
+    const {
   // Report install result codes. Exclude kSuccessAlreadyInstalled from metrics.
   // This result means the installation pipeline is a no-op (which happens every
   // time user logs in, and if there hasn't been a version upgrade). This skews
   // the install success rate.
-  std::map<GURL, InstallResultCode> results_to_report;
+  std::map<GURL, PendingAppManager::InstallResult> results_to_report;
   std::copy_if(install_results.begin(), install_results.end(),
                std::inserter(results_to_report, results_to_report.end()),
                [](const auto& url_and_result) {
-                 return url_and_result.second !=
+                 return url_and_result.second.code !=
                         InstallResultCode::kSuccessAlreadyInstalled;
                });
 
@@ -734,14 +735,14 @@
         kInstallResultHistogramName,
         shutting_down_
             ? InstallResultCode::kCancelledOnWebAppProviderShuttingDown
-            : url_and_result.second);
+            : url_and_result.second.code);
 
     // Record per-profile result.
     base::UmaHistogramEnumeration(
         install_result_per_profile_histogram_name_,
         shutting_down_
             ? InstallResultCode::kCancelledOnWebAppProviderShuttingDown
-            : url_and_result.second);
+            : url_and_result.second.code);
   }
 
   // Record per-app result.
@@ -756,7 +757,7 @@
           app_histogram_name,
           shutting_down_
               ? InstallResultCode::kCancelledOnWebAppProviderShuttingDown
-              : url_and_result->second);
+              : url_and_result->second.code);
     }
   }
 }
@@ -764,7 +765,7 @@
 void SystemWebAppManager::OnAppsSynchronized(
     bool did_force_install_apps,
     const base::TimeTicks& install_start_time,
-    std::map<GURL, InstallResultCode> install_results,
+    std::map<GURL, PendingAppManager::InstallResult> install_results,
     std::map<GURL, bool> uninstall_results) {
   // TODO(crbug.com/1053371): Clean up File Handler install. We install SWA file
   // handlers here, because the code that registers file handlers for regular
diff --git a/chrome/browser/web_applications/system_web_app_manager.h b/chrome/browser/web_applications/system_web_app_manager.h
index 074f37f..c40ea69 100644
--- a/chrome/browser/web_applications/system_web_app_manager.h
+++ b/chrome/browser/web_applications/system_web_app_manager.h
@@ -255,10 +255,11 @@
 
   bool AppHasFileHandlingOriginTrial(SystemAppType type);
 
-  void OnAppsSynchronized(bool did_force_install_apps,
-                          const base::TimeTicks& install_start_time,
-                          std::map<GURL, InstallResultCode> install_results,
-                          std::map<GURL, bool> uninstall_results);
+  void OnAppsSynchronized(
+      bool did_force_install_apps,
+      const base::TimeTicks& install_start_time,
+      std::map<GURL, PendingAppManager::InstallResult> install_results,
+      std::map<GURL, bool> uninstall_results);
   bool ShouldForceInstallApps() const;
   void UpdateLastAttemptedInfo();
   // Returns if we have exceeded the number of retry attempts allowed for this
@@ -266,7 +267,8 @@
   bool CheckAndIncrementRetryAttempts();
 
   void RecordSystemWebAppInstallResults(
-      const std::map<GURL, InstallResultCode>& install_results) const;
+      const std::map<GURL, PendingAppManager::InstallResult>& install_results)
+      const;
 
   void RecordSystemWebAppInstallDuration(
       const base::TimeDelta& time_duration) const;
diff --git a/chrome/browser/web_applications/system_web_app_manager_unittest.cc b/chrome/browser/web_applications/system_web_app_manager_unittest.cc
index 5acbfcc..f5d0450 100644
--- a/chrome/browser/web_applications/system_web_app_manager_unittest.cc
+++ b/chrome/browser/web_applications/system_web_app_manager_unittest.cc
@@ -634,8 +634,9 @@
   }
 
   pending_app_manager().SetHandleInstallRequestCallback(
-      base::BindLambdaForTesting([](const ExternalInstallOptions&) {
-        return InstallResultCode::kWebAppDisabled;
+      base::BindLambdaForTesting([](const ExternalInstallOptions&)
+                                     -> PendingAppManager::InstallResult {
+        return {.code = InstallResultCode::kWebAppDisabled};
       }));
 
   {
@@ -724,10 +725,11 @@
   system_web_app_manager().SetSystemAppsForTesting(system_apps);
 
   pending_app_manager().SetHandleInstallRequestCallback(
-      base::BindLambdaForTesting([](const ExternalInstallOptions& opts) {
+      base::BindLambdaForTesting([](const ExternalInstallOptions& opts)
+                                     -> PendingAppManager::InstallResult {
         if (opts.install_url == AppUrl1())
-          return InstallResultCode::kSuccessAlreadyInstalled;
-        return InstallResultCode::kSuccessNewInstall;
+          return {.code = InstallResultCode::kSuccessAlreadyInstalled};
+        return {.code = InstallResultCode::kSuccessNewInstall};
       }));
 
   StartAndWaitForAppsToSynchronize();
@@ -756,10 +758,11 @@
 
   {
     pending_app_manager().SetHandleInstallRequestCallback(
-        base::BindLambdaForTesting([](const ExternalInstallOptions& opts) {
+        base::BindLambdaForTesting([](const ExternalInstallOptions& opts)
+                                       -> PendingAppManager::InstallResult {
           if (opts.install_url == AppUrl1())
-            return InstallResultCode::kWriteDataFailed;
-          return InstallResultCode::kSuccessNewInstall;
+            return {.code = InstallResultCode::kWriteDataFailed};
+          return {.code = InstallResultCode::kSuccessNewInstall};
         }));
 
     StartAndWaitForAppsToSynchronize();
@@ -772,10 +775,11 @@
 
   {
     pending_app_manager().SetHandleInstallRequestCallback(
-        base::BindLambdaForTesting([](const ExternalInstallOptions& opts) {
+        base::BindLambdaForTesting([](const ExternalInstallOptions& opts)
+                                       -> PendingAppManager::InstallResult {
           if (opts.install_url == AppUrl1())
-            return InstallResultCode::kSuccessNewInstall;
-          return InstallResultCode::kSuccessAlreadyInstalled;
+            return {.code = InstallResultCode::kSuccessNewInstall};
+          return {.code = InstallResultCode::kSuccessAlreadyInstalled};
         }));
     StartAndWaitForAppsToSynchronize();
 
diff --git a/chrome/browser/web_applications/test/test_pending_app_manager.cc b/chrome/browser/web_applications/test/test_pending_app_manager.cc
index 4c5453e..d0c62dc 100644
--- a/chrome/browser/web_applications/test/test_pending_app_manager.cc
+++ b/chrome/browser/web_applications/test/test_pending_app_manager.cc
@@ -63,7 +63,7 @@
           }
           install_requests_.push_back(install_options);
         }
-        std::move(std::move(callback)).Run(url, result_code);
+        std::move(std::move(callback)).Run(url, {.code = result_code});
       }));
 }
 
diff --git a/chrome/browser/web_applications/test/test_pending_app_manager_impl.h b/chrome/browser/web_applications/test/test_pending_app_manager_impl.h
index 209ac71..73ff215 100644
--- a/chrome/browser/web_applications/test/test_pending_app_manager_impl.h
+++ b/chrome/browser/web_applications/test/test_pending_app_manager_impl.h
@@ -38,7 +38,8 @@
   }
 
   using HandleInstallRequestCallback =
-      base::RepeatingCallback<InstallResultCode(const ExternalInstallOptions&)>;
+      base::RepeatingCallback<PendingAppManager::InstallResult(
+          const ExternalInstallOptions&)>;
 
   // Set a callback to handle install requests. If set, this callback will be
   // used in place of the real installation process. The callback takes a const
diff --git a/chrome/browser/web_applications/test/test_web_app_ui_manager.cc b/chrome/browser/web_applications/test/test_web_app_ui_manager.cc
index 15372c32..64be713 100644
--- a/chrome/browser/web_applications/test/test_web_app_ui_manager.cc
+++ b/chrome/browser/web_applications/test/test_web_app_ui_manager.cc
@@ -54,12 +54,13 @@
                      }));
 }
 
-void TestWebAppUiManager::UninstallAndReplaceIfExists(
+bool TestWebAppUiManager::UninstallAndReplaceIfExists(
     const std::vector<AppId>& from_apps,
     const AppId& to_app) {
   for (const AppId& from_app : from_apps) {
     uninstall_and_replace_map_[from_app] = to_app;
   }
+  return false;
 }
 
 bool TestWebAppUiManager::CanAddAppToQuickLaunchBar() const {
diff --git a/chrome/browser/web_applications/test/test_web_app_ui_manager.h b/chrome/browser/web_applications/test/test_web_app_ui_manager.h
index 95d4d454..324a4f65 100644
--- a/chrome/browser/web_applications/test/test_web_app_ui_manager.h
+++ b/chrome/browser/web_applications/test/test_web_app_ui_manager.h
@@ -30,7 +30,7 @@
   size_t GetNumWindowsForApp(const AppId& app_id) override;
   void NotifyOnAllAppWindowsClosed(const AppId& app_id,
                                    base::OnceClosure callback) override;
-  void UninstallAndReplaceIfExists(const std::vector<AppId>& from_apps,
+  bool UninstallAndReplaceIfExists(const std::vector<AppId>& from_apps,
                                    const AppId& to_app) override;
   bool CanAddAppToQuickLaunchBar() const override;
   void AddAppToQuickLaunchBar(const AppId& app_id) override;
diff --git a/chrome/browser/web_applications/web_app_migration_manager.cc b/chrome/browser/web_applications/web_app_migration_manager.cc
index 9684512..7a228a9 100644
--- a/chrome/browser/web_applications/web_app_migration_manager.cc
+++ b/chrome/browser/web_applications/web_app_migration_manager.cc
@@ -266,15 +266,6 @@
   web_app->SetUserLaunchOrdinal(
       bookmark_app_registrar_->GetUserLaunchOrdinal(app_id));
 
-  if (IsChromeOs()) {
-    auto chromeos_data = base::make_optional<WebAppChromeOsData>();
-    const bool should_show = !WebAppUiManager::ShouldHideAppFromUser(app_id);
-    chromeos_data->show_in_launcher = should_show;
-    chromeos_data->show_in_search = should_show;
-    chromeos_data->show_in_management = should_show;
-    web_app->SetWebAppChromeOsData(std::move(chromeos_data));
-  }
-
   WebApp::SyncFallbackData sync_fallback_data;
   sync_fallback_data.name = bookmark_app_registrar_->GetAppShortName(app_id);
   sync_fallback_data.theme_color =
diff --git a/chrome/browser/web_applications/web_app_migration_manager_browsertest.cc b/chrome/browser/web_applications/web_app_migration_manager_browsertest.cc
index 2c33467..502dc72 100644
--- a/chrome/browser/web_applications/web_app_migration_manager_browsertest.cc
+++ b/chrome/browser/web_applications/web_app_migration_manager_browsertest.cc
@@ -55,14 +55,6 @@
 // manifest_test_page.html.
 constexpr char kSimpleManifestStartUrl[] =
     "https://example.org/manifest_test_page.html";
-// start_url in release_notes_manifest.json generates the id of an app that
-// should be hidden from the user.
-constexpr char kHiddenAppInstallUrl[] =
-    "https://www.google.com/manifest_test_page.html"
-    "?manifest=release_notes_manifest.json";
-
-constexpr char kHiddenAppStartUrl[] =
-    "https://www.google.com/chromebook/whatsnew/embedded/";
 
 constexpr char kManifestWithShortcutsMenuInstallUrl[] =
     "https://example.org/manifest_test_page.html"
@@ -259,41 +251,6 @@
 }
 
 IN_PROC_BROWSER_TEST_F(WebAppMigrationManagerBrowserTest,
-                       PRE_DatabaseMigration_HiddenFromUser) {
-  ui_test_utils::NavigateToURL(browser(), GURL{kHiddenAppInstallUrl});
-  AppId app_id = InstallWebAppAsUserViaOmnibox();
-  EXPECT_EQ(GenerateAppIdFromURL(GURL(kHiddenAppStartUrl)), app_id);
-
-  EXPECT_TRUE(provider().registrar().AsBookmarkAppRegistrar());
-  EXPECT_FALSE(provider().registrar().AsWebAppRegistrar());
-
-  EXPECT_TRUE(provider().registrar().IsInstalled(app_id));
-}
-
-IN_PROC_BROWSER_TEST_F(WebAppMigrationManagerBrowserTest,
-                       DatabaseMigration_HiddenFromUser) {
-  AwaitRegistryReady();
-
-  AppId app_id = GenerateAppIdFromURL(GURL{kHiddenAppStartUrl});
-  EXPECT_TRUE(provider().registrar().IsInstalled(app_id));
-
-  WebAppRegistrar* registrar = provider().registrar().AsWebAppRegistrar();
-  ASSERT_TRUE(registrar);
-  EXPECT_FALSE(provider().registrar().AsBookmarkAppRegistrar());
-
-  const WebApp* web_app = registrar->GetAppById(app_id);
-  ASSERT_TRUE(web_app);
-
-  if (IsChromeOs()) {
-    EXPECT_FALSE(web_app->chromeos_data()->show_in_launcher);
-    EXPECT_FALSE(web_app->chromeos_data()->show_in_search);
-    EXPECT_FALSE(web_app->chromeos_data()->show_in_management);
-  } else {
-    EXPECT_FALSE(web_app->chromeos_data().has_value());
-  }
-}
-
-IN_PROC_BROWSER_TEST_F(WebAppMigrationManagerBrowserTest,
                        InstallShadowBookmarkApp) {
   EXPECT_FALSE(provider().registrar().AsBookmarkAppRegistrar());
   AwaitRegistryReady();
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index a23d6bc8d..16133f8 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-master-1606759191-6cd311392c4a2d76b8ec4391ac1874206c9889b0.profdata
+chrome-linux-master-1606780634-867f063cb43c5794bf65123662fce4e91b9de4cb.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index b1859e8..0d4cde7a 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-master-1606759191-e36e6bb9e34aaec2b6f2fa507df72b0ae1dbb4d4.profdata
+chrome-mac-master-1606780634-1ea1516e4fb1522afac8d06bcea54ae6d1ecbcd2.profdata
diff --git a/chrome/common/url_constants.cc b/chrome/common/url_constants.cc
index 1284519..ec411a3 100644
--- a/chrome/common/url_constants.cc
+++ b/chrome/common/url_constants.cc
@@ -41,10 +41,6 @@
 const char kChromeFixUpdateProblems[] =
     "https://support.google.com/chrome?p=fix_chrome_updates";
 
-// TODO: replace w/link after marketing provides it.
-const char kChromeReleaseNotesURL[] =
-    "https://www.google.com/chromebook/whatsnew/embedded/";
-
 const char kChromeHelpViaKeyboardURL[] =
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
diff --git a/chrome/common/url_constants.h b/chrome/common/url_constants.h
index 790f555..4316f5c 100644
--- a/chrome/common/url_constants.h
+++ b/chrome/common/url_constants.h
@@ -60,9 +60,6 @@
 // The URL for the help center article to fix Chrome update problems.
 extern const char kChromeFixUpdateProblems[];
 
-// Link to the release notes page managed by marketing.
-extern const char kChromeReleaseNotesURL[];
-
 // General help links for Chrome, opened using various actions.
 extern const char kChromeHelpViaKeyboardURL[];
 extern const char kChromeHelpViaMenuURL[];
diff --git a/chrome/test/data/banners/release_notes_manifest.json b/chrome/test/data/banners/release_notes_manifest.json
deleted file mode 100644
index e70a906..0000000
--- a/chrome/test/data/banners/release_notes_manifest.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
-  "name": "What's New",
-  "short_name": "What's New",
-  "icons": [
-    {
-      "src": "launcher-icon-1x.png",
-      "sizes": "48x48",
-      "type": "image/png"
-    },
-    {
-      "src": "launcher-icon-1-5x.png",
-      "sizes": "72x72",
-      "type": "image/png"
-    },
-    {
-      "src": "launcher-icon-2x.png",
-      "sizes": "96x96",
-      "type": "image/png",
-      "purpose": "any monochrome"
-    },
-    {
-      "src": "launcher-icon-3x.png",
-      "sizes": "144x144",
-      "type": "image/png"
-    },
-    {
-      "src": "launcher-icon-4x.png",
-      "sizes": "192x192",
-      "type": "image/png"
-    },
-    {
-      "src": "image-512px.png",
-      "sizes": "512x512",
-      "type": "image/png"
-    }
-  ],
-  "start_url": "https://www.google.com/chromebook/whatsnew/embedded/",
-  "scope": "/",
-  "display": "standalone",
-  "background_color": "#FFFFFF",
-  "theme_color": "#FFFFFF"
-}
diff --git a/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js b/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js
index df49ffc..ac350f2 100644
--- a/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js
+++ b/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js
@@ -182,6 +182,15 @@
     return flushTasks();
   }
 
+  /**
+   * @param {boolean} success
+   * @return {!Promise}
+   */
+  simulateCancelComplete(success) {
+    this.scanJobObserverRemote_.onCancelComplete(success);
+    return flushTasks();
+  }
+
   // scanService methods:
 
   /** @return {!Promise<{scanners: !ScannerArr}>} */
@@ -541,7 +550,11 @@
         .then(() => {
           // Click the cancel button to cancel the scan.
           cancelButton.click();
-          return fakeScanService_.cancelScan();
+          return fakeScanService_.whenCalled('cancelScan');
+        })
+        .then(() => {
+          // Simulate cancel completing successfully.
+          return fakeScanService_.simulateCancelComplete(true);
         })
         .then(() => {
           // After canceling is complete, the scan button should be visible and
@@ -551,6 +564,64 @@
         });
   });
 
+  test('CancelScanFailed', () => {
+    const expectedScanners = [
+      createScanner(firstScannerId, firstScannerName),
+    ];
+
+    let capabilities = new Map();
+    capabilities.set(firstScannerId, firstCapabilities);
+
+    /** @type {!CrButtonElement} */
+    let scanButton;
+    /** @type {!CrButtonElement} */
+    let cancelButton;
+
+    return initializeScanningApp(expectedScanners, capabilities)
+        .then(() => {
+          scanButton =
+              /** @type {!CrButtonElement} */ (scanningApp.$$('#scanButton'));
+          cancelButton =
+              /** @type {!CrButtonElement} */ (scanningApp.$$('#cancelButton'));
+          return fakeScanService_.whenCalled('getScannerCapabilities');
+        })
+        .then(() => {
+          // Click the Scan button and wait till the scan is started.
+          scanButton.click();
+          return fakeScanService_.whenCalled('startScan');
+        })
+        .then(() => {
+          // Simulate a progress update and verify the progress bar and text are
+          // updated correctly.
+          return fakeScanService_.simulateProgress(1, 17);
+        })
+        .then(() => {
+          // Click the cancel button to cancel the scan.
+          cancelButton.click();
+          assertFalse(scanningApp.$$('#toast').open);
+          return fakeScanService_.whenCalled('cancelScan');
+        })
+        .then(() => {
+          // Simulate cancel failing.
+          return fakeScanService_.simulateCancelComplete(false);
+        })
+        .then(() => {
+          // After canceling fails, the error toast should pop up.
+          assertTrue(scanningApp.$$('#toast').open);
+          assertEquals(
+              scanningApp.i18n('cancelFailedToastText'),
+              scanningApp.$$('#toastText').textContent.trim());
+          // The scan progress page should still be showing with the cancel
+          // button visible.
+          assertTrue(
+              isVisible(scanningApp.$$('#scanPreview').$$('#scanProgress')));
+          assertTrue(isVisible(cancelButton));
+          assertFalse(
+              isVisible(scanningApp.$$('#scanPreview').$$('#helperText')));
+          assertFalse(isVisible(scanButton));
+        });
+  });
+
   test('ScanFailedToStart', () => {
     const expectedScanners = [
       createScanner(firstScannerId, firstScannerName),
diff --git a/chromecast/media/audio/mixer_service/control_connection.cc b/chromecast/media/audio/mixer_service/control_connection.cc
index 49453be..21e0bec 100644
--- a/chromecast/media/audio/mixer_service/control_connection.cc
+++ b/chromecast/media/audio/mixer_service/control_connection.cc
@@ -35,7 +35,9 @@
     auto* volume = message.mutable_set_device_volume();
     volume->set_content_type(ConvertContentType(type));
     volume->set_volume_multiplier(volume_multiplier);
-    socket_->SendProto(message);
+    if (!socket_->SendProto(0, message)) {
+      OnSendFailed();
+    }
   }
 }
 
@@ -50,7 +52,9 @@
     auto* mute_message = message.mutable_set_device_muted();
     mute_message->set_content_type(ConvertContentType(type));
     mute_message->set_muted(muted);
-    socket_->SendProto(message);
+    if (!socket_->SendProto(0, message)) {
+      OnSendFailed();
+    }
   }
 }
 
@@ -66,7 +70,9 @@
     auto* limit = message.mutable_set_volume_limit();
     limit->set_content_type(ConvertContentType(type));
     limit->set_max_volume_multiplier(max_volume_multiplier);
-    socket_->SendProto(message);
+    if (!socket_->SendProto(0, message)) {
+      OnSendFailed();
+    }
   }
 }
 
@@ -76,22 +82,33 @@
   if (!socket_) {
     return;
   }
-  Generic proto;
-  proto.mutable_list_postprocessors();
-  socket_->SendProto(proto);
+  Generic message;
+  message.mutable_list_postprocessors();
+  if (!socket_->SendProto(0, message)) {
+    OnSendFailed();
+  }
 }
 
 void ControlConnection::ConfigurePostprocessor(std::string postprocessor_name,
                                                std::string config) {
-  SendPostprocessorMessage(postprocessor_name, config);
-  postprocessor_config_.insert_or_assign(std::move(postprocessor_name),
-                                         std::move(config));
+  postprocessor_config_.insert_or_assign(postprocessor_name, config);
+  if (!SendPostprocessorMessageInternal(std::move(postprocessor_name),
+                                        std::move(config))) {
+    OnSendFailed();
+  }
 }
 
 void ControlConnection::SendPostprocessorMessage(std::string postprocessor_name,
                                                  std::string message) {
+  SendPostprocessorMessageInternal(std::move(postprocessor_name),
+                                   std::move(message));
+}
+
+bool ControlConnection::SendPostprocessorMessageInternal(
+    std::string postprocessor_name,
+    std::string message) {
   if (!socket_) {
-    return;
+    return true;
   }
 
   // Erase any ? and subsequent substring from the name.
@@ -104,7 +121,7 @@
   auto* content = proto.mutable_configure_postprocessor();
   content->set_name(std::move(postprocessor_name));
   content->set_config(std::move(message));
-  socket_->SendProto(proto);
+  return socket_->SendProto(0, proto);
 }
 
 void ControlConnection::ReloadPostprocessors() {
@@ -113,7 +130,7 @@
   }
   Generic message;
   message.mutable_reload_postprocessors();
-  socket_->SendProto(message);
+  socket_->SendProto(0, message);
 }
 
 void ControlConnection::SetStreamCountCallback(StreamCountCallback callback) {
@@ -122,7 +139,9 @@
     Generic message;
     message.mutable_request_stream_count()->set_subscribe(
         !stream_count_callback_.is_null());
-    socket_->SendProto(message);
+    if (!socket_->SendProto(0, message)) {
+      OnSendFailed();
+    }
   }
 }
 
@@ -131,7 +150,9 @@
   if (socket_) {
     Generic message;
     message.mutable_set_num_output_channels()->set_channels(num_channels);
-    socket_->SendProto(message);
+    if (!socket_->SendProto(0, message)) {
+      OnSendFailed();
+    }
   }
 }
 
@@ -144,7 +165,9 @@
     auto* limit = message.mutable_set_volume_limit();
     limit->set_content_type(ConvertContentType(item.first));
     limit->set_max_volume_multiplier(item.second);
-    socket_->SendProto(message);
+    if (!socket_->SendProto(0, message)) {
+      return OnSendFailed();
+    }
   }
 
   for (const auto& item : muted_) {
@@ -152,7 +175,9 @@
     auto* muted = message.mutable_set_device_muted();
     muted->set_content_type(ConvertContentType(item.first));
     muted->set_muted(item.second);
-    socket_->SendProto(message);
+    if (!socket_->SendProto(0, message)) {
+      return OnSendFailed();
+    }
   }
 
   for (const auto& item : volume_) {
@@ -160,30 +185,40 @@
     auto* volume = message.mutable_set_device_volume();
     volume->set_content_type(ConvertContentType(item.first));
     volume->set_volume_multiplier(item.second);
-    socket_->SendProto(message);
+    if (!socket_->SendProto(0, message)) {
+      return OnSendFailed();
+    }
   }
 
   if (stream_count_callback_) {
     Generic message;
     message.mutable_request_stream_count()->set_subscribe(true);
-    socket_->SendProto(message);
+    if (!socket_->SendProto(0, message)) {
+      return OnSendFailed();
+    }
   }
 
   if (num_output_channels_) {
     Generic message;
     message.mutable_set_num_output_channels()->set_channels(
         num_output_channels_);
-    socket_->SendProto(message);
+    if (!socket_->SendProto(0, message)) {
+      return OnSendFailed();
+    }
   }
 
   for (const auto& item : postprocessor_config_) {
-    SendPostprocessorMessage(item.first, item.second);
+    if (!SendPostprocessorMessageInternal(item.first, item.second)) {
+      return OnSendFailed();
+    }
   }
 
   if (!list_postprocessors_callbacks_.empty()) {
     Generic message;
     message.mutable_list_postprocessors();
-    socket_->SendProto(message);
+    if (!socket_->SendProto(0, message)) {
+      return OnSendFailed();
+    }
   }
 
   if (connect_callback_) {
@@ -191,6 +226,11 @@
   }
 }
 
+void ControlConnection::OnSendFailed() {
+  LOG(WARNING) << "Failed to send a control message";
+  OnConnectionError();
+}
+
 void ControlConnection::OnConnectionError() {
   socket_.reset();
   MixerConnection::Connect();
diff --git a/chromecast/media/audio/mixer_service/control_connection.h b/chromecast/media/audio/mixer_service/control_connection.h
index 4e07b64..b008d397 100644
--- a/chromecast/media/audio/mixer_service/control_connection.h
+++ b/chromecast/media/audio/mixer_service/control_connection.h
@@ -86,6 +86,10 @@
   void SetNumOutputChannels(int num_channels);
 
  private:
+  bool SendPostprocessorMessageInternal(std::string postprocessor_name,
+                                        std::string message);
+  void OnSendFailed();
+
   // MixerConnection implementation:
   void OnConnected(std::unique_ptr<MixerSocket> socket) override;
   void OnConnectionError() override;
diff --git a/chromecast/media/audio/mixer_service/loopback_connection.cc b/chromecast/media/audio/mixer_service/loopback_connection.cc
index ab3197c..a4d25c7 100644
--- a/chromecast/media/audio/mixer_service/loopback_connection.cc
+++ b/chromecast/media/audio/mixer_service/loopback_connection.cc
@@ -18,6 +18,14 @@
 namespace media {
 namespace mixer_service {
 
+namespace {
+
+enum MessageTypes : int {
+  kRequest = 1,
+};
+
+}
+
 LoopbackConnection::LoopbackConnection(Delegate* delegate)
     : LoopbackConnection(delegate, nullptr) {}
 
@@ -48,7 +56,7 @@
 
   Generic message;
   message.mutable_loopback_request();
-  socket_->SendProto(message);
+  socket_->SendProto(kRequest, message);
 }
 
 void LoopbackConnection::OnConnectionError() {
diff --git a/chromecast/media/audio/mixer_service/loopback_interrupt_reason.h b/chromecast/media/audio/mixer_service/loopback_interrupt_reason.h
index bc9a1ee7..42aadb00 100644
--- a/chromecast/media/audio/mixer_service/loopback_interrupt_reason.h
+++ b/chromecast/media/audio/mixer_service/loopback_interrupt_reason.h
@@ -12,10 +12,11 @@
 // StreamInterruption::InterruptionReason in mixer_service.proto.
 enum class LoopbackInterruptReason {
   kUnknown = 0,
-  kDisconnected = 1,   // Disconnected from mixer.
-  kUnderrun = 2,       // Mixer output underrun.
-  kConfigChange = 3,   // Mixer output config changed.
-  kOutputStopped = 4,  // Mixer stopped playing out audio.
+  kDisconnected = 1,    // Disconnected from mixer.
+  kUnderrun = 2,        // Mixer output underrun.
+  kConfigChange = 3,    // Mixer output config changed.
+  kOutputStopped = 4,   // Mixer stopped playing out audio.
+  kSocketOverflow = 5,  // Mixer couldn't send over the socket.
 };
 
 }  // namespace media
diff --git a/chromecast/media/audio/mixer_service/mixer_service.proto b/chromecast/media/audio/mixer_service/mixer_service.proto
index e26194c..cb5acb52 100644
--- a/chromecast/media/audio/mixer_service/mixer_service.proto
+++ b/chromecast/media/audio/mixer_service/mixer_service.proto
@@ -145,6 +145,7 @@
     INTERRUPTED_UNDERRUN = 2;        // Mixer output underrun.
     INTERRUPTED_CONFIG_CHANGE = 3;   // Mixer output config changed.
     INTERRUPTED_OUTPUT_STOPPED = 4;  // Mixer stopped playing out audio.
+    INTERRUPTED_SOCKET_OVERFLOW = 5;  // Mixer couldn't send over the socket.
   }
 
   optional InterruptionReason reason = 1;
diff --git a/chromecast/media/audio/mixer_service/mixer_socket.cc b/chromecast/media/audio/mixer_service/mixer_socket.cc
index 8ca189f5..9dd8cd1 100644
--- a/chromecast/media/audio/mixer_service/mixer_socket.cc
+++ b/chromecast/media/audio/mixer_service/mixer_socket.cc
@@ -144,28 +144,30 @@
   memset(ptr, 0, sizeof(int32_t));
 }
 
-void MixerSocket::SendAudioBuffer(scoped_refptr<net::IOBuffer> audio_buffer,
+bool MixerSocket::SendAudioBuffer(scoped_refptr<net::IOBuffer> audio_buffer,
                                   int filled_bytes,
                                   int64_t timestamp) {
   PrepareAudioBuffer(audio_buffer.get(), filled_bytes, timestamp);
-  SendPreparedAudioBuffer(std::move(audio_buffer));
+  return SendPreparedAudioBuffer(std::move(audio_buffer));
 }
 
-void MixerSocket::SendPreparedAudioBuffer(
+bool MixerSocket::SendPreparedAudioBuffer(
     scoped_refptr<net::IOBuffer> audio_buffer) {
   uint16_t payload_size;
   base::ReadBigEndian(audio_buffer->data(), &payload_size);
   DCHECK_GE(payload_size, kAudioHeaderSize);
-  SendBuffer(std::move(audio_buffer), sizeof(uint16_t) + payload_size);
+  return SendBuffer(0, std::move(audio_buffer),
+                    sizeof(uint16_t) + payload_size);
 }
 
-void MixerSocket::SendProto(const google::protobuf::MessageLite& message) {
-  int16_t type = static_cast<int16_t>(MessageType::kMetadata);
+bool MixerSocket::SendProto(int type,
+                            const google::protobuf::MessageLite& message) {
+  int16_t packet_type = static_cast<int16_t>(MessageType::kMetadata);
   size_t message_size = message.ByteSizeLong();
   int32_t padding_bytes = (4 - (message_size % 4)) % 4;
 
-  int total_size =
-      sizeof(type) + sizeof(padding_bytes) + message_size + padding_bytes;
+  int total_size = sizeof(packet_type) + sizeof(padding_bytes) + message_size +
+                   padding_bytes;
 
   scoped_refptr<net::IOBuffer> buffer;
   char* ptr = (socket_ ? static_cast<char*>(socket_->PrepareSend(total_size))
@@ -184,8 +186,8 @@
     ptr += sizeof(uint16_t);
   }
 
-  base::WriteBigEndian(ptr, type);
-  ptr += sizeof(type);
+  base::WriteBigEndian(ptr, packet_type);
+  ptr += sizeof(packet_type);
   base::WriteBigEndian(ptr, padding_bytes);
   ptr += sizeof(padding_bytes);
   message.SerializeToArray(ptr, message_size);
@@ -194,36 +196,46 @@
 
   if (!buffer) {
     socket_->Send();
-    return;
+    return true;
   }
-  SendBuffer(std::move(buffer), sizeof(uint16_t) + total_size);
+  return SendBuffer(type, std::move(buffer), sizeof(uint16_t) + total_size);
 }
 
-void MixerSocket::SendBuffer(scoped_refptr<net::IOBuffer> buffer,
+bool MixerSocket::SendBuffer(int type,
+                             scoped_refptr<net::IOBuffer> buffer,
                              size_t buffer_size) {
   if (counterpart_task_runner_) {
     counterpart_task_runner_->PostTask(
         FROM_HERE,
         base::BindOnce(base::IgnoreResult(&MixerSocket::OnMessageBuffer),
                        local_counterpart_, std::move(buffer), buffer_size));
-    return;
+    return true;
   }
+  return SendBufferToSocket(type, std::move(buffer), buffer_size);
+}
+
+bool MixerSocket::SendBufferToSocket(int type,
+                                     scoped_refptr<net::IOBuffer> buffer,
+                                     size_t buffer_size) {
   DCHECK(socket_);
   if (!socket_->SendBuffer(buffer, buffer_size)) {
-    write_queue_.push(std::move(buffer));
+    if (type == 0) {
+      return false;
+    }
+    pending_writes_.insert_or_assign(type, std::move(buffer));
   }
+  return true;
 }
 
 void MixerSocket::OnSendUnblocked() {
   DCHECK(socket_);
-  while (!write_queue_.empty()) {
+  base::flat_map<int, scoped_refptr<net::IOBuffer>> pending;
+  pending_writes_.swap(pending);
+  for (auto& m : pending) {
     uint16_t message_size;
-    base::ReadBigEndian(write_queue_.front()->data(), &message_size);
-    if (!socket_->SendBuffer(write_queue_.front().get(),
-                             sizeof(uint16_t) + message_size)) {
-      return;
-    }
-    write_queue_.pop();
+    base::ReadBigEndian(m.second->data(), &message_size);
+    SendBufferToSocket(m.first, std::move(m.second),
+                       sizeof(uint16_t) + message_size);
   }
 }
 
@@ -245,18 +257,18 @@
 }
 
 bool MixerSocket::OnMessage(char* data, size_t size) {
-  int16_t type;
-  if (size < sizeof(type)) {
+  int16_t packet_type;
+  if (size < sizeof(packet_type)) {
     LOG(ERROR) << "Invalid message size " << size << " from " << this;
     delegate_->OnConnectionError();
     return false;
   }
 
-  memcpy(&type, data, sizeof(type));
-  data += sizeof(type);
-  size -= sizeof(type);
+  memcpy(&packet_type, data, sizeof(packet_type));
+  data += sizeof(packet_type);
+  size -= sizeof(packet_type);
 
-  switch (static_cast<MessageType>(type)) {
+  switch (static_cast<MessageType>(packet_type)) {
     case MessageType::kMetadata:
       return ParseMetadata(data, size);
     case MessageType::kAudio:
diff --git a/chromecast/media/audio/mixer_service/mixer_socket.h b/chromecast/media/audio/mixer_service/mixer_socket.h
index d8f1c84..417f5dee 100644
--- a/chromecast/media/audio/mixer_service/mixer_socket.h
+++ b/chromecast/media/audio/mixer_service/mixer_socket.h
@@ -7,8 +7,8 @@
 
 #include <cstdint>
 #include <memory>
-#include <queue>
 
+#include "base/containers/flat_map.h"
 #include "base/macros.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
@@ -105,24 +105,39 @@
                                  int filled_bytes,
                                  int64_t timestamp);
 
-  // Prepares |audio_buffer| and then sends it across the connection.
-  void SendAudioBuffer(scoped_refptr<net::IOBuffer> audio_buffer,
+  // Prepares |audio_buffer| and then sends it across the connection. Returns
+  // |false| if the audio could not be sent.
+  bool SendAudioBuffer(scoped_refptr<net::IOBuffer> audio_buffer,
                        int filled_bytes,
                        int64_t timestamp);
 
   // Sends |audio_buffer| across the connection. |audio_buffer| should have
-  // previously been prepared using PrepareAudioBuffer().
-  void SendPreparedAudioBuffer(scoped_refptr<net::IOBuffer> audio_buffer);
+  // previously been prepared using PrepareAudioBuffer(). Returns |false| if the
+  // audio could not be sent.
+  bool SendPreparedAudioBuffer(scoped_refptr<net::IOBuffer> audio_buffer);
 
-  // Sends an arbitrary protobuf across the connection.
-  void SendProto(const google::protobuf::MessageLite& message);
+  // Sends an arbitrary protobuf across the connection. |type| indicates the
+  // type of message; if the write cannot complete immediately, one message of
+  // each type will be stored for later sending; if a newer message is sent with
+  // the same type, then the previous message is overwritten. When writes become
+  // available again, the stored messages are written in order of |type| (lowest
+  // type first). Note that |type| is completely determined by the caller, and
+  // you can reuse the same type value for different messages as long as they
+  // are on different socket instances. A type of 0 means to never store the
+  // message. Returns |false| if the message was not sent or stored.
+  bool SendProto(int type, const google::protobuf::MessageLite& message);
 
   // Resumes receiving messages. Delegate calls may be called synchronously
   // from within this method.
   void ReceiveMoreMessages();
 
  private:
-  void SendBuffer(scoped_refptr<net::IOBuffer> buffer, size_t buffer_size);
+  bool SendBuffer(int type,
+                  scoped_refptr<net::IOBuffer> buffer,
+                  size_t buffer_size);
+  bool SendBufferToSocket(int type,
+                          scoped_refptr<net::IOBuffer> buffer,
+                          size_t buffer_size);
 
   // SmallMessageSocket::Delegate implementation:
   void OnSendUnblocked() override;
@@ -142,7 +157,7 @@
   const std::unique_ptr<SmallMessageSocket> socket_;
 
   scoped_refptr<IOBufferPool> buffer_pool_;
-  std::queue<scoped_refptr<net::IOBuffer>> write_queue_;
+  base::flat_map<int, scoped_refptr<net::IOBuffer>> pending_writes_;
 
   base::WeakPtr<MixerSocket> local_counterpart_;
   scoped_refptr<base::SequencedTaskRunner> counterpart_task_runner_;
diff --git a/chromecast/media/audio/mixer_service/output_stream_connection.cc b/chromecast/media/audio/mixer_service/output_stream_connection.cc
index cc31024..66b839b 100644
--- a/chromecast/media/audio/mixer_service/output_stream_connection.cc
+++ b/chromecast/media/audio/mixer_service/output_stream_connection.cc
@@ -31,6 +31,16 @@
   return params.sample_rate() / 100;
 }
 
+enum MessageTypes : int {
+  kInitial = 1,
+  kStartTimestamp,
+  kPlaybackRate,
+  kAudioClockRate,
+  kStreamVolume,
+  kPauseResume,
+  kEndOfStream,
+};
+
 }  // namespace
 
 OutputStreamConnection::OutputStreamConnection(Delegate* delegate,
@@ -76,7 +86,12 @@
   }
 
   if (filled_frames == 0) {
+    // Send explicit end-of-stream message.
     sent_eos_ = true;
+    Generic message;
+    message.mutable_eos_played_out();
+    socket_->SendProto(kEndOfStream, message);
+    return;
   }
   socket_->SendAudioBuffer(std::move(audio_buffer), filled_frames * frame_size_,
                            pts);
@@ -87,7 +102,7 @@
   if (socket_) {
     Generic message;
     message.mutable_set_stream_volume()->set_volume(multiplier);
-    socket_->SendProto(message);
+    socket_->SendProto(kStreamVolume, message);
   }
 }
 
@@ -100,7 +115,7 @@
     Generic message;
     message.mutable_set_start_timestamp()->set_start_timestamp(start_timestamp);
     message.mutable_set_start_timestamp()->set_start_pts(pts);
-    socket_->SendProto(message);
+    socket_->SendProto(kStartTimestamp, message);
   }
 }
 
@@ -109,7 +124,7 @@
   if (socket_) {
     Generic message;
     message.mutable_set_playback_rate()->set_playback_rate(playback_rate);
-    socket_->SendProto(message);
+    socket_->SendProto(kPlaybackRate, message);
   }
 }
 
@@ -118,7 +133,7 @@
   if (socket_) {
     Generic message;
     message.mutable_set_audio_clock_rate()->set_rate(rate);
-    socket_->SendProto(message);
+    socket_->SendProto(kAudioClockRate, message);
   }
 }
 
@@ -127,7 +142,7 @@
   if (socket_) {
     Generic message;
     message.mutable_set_paused()->set_paused(true);
-    socket_->SendProto(message);
+    socket_->SendProto(kPauseResume, message);
   }
 }
 
@@ -136,7 +151,7 @@
   if (socket_) {
     Generic message;
     message.mutable_set_paused()->set_paused(false);
-    socket_->SendProto(message);
+    socket_->SendProto(kPauseResume, message);
   }
 }
 
@@ -163,7 +178,7 @@
   if (paused_) {
     message.mutable_set_paused()->set_paused(true);
   }
-  socket_->SendProto(message);
+  socket_->SendProto(kInitial, message);
   delegate_->FillNextBuffer(
       audio_buffer_->data() + MixerSocket::kAudioMessageHeaderSize,
       fill_size_frames_, std::numeric_limits<int64_t>::min());
diff --git a/chromecast/media/audio/mixer_service/receiver/receiver_cma.cc b/chromecast/media/audio/mixer_service/receiver/receiver_cma.cc
index 039b3ce3..8879e5a 100644
--- a/chromecast/media/audio/mixer_service/receiver/receiver_cma.cc
+++ b/chromecast/media/audio/mixer_service/receiver/receiver_cma.cc
@@ -21,7 +21,14 @@
 namespace mixer_service {
 
 namespace {
+
 constexpr base::TimeDelta kInactivityTimeout = base::TimeDelta::FromSeconds(5);
+
+enum MessageTypes : int {
+  kPushResult = 1,
+  kEndOfStream,
+};
+
 }  // namespace
 
 class ReceiverCma::UnusedSocket : public MixerSocket::Delegate {
@@ -136,7 +143,7 @@
       message.set_next_playback_timestamp(next_playout_timestamp);
       mixer_service::Generic generic;
       *(generic.mutable_push_result()) = message;
-      socket_->SendProto(generic);
+      socket_->SendProto(kPushResult, generic);
       last_send_time_ = base::TimeTicks::Now();
     }
 
@@ -148,7 +155,7 @@
     mixer_service::EosPlayedOut message;
     mixer_service::Generic generic;
     *generic.mutable_eos_played_out() = message;
-    socket_->SendProto(generic);
+    socket_->SendProto(kEndOfStream, generic);
     last_send_time_ = base::TimeTicks::Now();
 
     cma_audio_.reset();
diff --git a/chromecast/media/audio/mixer_service/redirected_audio_connection.cc b/chromecast/media/audio/mixer_service/redirected_audio_connection.cc
index c395baa..571d4a8 100644
--- a/chromecast/media/audio/mixer_service/redirected_audio_connection.cc
+++ b/chromecast/media/audio/mixer_service/redirected_audio_connection.cc
@@ -30,6 +30,11 @@
   }
 }
 
+enum MessageTypes : int {
+  kRedirectionRequest = 1,
+  kStreamMatchPatterns,
+};
+
 }  // namespace
 
 RedirectedAudioConnection::RedirectedAudioConnection(const Config& config,
@@ -46,7 +51,7 @@
   if (socket_) {
     Generic message;
     FillPatterns(stream_match_patterns_, &message);
-    socket_->SendProto(message);
+    socket_->SendProto(kStreamMatchPatterns, message);
   }
 }
 
@@ -75,7 +80,7 @@
   if (!stream_match_patterns_.empty()) {
     FillPatterns(stream_match_patterns_, &message);
   }
-  socket_->SendProto(message);
+  socket_->SendProto(kRedirectionRequest, message);
 }
 
 void RedirectedAudioConnection::OnConnectionError() {
diff --git a/chromecast/media/cma/backend/mixer/audio_output_redirector.cc b/chromecast/media/cma/backend/mixer/audio_output_redirector.cc
index 5c42e678..7bae7be 100644
--- a/chromecast/media/cma/backend/mixer/audio_output_redirector.cc
+++ b/chromecast/media/cma/backend/mixer/audio_output_redirector.cc
@@ -51,6 +51,10 @@
   return DecoderConfigAdapter::ToMediaChannelLayout(layout);
 }
 
+enum MessageTypes : int {
+  kStreamConfig = 1,
+};
+
 }  // namespace
 
 class AudioOutputRedirector::RedirectionConnection
@@ -82,7 +86,7 @@
     config->set_sample_rate(sample_rate);
     config->set_num_channels(num_channels);
     config->set_data_size(data_size);
-    socket_->SendProto(message);
+    socket_->SendProto(kStreamConfig, message);
 
     sent_stream_config_ = true;
   }
diff --git a/chromecast/media/cma/backend/mixer/mixer_input_connection.cc b/chromecast/media/cma/backend/mixer/mixer_input_connection.cc
index ca54705..1f672d7 100644
--- a/chromecast/media/cma/backend/mixer/mixer_input_connection.cc
+++ b/chromecast/media/cma/backend/mixer/mixer_input_connection.cc
@@ -51,6 +51,14 @@
 
 constexpr int kRateShifterOutputFrames = 4096;
 
+enum MessageTypes : int {
+  kReadyForPlayback = 1,
+  kPushResult,
+  kEndOfStream,
+  kUnderrun,
+  kError,
+};
+
 int64_t SamplesToMicroseconds(double samples, int sample_rate) {
   return std::round(samples * 1000000 / sample_rate);
 }
@@ -270,6 +278,10 @@
   if (message.has_set_paused()) {
     SetPaused(message.set_paused().paused());
   }
+  if (message.has_eos_played_out()) {
+    // Explicit EOS.
+    HandleAudioData(nullptr, 0, INT64_MIN);
+  }
   return true;
 }
 
@@ -567,7 +579,7 @@
     mixer_service::Generic message;
     message.mutable_push_result()->set_next_playback_timestamp(
         next_playback_timestamp);
-    socket_->SendProto(message);
+    socket_->SendProto(kPushResult, message);
   }
 }
 
@@ -1022,14 +1034,14 @@
     base::AutoLock lock(lock_);
     push_result->set_next_playback_timestamp(next_playback_timestamp_);
   }
-  socket_->SendProto(message);
+  socket_->SendProto(kPushResult, message);
 }
 
 void MixerInputConnection::PostEos() {
   DCHECK(io_task_runner_->RunsTasksInCurrentSequence());
   mixer_service::Generic message;
   message.mutable_eos_played_out();
-  socket_->SendProto(message);
+  socket_->SendProto(kEndOfStream, message);
 }
 
 void MixerInputConnection::PostAudioReadyForPlayback() {
@@ -1047,7 +1059,7 @@
     ready_for_playback->set_delay_microseconds(
         mixer_rendering_delay_.delay_microseconds);
   }
-  socket_->SendProto(message);
+  socket_->SendProto(kReadyForPlayback, message);
   audio_ready_for_playback_fired_ = true;
 }
 
@@ -1056,7 +1068,7 @@
   mixer_service::Generic message;
   message.mutable_mixer_underrun()->set_type(
       mixer_service::MixerUnderrun::INPUT_UNDERRUN);
-  socket_->SendProto(message);
+  socket_->SendProto(kUnderrun, message);
 }
 
 void MixerInputConnection::PostOutputUnderrun() {
@@ -1064,7 +1076,7 @@
   mixer_service::Generic message;
   message.mutable_mixer_underrun()->set_type(
       mixer_service::MixerUnderrun::OUTPUT_UNDERRUN);
-  socket_->SendProto(message);
+  socket_->SendProto(kUnderrun, message);
 }
 
 void MixerInputConnection::OnAudioPlaybackError(MixerError error) {
@@ -1094,7 +1106,7 @@
   DCHECK(io_task_runner_->RunsTasksInCurrentSequence());
   mixer_service::Generic message;
   message.mutable_error()->set_type(mixer_service::Error::INVALID_STREAM_ERROR);
-  socket_->SendProto(message);
+  socket_->SendProto(kError, message);
 
   OnConnectionError();
 }
diff --git a/chromecast/media/cma/backend/mixer/mixer_loopback_connection.cc b/chromecast/media/cma/backend/mixer/mixer_loopback_connection.cc
index 6dde7ac1..d26b361 100644
--- a/chromecast/media/cma/backend/mixer/mixer_loopback_connection.cc
+++ b/chromecast/media/cma/backend/mixer/mixer_loopback_connection.cc
@@ -15,6 +15,15 @@
 namespace chromecast {
 namespace media {
 
+namespace {
+
+enum MessageTypes : int {
+  kStreamConfig = 1,
+  kInterrupt,
+};
+
+}  // namespace
+
 MixerLoopbackConnection::MixerLoopbackConnection(
     std::unique_ptr<mixer_service::MixerSocket> socket)
     : socket_(std::move(socket)) {
@@ -25,6 +34,11 @@
 MixerLoopbackConnection::~MixerLoopbackConnection() = default;
 
 void MixerLoopbackConnection::SetErrorCallback(base::OnceClosure callback) {
+  if (pending_error_) {
+    pending_error_ = false;
+    std::move(callback).Run();
+    return;
+  }
   error_callback_ = std::move(callback);
 }
 
@@ -38,7 +52,7 @@
   config->set_sample_rate(sample_rate);
   config->set_num_channels(num_channels);
   config->set_data_size(data_size);
-  socket_->SendProto(message);
+  socket_->SendProto(kStreamConfig, message);
 
   sent_stream_config_ = true;
 }
@@ -48,7 +62,10 @@
     int data_size_bytes,
     int64_t timestamp) {
   DCHECK(sent_stream_config_);
-  socket_->SendAudioBuffer(std::move(audio_buffer), data_size_bytes, timestamp);
+  if (!socket_->SendAudioBuffer(std::move(audio_buffer), data_size_bytes,
+                                timestamp)) {
+    SendInterrupt(LoopbackInterruptReason::kSocketOverflow);
+  }
 }
 
 void MixerLoopbackConnection::SendInterrupt(LoopbackInterruptReason reason) {
@@ -58,7 +75,7 @@
   interrupt->set_reason(
       static_cast<mixer_service::StreamInterruption::InterruptionReason>(
           reason));
-  socket_->SendProto(message);
+  socket_->SendProto(kInterrupt, message);
 }
 
 bool MixerLoopbackConnection::HandleMetadata(
@@ -75,7 +92,9 @@
 void MixerLoopbackConnection::OnConnectionError() {
   if (error_callback_) {
     std::move(error_callback_).Run();
+    return;
   }
+  pending_error_ = true;
 }
 
 }  // namespace media
diff --git a/chromecast/media/cma/backend/mixer/mixer_loopback_connection.h b/chromecast/media/cma/backend/mixer/mixer_loopback_connection.h
index 7e7df184..6a862c3 100644
--- a/chromecast/media/cma/backend/mixer/mixer_loopback_connection.h
+++ b/chromecast/media/cma/backend/mixer/mixer_loopback_connection.h
@@ -55,6 +55,7 @@
 
   base::OnceClosure error_callback_;
 
+  bool pending_error_ = false;
   bool sent_stream_config_ = false;
 
   DISALLOW_COPY_AND_ASSIGN(MixerLoopbackConnection);
diff --git a/chromecast/media/cma/backend/mixer/mixer_service_receiver.cc b/chromecast/media/cma/backend/mixer/mixer_service_receiver.cc
index a2a54bb..a7971f9 100644
--- a/chromecast/media/cma/backend/mixer/mixer_service_receiver.cc
+++ b/chromecast/media/cma/backend/mixer/mixer_service_receiver.cc
@@ -21,6 +21,15 @@
 namespace chromecast {
 namespace media {
 
+namespace {
+
+enum MessageTypes : int {
+  kStreamCounts = 1,
+  kPostProcessorList,
+};
+
+}  // namespace
+
 class MixerServiceReceiver::ControlConnection
     : public mixer_service::MixerSocket::Delegate {
  public:
@@ -45,7 +54,7 @@
     auto* counts = message.mutable_stream_count();
     counts->set_primary(receiver_->primary_stream_count_);
     counts->set_sfx(receiver_->sfx_stream_count_);
-    socket_->SendProto(message);
+    socket_->SendProto(kStreamCounts, message);
   }
 
  private:
@@ -109,7 +118,7 @@
     for (const auto& library_pair : PostProcessorRegistry::Get()->Libraries()) {
       postprocessor_list->add_postprocessors(library_pair.first);
     }
-    socket_->SendProto(message);
+    socket_->SendProto(kPostProcessorList, message);
   }
 
   void OnConnectionError() override {
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd
index a379682..f2c1f57 100644
--- a/chromeos/chromeos_strings.grd
+++ b/chromeos/chromeos_strings.grd
@@ -582,6 +582,9 @@
       <message name="IDS_SCANNING_APP_GET_HELP_LINK_TEXT" desc="The text used for the link that navigates to the Scan app help webpage. This is shown to the user after a scanning error.">
         Get help
       </message>
+      <message name="IDS_SCANNING_APP_CANCEL_FAILED_TOAST_TEXT" desc="The error message displayed when a user attempts to cancel a scan job but the cancel request fails.">
+        Couldn't cancel scanning
+      </message>
 
       <!-- Diagnostics App -->
       <!-- TODO(michaelcheco): Update with finalized copies of the strings -->
diff --git a/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_CANCEL_FAILED_TOAST_TEXT.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_CANCEL_FAILED_TOAST_TEXT.png.sha1
new file mode 100644
index 0000000..56f683af
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_CANCEL_FAILED_TOAST_TEXT.png.sha1
@@ -0,0 +1 @@
+78e37b5f7d89b511799f4f8c706d997a4f1953d6
\ No newline at end of file
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_grd/IDS_EXPERT_SCAN_BARCODE.png.sha1 b/chromeos/components/camera_app_ui/resources/strings/camera_strings_grd/IDS_EXPERT_SCAN_BARCODE.png.sha1
index 052d3a0..605c9f66 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_grd/IDS_EXPERT_SCAN_BARCODE.png.sha1
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_grd/IDS_EXPERT_SCAN_BARCODE.png.sha1
@@ -1 +1 @@
-fd4166d2a4aa6d5118d7127d3ee638863cf0e938
\ No newline at end of file
+655537c26570afc16403950a0b55063be57b1ceb
\ No newline at end of file
diff --git a/chromeos/components/phonehub/BUILD.gn b/chromeos/components/phonehub/BUILD.gn
index afef6c95..a8256daa2 100644
--- a/chromeos/components/phonehub/BUILD.gn
+++ b/chromeos/components/phonehub/BUILD.gn
@@ -80,6 +80,8 @@
     "tether_controller.h",
     "tether_controller_impl.cc",
     "tether_controller_impl.h",
+    "util/histogram_util.cc",
+    "util/histogram_util.h",
   ]
 
   deps = [
diff --git a/chromeos/components/phonehub/connection_manager_impl.cc b/chromeos/components/phonehub/connection_manager_impl.cc
index f157fba..92592d5 100644
--- a/chromeos/components/phonehub/connection_manager_impl.cc
+++ b/chromeos/components/phonehub/connection_manager_impl.cc
@@ -20,7 +20,7 @@
     base::TimeDelta::FromSeconds(15u));
 
 void RecordConnectionSuccessMetric(bool success) {
-  UMA_HISTOGRAM_BOOLEAN("PhoneHub.Connectivity.Success", success);
+  UMA_HISTOGRAM_BOOLEAN("PhoneHub.Connection.Result", success);
 }
 
 }  // namespace
diff --git a/chromeos/components/phonehub/connection_manager_impl_unittest.cc b/chromeos/components/phonehub/connection_manager_impl_unittest.cc
index 8752acf..8f587c35 100644
--- a/chromeos/components/phonehub/connection_manager_impl_unittest.cc
+++ b/chromeos/components/phonehub/connection_manager_impl_unittest.cc
@@ -139,6 +139,13 @@
     mock_timer_->Fire();
   }
 
+  void VerifyConnectionResultHistogram(
+      base::HistogramBase::Sample sample,
+      base::HistogramBase::Count expected_count) {
+    histogram_tester_.ExpectBucketCount("PhoneHub.Connection.Result", sample,
+                                        expected_count);
+  }
+
   base::MockOneShotTimer* mock_timer_;
   chromeos::multidevice::RemoteDeviceRef test_remote_device_;
   chromeos::multidevice::RemoteDeviceRef test_local_device_;
@@ -175,7 +182,7 @@
 
   histogram_tester_.ExpectTimeBucketCount("PhoneHub.Connectivity.Latency",
                                           kFakeConnectionLatencyTime, 1);
-  histogram_tester_.ExpectBucketCount("PhoneHub.Connectivity.Success", true, 1);
+  VerifyConnectionResultHistogram(true, 1);
 }
 
 TEST_F(ConnectionManagerImplTest, FailedToAttemptConnection) {
@@ -196,8 +203,7 @@
   EXPECT_EQ(2u, GetNumStatusObserverCalls());
   EXPECT_EQ(ConnectionManager::Status::kDisconnected, GetStatus());
 
-  histogram_tester_.ExpectBucketCount("PhoneHub.Connectivity.Success", false,
-                                      1);
+  VerifyConnectionResultHistogram(false, 1);
 }
 
 TEST_F(ConnectionManagerImplTest, SuccessfulAttemptConnectionButDisconnected) {
@@ -224,7 +230,7 @@
 
   histogram_tester_.ExpectTimeBucketCount("PhoneHub.Connectivity.Latency",
                                           kFakeConnectionLatencyTime, 1);
-  histogram_tester_.ExpectBucketCount("PhoneHub.Connectivity.Success", true, 1);
+  VerifyConnectionResultHistogram(true, 1);
 
   // Simulate a disconnected channel.
   test_clock_->Advance(kFakeConnectionDurationTime);
@@ -257,7 +263,7 @@
 
   histogram_tester_.ExpectTimeBucketCount("PhoneHub.Connectivity.Latency",
                                           kFakeConnectionLatencyTime, 1);
-  histogram_tester_.ExpectBucketCount("PhoneHub.Connectivity.Success", true, 1);
+  VerifyConnectionResultHistogram(true, 1);
 
   // Status has been updated to connected, verify that the status observer has
   // been called.
@@ -318,7 +324,7 @@
 
   histogram_tester_.ExpectTimeBucketCount("PhoneHub.Connectivity.Latency",
                                           kFakeConnectionLatencyTime, 1);
-  histogram_tester_.ExpectBucketCount("PhoneHub.Connectivity.Success", true, 1);
+  VerifyConnectionResultHistogram(true, 1);
 
   // Status has been updated to connected, verify that the status observer has
   // been called.
@@ -342,8 +348,7 @@
   VerifyTimerStopped();
   EXPECT_EQ(2u, GetNumStatusObserverCalls());
   EXPECT_EQ(ConnectionManager::Status::kDisconnected, GetStatus());
-  histogram_tester_.ExpectBucketCount("PhoneHub.Connectivity.Success", false,
-                                      1);
+  VerifyConnectionResultHistogram(false, 1);
 }
 
 TEST_F(ConnectionManagerImplTest, DisconnectConnection) {
@@ -361,8 +366,7 @@
   EXPECT_EQ(2u, GetNumStatusObserverCalls());
   EXPECT_EQ(ConnectionManager::Status::kDisconnected, GetStatus());
   VerifyTimerStopped();
-  histogram_tester_.ExpectBucketCount("PhoneHub.Connectivity.Success", false,
-                                      1);
+  VerifyConnectionResultHistogram(false, 1);
 }
 
 }  // namespace phonehub
diff --git a/chromeos/components/phonehub/multidevice_setup_state_updater.cc b/chromeos/components/phonehub/multidevice_setup_state_updater.cc
index 56574ad..00d958f 100644
--- a/chromeos/components/phonehub/multidevice_setup_state_updater.cc
+++ b/chromeos/components/phonehub/multidevice_setup_state_updater.cc
@@ -6,6 +6,7 @@
 
 #include "chromeos/components/multidevice/logging/logging.h"
 #include "chromeos/components/phonehub/pref_names.h"
+#include "chromeos/components/phonehub/util/histogram_util.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
 
@@ -68,6 +69,7 @@
     multidevice_setup_client_->SetFeatureEnabledState(
         Feature::kPhoneHub, /*enabled=*/true, /*auth_token=*/base::nullopt,
         base::DoNothing());
+    util::LogFeatureOptInEntryPoint(util::OptInEntryPoint::kSetupFlow);
   }
 
   UpdateIsAwaitingVerifiedHost(host_status);
diff --git a/chromeos/components/phonehub/onboarding_ui_tracker_impl.cc b/chromeos/components/phonehub/onboarding_ui_tracker_impl.cc
index 34506372..f46e9f2 100644
--- a/chromeos/components/phonehub/onboarding_ui_tracker_impl.cc
+++ b/chromeos/components/phonehub/onboarding_ui_tracker_impl.cc
@@ -3,8 +3,10 @@
 // found in the LICENSE file.
 
 #include "chromeos/components/phonehub/onboarding_ui_tracker_impl.h"
+
 #include "chromeos/components/phonehub/feature_status.h"
 #include "chromeos/components/phonehub/pref_names.h"
+#include "chromeos/components/phonehub/util/histogram_util.h"
 #include "chromeos/services/multidevice_setup/public/cpp/multidevice_setup_client.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
@@ -60,6 +62,7 @@
     multidevice_setup_client_->SetFeatureEnabledState(
         multidevice_setup::mojom::Feature::kPhoneHub,
         /*enabled=*/true, /*auth_token=*/base::nullopt, base::DoNothing());
+    util::LogFeatureOptInEntryPoint(util::OptInEntryPoint::kOnboardingFlow);
     return;
   }
   LOG(ERROR)
diff --git a/chromeos/components/phonehub/util/histogram_util.cc b/chromeos/components/phonehub/util/histogram_util.cc
new file mode 100644
index 0000000..f2989ee6
--- /dev/null
+++ b/chromeos/components/phonehub/util/histogram_util.cc
@@ -0,0 +1,19 @@
+// Copyright 2020 The Chromium 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 "chromeos/components/phonehub/util/histogram_util.h"
+
+#include "base/metrics/histogram_macros.h"
+
+namespace chromeos {
+namespace phonehub {
+namespace util {
+
+void LogFeatureOptInEntryPoint(OptInEntryPoint entry_point) {
+  UMA_HISTOGRAM_ENUMERATION("PhoneHub.OptInEntryPoint", entry_point);
+}
+
+}  // namespace util
+}  // namespace phonehub
+}  // namespace chromeos
diff --git a/chromeos/components/phonehub/util/histogram_util.h b/chromeos/components/phonehub/util/histogram_util.h
new file mode 100644
index 0000000..7447b6a
--- /dev/null
+++ b/chromeos/components/phonehub/util/histogram_util.h
@@ -0,0 +1,30 @@
+// Copyright 2020 The Chromium 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 CHROMEOS_COMPONENTS_PHONEHUB_UTIL_HISTOGRAM_UTIL_H_
+#define CHROMEOS_COMPONENTS_PHONEHUB_UTIL_HISTOGRAM_UTIL_H_
+
+namespace chromeos {
+namespace phonehub {
+namespace util {
+
+// Enumeration of possible opt-in entry points for Phone Hub feature. Keep in
+// sync with corresponding enum in tools/metrics/histograms/enums.xml. These
+// values are persisted to logs. Entries should not be renumbered and numeric
+// values should never be reused.
+enum class OptInEntryPoint {
+  kSetupFlow = 0,
+  kOnboardingFlow = 1,
+  kSettings = 2,
+  kMaxValue = kSettings,
+};
+
+// Logs a given opt-in |entry_point| for the PhoneHub feature.
+void LogFeatureOptInEntryPoint(OptInEntryPoint entry_point);
+
+}  // namespace util
+}  // namespace phonehub
+}  // namespace chromeos
+
+#endif  // CHROMEOS_COMPONENTS_PHONEHUB_UTIL_HISTOGRAM_UTIL_H_
diff --git a/chromeos/components/scanning/resources/scanning_app.js b/chromeos/components/scanning/resources/scanning_app.js
index 669c9f986..aea6c8d8 100644
--- a/chromeos/components/scanning/resources/scanning_app.js
+++ b/chromeos/components/scanning/resources/scanning_app.js
@@ -257,6 +257,20 @@
   },
 
   /**
+   * Overrides chromeos.scanning.mojom.ScanJobObserverInterface.
+   * @param {boolean} success
+   */
+  onCancelComplete(success) {
+    // If the cancel request fails, continue showing the scan progress page.
+    if (!success) {
+      this.showToast_('cancelFailedToastText');
+      return;
+    }
+
+    this.setAppState_(AppState.READY);
+  },
+
+  /**
    * @param {string} selectedSource
    * @return {!Array<chromeos.scanning.mojom.PageSize>}
    * @private
@@ -414,18 +428,10 @@
   /** @private */
   onCancelClick_() {
     assert(this.appState_ === AppState.SCANNING);
-
     this.scanService_.cancelScan();
-    this.setAppState_(AppState.READY);
   },
 
   /**
-   * Overrides chromeos.scanning.mojom.ScanJobObserverInterface.
-   * @param {boolean} success
-   */
-  onCancelComplete(success) {},
-
-  /**
    * Revokes and removes all of the object URLs.
    * @private
    */
diff --git a/chromeos/components/scanning/scanning_ui.cc b/chromeos/components/scanning/scanning_ui.cc
index 9e4a89be..7fdc8b8 100644
--- a/chromeos/components/scanning/scanning_ui.cc
+++ b/chromeos/components/scanning/scanning_ui.cc
@@ -56,6 +56,7 @@
       {"appTitle", IDS_SCANNING_APP_TITLE},
       {"blackAndWhiteOptionText", IDS_SCANNING_APP_BLACK_AND_WHITE_OPTION_TEXT},
       {"cancelButtonText", IDS_SCANNING_APP_CANCEL_BUTTON_TEXT},
+      {"cancelFailedToastText", IDS_SCANNING_APP_CANCEL_FAILED_TOAST_TEXT},
       {"colorModeDropdownLabel", IDS_SCANNING_APP_COLOR_MODE_DROPDOWN_LABEL},
       {"colorOptionText", IDS_SCANNING_APP_COLOR_OPTION_TEXT},
       {"defaultSourceOptionText", IDS_SCANNING_APP_DEFAULT_SOURCE_OPTION_TEXT},
diff --git a/chromeos/tpm/install_attributes.h b/chromeos/tpm/install_attributes.h
index da9bc9a..c805f7fa 100644
--- a/chromeos/tpm/install_attributes.h
+++ b/chromeos/tpm/install_attributes.h
@@ -212,7 +212,7 @@
   // errors (cryptohomed startup is slow).
   void TriggerConsistencyCheck(int dbus_retries);
 
-  // Callback for `GetTpmNonsensitiveStatus()` DBUS call.  Generates UMA or
+  // Callback for `GetTpmNonsensitiveStatus()` D-Bus call. Generates UMA or
   // schedules retry in case of DBUS error.
   void OnTpmStatusComplete(
       int dbus_retries_remaining,
diff --git a/components/apdu/apdu_response.h b/components/apdu/apdu_response.h
index a240354..cadbb17 100644
--- a/components/apdu/apdu_response.h
+++ b/components/apdu/apdu_response.h
@@ -26,6 +26,7 @@
   enum class Status : uint16_t {
     SW_NO_ERROR = 0x9000,
     SW_CONDITIONS_NOT_SATISFIED = 0x6985,
+    SW_COMMAND_NOT_ALLOWED = 0x6986,
     SW_WRONG_DATA = 0x6A80,
     SW_WRONG_LENGTH = 0x6700,
     SW_INS_NOT_SUPPORTED = 0x6D00,
diff --git a/components/arc/mojom/auth.mojom b/components/arc/mojom/auth.mojom
index eabdf80..9a3af92 100644
--- a/components/arc/mojom/auth.mojom
+++ b/components/arc/mojom/auth.mojom
@@ -36,9 +36,9 @@
   //   due to Host/Instance version mismatch.
   MOJO_VERSION_MISMATCH = 1,
 
-  // PROVISIONING_TIMEOUT: is sent when provisioning is started
+  // GENERIC_PROVISIONING_TIMEOUT: is sent when provisioning is started
   //   but not completed with time out.
-  PROVISIONING_TIMEOUT = 2,
+  GENERIC_PROVISIONING_TIMEOUT = 2,
 
   // Network connection is unavailable.
   NO_NETWORK_CONNECTION = 3,
@@ -57,39 +57,39 @@
 };
 
 [Extensible]
-enum DeviceCheckInError {
+enum GMSCheckInError {
   // Next value: 4.
 
-  // DEVICE_CHECK_IN_FAILED: is sent when "check-in" procedure is completed
+  // GMS_CHECK_IN_FAILED: is sent when "check-in" procedure is completed
   //   but is actually failed.
-  DEVICE_CHECK_IN_FAILED = 1,
+  GMS_CHECK_IN_FAILED = 1,
 
-  // DEVICE_CHECK_IN_TIMEOUT: is sent when "check-in" procedure started
+  // GMS_CHECK_IN_TIMEOUT: is sent when "check-in" procedure started
   //   but is not completed.
-  DEVICE_CHECK_IN_TIMEOUT = 2,
+  GMS_CHECK_IN_TIMEOUT = 2,
 
-  // DEVICE_CHECK_IN_INTERNAL_ERROR: is sent when "check-in" procedure is
+  // GMS_CHECK_IN_INTERNAL_ERROR: is sent when "check-in" procedure is
   //   started, but some unexpected error situation happens so that it could
   //   not completed.
-  DEVICE_CHECK_IN_INTERNAL_ERROR = 3,
+  GMS_CHECK_IN_INTERNAL_ERROR = 3,
 };
 
 [Extensible]
-enum GMSError {
+enum GMSSignInError {
   // Next value: 7.
 
-  // GMS_NETWORK_ERROR: is sent when GMS sign-in procedure is started, but
-  //   it reports NETWORK_ERROR.
-  GMS_NETWORK_ERROR = 1,
+  // GMS_SIGN_IN_NETWORK_ERROR: is sent when GMS sign-in procedure is
+  //   started, but it reports NETWORK_ERROR.
+  GMS_SIGN_IN_NETWORK_ERROR = 1,
 
-  // GMS_SERVICE_UNAVAILABLE: is sent when GMS sign-in procedure is started
-  //   but it reports SERVICE_UNAVAILABLE. Note that this is not generic
-  //   service unavailable error code.
-  GMS_SERVICE_UNAVAILABLE = 2,
+  // GMS_SIGN_IN_SERVICE_UNAVAILABLE: is sent when GMS sign-in
+  //   procedure is started but it reports SERVICE_UNAVAILABLE. Note
+  //   that this is not generic service unavailable error code.
+  GMS_SIGN_IN_SERVICE_UNAVAILABLE = 2,
 
-  // GMS_BAD_AUTHENTICATION: is sent when GMS sign-in procedure is started
-  //   but it reports BAD_AUTHENTICATION.
-  GMS_BAD_AUTHENTICATION = 3,
+  // GMS_SIGN_IN_BAD_AUTHENTICATION: is sent when GMS sign-in procedure
+  //   is started but it reports BAD_AUTHENTICATION.
+  GMS_SIGN_IN_BAD_AUTHENTICATION = 3,
 
   // GMS_SIGN_IN_FAILED: is sent when GMS sign in procedure is started but
   //   it reports an error other than above NETWORK_ERROR, SERVICE_UNAVAILABLE
@@ -178,8 +178,8 @@
 union ArcSignInError {
   CloudProvisionFlowError cloud_provision_flow_error;
   [MinVersion=26] GeneralSignInError general_error;
-  [MinVersion=26] GMSError gms_error;
-  [MinVersion=26] DeviceCheckInError checkin_error;
+  [MinVersion=26] GMSSignInError sign_in_error;
+  [MinVersion=26] GMSCheckInError check_in_error;
 };
 
 union ArcSignInResult {
diff --git a/components/encrypted_messages/DIR_METADATA b/components/encrypted_messages/DIR_METADATA
new file mode 100644
index 0000000..90ac65c
--- /dev/null
+++ b/components/encrypted_messages/DIR_METADATA
@@ -0,0 +1,3 @@
+monorail {
+  component: "Internals>CertAnalysis"
+}
diff --git a/components/encrypted_messages/OWNERS b/components/encrypted_messages/OWNERS
index d59d01a..589776d 100644
--- a/components/encrypted_messages/OWNERS
+++ b/components/encrypted_messages/OWNERS
@@ -1,5 +1,3 @@
 estark@chromium.org
 felt@chromium.org
 rsleevi@chromium.org
-
-# COMPONENT: Internals>CertAnalysis
diff --git a/components/enterprise/DIR_METADATA b/components/enterprise/DIR_METADATA
new file mode 100644
index 0000000..3ecb477
--- /dev/null
+++ b/components/enterprise/DIR_METADATA
@@ -0,0 +1,3 @@
+monorail {
+  component: "Enterprise"
+}
diff --git a/components/enterprise/OWNERS b/components/enterprise/OWNERS
index c6d1e61..297ae77a 100644
--- a/components/enterprise/OWNERS
+++ b/components/enterprise/OWNERS
@@ -7,5 +7,3 @@
 ydago@chromium.org
 zmin@chromium.org
 
-# COMPONENT: Enterprise
-
diff --git a/components/error_page/DIR_METADATA b/components/error_page/DIR_METADATA
new file mode 100644
index 0000000..709d8280
--- /dev/null
+++ b/components/error_page/DIR_METADATA
@@ -0,0 +1,5 @@
+monorail {
+  component: "Internals>Network"
+}
+
+team_email: "net-dev@chromium.org"
diff --git a/components/error_page/OWNERS b/components/error_page/OWNERS
index b5ae9b2..21aa4da 100644
--- a/components/error_page/OWNERS
+++ b/components/error_page/OWNERS
@@ -3,6 +3,3 @@
 per-file error_page_strings.grdp=edwardjung@chromium.org
 
 file://net/OWNERS
-
-# COMPONENT: Internals>Network
-# TEAM: net-dev@chromium.org
diff --git a/components/error_page_strings_grdp/DIR_METADATA b/components/error_page_strings_grdp/DIR_METADATA
new file mode 100644
index 0000000..2d14a86
--- /dev/null
+++ b/components/error_page_strings_grdp/DIR_METADATA
@@ -0,0 +1,3 @@
+monorail {
+  component: "Internals>Network"
+}
diff --git a/components/error_page_strings_grdp/OWNERS b/components/error_page_strings_grdp/OWNERS
index 6d90006..a24fa86 100644
--- a/components/error_page_strings_grdp/OWNERS
+++ b/components/error_page_strings_grdp/OWNERS
@@ -1,4 +1,3 @@
 edwardjung@chromium.org
 
 file://components/error_page/OWNERS
-# COMPONENT: Internals>Network
diff --git a/components/exo/DIR_METADATA b/components/exo/DIR_METADATA
new file mode 100644
index 0000000..1cfc76b
--- /dev/null
+++ b/components/exo/DIR_METADATA
@@ -0,0 +1,3 @@
+monorail {
+  component: "Internals>Exosphere"
+}
diff --git a/components/exo/OWNERS b/components/exo/OWNERS
index 8dde166..cba68c6 100644
--- a/components/exo/OWNERS
+++ b/components/exo/OWNERS
@@ -3,5 +3,3 @@
 
 # For Input (keyboard, mouse, touch)
 mukai@chromium.org
-
-# COMPONENT: Internals>Exosphere
diff --git a/components/favicon/DIR_METADATA b/components/favicon/DIR_METADATA
new file mode 100644
index 0000000..9b08ae7f
--- /dev/null
+++ b/components/favicon/DIR_METADATA
@@ -0,0 +1,3 @@
+monorail {
+  component: "UI>Browser>History"
+}
diff --git a/components/favicon/OWNERS b/components/favicon/OWNERS
index 68d5c7cc..6581507 100644
--- a/components/favicon/OWNERS
+++ b/components/favicon/OWNERS
@@ -1,4 +1,3 @@
 mastiz@chromium.org
 pkotwicz@chromium.org
 sky@chromium.org
-# COMPONENT: UI>Browser>History
diff --git a/components/favicon_base/DIR_METADATA b/components/favicon_base/DIR_METADATA
new file mode 100644
index 0000000..9b08ae7f
--- /dev/null
+++ b/components/favicon_base/DIR_METADATA
@@ -0,0 +1,3 @@
+monorail {
+  component: "UI>Browser>History"
+}
diff --git a/components/favicon_base/OWNERS b/components/favicon_base/OWNERS
index c55fe03..e1be2fe 100644
--- a/components/favicon_base/OWNERS
+++ b/components/favicon_base/OWNERS
@@ -1,3 +1 @@
 file://components/favicon/OWNERS
-
-# COMPONENT: UI>Browser>History
diff --git a/components/feature_engagement/DIR_METADATA b/components/feature_engagement/DIR_METADATA
new file mode 100644
index 0000000..454508f
--- /dev/null
+++ b/components/feature_engagement/DIR_METADATA
@@ -0,0 +1,3 @@
+monorail {
+  component: "Internals>FeatureEngagement"
+}
diff --git a/components/feature_engagement/OWNERS b/components/feature_engagement/OWNERS
index e80cdac..a664df7ac 100644
--- a/components/feature_engagement/OWNERS
+++ b/components/feature_engagement/OWNERS
@@ -8,5 +8,3 @@
 per-file *EventConstants.java=twellington@chromium.org
 per-file *FeatureConstants.java=twellington@chromium.org
 
-# COMPONENT: Internals>FeatureEngagement
-
diff --git a/components/federated_learning/DIR_METADATA b/components/federated_learning/DIR_METADATA
new file mode 100644
index 0000000..0e6c0305
--- /dev/null
+++ b/components/federated_learning/DIR_METADATA
@@ -0,0 +1 @@
+team_email: "privacy-sandbox-dev@chromium.org"
diff --git a/components/federated_learning/OWNERS b/components/federated_learning/OWNERS
index 073e83c..424ff9bd 100644
--- a/components/federated_learning/OWNERS
+++ b/components/federated_learning/OWNERS
@@ -1,5 +1,4 @@
 jkarlin@chromium.org
 yaoxia@chromium.org
 
-# TEAM: privacy-sandbox-dev@chromium.org
 # TODO(yaoxia): Add a crbug component for FloC.
diff --git a/components/feed/DIR_METADATA b/components/feed/DIR_METADATA
new file mode 100644
index 0000000..caf2b284
--- /dev/null
+++ b/components/feed/DIR_METADATA
@@ -0,0 +1,3 @@
+monorail {
+  component: "UI>Browser>ContentSuggestions>Feed"
+}
diff --git a/components/feed/OWNERS b/components/feed/OWNERS
index 85ef789..c22fdb6 100644
--- a/components/feed/OWNERS
+++ b/components/feed/OWNERS
@@ -12,4 +12,3 @@
 skym@chromium.org
 
 # Team: feed@chromium.org
-# COMPONENT: UI>Browser>ContentSuggestions>Feed
diff --git a/components/feed/feed_feature_list.cc b/components/feed/feed_feature_list.cc
index f9cf11ab..3554fe7f 100644
--- a/components/feed/feed_feature_list.cc
+++ b/components/feed/feed_feature_list.cc
@@ -53,6 +53,8 @@
 const base::Feature kInterestFeedSpinnerAlwaysAnimate{
     "InterestFeedSpinnerAlwaysAnimate", base::FEATURE_DISABLED_BY_DEFAULT};
 
+const base::Feature kWebFeed{"WebFeed", base::FEATURE_DISABLED_BY_DEFAULT};
+
 const char kDefaultReferrerUrl[] =
     "https://www.googleapis.com/auth/chrome-content-suggestions";
 
diff --git a/components/feed/feed_feature_list.h b/components/feed/feed_feature_list.h
index 432ba98..4cca493 100644
--- a/components/feed/feed_feature_list.h
+++ b/components/feed/feed_feature_list.h
@@ -35,6 +35,9 @@
 
 extern const base::Feature kInterestFeedSpinnerAlwaysAnimate;
 
+// Feature that allows users to keep up with and consume web content.
+extern const base::Feature kWebFeed;
+
 std::string GetFeedReferrerUrl();
 
 }  // namespace feed
diff --git a/components/feedback/DIR_METADATA b/components/feedback/DIR_METADATA
new file mode 100644
index 0000000..1b00e25cb7
--- /dev/null
+++ b/components/feedback/DIR_METADATA
@@ -0,0 +1,3 @@
+monorail {
+  component: "Platform>Apps>Feedback"
+}
diff --git a/components/feedback/OWNERS b/components/feedback/OWNERS
index 9172da3..699355a 100644
--- a/components/feedback/OWNERS
+++ b/components/feedback/OWNERS
@@ -4,5 +4,3 @@
 
 per-file redaction_tool*=iby@chromium.org
 per-file redaction_tool*=mutexlox@chromium.org
-
-# COMPONENT: Platform>Apps>Feedback
diff --git a/components/filename_generation/DIR_METADATA b/components/filename_generation/DIR_METADATA
new file mode 100644
index 0000000..6bf7cbf
--- /dev/null
+++ b/components/filename_generation/DIR_METADATA
@@ -0,0 +1,3 @@
+monorail {
+  component: "UI>Browser>Downloads"
+}
diff --git a/components/filename_generation/OWNERS b/components/filename_generation/OWNERS
index cdd1fbd..a0272728 100644
--- a/components/filename_generation/OWNERS
+++ b/components/filename_generation/OWNERS
@@ -2,5 +2,3 @@
 petewil@chromium.org
 qinmin@chromium.org
 romax@chromium.org
-
-# COMPONENT: UI>Browser>Downloads
diff --git a/components/flags_strings.grdp b/components/flags_strings.grdp
index 97de3ad..ac83ec6a 100644
--- a/components/flags_strings.grdp
+++ b/components/flags_strings.grdp
@@ -6,6 +6,9 @@
   <message name="IDS_FLAGS_UI_SEARCH_PLACEHOLDER" translateable="false" desc="The placeholder for the search box on the about:flags page.">
     Search flags
   </message>
+  <message name="IDS_FLAGS_UI_SEARCH_LABEL" translateable="false" desc="The accessible label for the search box on the about:flags page.">
+    Search flags
+  </message>
   <message name="IDS_FLAGS_UI_TITLE" translateable="false" desc="The page title for the about:flags page.">
     Experiments
   </message>
diff --git a/components/flags_ui/DIR_METADATA b/components/flags_ui/DIR_METADATA
new file mode 100644
index 0000000..8325efa
--- /dev/null
+++ b/components/flags_ui/DIR_METADATA
@@ -0,0 +1,3 @@
+monorail {
+  component: "UI>Browser>WebUI"
+}
diff --git a/components/flags_ui/OWNERS b/components/flags_ui/OWNERS
index f93ac61e..8894df51 100644
--- a/components/flags_ui/OWNERS
+++ b/components/flags_ui/OWNERS
@@ -2,5 +2,3 @@
 
 asvitkine@chromium.org
 ellyjones@chromium.org
-
-# COMPONENT: UI>Browser>WebUI
diff --git a/components/flags_ui/resources/flags.html b/components/flags_ui/resources/flags.html
index 830cbe2..c45a0b3 100644
--- a/components/flags_ui/resources/flags.html
+++ b/components/flags_ui/resources/flags.html
@@ -30,8 +30,10 @@
   <div class="flex-container">
     <div class="flex">
       <div class="search-container">
-        <input type="text" id="search" placeholder="$i18n{search-placeholder}" tabindex="1"
-            autocomplete="off" spellcheck="false">
+        <input type="text" id="search"
+               aria-label="$i18n{search-label}"
+               placeholder="$i18n{search-placeholder}" tabindex="1"
+               autocomplete="off" spellcheck="false">
         <input type="button" class="clear-search" title="$i18n{clear-search}"
             tabindex="2">
       </div>
diff --git a/components/lookalikes/core/features.cc b/components/lookalikes/core/features.cc
index 410daa2..dc362a9 100644
--- a/components/lookalikes/core/features.cc
+++ b/components/lookalikes/core/features.cc
@@ -8,7 +8,7 @@
 namespace features {
 
 const base::Feature kDetectTargetEmbeddingLookalikes{
-    "TargetEmbeddingLookalikes", base::FEATURE_ENABLED_BY_DEFAULT};
+    "TargetEmbeddingLookalikes", base::FEATURE_DISABLED_BY_DEFAULT};
 
 const base::Feature kLookalikeInterstitialForPunycode{
     "LookalikeInterstitialForPunycode", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/components/media_message_center/media_notification_view_impl.cc b/components/media_message_center/media_notification_view_impl.cc
index f541170..2097002 100644
--- a/components/media_message_center/media_notification_view_impl.cc
+++ b/components/media_message_center/media_notification_view_impl.cc
@@ -432,6 +432,7 @@
 
   container_->OnMediaSessionMetadataChanged(metadata);
 
+  MaybeShowOrHideArtistLabel();
   PreferredSizeChanged();
   Layout();
   SchedulePaint();
@@ -463,6 +464,7 @@
 
   container_->OnMediaArtworkChanged(image);
 
+  MaybeShowOrHideArtistLabel();
   PreferredSizeChanged();
   Layout();
   SchedulePaint();
@@ -794,6 +796,13 @@
     item_->OnMediaSessionActionButtonPressed(GetActionFromButtonTag(*button));
 }
 
+void MediaNotificationViewImpl::MaybeShowOrHideArtistLabel() {
+  if (!is_cros_)
+    return;
+
+  artist_label_->SetVisible(!artist_label_->GetText().empty() || has_artwork_);
+}
+
 std::vector<views::View*> MediaNotificationViewImpl::GetButtons() {
   auto buttons = button_row_->children();
   buttons.insert(buttons.cbegin(),
diff --git a/components/media_message_center/media_notification_view_impl.h b/components/media_message_center/media_notification_view_impl.h
index a6ee20c..0aec17e 100644
--- a/components/media_message_center/media_notification_view_impl.h
+++ b/components/media_message_center/media_notification_view_impl.h
@@ -134,6 +134,8 @@
 
   void ButtonPressed(views::Button* button);
 
+  void MaybeShowOrHideArtistLabel();
+
   // Returns the buttons contained in the button row and playback button
   // container.
   std::vector<views::View*> GetButtons();
diff --git a/components/messages/android/java/res/layout/message_banner_view.xml b/components/messages/android/java/res/layout/message_banner_view.xml
index 2d25077..33a788ea 100644
--- a/components/messages/android/java/res/layout/message_banner_view.xml
+++ b/components/messages/android/java/res/layout/message_banner_view.xml
@@ -3,16 +3,12 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<!--
-    TODO(crbug.com/1111911): remove "UnusedResources" when this view is
-                               used outside of tests. -->
 <org.chromium.components.messages.MessageBannerView
-    xmlns:tools="http://schemas.android.com/tools"
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
-    tools:ignore="UnusedResources"
-    android:layout_height="@dimen/message_banner_height"
+    android:layout_height="wrap_content"
     android:layout_width="match_parent"
+    android:minHeight="@dimen/message_banner_height"
     android:layout_gravity="center_horizontal"
     android:orientation="horizontal"
     android:layout_marginTop="@dimen/message_shadow_top_margin"
@@ -20,6 +16,8 @@
     android:layout_marginStart="@dimen/message_shadow_lateral_margin"
     android:layout_marginEnd="@dimen/message_shadow_lateral_margin"
     android:elevation="@dimen/message_banner_elevation"
+    android:paddingTop="@dimen/message_banner_vertical_padding"
+    android:paddingBottom="@dimen/message_banner_vertical_padding"
     app:maxWidthPortrait="@dimen/message_max_width"
     app:maxWidthLandscape="@dimen/message_max_width"
     android:background="@drawable/message_bg_tinted">
@@ -35,12 +33,12 @@
         android:importantForAccessibility="no" />
 
     <LinearLayout
-        android:layout_width="wrap_content"
-        android:layout_weight="1"
+        android:layout_width="0dp"
+        android:layout_weight="3"
         android:gravity="center_vertical"
         android:layout_gravity="center_vertical"
         android:orientation="vertical"
-        android:layout_height="match_parent">
+        android:layout_height="wrap_content">
 
         <TextView
             android:id="@+id/message_title"
@@ -80,8 +78,8 @@
     <org.chromium.ui.widget.ButtonCompat
         style="@style/TextButton"
         android:id="@+id/message_primary_button"
-        android:layout_weight="0"
-        android:layout_width="wrap_content"
+        android:layout_weight="1"
+        android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:layout_gravity="center_vertical"
         android:visibility="gone" />
diff --git a/components/messages/android/java/res/values/dimens.xml b/components/messages/android/java/res/values/dimens.xml
index 9a37fb7d..da97507 100644
--- a/components/messages/android/java/res/values/dimens.xml
+++ b/components/messages/android/java/res/values/dimens.xml
@@ -3,11 +3,11 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<resources xmlns:tools="http://schemas.android.com/tools">
+<resources>
 
-    <!-- 88dp = 64dp (required height of message banner) + 24dp (shadow padding) -->
     <dimen name="message_banner_height">64dp</dimen>
     <dimen name="message_banner_radius">12dp</dimen>
+    <dimen name="message_banner_vertical_padding">12dp</dimen>
     <dimen name="message_banner_elevation">6dp</dimen>
     <!-- Min width to ensure the min touchable size. -->
     <dimen name="message_banner_button_min_width">12dp</dimen>
diff --git a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/SecurityStatusIcon.java b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/SecurityStatusIcon.java
index 0b1a1f0..be0e24c 100644
--- a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/SecurityStatusIcon.java
+++ b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/SecurityStatusIcon.java
@@ -16,17 +16,12 @@
      */
     @DrawableRes
     public static int getSecurityIconResource(@ConnectionSecurityLevel int securityLevel,
-            boolean shouldShowDangerTriangleForWarningLevel, boolean isSmallDevice,
-            boolean skipIconForNeutralState) {
+            boolean isSmallDevice, boolean skipIconForNeutralState) {
         switch (securityLevel) {
             case ConnectionSecurityLevel.NONE:
                 if (isSmallDevice && skipIconForNeutralState) return 0;
                 return R.drawable.omnibox_info;
             case ConnectionSecurityLevel.WARNING:
-                if (shouldShowDangerTriangleForWarningLevel) {
-                    return R.drawable.omnibox_not_secure_warning;
-                }
-                return R.drawable.omnibox_info;
             case ConnectionSecurityLevel.DANGEROUS:
                 return R.drawable.omnibox_not_secure_warning;
             case ConnectionSecurityLevel.SECURE_WITH_POLICY_INSTALLED_CERT:
diff --git a/components/omnibox/browser/location_bar_model_util.cc b/components/omnibox/browser/location_bar_model_util.cc
index a67d14c6..2f2efaa 100644
--- a/components/omnibox/browser/location_bar_model_util.cc
+++ b/components/omnibox/browser/location_bar_model_util.cc
@@ -21,18 +21,11 @@
   switch (security_level) {
     case security_state::NONE:
       return omnibox::kHttpIcon;
-    case security_state::WARNING:
-      // When kMarkHttpAsParameterDangerWarning is enabled, show a danger
-      // triangle icon.
-      if (security_state::ShouldShowDangerTriangleForWarningLevel()) {
-        return omnibox::kNotSecureWarningIcon;
-      }
-      NOTREACHED();
-      return omnibox::kHttpIcon;
     case security_state::SECURE:
       return omnibox::kHttpsValidIcon;
     case security_state::SECURE_WITH_POLICY_INSTALLED_CERT:
       return vector_icons::kBusinessIcon;
+    case security_state::WARNING:
     case security_state::DANGEROUS:
       return omnibox::kNotSecureWarningIcon;
     case security_state::SECURITY_LEVEL_COUNT:
diff --git a/components/omnibox/browser/location_bar_model_util_unittest.cc b/components/omnibox/browser/location_bar_model_util_unittest.cc
index b484cd8..5364bf2 100644
--- a/components/omnibox/browser/location_bar_model_util_unittest.cc
+++ b/components/omnibox/browser/location_bar_model_util_unittest.cc
@@ -37,9 +37,5 @@
 TEST(LocationBarModelUtilTest, GetSecurityVectorIconWithWarningLevel) {
   const gfx::VectorIcon& icon = location_bar_model::GetSecurityVectorIcon(
       security_state::SecurityLevel::WARNING);
-  if (security_state::ShouldShowDangerTriangleForWarningLevel()) {
-    EXPECT_EQ(icon.name, omnibox::kNotSecureWarningIcon.name);
-  } else {
-    EXPECT_EQ(icon.name, omnibox::kHttpIcon.name);
-  }
+  EXPECT_EQ(icon.name, omnibox::kNotSecureWarningIcon.name);
 }
diff --git a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoConnectionController.java b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoConnectionController.java
index 7aa99ea..60deac2 100644
--- a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoConnectionController.java
+++ b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoConnectionController.java
@@ -60,13 +60,12 @@
         mInfoView.onDismiss();
     }
 
-    private static @ColorRes int getSecurityIconColor(
-            @ConnectionSecurityLevel int securityLevel, boolean showDangerTriangleForWarningLevel) {
+    private static @ColorRes int getSecurityIconColor(@ConnectionSecurityLevel int securityLevel) {
         switch (securityLevel) {
             case ConnectionSecurityLevel.DANGEROUS:
                 return R.color.default_text_color_error;
             case ConnectionSecurityLevel.WARNING:
-                return showDangerTriangleForWarningLevel ? R.color.default_text_color_error : 0;
+                return R.color.default_text_color_error;
             case ConnectionSecurityLevel.NONE:
             case ConnectionSecurityLevel.SECURE_WITH_POLICY_INSTALLED_CERT:
             case ConnectionSecurityLevel.SECURE:
@@ -84,13 +83,10 @@
         rowParams.subtitle = params.message;
         rowParams.visible = rowParams.title != null || rowParams.subtitle != null;
         int securityLevel = SecurityStateModel.getSecurityLevelForWebContents(mWebContents);
-        boolean showTriangleForWarning =
-                SecurityStateModel.shouldShowDangerTriangleForWarningLevel();
-        rowParams.iconResId =
-                SecurityStatusIcon.getSecurityIconResource(securityLevel, showTriangleForWarning,
-                        /*isSmallDevice=*/false,
-                        /*skipIconForNeutralState=*/false);
-        rowParams.iconTint = getSecurityIconColor(securityLevel, showTriangleForWarning);
+        rowParams.iconResId = SecurityStatusIcon.getSecurityIconResource(securityLevel,
+                /*isSmallDevice=*/false,
+                /*skipIconForNeutralState=*/false);
+        rowParams.iconTint = getSecurityIconColor(securityLevel);
         if (params.clickCallback != null) rowParams.clickCallback = this::launchSubpage;
         mRowView.setParams(rowParams);
     }
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestService.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestService.java
index 9d06afa3..bc66bd4 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestService.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestService.java
@@ -743,20 +743,10 @@
 
         mIsFinishedQueryingPaymentApps = true;
 
-        if (disconnectIfNoPaymentMethodsSupported(mBrowserPaymentRequest.hasAvailableApps())) {
-            return;
-        }
-
         // Always return false when can make payment is disabled.
         mHasEnrolledInstrument &= mDelegate.prefsCanMakePayment();
 
-        if (mIsCanMakePaymentResponsePending) {
-            respondCanMakePaymentQuery();
-        }
-
-        if (mIsHasEnrolledInstrumentResponsePending) {
-            respondHasEnrolledInstrumentQuery();
-        }
+        if (mIsShowCalled && disconnectIfNoPaymentMethodsSupported()) return;
 
         mBrowserPaymentRequest.notifyPaymentUiOfPendingApps(mPendingApps);
         mPendingApps.clear();
@@ -774,6 +764,14 @@
             onShowFailed(error);
             return;
         }
+
+        if (mIsCanMakePaymentResponsePending) {
+            respondCanMakePaymentQuery();
+        }
+
+        if (mIsHasEnrolledInstrumentResponsePending) {
+            respondHasEnrolledInstrumentQuery();
+        }
     }
 
     private void onShowFailed(String error) {
@@ -790,12 +788,11 @@
 
     /**
      * If no payment methods are supported, disconnect from the client and return true.
-     * @param hasAvailableApps Whether any payment app is available.
      * @return Whether client has been disconnected.
      */
-    private boolean disconnectIfNoPaymentMethodsSupported(boolean hasAvailableApps) {
-        if (!mIsFinishedQueryingPaymentApps || !mIsShowCalled) return false;
-        if (!mCanMakePayment || (mPendingApps.isEmpty() && !hasAvailableApps)) {
+    private boolean disconnectIfNoPaymentMethodsSupported() {
+        if (!mCanMakePayment
+                || (mPendingApps.isEmpty() && !mBrowserPaymentRequest.hasAvailableApps())) {
             // All factories have responded, but none of them have apps. It's possible to add credit
             // cards, but the merchant does not support them either. The payment request must be
             // rejected.
@@ -1025,10 +1022,9 @@
         mIsShowWaitingForUpdatedDetails = waitForUpdatedDetails;
 
         mJourneyLogger.setTriggerTime();
-        if (disconnectIfNoPaymentMethodsSupported(mBrowserPaymentRequest.hasAvailableApps())) {
-            return;
-        }
+
         if (mIsFinishedQueryingPaymentApps) {
+            if (disconnectIfNoPaymentMethodsSupported()) return;
             String error = mBrowserPaymentRequest.showAppSelector(mIsShowWaitingForUpdatedDetails,
                     mSpec.getRawTotal(), mSpec.getPaymentOptions(), mIsUserGestureShow);
             if (error != null) {
diff --git a/components/printing/renderer/print_render_frame_helper.cc b/components/printing/renderer/print_render_frame_helper.cc
index 94be8ef..a48331f 100644
--- a/components/printing/renderer/print_render_frame_helper.cc
+++ b/components/printing/renderer/print_render_frame_helper.cc
@@ -2202,6 +2202,14 @@
   bool canceled = false;
   GetPrintManagerHost()->UpdatePrintSettings(cookie, job_settings->Clone(),
                                              &settings, &canceled);
+
+  // If mojom::PrintManagerHost is disconnected in the browser after calling
+  // UpdatePrintSettings(), |settings| could be null.
+  if (!settings) {
+    print_preview_context_.set_error(PREVIEW_ERROR_EMPTY_PRINTER_SETTINGS);
+    return false;
+  }
+
   if (canceled) {
     notify_browser_of_print_failure_ = false;
     return false;
diff --git a/components/printing/renderer/print_render_frame_helper.h b/components/printing/renderer/print_render_frame_helper.h
index 78d76aa..a874a18 100644
--- a/components/printing/renderer/print_render_frame_helper.h
+++ b/components/printing/renderer/print_render_frame_helper.h
@@ -187,6 +187,7 @@
     PREVIEW_ERROR_PAGE_RENDERED_WITHOUT_METAFILE_DEPRECATED = 6,
     PREVIEW_ERROR_INVALID_PRINTER_SETTINGS = 7,
     PREVIEW_ERROR_METAFILE_CAPTURE_FAILED_DEPRECATED = 8,
+    PREVIEW_ERROR_EMPTY_PRINTER_SETTINGS = 9,
     PREVIEW_ERROR_LAST_ENUM  // Always last.
   };
 
diff --git a/components/safe_browsing/content/password_protection/password_protection_request.cc b/components/safe_browsing/content/password_protection/password_protection_request.cc
index aa728ce..e13229c 100644
--- a/components/safe_browsing/content/password_protection/password_protection_request.cc
+++ b/components/safe_browsing/content/password_protection/password_protection_request.cc
@@ -5,43 +5,37 @@
 #include "components/safe_browsing/content/password_protection/password_protection_request.h"
 
 #include <cstddef>
-#include <memory>
 
 #include "base/bind.h"
 #include "base/containers/flat_set.h"
-#include "base/memory/weak_ptr.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/thread_pool.h"
-#include "base/time/time.h"
-#include "components/password_manager/core/browser/password_manager_metrics_util.h"
-#include "components/password_manager/core/browser/password_reuse_detector.h"
-#include "components/safe_browsing/content/common/safe_browsing.mojom.h"
 #include "components/safe_browsing/content/password_protection/password_protection_navigation_throttle.h"
 #include "components/safe_browsing/content/web_ui/safe_browsing_ui.h"
 #include "components/safe_browsing/core/common/thread_utils.h"
-#include "components/safe_browsing/core/common/visual_utils.h"
 #include "components/safe_browsing/core/db/allowlist_checker_client.h"
+#include "components/safe_browsing/core/db/database_manager.h"
 #include "components/safe_browsing/core/features.h"
-#include "components/safe_browsing/core/password_protection/metrics_util.h"
-#include "components/safe_browsing/core/proto/csd.pb.h"
 #include "components/url_formatter/url_formatter.h"
-#include "components/zoom/zoom_controller.h"
 #include "content/public/browser/browser_task_traits.h"
-#include "content/public/browser/render_widget_host_view.h"
-#include "content/public/browser/web_contents.h"
+#include "content/public/browser/navigation_throttle.h"
 #include "net/base/escape.h"
 #include "net/base/load_flags.h"
-#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
 #include "net/http/http_status_code.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
 #include "services/network/public/cpp/simple_url_loader.h"
-#include "services/service_manager/public/cpp/interface_provider.h"
 #include "url/gurl.h"
-#include "url/origin.h"
 
-using content::BrowserThread;
-using content::WebContents;
+#if BUILDFLAG(SAFE_BROWSING_AVAILABLE) || BUILDFLAG(FULL_SAFE_BROWSING)
+#include "content/public/browser/web_contents.h"
+#endif  // BUILDFLAG(SAFE_BROWSING_AVAILABLE) || BUILDFLAG(FULL_SAFE_BROWSING)
+
+#if BUILDFLAG(FULL_SAFE_BROWSING)
+#include "components/safe_browsing/core/common/visual_utils.h"
+#include "components/zoom/zoom_controller.h"
+#include "content/public/browser/render_widget_host_view.h"
+#endif  // BUILDFLAG(FULL_SAFE_BROWSING)
 
 namespace safe_browsing {
 
@@ -57,7 +51,7 @@
 #if BUILDFLAG(SAFE_BROWSING_AVAILABLE)
 // The maximum time to wait for DOM features to be collected, in milliseconds.
 const int kDomFeatureTimeoutMs = 3000;
-#endif
+#endif  // BUILDFLAG(SAFE_BROWSING_AVAILABLE)
 
 #if BUILDFLAG(FULL_SAFE_BROWSING)
 // Parameters chosen to ensure privacy is preserved by visual features.
@@ -73,7 +67,7 @@
   visual_utils::GetBlurredImage(screenshot, features->mutable_image());
   return features;
 }
-#endif
+#endif  // BUILDFLAG(FULL_SAFE_BROWSING)
 
 std::vector<std::string> GetMatchingDomains(
     const std::vector<password_manager::MatchingReusedCredential>&
@@ -102,13 +96,13 @@
 #else
   return base::FeatureList::IsEnabled(
       safe_browsing::kClientSideDetectionForAndroid);
-#endif
+#endif  // BUILDFLAG(FULL_SAFE_BROWSING)
 }
 
 }  // namespace
 
 PasswordProtectionRequest::PasswordProtectionRequest(
-    WebContents* web_contents,
+    content::WebContents* web_contents,
     const GURL& main_frame_url,
     const GURL& password_form_action,
     const GURL& password_form_frame_url,
@@ -281,7 +275,7 @@
     request_proto_->set_content_area_height(content_area_size.height());
     request_proto_->set_content_area_width(content_area_size.width());
   }
-#endif
+#endif  // BUILDFLAG(FULL_SAFE_BROWSING)
 
   switch (trigger_type_) {
     case LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE: {
@@ -477,7 +471,7 @@
 
   SendRequest();
 }
-#endif
+#endif  // BUILDFLAG(FULL_SAFE_BROWSING)
 
 void PasswordProtectionRequest::SendRequest() {
   DCHECK(CurrentlyOnThread(ThreadID::UI));
diff --git a/components/safe_browsing/content/password_protection/password_protection_request.h b/components/safe_browsing/content/password_protection/password_protection_request.h
index 03dcaf7b..7ae11f8 100644
--- a/components/safe_browsing/content/password_protection/password_protection_request.h
+++ b/components/safe_browsing/content/password_protection/password_protection_request.h
@@ -5,23 +5,32 @@
 #ifndef COMPONENTS_SAFE_BROWSING_CONTENT_PASSWORD_PROTECTION_PASSWORD_PROTECTION_REQUEST_H_
 #define COMPONENTS_SAFE_BROWSING_CONTENT_PASSWORD_PROTECTION_PASSWORD_PROTECTION_REQUEST_H_
 
+#include <memory>
+#include <string>
 #include <vector>
 
-#include "base/macros.h"
 #include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
+#include "base/sequenced_task_runner_helpers.h"
 #include "base/task/cancelable_task_tracker.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "components/password_manager/core/browser/password_manager_metrics_util.h"
 #include "components/password_manager/core/browser/password_reuse_detector.h"
 #include "components/safe_browsing/buildflags.h"
-#include "components/safe_browsing/content/common/safe_browsing.mojom.h"
 #include "components/safe_browsing/content/password_protection/password_protection_service.h"
 #include "components/safe_browsing/core/password_protection/metrics_util.h"
 #include "components/safe_browsing/core/password_protection/request_canceler.h"
 #include "components/safe_browsing/core/proto/csd.pb.h"
+
+#if BUILDFLAG(SAFE_BROWSING_AVAILABLE)
+#include "components/safe_browsing/content/common/safe_browsing.mojom.h"
 #include "mojo/public/cpp/bindings/remote.h"
+#endif  // BUILDFLAG(SAFE_BROWSING_AVAILABLE)
+
+#if BUILDFLAG(FULL_SAFE_BROWSING)
 #include "third_party/skia/include/core/SkBitmap.h"
+#endif  // BUILDFLAG(FULL_SAFE_BROWSING)
 
 #if defined(OS_IOS)
 // TODO(crbug.com/1147967): Enable in iOS once this file is moved to /core.
@@ -35,6 +44,10 @@
 class SimpleURLLoader;
 }
 
+namespace content {
+class WebContents;
+}
+
 namespace safe_browsing {
 
 class PasswordProtectionNavigationThrottle;
@@ -68,9 +81,9 @@
 //     |        | On request timeout, cancel request.
 //     |        | On deletion of |password_protection_service_|, cancel request.
 class PasswordProtectionRequest
-    : public base::RefCountedThreadSafe<PasswordProtectionRequest,
-                                        DeleteOnUIThread>,
-      public CancelableRequest {
+    : public CancelableRequest,
+      public base::RefCountedThreadSafe<PasswordProtectionRequest,
+                                        DeleteOnUIThread> {
  public:
   PasswordProtectionRequest(
       content::WebContents* web_contents,
@@ -87,6 +100,11 @@
       PasswordProtectionService* pps,
       int request_timeout_in_ms);
 
+  // Not copyable or movable
+  PasswordProtectionRequest(const PasswordProtectionRequest&) = delete;
+  PasswordProtectionRequest& operator=(const PasswordProtectionRequest&) =
+      delete;
+
   base::WeakPtr<PasswordProtectionRequest> GetWeakPtr() {
     return weakptr_factory_.GetWeakPtr();
   }
@@ -192,7 +210,7 @@
   // If appropriate, collects visual features, otherwise continues on to sending
   // the request.
   void MaybeCollectVisualFeatures();
-#endif
+#endif  // BUILDFLAG(SAFE_BROWSING_AVAILABLE)
 
 #if BUILDFLAG(FULL_SAFE_BROWSING)
   // Collects visual features from the current login page.
@@ -204,7 +222,7 @@
   // Called when the visual feature extraction is complete.
   void OnVisualFeatureCollectionDone(
       std::unique_ptr<VisualFeatures> visual_features);
-#endif
+#endif  // BUILDFLAG(FULL_SAFE_BROWSING)
 
   // Initiates network request to Safe Browsing backend.
   void SendRequest();
@@ -304,13 +322,12 @@
   // Whether the DOM features collection is finished, either by timeout or by
   // successfully gathering the features.
   bool dom_features_collection_complete_;
-#endif
+#endif  // BUILDFLAG(SAFE_BROWSING_AVAILABLE)
 
   // Cancels the request when it is no longer valid.
   std::unique_ptr<RequestCanceler> request_canceler_;
 
   base::WeakPtrFactory<PasswordProtectionRequest> weakptr_factory_{this};
-  DISALLOW_COPY_AND_ASSIGN(PasswordProtectionRequest);
 };
 
 }  // namespace safe_browsing
diff --git a/components/security_state/content/android/java/src/org/chromium/components/security_state/SecurityStateModel.java b/components/security_state/content/android/java/src/org/chromium/components/security_state/SecurityStateModel.java
index 93e67b29..c948eb2 100644
--- a/components/security_state/content/android/java/src/org/chromium/components/security_state/SecurityStateModel.java
+++ b/components/security_state/content/android/java/src/org/chromium/components/security_state/SecurityStateModel.java
@@ -30,23 +30,11 @@
         return getSecurityLevelForWebContents(webContents) == ConnectionSecurityLevel.DANGEROUS;
     }
 
-    /**
-     * Returns whether to use a danger icon instead of an info icon in the URL bar for the WARNING
-     * security level.
-     *
-     * @return Whether to downgrade the info icon to a danger triangle for the WARNING security
-     *         level.
-     */
-    public static boolean shouldShowDangerTriangleForWarningLevel() {
-        return SecurityStateModelJni.get().shouldShowDangerTriangleForWarningLevel();
-    }
-
     private SecurityStateModel() {}
 
     @NativeMethods
     @VisibleForTesting
     public interface Natives {
         int getSecurityLevelForWebContents(WebContents webContents);
-        boolean shouldShowDangerTriangleForWarningLevel();
     }
 }
diff --git a/components/security_state/content/android/security_state_model_android.cc b/components/security_state/content/android/security_state_model_android.cc
index 96999ff..df11000 100644
--- a/components/security_state/content/android/security_state_model_android.cc
+++ b/components/security_state/content/android/security_state_model_android.cc
@@ -39,9 +39,3 @@
       *security_state::GetVisibleSecurityState(web_contents),
       /* used_policy_installed_certificate= */ false);
 }
-
-// static
-jboolean JNI_SecurityStateModel_ShouldShowDangerTriangleForWarningLevel(
-    JNIEnv* env) {
-  return security_state::ShouldShowDangerTriangleForWarningLevel();
-}
diff --git a/components/security_state/content/content_utils.cc b/components/security_state/content/content_utils.cc
index e0bc23c..9081939 100644
--- a/components/security_state/content/content_utils.cc
+++ b/components/security_state/content/content_utils.cc
@@ -45,9 +45,7 @@
     case security_state::NONE:
       return blink::SecurityStyle::kNeutral;
     case security_state::WARNING:
-      if (security_state::ShouldShowDangerTriangleForWarningLevel())
-        return blink::SecurityStyle::kInsecure;
-      return blink::SecurityStyle::kNeutral;
+      return blink::SecurityStyle::kInsecure;
     case security_state::SECURE_WITH_POLICY_INSTALLED_CERT:
     case security_state::SECURE:
       return blink::SecurityStyle::kSecure;
diff --git a/components/security_state/core/security_state.cc b/components/security_state/core/security_state.cc
index 47328cc..05f2b8fa 100644
--- a/components/security_state/core/security_state.cc
+++ b/components/security_state/core/security_state.cc
@@ -322,12 +322,6 @@
           net::CERT_STATUS_SHA1_SIGNATURE_PRESENT);
 }
 
-// TODO(crbug.com/1015626): Clean this up once the experiment is fully
-// launched.
-bool ShouldShowDangerTriangleForWarningLevel() {
-  return true;
-}
-
 bool IsSafetyTipUIFeatureEnabled() {
   return base::FeatureList::IsEnabled(features::kSafetyTipUI) ||
          base::FeatureList::IsEnabled(
diff --git a/components/security_state/core/security_state.h b/components/security_state/core/security_state.h
index d24f20a..10e52674 100644
--- a/components/security_state/core/security_state.h
+++ b/components/security_state/core/security_state.h
@@ -265,10 +265,6 @@
 
 bool IsSHA1InChain(const VisibleSecurityState& visible_security_state);
 
-// Returns whether the WARNING state should downgrade the security icon from
-// info to danger triangle as part of an experiment (crbug.com/997972).
-bool ShouldShowDangerTriangleForWarningLevel();
-
 // Returns true if Safety Tip UI should be shown because a relevant field trial
 // is enabled.
 bool IsSafetyTipUIFeatureEnabled();
diff --git a/components/services/language_detection/language_detection_service_impl.cc b/components/services/language_detection/language_detection_service_impl.cc
index 6bf162a..dda56d9 100644
--- a/components/services/language_detection/language_detection_service_impl.cc
+++ b/components/services/language_detection/language_detection_service_impl.cc
@@ -6,6 +6,7 @@
 
 #include <string>
 
+#include "base/strings/utf_string_conversions.h"
 #include "components/translate/core/language_detection/language_detection_util.h"
 
 namespace language_detection {
@@ -20,8 +21,8 @@
     const ::base::string16& text,
     DetermineLanguageCallback callback) {
   bool is_cld_reliable = false;
-  std::string cld_language =
-      translate::DetermineTextLanguage(text, &is_cld_reliable);
+  std::string cld_language = translate::DetermineTextLanguage(
+      base::UTF16ToUTF8(text), &is_cld_reliable);
   std::move(callback).Run(cld_language, is_cld_reliable);
 }
 
diff --git a/components/services/storage/dom_storage/local_storage_impl.cc b/components/services/storage/dom_storage/local_storage_impl.cc
index ad3380f..984464f 100644
--- a/components/services/storage/dom_storage/local_storage_impl.cc
+++ b/components/services/storage/dom_storage/local_storage_impl.cc
@@ -796,6 +796,12 @@
   std::move(callback).Run();
 }
 
+void LocalStorageImpl::PurgeAllStorageAreas() {
+  for (const auto& it : areas_)
+    it.second->storage_area()->CancelAllPendingRequests();
+  areas_.clear();
+}
+
 void LocalStorageImpl::InitiateConnection(bool in_memory_only) {
   if (connection_state_ == CONNECTION_SHUTDOWN)
     return;
@@ -922,9 +928,7 @@
 
   // We're about to set database_ to null, so delete the StorageAreaImpls
   // that might still be using the old database.
-  for (const auto& it : areas_)
-    it.second->storage_area()->CancelAllPendingRequests();
-  areas_.clear();
+  PurgeAllStorageAreas();
 
   // Reset state to be in process of connecting. This will cause requests for
   // StorageAreas to be queued until the connection is complete.
@@ -1100,6 +1104,7 @@
   // Flush any final tasks on the DB task runner before invoking the callback.
   leveldb_task_runner_->PostTaskAndReply(
       FROM_HERE, base::DoNothing(), std::move(shutdown_complete_callback_));
+  PurgeAllStorageAreas();
   database_.reset();
 }
 
diff --git a/components/services/storage/dom_storage/local_storage_impl.h b/components/services/storage/dom_storage/local_storage_impl.h
index ac49957..aa941b4 100644
--- a/components/services/storage/dom_storage/local_storage_impl.h
+++ b/components/services/storage/dom_storage/local_storage_impl.h
@@ -112,6 +112,10 @@
   // Initiates connecting to the database if no connection is in progres yet.
   void RunWhenConnected(base::OnceClosure callback);
 
+  // StorageAreas held by this LocalStorageImpl retain an unmanaged reference to
+  // `database_`. This deletes them and is used any time `database_` is reset.
+  void PurgeAllStorageAreas();
+
   // Part of our asynchronous directory opening called from RunWhenConnected().
   void InitiateConnection(bool in_memory_only = false);
   void OnDatabaseOpened(leveldb::Status status);
diff --git a/components/services/storage/public/mojom/service_worker_storage_control.mojom b/components/services/storage/public/mojom/service_worker_storage_control.mojom
index 86223dd61..3bae1f50 100644
--- a/components/services/storage/public/mojom/service_worker_storage_control.mojom
+++ b/components/services/storage/public/mojom/service_worker_storage_control.mojom
@@ -288,7 +288,8 @@
 
   // Applies changes to data retention policy which are relevant at shutdown.
   // This is analogous to LocalStorageControl::ApplyPolicyUpdates.
-  ApplyPolicyUpdates(array<LocalStoragePolicyUpdate> policy_updates);
+  ApplyPolicyUpdates(array<LocalStoragePolicyUpdate> policy_updates) =>
+      (ServiceWorkerDatabaseStatus status);
 
   // Get resource ids which are scheduled to purge.
   GetPurgingResourceIdsForTest() => (ServiceWorkerDatabaseStatus status,
diff --git a/components/signin/public/base/signin_metrics.cc b/components/signin/public/base/signin_metrics.cc
index 493cc443..adcfc19d 100644
--- a/components/signin/public/base/signin_metrics.cc
+++ b/components/signin/public/base/signin_metrics.cc
@@ -123,6 +123,12 @@
       base::RecordAction(
           base::UserMetricsAction("Signin_Signin_FromGoogleServicesSettings"));
       break;
+    case AccessPoint::ACCESS_POINT_KALEIDOSCOPE:
+      NOTREACHED() << "Access point " << static_cast<int>(access_point)
+                   << " is only used to trigger non-sync sign-in and this"
+                   << " action should only be triggered for sync-enabled"
+                   << " sign-ins.";
+      break;
     case AccessPoint::ACCESS_POINT_SYNC_ERROR_CARD:
     case AccessPoint::ACCESS_POINT_FORCED_SIGNIN:
     case AccessPoint::ACCESS_POINT_ACCOUNT_RENAMED:
@@ -207,6 +213,7 @@
     case AccessPoint::ACCESS_POINT_ACCOUNT_RENAMED:
     case AccessPoint::ACCESS_POINT_WEB_SIGNIN:
     case AccessPoint::ACCESS_POINT_SAFETY_CHECK:
+    case AccessPoint::ACCESS_POINT_KALEIDOSCOPE:
       NOTREACHED() << "Signin_SigninWithDefault_From* user actions"
                    << " are not recorded for access_point "
                    << static_cast<int>(access_point)
@@ -286,6 +293,7 @@
     case AccessPoint::ACCESS_POINT_ACCOUNT_RENAMED:
     case AccessPoint::ACCESS_POINT_WEB_SIGNIN:
     case AccessPoint::ACCESS_POINT_SAFETY_CHECK:
+    case AccessPoint::ACCESS_POINT_KALEIDOSCOPE:
       NOTREACHED() << "Signin_SigninNotDefault_From* user actions"
                    << " are not recorded for access point "
                    << static_cast<int>(access_point)
@@ -369,6 +377,7 @@
     case AccessPoint::ACCESS_POINT_ACCOUNT_RENAMED:
     case AccessPoint::ACCESS_POINT_WEB_SIGNIN:
     case AccessPoint::ACCESS_POINT_SAFETY_CHECK:
+    case AccessPoint::ACCESS_POINT_KALEIDOSCOPE:
       // These access points do not support personalized sign-in promos, so
       // |Signin_SigninNewAccountNoExistingAccount_From*| user actions should
       // not be recorded for them. Note: To avoid bloating the sign-in APIs, the
@@ -455,6 +464,7 @@
     case AccessPoint::ACCESS_POINT_ACCOUNT_RENAMED:
     case AccessPoint::ACCESS_POINT_WEB_SIGNIN:
     case AccessPoint::ACCESS_POINT_SAFETY_CHECK:
+    case AccessPoint::ACCESS_POINT_KALEIDOSCOPE:
       // These access points do not support personalized sign-in promos, so
       // |Signin_SigninNewAccountExistingAccount_From*| user actions should not
       // be recorded for them. Note: To avoid bloating the sign-in APIs, the
@@ -879,6 +889,10 @@
       base::RecordAction(base::UserMetricsAction(
           "Signin_Impression_FromGoogleServicesSettings"));
       break;
+    case AccessPoint::ACCESS_POINT_KALEIDOSCOPE:
+      base::RecordAction(
+          base::UserMetricsAction("Signin_Impression_FromKaleidoscope"));
+      break;
     case AccessPoint::ACCESS_POINT_CONTENT_AREA:
     case AccessPoint::ACCESS_POINT_EXTENSIONS:
     case AccessPoint::ACCESS_POINT_SUPERVISED_USER:
@@ -1024,6 +1038,7 @@
     case AccessPoint::ACCESS_POINT_ACCOUNT_RENAMED:
     case AccessPoint::ACCESS_POINT_WEB_SIGNIN:
     case AccessPoint::ACCESS_POINT_SAFETY_CHECK:
+    case AccessPoint::ACCESS_POINT_KALEIDOSCOPE:
       NOTREACHED() << "Signin_Impression{With|WithNo}Account_From* user actions"
                    << " are not recorded for access point "
                    << static_cast<int>(access_point)
diff --git a/components/signin/public/base/signin_metrics.h b/components/signin/public/base/signin_metrics.h
index 88793956..072bd9c 100644
--- a/components/signin/public/base/signin_metrics.h
+++ b/components/signin/public/base/signin_metrics.h
@@ -171,6 +171,7 @@
   ACCESS_POINT_ACCOUNT_RENAMED = 30,
   ACCESS_POINT_WEB_SIGNIN = 31,
   ACCESS_POINT_SAFETY_CHECK = 32,
+  ACCESS_POINT_KALEIDOSCOPE = 33,
   ACCESS_POINT_MAX,  // This must be last.
 };
 
diff --git a/components/signin/public/base/signin_metrics_unittest.cc b/components/signin/public/base/signin_metrics_unittest.cc
index 1bc0b6d3..7ead308 100644
--- a/components/signin/public/base/signin_metrics_unittest.cc
+++ b/components/signin/public/base/signin_metrics_unittest.cc
@@ -147,6 +147,8 @@
         return "WebSignIn";
       case AccessPoint::ACCESS_POINT_SAFETY_CHECK:
         return "SafetyCheck";
+      case AccessPoint::ACCESS_POINT_KALEIDOSCOPE:
+        return "Kaleidoscope";
       case AccessPoint::ACCESS_POINT_MAX:
         NOTREACHED();
         return "";
diff --git a/components/subresource_filter/OWNERS b/components/subresource_filter/OWNERS
index ee31bdd..090edda5 100644
--- a/components/subresource_filter/OWNERS
+++ b/components/subresource_filter/OWNERS
@@ -1,5 +1,4 @@
 csharrison@chromium.org
-ericrobinson@chromium.org
 jkarlin@chromium.org
 
 # COMPONENT: UI>Browser>AdFilter
diff --git a/components/translate/core/language_detection/language_detection_util.cc b/components/translate/core/language_detection/language_detection_util.cc
index d80136c..6061e53 100644
--- a/components/translate/core/language_detection/language_detection_util.cc
+++ b/components/translate/core/language_detection/language_detection_util.cc
@@ -79,18 +79,52 @@
                           base::CompareCase::INSENSITIVE_ASCII);
 }
 
+// Given a detected language and whether that detection is reliable, returns the
+// ISO 639 language code of |utf8_text|. Returns
+// |translate::kUnknownLanguageCode| for unreliable, "unknown", and xx-Latn
+// predictions that are currently not supported.
+std::string FilterDetectedLanguage(const std::string& utf8_text,
+                                   const std::string& detected_language,
+                                   bool is_detection_reliable) {
+  // Ignore unreliable, "unknown", and xx-Latn predictions that are currently
+  // not supported.
+  if (!is_detection_reliable)
+    return translate::kUnknownLanguageCode;
+  if (detected_language == "bg-Latn" || detected_language == "el-Latn" ||
+      detected_language == "ja-Latn" || detected_language == "ru-Latn" ||
+      detected_language == "zh-Latn" ||
+      detected_language == chrome_lang_id::NNetLanguageIdentifier::kUnknown) {
+    return translate::kUnknownLanguageCode;
+  }
+
+  if (detected_language == "zh") {
+    // If prediction is "zh" (Chinese), then we need to determine whether the
+    // text is zh-Hant (Chinese Traditional) or zh-Hans (Chinese Simplified).
+    translate::ChineseScriptClassifier zh_classifier;
+
+    // The Classify function returns either "zh-Hant" or "zh-Hans".
+    // Convert to the old-style language codes used by the Translate API.
+    const std::string zh_classification = zh_classifier.Classify(utf8_text);
+    if (zh_classification == "zh-Hant")
+      return "zh-TW";
+    if (zh_classification == "zh-Hans")
+      return "zh-CN";
+    return translate::kUnknownLanguageCode;
+  }
+  // The detection is reliable and none of the cases that are not handled by the
+  // language detection model.
+  return detected_language;
+}
+
 }  // namespace
 
 namespace translate {
 
-// Returns the ISO 639 language code of the specified |text|, or 'unknown' if it
-// failed.
-// |is_cld_reliable| will be set as true if CLD says the detection is reliable.
-std::string DetermineTextLanguage(const base::string16& text,
+// Returns the ISO 639 language code of the specified |utf8_text|, or 'unknown'
+// if it failed. |is_cld_reliable| will be set as true if CLD says the detection
+// is reliable.
+std::string DetermineTextLanguage(const std::string& utf8_text,
                                   bool* is_cld_reliable) {
-  std::string language = translate::kUnknownLanguageCode;
-  const std::string utf8_text(base::UTF16ToUTF8(text));
-
   // Make a prediction.
   base::TimeTicks lang_id_start = base::TimeTicks::Now();
   chrome_lang_id::NNetLanguageIdentifier lang_id;
@@ -98,55 +132,24 @@
       lang_id.FindTopNMostFreqLangs(utf8_text, /*num_langs=*/1).at(0);
   base::UmaHistogramTimes("Translate.CLD3.TopLanguageEvaluationDuration",
                           base::TimeTicks::Now() - lang_id_start);
-  const bool prediction_reliable = lang_id_result.is_reliable;
-  const std::string& predicted_language = lang_id_result.language;
+  const bool is_detection_reliable = lang_id_result.is_reliable;
+  const std::string& detected_language = lang_id_result.language;
 
   // Update histograms.
   const base::HistogramBase::Sample pred_lang_hash =
       static_cast<base::HistogramBase::Sample>(
-          base::HashMetricName(predicted_language));
+          base::HashMetricName(detected_language));
   base::UmaHistogramSparse("Translate.CLD3.LanguageDetected", pred_lang_hash);
-  if (predicted_language != chrome_lang_id::NNetLanguageIdentifier::kUnknown) {
+  if (detected_language != chrome_lang_id::NNetLanguageIdentifier::kUnknown) {
     UMA_HISTOGRAM_PERCENTAGE("Translate.CLD3.LanguagePercentage",
                              static_cast<int>(100 * lang_id_result.proportion));
   }
 
   if (is_cld_reliable != nullptr) {
-    *is_cld_reliable = prediction_reliable;
+    *is_cld_reliable = is_detection_reliable;
   }
-
-  // Ignore unreliable, "unknown", and xx-Latn predictions that are currently
-  // not supported.
-  if (prediction_reliable &&
-      predicted_language != "bg-Latn" &&
-      predicted_language != "el-Latn" &&
-      predicted_language != "ja-Latn" &&
-      predicted_language != "ru-Latn" &&
-      predicted_language != "zh-Latn" &&
-      predicted_language !=
-          chrome_lang_id::NNetLanguageIdentifier::kUnknown) {
-    if (predicted_language != "zh") {
-      language = predicted_language;
-    } else {
-      // If prediction is "zh" (Chinese), then we need to determine whether the
-      // text is zh-Hant (Chinese Traditional) or zh-Hans (Chinese Simplified).
-      translate::ChineseScriptClassifier zh_classifier;
-
-      // The Classify function returns either "zh-Hant" or "zh-Hans".
-      // Convert to the old-style language codes used by the Translate API.
-      const std::string zh_classification = zh_classifier.Classify(utf8_text);
-      if (zh_classification == "zh-Hant") {
-        language = "zh-TW";
-      } else if (zh_classification == "zh-Hans") {
-        language = "zh-CN";
-      } else {
-        language = translate::kUnknownLanguageCode;
-      }
-    }
-  }
-
-  VLOG(1) << "Detected language: " << language;
-  return language;
+  return FilterDetectedLanguage(utf8_text, detected_language,
+                                is_detection_reliable);
 }
 
 std::string DeterminePageLanguage(const std::string& code,
@@ -156,7 +159,8 @@
                                   bool* is_cld_reliable_p) {
   // First determine the language for the test contents.
   bool is_cld_reliable;
-  std::string cld_language = DetermineTextLanguage(contents, &is_cld_reliable);
+  const std::string utf8_text(base::UTF16ToUTF8(contents));
+  std::string cld_language = DetermineTextLanguage(utf8_text, &is_cld_reliable);
   if (cld_language_p != nullptr)
     *cld_language_p = cld_language;
   if (is_cld_reliable_p != nullptr)
diff --git a/components/translate/core/language_detection/language_detection_util.h b/components/translate/core/language_detection/language_detection_util.h
index d16ab4d..74e9246 100644
--- a/components/translate/core/language_detection/language_detection_util.h
+++ b/components/translate/core/language_detection/language_detection_util.h
@@ -11,10 +11,10 @@
 
 namespace translate {
 
-// Returns the ISO 639 language code of the specified |text|, or
+// Returns the ISO 639 language code of the specified |utf8_text|, or
 // |translate::kUnknownLanguageCode| if it failed. |is_cld_reliable| will be
 // set as true if CLD says the detection is reliable.
-std::string DetermineTextLanguage(const base::string16& text,
+std::string DetermineTextLanguage(const std::string& utf8_text,
                                   bool* is_cld_reliable);
 
 // Determines content page language from Content-Language code and contents.
diff --git a/content/BUILD.gn b/content/BUILD.gn
index 7eea6c1..30537118 100644
--- a/content/BUILD.gn
+++ b/content/BUILD.gn
@@ -118,8 +118,9 @@
     "content_resources.pak",
   ]
   deps = [
-    "//gpu/ipc/common:vulkan_interface_js",
+    "//gpu/ipc/common:vulkan_interface_webui_js",
     "//url/mojom:url_mojom_origin_js",
+    "//url/mojom:url_mojom_origin_webui_js",
   ]
 }
 
@@ -131,8 +132,8 @@
     "dev_ui_content_resources.pak",
   ]
   deps = [
-    "//content/browser/conversions:mojo_bindings_js",
-    "//content/browser/process_internals:mojo_bindings_js",
+    "//content/browser/conversions:mojo_bindings_webui_js",
+    "//content/browser/process_internals:mojo_bindings_webui_js",
   ]
 }
 
diff --git a/content/browser/accessibility/ax_platform_node_textrangeprovider_win_browsertest.cc b/content/browser/accessibility/ax_platform_node_textrangeprovider_win_browsertest.cc
index 76dbc6a2..1ab231a2 100644
--- a/content/browser/accessibility/ax_platform_node_textrangeprovider_win_browsertest.cc
+++ b/content/browser/accessibility/ax_platform_node_textrangeprovider_win_browsertest.cc
@@ -2114,13 +2114,12 @@
                                                 "Text in iframe");
 
   WaitForHitTestData(iframe_node->current_frame_host());
-  FrameTreeVisualizer visualizer;
   ASSERT_EQ(
       " Site A ------------ proxies for B\n"
       "   +--Site B ------- proxies for A\n"
       "Where A = http://a.com/\n"
       "      B = http://b.com/",
-      visualizer.DepictFrameTree(root));
+      DepictFrameTree(*root));
 
   auto* node = FindNode(ax::mojom::Role::kStaticText, "After frame");
   ASSERT_NE(nullptr, node);
diff --git a/content/browser/accessibility/hit_testing_browsertest.cc b/content/browser/accessibility/hit_testing_browsertest.cc
index e5e47c4..7128c58 100644
--- a/content/browser/accessibility/hit_testing_browsertest.cc
+++ b/content/browser/accessibility/hit_testing_browsertest.cc
@@ -471,13 +471,12 @@
   WaitForAccessibilityTreeToContainNodeWithName(shell()->web_contents(),
                                                 "rectF");
 
-  FrameTreeVisualizer visualizer;
   EXPECT_EQ(
       " Site A ------------ proxies for B\n"
       "   +--Site B ------- proxies for A\n"
       "Where A = http://a.com/\n"
       "      B = http://b.com/",
-      visualizer.DepictFrameTree(root));
+      DepictFrameTree(*root));
 
   // Before scrolling.
   {
diff --git a/content/browser/conversions/BUILD.gn b/content/browser/conversions/BUILD.gn
index 6d722613..4dd227e 100644
--- a/content/browser/conversions/BUILD.gn
+++ b/content/browser/conversions/BUILD.gn
@@ -7,4 +7,5 @@
 mojom("mojo_bindings") {
   sources = [ "conversion_internals.mojom" ]
   public_deps = [ "//url/mojom:url_mojom_origin" ]
+  webui_module_path = "/"
 }
diff --git a/content/browser/conversions/conversion_internals_ui.cc b/content/browser/conversions/conversion_internals_ui.cc
index 5bfe7e3..7a30675 100644
--- a/content/browser/conversions/conversion_internals_ui.cc
+++ b/content/browser/conversions/conversion_internals_ui.cc
@@ -25,7 +25,7 @@
   WebUIDataSource* source =
       WebUIDataSource::Create(kChromeUIConversionInternalsHost);
 
-  source->AddResourcePath("conversion_internals.mojom-lite.js",
+  source->AddResourcePath("conversion_internals.mojom-webui.js",
                           IDR_CONVERSION_INTERNALS_MOJOM_JS);
   source->AddResourcePath("conversion_internals.js",
                           IDR_CONVERSION_INTERNALS_JS);
diff --git a/content/browser/devtools/protocol/system_info_handler.cc b/content/browser/devtools/protocol/system_info_handler.cc
index e1dadce4..e901a6b 100644
--- a/content/browser/devtools/protocol/system_info_handler.cc
+++ b/content/browser/devtools/protocol/system_info_handler.cc
@@ -46,9 +46,11 @@
       .Build();
 }
 // Give the GPU process a few seconds to provide GPU info.
-// Linux Debug builds need more time -- see Issue 796437 and 1046598.
+// Linux and Mac Debug builds need more time -- see Issue 796437, 1046598, and
+// 1153667.
 // Windows builds need more time -- see Issue 873112 and 1004472.
-#if ((defined(OS_LINUX) || defined(OS_CHROMEOS)) && !defined(NDEBUG)) || \
+#if ((defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_MAC)) && \
+     !defined(NDEBUG)) ||                                              \
     defined(OS_WIN)
 const int kGPUInfoWatchdogTimeoutMs = 30000;
 #else
diff --git a/content/browser/gpu/gpu_internals_ui.cc b/content/browser/gpu/gpu_internals_ui.cc
index 12360e56..8c1a641 100644
--- a/content/browser/gpu/gpu_internals_ui.cc
+++ b/content/browser/gpu/gpu_internals_ui.cc
@@ -98,9 +98,14 @@
       "trusted-types jstemplate;");
 
   source->UseStringsJs();
+  source->AddResourcePath("browser_bridge.js", IDR_GPU_BROWSER_BRIDGE_JS);
   source->AddResourcePath("gpu_internals.js", IDR_GPU_INTERNALS_JS);
-  source->AddResourcePath("vulkan_info.mojom.js", IDR_VULKAN_INFO_MOJO_JS);
-  source->AddResourcePath("vulkan_types.mojom.js", IDR_VULKAN_TYPES_MOJO_JS);
+  source->AddResourcePath("info_view.js", IDR_GPU_INFO_VIEW_JS);
+  source->AddResourcePath("vulkan_info.js", IDR_GPU_VULKAN_INFO_JS);
+  source->AddResourcePath("vulkan_info.mojom-webui.js",
+                          IDR_VULKAN_INFO_MOJO_JS);
+  source->AddResourcePath("vulkan_types.mojom-webui.js",
+                          IDR_VULKAN_TYPES_MOJO_JS);
   source->SetDefaultResource(IDR_GPU_INTERNALS_HTML);
   return source;
 }
diff --git a/content/browser/gpu/gpu_process_host.cc b/content/browser/gpu/gpu_process_host.cc
index bcef78d..2879999 100644
--- a/content/browser/gpu/gpu_process_host.cc
+++ b/content/browser/gpu/gpu_process_host.cc
@@ -272,6 +272,9 @@
     switches::kVModule,
     switches::kUseAdapterLuid,
     switches::kWebViewDrawFunctorUsesVulkan,
+#if BUILDFLAG(ENABLE_PLATFORM_HEVC)
+    switches::kEnableClearHevcForTesting,
+#endif
 #if defined(OS_MAC)
     sandbox::policy::switches::kEnableSandboxLogging,
     switches::kDisableAVFoundationOverlays,
diff --git a/content/browser/isolated_origin_browsertest.cc b/content/browser/isolated_origin_browsertest.cc
index e402799..489c64c 100644
--- a/content/browser/isolated_origin_browsertest.cc
+++ b/content/browser/isolated_origin_browsertest.cc
@@ -4391,7 +4391,7 @@
       "Where A = http://127.0.0.1/\n"
       "      B = http://bar.com/\n"
       "      C = http://baz.com/",
-      FrameTreeVisualizer().DepictFrameTree(root));
+      DepictFrameTree(*root));
 
   // But none are isolated, so all should share the default process for their
   // BrowsingInstance.
@@ -4466,7 +4466,7 @@
       "Where A = http://foo.com/\n"
       "      B = http://isolated.foo.com/\n"
       "      C = http://bar.com/",
-      FrameTreeVisualizer().DepictFrameTree(root));
+      DepictFrameTree(*root));
 }
 
 // Navigate a frame into and out of an isolated origin. This should not
@@ -4518,7 +4518,7 @@
       "   +--Site B ------- proxies for A\n"
       "Where A = http://isolated.foo.com/\n"
       "      B = http://foo.com/",
-      FrameTreeVisualizer().DepictFrameTree(root));
+      DepictFrameTree(*root));
 }
 
 // Ensure a popup and its opener can go in the same process, even though
@@ -4561,15 +4561,14 @@
       "   +--Site A ------- proxies for B\n"
       "Where A = http://foo.com/\n"
       "      B = http://bar.com/",
-      FrameTreeVisualizer().DepictFrameTree(root));
+      DepictFrameTree(*root));
   EXPECT_EQ(
       " Site A ------------ proxies for B\n"
       "Where A = http://bar.com/\n"
       "      B = http://foo.com/",
-      FrameTreeVisualizer().DepictFrameTree(
-          static_cast<WebContentsImpl*>(new_shell->web_contents())
-              ->GetFrameTree()
-              ->root()));
+      DepictFrameTree(*static_cast<WebContentsImpl*>(new_shell->web_contents())
+                           ->GetFrameTree()
+                           ->root()));
 }
 
 class WildcardOriginIsolationTest : public IsolatedOriginTestBase {
@@ -4720,7 +4719,7 @@
       "      B = http://isolated.foo.com/\n"
       "      C = http://b.isolated.foo.com/\n"
       "      D = http://isolated.com/",
-      FrameTreeVisualizer().DepictFrameTree(root));
+      DepictFrameTree(*root));
 }
 
 }  // namespace content
diff --git a/content/browser/process_internals/BUILD.gn b/content/browser/process_internals/BUILD.gn
index 4ae242c6..8b13164 100644
--- a/content/browser/process_internals/BUILD.gn
+++ b/content/browser/process_internals/BUILD.gn
@@ -8,4 +8,5 @@
   sources = [ "process_internals.mojom" ]
 
   deps = [ "//url/mojom:url_mojom_gurl" ]
+  webui_module_path = "/"
 }
diff --git a/content/browser/process_internals/process_internals_ui.cc b/content/browser/process_internals/process_internals_ui.cc
index 81b74e3..aff81db 100644
--- a/content/browser/process_internals/process_internals_ui.cc
+++ b/content/browser/process_internals/process_internals_ui.cc
@@ -37,7 +37,7 @@
 
   source->AddResourcePath("process_internals.js", IDR_PROCESS_INTERNALS_JS);
   source->AddResourcePath("process_internals.css", IDR_PROCESS_INTERNALS_CSS);
-  source->AddResourcePath("process_internals.mojom-lite.js",
+  source->AddResourcePath("process_internals.mojom-webui.js",
                           IDR_PROCESS_INTERNALS_MOJO_JS);
   source->SetDefaultResource(IDR_PROCESS_INTERNALS_HTML);
   source->OverrideContentSecurityPolicy(
diff --git a/content/browser/renderer_host/frame_tree_browsertest.cc b/content/browser/renderer_host/frame_tree_browsertest.cc
index f92874c..435dcb69 100644
--- a/content/browser/renderer_host/frame_tree_browsertest.cc
+++ b/content/browser/renderer_host/frame_tree_browsertest.cc
@@ -307,7 +307,7 @@
   EXPECT_TRUE(NavigateToURL(
       shell(), embedded_test_server()->GetURL(
                    "a.com", "/cross_site_iframe_factory.html?a(b(a))")));
-  std::string reference_tree = FrameTreeVisualizer().DepictFrameTree(root);
+  std::string reference_tree = DepictFrameTree(*root);
 
   GURL main_url(embedded_test_server()->GetURL(
       "a.com", "/cross_site_iframe_factory.html?a(b(c))"));
@@ -345,7 +345,7 @@
   EXPECT_EQ(url::kHttpScheme, target->current_origin().scheme());
   EXPECT_EQ("This is blob content.",
             EvalJs(target, "document.body.children[0].innerHTML"));
-  EXPECT_EQ(reference_tree, FrameTreeVisualizer().DepictFrameTree(root));
+  EXPECT_EQ(reference_tree, DepictFrameTree(*root));
 }
 
 IN_PROC_BROWSER_TEST_F(FrameTreeBrowserTest, NavigateChildToAboutBlank) {
@@ -1298,7 +1298,7 @@
                                "Where A = %s\n"
                                "      B = http://b.is/",
                                kExpectedSiteURL.c_str()),
-            FrameTreeVisualizer().DepictFrameTree(root));
+            DepictFrameTree(*root));
 }
 
 }  // namespace content
diff --git a/content/browser/renderer_host/input/fling_browsertest.cc b/content/browser/renderer_host/input/fling_browsertest.cc
index 32f90f1..a62ff93 100644
--- a/content/browser/renderer_host/input/fling_browsertest.cc
+++ b/content/browser/renderer_host/input/fling_browsertest.cc
@@ -122,13 +122,12 @@
     }
 
     WaitForHitTestData(iframe_node->current_frame_host());
-    FrameTreeVisualizer visualizer;
     ASSERT_EQ(
         " Site A ------------ proxies for B\n"
         "   +--Site B ------- proxies for A\n"
         "Where A = http://a.com/\n"
         "      B = http://b.com/",
-        visualizer.DepictFrameTree(root));
+        DepictFrameTree(*root));
 
     root_view_ = static_cast<RenderWidgetHostViewBase*>(
         root->current_frame_host()->GetRenderWidgetHost()->GetView());
diff --git a/content/browser/renderer_host/input/touch_selection_controller_client_aura_browsertest.cc b/content/browser/renderer_host/input/touch_selection_controller_client_aura_browsertest.cc
index bb833bcf..dbd1c16 100644
--- a/content/browser/renderer_host/input/touch_selection_controller_client_aura_browsertest.cc
+++ b/content/browser/renderer_host/input/touch_selection_controller_client_aura_browsertest.cc
@@ -384,7 +384,7 @@
       " Site A\n"
       "   +--Site A\n"
       "Where A = http://a.com/",
-      FrameTreeVisualizer().DepictFrameTree(root));
+      DepictFrameTree(*root));
   TestNavigationObserver observer(shell()->web_contents());
   EXPECT_EQ(1u, root->child_count());
   FrameTreeNode* child = root->child_at(0);
@@ -412,7 +412,7 @@
       "   +--Site B ------- proxies for A\n"
       "Where A = http://a.com/\n"
       "      B = http://b.com/",
-      FrameTreeVisualizer().DepictFrameTree(root));
+      DepictFrameTree(*root));
 
   // The child will change with the cross-site navigation. It shouldn't change
   // after this.
@@ -490,7 +490,7 @@
       " Site A\n"
       "   +--Site A\n"
       "Where A = http://a.com/",
-      FrameTreeVisualizer().DepictFrameTree(root));
+      DepictFrameTree(*root));
   TestNavigationObserver observer(shell()->web_contents());
   EXPECT_EQ(1u, root->child_count());
   FrameTreeNode* child = root->child_at(0);
@@ -524,7 +524,7 @@
       "   +--Site B ------- proxies for A\n"
       "Where A = http://a.com/\n"
       "      B = http://b.com/",
-      FrameTreeVisualizer().DepictFrameTree(root));
+      DepictFrameTree(*root));
 
   // The child will change with the cross-site navigation. It shouldn't change
   // after this.
diff --git a/content/browser/renderer_host/navigation_controller_impl.cc b/content/browser/renderer_host/navigation_controller_impl.cc
index ec86c29..7e76843 100644
--- a/content/browser/renderer_host/navigation_controller_impl.cc
+++ b/content/browser/renderer_host/navigation_controller_impl.cc
@@ -1560,6 +1560,13 @@
   new_entry->set_site_instance(
       static_cast<SiteInstanceImpl*>(rfh->GetSiteInstance()));
   new_entry->SetOriginalRequestURL(params.original_request_url);
+
+  if (!is_same_document) {
+    DCHECK_EQ(request->IsOverridingUserAgent() && !rfh->GetParent(),
+              params.is_overriding_user_agent);
+  } else {
+    DCHECK_EQ(rfh->is_overriding_user_agent(), params.is_overriding_user_agent);
+  }
   new_entry->SetIsOverridingUserAgent(params.is_overriding_user_agent);
 
   // Update the FrameNavigationEntry for new main frame commits.
diff --git a/content/browser/renderer_host/navigation_controller_impl_browsertest.cc b/content/browser/renderer_host/navigation_controller_impl_browsertest.cc
index 825c18a0..dd6e0af 100644
--- a/content/browser/renderer_host/navigation_controller_impl_browsertest.cc
+++ b/content/browser/renderer_host/navigation_controller_impl_browsertest.cc
@@ -2130,7 +2130,6 @@
 
   // Check the end result of the frame tree.
   if (AreAllSitesIsolatedForTesting()) {
-    FrameTreeVisualizer visualizer;
     EXPECT_EQ(
         " Site A ------------ proxies for B\n"
         "   |--Site A ------- proxies for B\n"
@@ -2138,7 +2137,7 @@
         "   +--Site B ------- proxies for A\n"
         "Where A = http://127.0.0.1/\n"
         "      B = http://foo.com/",
-        visualizer.DepictFrameTree(root));
+        DepictFrameTree(*root));
   }
 }
 
@@ -2649,7 +2648,6 @@
 
   // Check the end result of the frame tree.
   if (AreAllSitesIsolatedForTesting()) {
-    FrameTreeVisualizer visualizer;
     EXPECT_EQ(
         " Site A ------------ proxies for B\n"
         "   |--Site A ------- proxies for B\n"
@@ -2659,7 +2657,7 @@
         "        +--Site A -- proxies for B\n"
         "Where A = http://127.0.0.1/\n"
         "      B = http://foo.com/",
-        visualizer.DepictFrameTree(root));
+        DepictFrameTree(*root));
   }
 }
 
@@ -2802,14 +2800,13 @@
 
   // Check the end result of the frame tree.
   if (AreAllSitesIsolatedForTesting()) {
-    FrameTreeVisualizer visualizer;
     EXPECT_EQ(
         " Site A ------------ proxies for B\n"
         "   |--Site A ------- proxies for B\n"
         "   +--Site B ------- proxies for A\n"
         "Where A = http://127.0.0.1/\n"
         "      B = http://baz.com/",
-        visualizer.DepictFrameTree(root));
+        DepictFrameTree(*root));
   }
 }
 
diff --git a/content/browser/renderer_host/navigation_request.h b/content/browser/renderer_host/navigation_request.h
index 6404c50..2a6f96e 100644
--- a/content/browser/renderer_host/navigation_request.h
+++ b/content/browser/renderer_host/navigation_request.h
@@ -728,6 +728,10 @@
   // properly determine SiteInstances and process allocation.
   UrlInfo GetUrlInfo();
 
+  bool IsOverridingUserAgent() const {
+    return commit_params_->is_overriding_user_agent || entry_overrides_ua_;
+  }
+
  private:
   friend class NavigationRequestTest;
 
@@ -1082,10 +1086,6 @@
 
   base::Optional<network::mojom::BlockedByResponseReason> EnforceCOEP();
 
-  bool IsOverridingUserAgent() const {
-    return commit_params_->is_overriding_user_agent || entry_overrides_ua_;
-  }
-
   // Returns the user-agent override, or an empty string if one isn't set.
   std::string GetUserAgentOverride();
 
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
index 2959182..e248136 100644
--- a/content/browser/renderer_host/render_frame_host_impl.cc
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -8633,6 +8633,14 @@
                                   ukm_recorder);
   }
 
+  if (!is_same_document_navigation) {
+    DCHECK_EQ(navigation_request->IsOverridingUserAgent() &&
+                  frame_tree_node_->IsMainFrame(),
+              params->is_overriding_user_agent);
+  } else {
+    DCHECK_EQ(is_overriding_user_agent_, params->is_overriding_user_agent);
+  }
+
   // TODO(https://crbug.com/1131832): Do not pass |params| to DidNavigate().
   frame_tree_node()->navigator().DidNavigate(this, *params,
                                              std::move(navigation_request),
@@ -8754,6 +8762,9 @@
   is_mhtml_document_ = navigation_request->IsWaitingToCommit() &&
                        navigation_request->IsLoadedFromMhtmlArchive();
 
+  is_overriding_user_agent_ = navigation_request->IsOverridingUserAgent() &&
+                              frame_tree_node_->IsMainFrame();
+
   RecordCrossOriginIsolationMetrics(this);
 
   CrossOriginOpenerPolicyReporter::InstallAccessMonitorsIfNeeded(
diff --git a/content/browser/renderer_host/render_frame_host_impl.h b/content/browser/renderer_host/render_frame_host_impl.h
index 6008ccb..f30df922 100644
--- a/content/browser/renderer_host/render_frame_host_impl.h
+++ b/content/browser/renderer_host/render_frame_host_impl.h
@@ -1124,6 +1124,8 @@
 
   bool is_mhtml_document() { return is_mhtml_document_; }
 
+  bool is_overriding_user_agent() { return is_overriding_user_agent_; }
+
   // Notifies the render frame that |frame_tree_node_| has had the sticky
   // user activation bit set for the first time.
   void DidReceiveFirstUserActivation();
@@ -3102,6 +3104,10 @@
   // browser side state as this value is used in security checks.
   bool is_mhtml_document_ = false;
 
+  // Whether the currently committed document is overriding the user agent or
+  // not.
+  bool is_overriding_user_agent_ = false;
+
   // The last reported character encoding, not canonicalized.
   std::string last_reported_encoding_;
 
diff --git a/content/browser/renderer_host/render_frame_host_manager_browsertest.cc b/content/browser/renderer_host/render_frame_host_manager_browsertest.cc
index 1526222..9695520 100644
--- a/content/browser/renderer_host/render_frame_host_manager_browsertest.cc
+++ b/content/browser/renderer_host/render_frame_host_manager_browsertest.cc
@@ -3933,7 +3933,7 @@
         "                  +--Site B -- proxies for A\n"
         "Where A = http://a.com/\n"
         "      B = http://b.com/",
-        FrameTreeVisualizer().DepictFrameTree(root));
+        DepictFrameTree(*root));
   } else {
     const GURL kExpectedSiteURL = AreDefaultSiteInstancesEnabled()
                                       ? SiteInstanceImpl::GetDefaultSiteURL()
@@ -3945,7 +3945,7 @@
                           "                  +--Site A\n"
                           "Where A = ") +
                   kExpectedSiteURL.spec(),
-              FrameTreeVisualizer().DepictFrameTree(root));
+              DepictFrameTree(*root));
   }
   FrameTreeNode* bottom_child =
       root->child_at(0)->child_at(0)->child_at(0)->child_at(0);
@@ -4001,7 +4001,7 @@
                         "        +--Site A\n"
                         "Where A = ") +
                 kExpectedSiteURL.spec(),
-            FrameTreeVisualizer().DepictFrameTree(root));
+            DepictFrameTree(*root));
 
   // The URL of the grandchild has not changed.
   EXPECT_EQ(expected_url, grandchild->current_url());
@@ -4035,7 +4035,7 @@
                         "        +--Site A\n"
                         "Where A = ") +
                 kExpectedSiteURL.spec(),
-            FrameTreeVisualizer().DepictFrameTree(root));
+            DepictFrameTree(*root));
 
   EXPECT_EQ(GURL(url::kAboutBlankURL),
             root->child_at(0)->child_at(0)->current_url());
@@ -9086,8 +9086,6 @@
 IN_PROC_BROWSER_TEST_P(RenderFrameHostManagerTest,
                        RemoveSubframeInUnload_SameSite) {
   // TODO(https://crbug.com/1148793): Remove this early return.
-  if (ShouldCreateNewHostForSameSiteSubframe())
-    return;
   AssertCanRemoveSubframeInUnload(/*same_site=*/true);
 }
 
diff --git a/content/browser/resources/conversions/conversion_internals.html b/content/browser/resources/conversions/conversion_internals.html
index 1060896f..c19a428 100644
--- a/content/browser/resources/conversions/conversion_internals.html
+++ b/content/browser/resources/conversions/conversion_internals.html
@@ -7,21 +7,9 @@
   <meta charset="utf-8">
   <link rel="stylesheet" href="chrome://resources/css/text_defaults.css">
   <link rel="stylesheet" href="chrome://resources/css/roboto.css">
-  <script src="chrome://resources/js/assert.js"></script>
-  <script src="chrome://resources/js/util.js"></script>
-  <script src="chrome://resources/js/cr.js"></script>
-  <script src="chrome://resources/js/cr/ui.js"></script>
-  <script src="chrome://resources/js/cr/ui/tree.js"></script>
-
-  <script src="chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js">
-  </script>
-  <script src="chrome://resources/mojo/mojo/public/mojom/base/unguessable_token.mojom-lite.js"></script>
-  <script src="chrome://resources/mojo/url/mojom/url.mojom-lite.js"></script>
-  <script src="chrome://resources/mojo/url/mojom/origin.mojom-lite.js"></script>
 
   <link rel="stylesheet" href="conversion_internals.css">
-  <script src="conversion_internals.mojom-lite.js"></script>
-  <script src="conversion_internals.js"></script>
+  <script type="module" src="conversion_internals.js"></script>
   <title>Conversion Internals</title>
 </head>
 <body>
diff --git a/content/browser/resources/conversions/conversion_internals.js b/content/browser/resources/conversions/conversion_internals.js
index 679ed861..4033673 100644
--- a/content/browser/resources/conversions/conversion_internals.js
+++ b/content/browser/resources/conversions/conversion_internals.js
@@ -2,24 +2,26 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-(function() {
-'use strict';
+import {$} from 'chrome://resources/js/util.m.js';
+import {Origin} from 'chrome://resources/mojo/url/mojom/origin.mojom-webui.js';
+
+import {ConversionInternalsHandler, ConversionInternalsHandlerRemote, WebUIImpression} from './conversion_internals.mojom-webui.js';
 
 /**
  * Reference to the backend providing all the data.
- * @type {mojom.ConversionInternalsHandlerRemote}
+ * @type {ConversionInternalsHandlerRemote}
  */
 let pageHandler = null;
 
 /**
  * All impressions held in storage at last update.
- * @type {!Array<!mojom.Impression>}
+ * @type {!Array<!WebUIImpression>}
  */
 let impressions = null;
 
 /**
  * All impressions held in storage at last update.
- * @type {!Array<!mojom.Impression>}
+ * @type {!Array<!WebUIImpression>}
  */
 let reports = null;
 
@@ -33,7 +35,7 @@
 
 /**
  * Converts a mojo origin into a user-readable string, omitting default ports.
- * @param {url.mojom.Origin} origin Origin to convert
+ * @param {Origin} origin Origin to convert
  * @return {string}
  */
 function UrlToText(origin) {
@@ -52,7 +54,7 @@
 
 /**
  * Creates a single row for the impression table.
- * @param {!mojom.Impression} impression The info to create the row.
+ * @param {!WebIUIImpression} impression The info to create the row.
  * @return {!HTMLElement}
  */
 function createImpressionRow(impression) {
@@ -70,7 +72,7 @@
 
 /**
  * Creates a single row for the impression table.
- * @param {!mojom.Impression} impression The info to create the row.
+ * @param {!WebUIImpression} impression The info to create the row.
  * @return {!HTMLElement}
  */
 function createReportRow(report) {
@@ -175,7 +177,7 @@
 
 document.addEventListener('DOMContentLoaded', function() {
   // Setup the mojo interface.
-  pageHandler = mojom.ConversionInternalsHandler.getRemote();
+  pageHandler = ConversionInternalsHandler.getRemote();
 
   $('refresh').addEventListener('click', updatePageData);
   $('clear-data').addEventListener('click', clearStorage);
@@ -185,4 +187,3 @@
   setInterval(updatePageData, 2 * 60 * 1000);
   updatePageData();
 });
-})();
diff --git a/content/browser/resources/gpu/browser_bridge.js b/content/browser/resources/gpu/browser_bridge.js
index 4fe53ca..e06e851 100644
--- a/content/browser/resources/gpu/browser_bridge.js
+++ b/content/browser/resources/gpu/browser_bridge.js
@@ -1,158 +1,139 @@
 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
-cr.define('gpu', function() {
+
+import {dispatchSimpleEvent} from 'chrome://resources/js/cr.m.js';
+import {NativeEventTarget as EventTarget} from 'chrome://resources/js/cr/event_target.m.js';
+
+
+/**
+ * This class provides a 'bridge' for communicating between javascript and the
+ * browser. When run outside of WebUI, e.g. as a regular webpage, it provides
+ * synthetic data to assist in testing.
+ */
+export class BrowserBridge extends EventTarget {
+  constructor() {
+    super();
+    this.nextRequestId_ = 0;
+    this.pendingCallbacks_ = [];
+    this.logMessages_ = [];
+
+    // Tell c++ code that we are ready to receive GPU Info.
+    chrome.send('browserBridgeInitialized');
+    this.beginRequestClientInfo_();
+    this.beginRequestLogMessages_();
+  }
+
+  applySimulatedData_(data) {
+    // set up things according to the simulated data
+    this.gpuInfo_ = data.gpuInfo;
+    this.clientInfo_ = data.clientInfo;
+    this.logMessages_ = data.logMessages;
+    dispatchSimpleEvent(this, 'gpuInfoUpdate');
+    dispatchSimpleEvent(this, 'clientInfoChange');
+    dispatchSimpleEvent(this, 'logMessagesChange');
+  }
+
   /**
-   * This class provides a 'bridge' for communicating between javascript and the
-   * browser. When run outside of WebUI, e.g. as a regular webpage, it provides
-   * synthetic data to assist in testing.
+   * Sends a message to the browser with specified args. The
+   * browser will reply asynchronously via the provided callback.
    */
-  class BrowserBridge extends cr.EventTarget {
-    constructor() {
-      super();
-      // If we are not running inside WebUI, output chrome.send messages
-      // to the console to help with quick-iteration debugging.
-      this.debugMode_ = (chrome.send === undefined && console.log);
-      if (this.debugMode_) {
-        const browserBridgeTests = document.createElement('script');
-        browserBridgeTests.src = './gpu_internals/browser_bridge_tests.js';
-        document.body.appendChild(browserBridgeTests);
-      }
-
-      this.nextRequestId_ = 0;
-      this.pendingCallbacks_ = [];
-      this.logMessages_ = [];
-
-      // Tell c++ code that we are ready to receive GPU Info.
-      if (!this.debugMode_) {
-        chrome.send('browserBridgeInitialized');
-        this.beginRequestClientInfo_();
-        this.beginRequestLogMessages_();
-      }
-    }
-
-    applySimulatedData_(data) {
-      // set up things according to the simulated data
-      this.gpuInfo_ = data.gpuInfo;
-      this.clientInfo_ = data.clientInfo;
-      this.logMessages_ = data.logMessages;
-      cr.dispatchSimpleEvent(this, 'gpuInfoUpdate');
-      cr.dispatchSimpleEvent(this, 'clientInfoChange');
-      cr.dispatchSimpleEvent(this, 'logMessagesChange');
-    }
-
-    /**
-     * Returns true if the page is hosted inside Chrome WebUI
-     * Helps have behavior conditional to emulate_webui.py
-     */
-    get debugMode() {
-      return this.debugMode_;
-    }
-
-    /**
-     * Sends a message to the browser with specified args. The
-     * browser will reply asynchronously via the provided callback.
-     */
-    callAsync(submessage, args, callback) {
-      const requestId = this.nextRequestId_;
-      this.nextRequestId_ += 1;
-      this.pendingCallbacks_[requestId] = callback;
-      if (!args) {
-        chrome.send('callAsync', [requestId.toString(), submessage]);
-      } else {
-        const allArgs = [requestId.toString(), submessage].concat(args);
-        chrome.send('callAsync', allArgs);
-      }
-    }
-
-    /**
-     * Called by gpu c++ code when client info is ready.
-     */
-    onCallAsyncReply(requestId, args) {
-      if (this.pendingCallbacks_[requestId] === undefined) {
-        throw new Error('requestId ' + requestId + ' is not pending');
-      }
-      const callback = this.pendingCallbacks_[requestId];
-      callback(args);
-      delete this.pendingCallbacks_[requestId];
-    }
-
-    /**
-     * Get gpuInfo data.
-     */
-    get gpuInfo() {
-      return this.gpuInfo_;
-    }
-
-    /**
-     * Called from gpu c++ code when GPU Info is updated.
-     */
-    onGpuInfoUpdate(gpuInfo) {
-      this.gpuInfo_ = gpuInfo;
-      cr.dispatchSimpleEvent(this, 'gpuInfoUpdate');
-    }
-
-    /**
-     * This function begins a request for the ClientInfo. If it comes back
-     * as undefined, then we will issue the request again in 250ms.
-     */
-    beginRequestClientInfo_() {
-      this.callAsync(
-          'requestClientInfo', undefined,
-          (function(data) {
-            if (data === undefined) {  // try again in 250 ms
-              window.setTimeout(this.beginRequestClientInfo_.bind(this), 250);
-            } else {
-              this.clientInfo_ = data;
-              cr.dispatchSimpleEvent(this, 'clientInfoChange');
-            }
-          }).bind(this));
-    }
-
-    /**
-     * Returns information about the currently running Chrome build.
-     */
-    get clientInfo() {
-      return this.clientInfo_;
-    }
-
-    /**
-     * This function checks for new GPU_LOG messages.
-     * If any are found, a refresh is triggered.
-     */
-    beginRequestLogMessages_() {
-      this.callAsync(
-          'requestLogMessages', undefined,
-          (function(messages) {
-            if (messages.length !== this.logMessages_.length) {
-              this.logMessages_ = messages;
-              cr.dispatchSimpleEvent(this, 'logMessagesChange');
-            }
-            // check again in 250 ms
-            window.setTimeout(this.beginRequestLogMessages_.bind(this), 250);
-          }).bind(this));
-    }
-
-    /**
-     * Returns an array of log messages issued by the GPU process, if any.
-     */
-    get logMessages() {
-      return this.logMessages_;
-    }
-
-    /**
-     * Returns the value of the "Sandboxed" row.
-     */
-    isSandboxedForTesting() {
-      for (i = 0; i < this.gpuInfo_.basicInfo.length; ++i) {
-        const info = this.gpuInfo_.basicInfo[i];
-        if (info.description === 'Sandboxed') {
-          return info.value;
-        }
-      }
-      return false;
+  callAsync(submessage, args, callback) {
+    const requestId = this.nextRequestId_;
+    this.nextRequestId_ += 1;
+    this.pendingCallbacks_[requestId] = callback;
+    if (!args) {
+      chrome.send('callAsync', [requestId.toString(), submessage]);
+    } else {
+      const allArgs = [requestId.toString(), submessage].concat(args);
+      chrome.send('callAsync', allArgs);
     }
   }
 
-  return {BrowserBridge: BrowserBridge};
-});
+  /**
+   * Called by gpu c++ code when client info is ready.
+   */
+  onCallAsyncReply(requestId, args) {
+    if (this.pendingCallbacks_[requestId] === undefined) {
+      throw new Error('requestId ' + requestId + ' is not pending');
+    }
+    const callback = this.pendingCallbacks_[requestId];
+    callback(args);
+    delete this.pendingCallbacks_[requestId];
+  }
+
+  /**
+   * Get gpuInfo data.
+   */
+  get gpuInfo() {
+    return this.gpuInfo_;
+  }
+
+  /**
+   * Called from gpu c++ code when GPU Info is updated.
+   */
+  onGpuInfoUpdate(gpuInfo) {
+    this.gpuInfo_ = gpuInfo;
+    dispatchSimpleEvent(this, 'gpuInfoUpdate');
+  }
+
+  /**
+   * This function begins a request for the ClientInfo. If it comes back
+   * as undefined, then we will issue the request again in 250ms.
+   */
+  beginRequestClientInfo_() {
+    this.callAsync(
+        'requestClientInfo', undefined,
+        (function(data) {
+          if (data === undefined) {  // try again in 250 ms
+            window.setTimeout(this.beginRequestClientInfo_.bind(this), 250);
+          } else {
+            this.clientInfo_ = data;
+            dispatchSimpleEvent(this, 'clientInfoChange');
+          }
+        }).bind(this));
+  }
+
+  /**
+   * Returns information about the currently running Chrome build.
+   */
+  get clientInfo() {
+    return this.clientInfo_;
+  }
+
+  /**
+   * This function checks for new GPU_LOG messages.
+   * If any are found, a refresh is triggered.
+   */
+  beginRequestLogMessages_() {
+    this.callAsync(
+        'requestLogMessages', undefined,
+        (function(messages) {
+          if (messages.length !== this.logMessages_.length) {
+            this.logMessages_ = messages;
+            dispatchSimpleEvent(this, 'logMessagesChange');
+          }
+          // check again in 250 ms
+          window.setTimeout(this.beginRequestLogMessages_.bind(this), 250);
+        }).bind(this));
+  }
+
+  /**
+   * Returns an array of log messages issued by the GPU process, if any.
+   */
+  get logMessages() {
+    return this.logMessages_;
+  }
+
+  /**
+   * Returns the value of the "Sandboxed" row.
+   */
+  isSandboxedForTesting() {
+    for (const info of this.gpuInfo_.basicInfo) {
+      if (info.description === 'Sandboxed') {
+        return info.value;
+      }
+    }
+    return false;
+  }
+}
diff --git a/content/browser/resources/gpu/browser_bridge_tests.js b/content/browser/resources/gpu/browser_bridge_tests.js
deleted file mode 100644
index 9cebfac..0000000
--- a/content/browser/resources/gpu/browser_bridge_tests.js
+++ /dev/null
@@ -1,297 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-const commandLineFlags = [
-  '--flag-switches-begin', '--show-composited-layer-borders',
-  '--flag-switches-end'
-];
-const commandLineStr = './out/Debug/chrome ' + commandLineFlags.join(' ');
-
-const glValueArray = [
-  'GL_ARB_compatibility',
-  'GL_ARB_copy_buffer',
-  'GL_ARB_depth_buffer_float',
-  'GL_ARB_depth_clamp',
-  'GL_ARB_depth_texture',
-  'GL_ARB_draw_buffers',
-  'GL_ARB_draw_elements_base_vertex',
-  'GL_ARB_draw_instanced',
-  'GL_ARB_fragment_coord_conventions',
-  'GL_ARB_fragment_program',
-  'GL_ARB_fragment_program_shadow',
-  'GL_ARB_fragment_shader',
-  'GL_ARB_framebuffer_object',
-  'GL_ARB_framebuffer_sRGB',
-  'GL_ARB_geometry_shader4',
-  'GL_ARB_half_float_pixel',
-  'GL_ARB_half_float_vertex',
-  'GL_ARB_imaging',
-  'GL_ARB_map_buffer_range',
-  'GL_ARB_multisample',
-  'GL_ARB_multitexture',
-  'GL_ARB_occlusion_query',
-  'GL_ARB_pixel_buffer_object',
-  'GL_ARB_point_parameters',
-  'GL_ARB_point_sprite',
-  'GL_ARB_provoking_vertex',
-  'GL_ARB_seamless_cube_map',
-  'GL_ARB_shader_objects',
-  'GL_ARB_shading_language_100',
-  'GL_ARB_shadow',
-  'GL_ARB_sync',
-  'GL_ARB_texture_border_clamp',
-  'GL_ARB_texture_buffer_object',
-  'GL_ARB_texture_compression',
-  'GL_ARB_texture_compression_rgtc',
-  'GL_ARB_texture_cube_map',
-  'GL_ARB_texture_env_add',
-  'GL_ARB_texture_env_combine',
-  'GL_ARB_texture_env_crossbar',
-  'GL_ARB_texture_env_dot3',
-  'GL_ARB_texture_float',
-  'GL_ARB_texture_mirrored_repeat',
-  'GL_ARB_texture_multisample',
-  'GL_ARB_texture_non_power_of_two',
-  'GL_ARB_texture_rectangle',
-  'GL_ARB_texture_rg',
-  'GL_ARB_transpose_matrix',
-  'GL_ARB_uniform_buffer_object',
-  'GL_ARB_vertex_array_bgra',
-  'GL_ARB_vertex_array_object',
-  'GL_ARB_vertex_buffer_object',
-  'GL_ARB_vertex_program',
-  'GL_ARB_vertex_shader',
-  'GL_ARB_window_pos',
-  'GL_ATI_draw_buffers',
-  'GL_ATI_texture_float',
-  'GL_ATI_texture_mirror_once',
-  'GL_S3_s3tc',
-  'GL_EXT_texture_env_add',
-  'GL_EXT_abgr',
-  'GL_EXT_bgra',
-  'GL_EXT_bindable_uniform',
-  'GL_EXT_blend_color',
-  'GL_EXT_blend_equation_separate',
-  'GL_EXT_blend_func_separate',
-  'GL_EXT_blend_minmax',
-  'GL_EXT_blend_subtract',
-  'GL_EXT_compiled_vertex_array',
-  'GL_EXT_Cg_shader',
-  'GL_EXT_depth_bounds_test',
-  'GL_EXT_direct_state_access',
-  'GL_EXT_draw_buffers2',
-  'GL_EXT_draw_instanced',
-  'GL_EXT_draw_range_elements',
-  'GL_EXT_fog_coord',
-  'GL_EXT_framebuffer_blit',
-  'GL_EXT_framebuffer_multisample',
-  'GL_EXTX_framebuffer_mixed_formats',
-  'GL_EXT_framebuffer_object',
-  'GL_EXT_framebuffer_sRGB',
-  'GL_EXT_geometry_shader4',
-  'GL_EXT_gpu_program_parameters',
-  'GL_EXT_gpu_shader4',
-  'GL_EXT_multi_draw_arrays',
-  'GL_EXT_packed_depth_stencil',
-  'GL_EXT_packed_float',
-  'GL_EXT_packed_pixels',
-  'GL_EXT_pixel_buffer_object',
-  'GL_EXT_point_parameters',
-  'GL_EXT_provoking_vertex',
-  'GL_EXT_rescale_normal',
-  'GL_EXT_secondary_color',
-  'GL_EXT_separate_shader_objects',
-  'GL_EXT_separate_specular_color',
-  'GL_EXT_shadow_funcs',
-  'GL_EXT_stencil_two_side',
-  'GL_EXT_stencil_wrap',
-  'GL_EXT_texture3D',
-  'GL_EXT_texture_array',
-  'GL_EXT_texture_buffer_object',
-  'GL_EXT_texture_compression_latc',
-  'GL_EXT_texture_compression_rgtc',
-  'GL_EXT_texture_compression_s3tc',
-  'GL_EXT_texture_cube_map',
-  'GL_EXT_texture_edge_clamp',
-  'GL_EXT_texture_env_combine',
-  'GL_EXT_texture_env_dot3',
-  'GL_EXT_texture_filter_anisotropic',
-  'GL_EXT_texture_integer',
-  'GL_EXT_texture_lod',
-  'GL_EXT_texture_lod_bias',
-  'GL_EXT_texture_mirror_clamp',
-  'GL_EXT_texture_object',
-  'GL_EXT_texture_shared_exponent',
-  'GL_EXT_texture_sRGB',
-  'GL_EXT_texture_swizzle',
-  'GL_EXT_timer_query',
-  'GL_EXT_vertex_array',
-  'GL_EXT_vertex_array_bgra',
-  'GL_IBM_rasterpos_clip',
-  'GL_IBM_texture_mirrored_repeat',
-  'GL_KTX_buffer_region',
-  'GL_NV_blend_square',
-  'GL_NV_conditional_render',
-  'GL_NV_copy_depth_to_color',
-  'GL_NV_copy_image',
-  'GL_NV_depth_buffer_float',
-  'GL_NV_depth_clamp',
-  'GL_NV_explicit_multisample',
-  'GL_NV_fence',
-  'GL_NV_float_buffer',
-  'GL_NV_fog_distance',
-  'GL_NV_fragment_program',
-  'GL_NV_fragment_program_option',
-  'GL_NV_fragment_program2',
-  'GL_NV_framebuffer_multisample_coverage',
-  'GL_NV_geometry_shader4',
-  'GL_NV_gpu_program4',
-  'GL_NV_half_float',
-  'GL_NV_light_max_exponent',
-  'GL_NV_multisample_coverage',
-  'GL_NV_multisample_filter_hint',
-  'GL_NV_occlusion_query',
-  'GL_NV_packed_depth_stencil',
-  'GL_NV_parameter_buffer_object',
-  'GL_NV_parameter_buffer_object2',
-  'GL_NV_pixel_data_range',
-  'GL_NV_point_sprite',
-  'GL_NV_primitive_restart',
-  'GL_NV_register_combiners',
-  'GL_NV_register_combiners2',
-  'GL_NV_shader_buffer_load',
-  'GL_NV_texgen_reflection',
-  'GL_NV_texture_barrier',
-  'GL_NV_texture_compression_vtc',
-  'GL_NV_texture_env_combine4',
-  'GL_NV_texture_expand_normal',
-  'GL_NV_texture_rectangle',
-  'GL_NV_texture_shader',
-  'GL_NV_texture_shader2',
-  'GL_NV_texture_shader3',
-  'GL_NV_transform_feedback',
-  'GL_NV_vertex_array_range',
-  'GL_NV_vertex_array_range2',
-  'GL_NV_vertex_buffer_unified_memory',
-  'GL_NV_vertex_program',
-  'GL_NV_vertex_program1_1',
-  'GL_NV_vertex_program2',
-  'GL_NV_vertex_program2_option',
-  'GL_NV_vertex_program3',
-  'GL_NVX_conditional_render',
-  'GL_NVX_gpu_memory_info',
-  'GL_SGIS_generate_mipmap',
-  'GL_SGIS_texture_lod',
-  'GL_SGIX_depth_texture',
-  'GL_SGIX_shadow',
-  'GL_SUN_slice_accum'
-];
-(function() {
-const dataSets = [
-  {
-    name: 'full_data_linux',
-    gpuInfo: {
-      basic_info: [
-        {description: 'Initialization time', value: '111'},
-        {description: 'Vendor Id', value: '0x10de'},
-        {description: 'Device Id', value: '0x0658'},
-        {description: 'Driver vendor', value: 'NVIDIA'},
-        {description: 'Driver version', value: '195.36.24'},
-        {description: 'Driver date', value: ''},
-        {description: 'Pixel shader version', value: '1.50'},
-        {description: 'Vertex shader version', value: '1.50'},
-        {description: 'GL version', value: '3.2'},
-        {description: 'GL_VENDOR', value: 'NVIDIA Corporation'},
-        {description: 'GL_RENDERER', value: 'Quadro FX 380/PCI/SSE2'},
-        {description: 'GL_VERSION', value: '3.2.0 NVIDIA 195.36.24'}, {
-          description: 'GL_EXTENSIONS',
-          value: glValueArray.join(' '),
-        }
-      ],
-      featureStatus: {
-        featureStatus: [
-          {'status': 'enabled', name: '2d_canvas'},
-          {'status': 'enabled', name: '3d_css'},
-          {'status': 'enabled', name: 'compositing'},
-          {'status': 'enabled', name: 'webgl'},
-          {'status': 'enabled', name: 'multisampling'}
-        ],
-        problems: []
-      }
-    },
-    clientInfo: {
-      command_line: commandLineStr,
-      version: 'Chrome/12.0.729.0',
-    },
-    logMessages: []
-  },
-  {
-    name: 'no_data',
-    gpuInfo: undefined,
-    clientInfo: undefined,
-    logMessages: undefined
-  },
-  {
-    name: 'logs',
-    gpuInfo: undefined,
-    clientInfo: undefined,
-    logMessages: [{header: 'foo', message: 'Bar'}]
-  },
-
-  // tests for 'status'
-  {
-    name: 'feature_states',
-    gpuInfo: {
-      basic_info: undefined,
-      featureStatus: {
-        featureStatus: [
-          {'status': 'disabled_off', name: '2d_canvas'},
-          {'status': 'unavailable_software', name: '3d_css'},
-          {'status': 'disabled_software', name: 'compositing'},
-          {'status': 'software', name: 'compositing'},
-          {'status': 'unavailable_off', name: 'webgl'},
-          {'status': 'enabled', name: 'multisampling'}
-        ],
-        problems: [
-          {description: 'Something wrong', crBugs: [], webkitBugs: []},
-          {description: 'SomethingElse', crBugs: [], webkitBugs: []}, {
-            description: 'WebKit and Chrome bug',
-            crBugs: [23456],
-            webkitBugs: [789, 2123]
-          }
-        ]
-      }
-    },
-    clientInfo: undefined,
-    logMessages: []
-  }
-
-];
-
-const selectEl = document.createElement('select');
-for (let i = 0; i < dataSets.length; ++i) {
-  const optionEl = document.createElement('option');
-  optionEl.textContent = dataSets[i].name;
-  optionEl.dataSet = dataSets[i];
-  selectEl.add(optionEl);
-}
-selectEl.addEventListener('change', function() {
-  browserBridge.applySimulatedData_(dataSets[selectEl.selectedIndex]);
-});
-selectEl.addEventListener('keydown', function() {
-  window.setTimeout(function() {
-    browserBridge.applySimulatedData_(dataSets[selectEl.selectedIndex]);
-  }, 0);
-});
-
-const controlEl = document.createElement('div');
-const textEl = document.createElement('span');
-textEl.textContent = 'GPU Info:';
-controlEl.appendChild(textEl);
-controlEl.appendChild(selectEl);
-
-document.querySelector('#debug-div')
-    .appendChild(controlEl, document.body.firstChild);
-
-browserBridge.applySimulatedData_(dataSets[0]);
-})();
diff --git a/content/browser/resources/gpu/gpu_internals.html b/content/browser/resources/gpu/gpu_internals.html
index d29a1a0..0f13f54 100644
--- a/content/browser/resources/gpu/gpu_internals.html
+++ b/content/browser/resources/gpu/gpu_internals.html
@@ -31,18 +31,7 @@
 </style>
 <link rel="stylesheet" href="info_view.css">
 <link rel="stylesheet" href="chrome://resources/css/widgets.css">
-<script src="chrome://resources/js/cr.js"></script>
-<script src="chrome://resources/js/cr/event_target.js"></script>
-<script src="chrome://resources/js/cr/ui.js"></script>
-<script src="chrome://resources/js/cr/ui/focus_outline_manager.js"></script>
-<script src="chrome://resources/js/load_time_data.js"></script>
-<script src="chrome://resources/js/assert.js"></script>
-<script src="chrome://resources/js/util.js"></script>
-<script src="chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js"></script>
-<script src="chrome://resources/gpu/ipc/common/vulkan_types.mojom-lite.js"></script>
-<script src="chrome://resources/gpu/ipc/common/vulkan_info.mojom-lite.js"></script>
-<script src="gpu_internals.js"></script>
-<script src="strings.js"></script>
+<script type="module" src="gpu_internals.js"></script>
 </head>
 <body>
   <div id="debug-div">
diff --git a/content/browser/resources/gpu/gpu_internals.js b/content/browser/resources/gpu/gpu_internals.js
index 62f96f6..a6d8781 100644
--- a/content/browser/resources/gpu/gpu_internals.js
+++ b/content/browser/resources/gpu/gpu_internals.js
@@ -2,20 +2,28 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// <include src="browser_bridge.js">
-// <include src="info_view.js">
-// <include src="vulkan_info.js">
+import {decorate} from 'chrome://resources/js/cr/ui.m.js';
 
-let browserBridge;
+import {BrowserBridge} from './browser_bridge.js';
+import {makeInfoView} from './info_view.js';
+
+// Injected script from C++ or test environments may reference `browserBridge`
+// as a property of the global object.
+window.browserBridge = new BrowserBridge;
 
 /**
  * Main entry point. called once the page has loaded.
  */
 function onLoad() {
-  browserBridge = new gpu.BrowserBridge();
-
   // Create the views.
-  cr.ui.decorate('#info-view', gpu.InfoView);
+  decorate('#info-view', makeInfoView(window.browserBridge));
+
+  // Because of inherent raciness (between the deprecated DevTools API which
+  // telemtry uses to drive the relevant tests, and the asynchronous loading of
+  // JS modules like this one) it's possible for telemetry tests to inject code
+  // *before* `browserBridge` is set and the DOM is populated. This flag is used
+  // to synchronize script injection by tests to prevent such races.
+  window.gpuPagePopulated = true;
 }
 
 document.addEventListener('DOMContentLoaded', onLoad);
diff --git a/content/browser/resources/gpu/info_view.js b/content/browser/resources/gpu/info_view.js
index b6f9473b..9eaa583 100644
--- a/content/browser/resources/gpu/info_view.js
+++ b/content/browser/resources/gpu/info_view.js
@@ -2,18 +2,22 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import {define as crUiDefine} from 'chrome://resources/js/cr/ui.m.js';
+import {$} from 'chrome://resources/js/util.m.js';
+
+import {VulkanInfo} from './vulkan_info.js';
 
 /**
  * @fileoverview This view displays information on the current GPU
  * hardware.  Its primary usefulness is to allow users to copy-paste
  * their data in an easy to read format for bug reports.
  */
-cr.define('gpu', function() {
+export function makeInfoView(browserBridge) {
   /**
    * Provides information on the GPU process and underlying graphics hardware.
    * @constructor
    */
-  const InfoView = cr.ui.define('div');
+  const InfoView = crUiDefine('div');
 
   InfoView.prototype = {
     __proto__: HTMLDivElement.prototype,
@@ -185,8 +189,7 @@
           if (gpuInfo.ANGLEFeatures.length) {
             ANGLEFeaturesDiv.hidden = false;
             ANGLEFeaturesList.textContent = '';
-            for (i = 0; i < gpuInfo.ANGLEFeatures.length; i++) {
-              const ANGLEFeature = gpuInfo.ANGLEFeatures[i];
+            for (const ANGLEFeature of gpuInfo.ANGLEFeatures) {
               const ANGLEFeatureEl = this.createANGLEFeatureEl_(ANGLEFeature);
               ANGLEFeaturesList.appendChild(ANGLEFeatureEl);
             }
@@ -210,7 +213,7 @@
         }
 
         if (gpuInfo.vulkanInfo) {
-          const vulkanInfo = new gpu.VulkanInfo(gpuInfo.vulkanInfo);
+          const vulkanInfo = new VulkanInfo(gpuInfo.vulkanInfo);
           const data = [{
             'description': 'info',
             'value': vulkanInfo.toString(),
@@ -324,8 +327,7 @@
       if (featureInfo.problems.length) {
         problemsDiv.hidden = false;
         problemsList.textContent = '';
-        for (i = 0; i < featureInfo.problems.length; i++) {
-          const problem = featureInfo.problems[i];
+        for (const problem of featureInfo.problems) {
           const problemEl = this.createProblemEl_(problem);
           problemsList.appendChild(problemEl);
         }
@@ -337,9 +339,9 @@
       if (featureInfo.workarounds.length) {
         workaroundsDiv.hidden = false;
         workaroundsList.textContent = '';
-        for (i = 0; i < featureInfo.workarounds.length; i++) {
+        for (const workaround of featureInfo.workarounds) {
           const workaroundEl = document.createElement('li');
-          workaroundEl.textContent = featureInfo.workarounds[i];
+          workaroundEl.textContent = workaround;
           workaroundsList.appendChild(workaroundEl);
         }
       } else {
@@ -536,5 +538,5 @@
     }
   };
 
-  return {InfoView: InfoView};
-});
+  return InfoView;
+}
diff --git a/content/browser/resources/gpu/vulkan_info.js b/content/browser/resources/gpu/vulkan_info.js
index 72c60d2..8bb02c0 100644
--- a/content/browser/resources/gpu/vulkan_info.js
+++ b/content/browser/resources/gpu/vulkan_info.js
@@ -2,18 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-cr.define('gpu', function() {
-  class VulkanInfo {
-    constructor(base64Data) {
-      const array = Uint8Array.from(atob(base64Data), c => c.charCodeAt(0));
-      const dataView = new DataView(array.buffer);
-      this.vulkanInfo_ = gpu.mojom.VulkanInfo_Deserialize(dataView);
-    }
+import {VulkanInfo_Deserialize} from './vulkan_info.mojom-webui.js';
 
-    toString() {
-      return JSON.stringify(this.vulkanInfo_, null, 2);
-    }
+export class VulkanInfo {
+  constructor(base64Data) {
+    const array = Uint8Array.from(atob(base64Data), c => c.charCodeAt(0));
+    const dataView = new DataView(array.buffer);
+    this.vulkanInfo_ = VulkanInfo_Deserialize(dataView);
   }
 
-  return {VulkanInfo: VulkanInfo};
-});
+  toString() {
+    return JSON.stringify(this.vulkanInfo_, null, 2);
+  }
+}
diff --git a/content/browser/resources/process/BUILD.gn b/content/browser/resources/process/BUILD.gn
index 61867ca..8871fe6 100644
--- a/content/browser/resources/process/BUILD.gn
+++ b/content/browser/resources/process/BUILD.gn
@@ -6,13 +6,21 @@
 
 js_type_check("closure_compile") {
   deps = [ ":process_internals" ]
+  uses_js_modules = true
+  closure_flags =
+      default_closure_args + mojom_js_args + [
+        "js_module_root=" + rebase_path(".", root_build_dir),
+        "js_module_root=" + rebase_path(
+                "$root_gen_dir/mojom-webui/content/browser/process_internals",
+                root_build_dir),
+      ]
 }
 
 js_library("process_internals") {
   deps = [
-    "//content/browser/process_internals:mojo_bindings_js_library_for_compile",
-    "//ui/webui/resources/js:assert",
-    "//ui/webui/resources/js:util",
-    "//ui/webui/resources/js/cr/ui:tree",
+    "//content/browser/process_internals:mojo_bindings_webui_js",
+    "//ui/webui/resources/js:util.m",
+    "//ui/webui/resources/js/cr:ui.m",
+    "//ui/webui/resources/js/cr/ui:tree.m",
   ]
 }
diff --git a/content/browser/resources/process/process_internals.html b/content/browser/resources/process/process_internals.html
index 21ba2fe..f1072e7 100644
--- a/content/browser/resources/process/process_internals.html
+++ b/content/browser/resources/process/process_internals.html
@@ -6,20 +6,9 @@
 <head>
   <meta charset="utf-8">
   <link rel="stylesheet" href="chrome://resources/css/text_defaults.css">
-  <script src="chrome://resources/js/assert.js"></script>
-  <script src="chrome://resources/js/util.js"></script>
-  <script src="chrome://resources/js/cr.js"></script>
-  <script src="chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js">
-  </script>
-  <script src="chrome://resources/mojo/url/mojom/url.mojom-lite.js"></script>
-
   <link rel="stylesheet" href="chrome://resources/css/tree.css">
-  <script src="chrome://resources/js/cr/ui.js"></script>
-  <script src="chrome://resources/js/cr/ui/tree.js"></script>
-
   <link rel="stylesheet" href="process_internals.css">
-  <script src="process_internals.mojom-lite.js"></script>
-  <script src='process_internals.js'></script>
+  <script type="module" src='process_internals.js'></script>
   <title>Process Model Internals</title>
 </head>
 <body>
diff --git a/content/browser/resources/process/process_internals.js b/content/browser/resources/process/process_internals.js
index af659f7..2193714 100644
--- a/content/browser/resources/process/process_internals.js
+++ b/content/browser/resources/process/process_internals.js
@@ -2,12 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-(function() {
-'use strict';
+import {decorate} from 'chrome://resources/js/cr/ui.m.js';
+import {Tree, TreeItem} from 'chrome://resources/js/cr/ui/tree.m.js';
+import {$} from 'chrome://resources/js/util.m.js';
+
+import {FrameInfo, ProcessInternalsHandler, ProcessInternalsHandlerRemote, WebContentsInfo} from './process_internals.mojom-webui.js';
 
 /**
  * Reference to the backend providing all the data.
- * @type {mojom.ProcessInternalsHandlerRemote}
+ * @type {ProcessInternalsHandlerRemote}
  */
 let pageHandler = null;
 
@@ -61,19 +64,19 @@
 
 /**
  * Root of the WebContents tree.
- * @type {cr.ui.Tree|null}
+ * @type {Tree|null}
  */
 let treeViewRoot = null;
 
 /**
  * Initialize and return |treeViewRoot|.
- * @return {cr.ui.Tree} Initialized |treeViewRoot|.
+ * @return {Tree} Initialized |treeViewRoot|.
  */
 function getTreeViewRoot() {
   if (!treeViewRoot) {
-    cr.ui.decorate('#tree-view', cr.ui.Tree);
+    decorate('#tree-view', Tree);
 
-    treeViewRoot = /** @type {cr.ui.Tree} */ ($('tree-view'));
+    treeViewRoot = /** @type {Tree} */ ($('tree-view'));
     treeViewRoot.detail = {payload: {}, children: {}};
   }
   return treeViewRoot;
@@ -82,7 +85,7 @@
 /**
  * Initialize and return a tree item representing a FrameInfo object and
  * recursively creates its subframe objects.
- * @param {mojom.FrameInfo} frame
+ * @param {FrameInfo} frame
  * @return {Array}
  */
 function frameToTreeItem(frame) {
@@ -109,8 +112,8 @@
     itemLabel += ` | url: ${frame.lastCommittedUrl.url}`;
   }
 
-  const item = new cr.ui.TreeItem(
-      {label: itemLabel, detail: {payload: {}, children: {}}});
+  const item =
+      new TreeItem({label: itemLabel, detail: {payload: {}, children: {}}});
   item.mayHaveChildren_ = true;
   item.expanded = true;
   item.icon = '';
@@ -131,8 +134,8 @@
 /**
  * Initialize and return a tree item representing the WebContentsInfo object
  * and contains all frames in it as a subtree.
- * @param {mojom.WebContentsInfo} webContents
- * @return {!cr.ui.TreeItem}
+ * @param {WebContentsInfo} webContents
+ * @return {!TreeItem}
  */
 function webContentsToTreeItem(webContents) {
   let itemLabel = 'WebContents: ';
@@ -140,8 +143,8 @@
     itemLabel += webContents.title + ', ';
   }
 
-  const item = new cr.ui.TreeItem(
-      {label: itemLabel, detail: {payload: {}, children: {}}});
+  const item =
+      new TreeItem({label: itemLabel, detail: {payload: {}, children: {}}});
   item.mayHaveChildren_ = true;
   item.expanded = true;
   item.icon = '';
@@ -171,16 +174,15 @@
 /**
  * This is a callback which is invoked when the data for WebContents
  * associated with the browser profile is received from the browser process.
- * @param {mojom.ProcessInternalsHandler_GetAllWebContentsInfo_ResponseParams}
- *     input
+ * @param {!Array<!WebContentsInfo>} infos
  */
-function populateWebContentsTab(input) {
+function populateWebContentsTab(infos) {
   const tree = getTreeViewRoot();
 
   // Clear the tree first before populating it with the new content.
   tree.innerText = '';
 
-  for (const webContents of input.infos) {
+  for (const webContents of infos) {
     const item = webContentsToTreeItem(webContents);
     tree.add(item);
   }
@@ -190,8 +192,9 @@
  * Function which retrieves the data for all WebContents associated with the
  * current browser profile. The result is passed to populateWebContentsTab.
  */
-function loadWebContentsInfo() {
-  pageHandler.getAllWebContentsInfo().then(populateWebContentsTab);
+async function loadWebContentsInfo() {
+  const {infos} = await pageHandler.getAllWebContentsInfo();
+  populateWebContentsTab(infos);
 }
 
 /**
@@ -252,7 +255,7 @@
 
 document.addEventListener('DOMContentLoaded', function() {
   // Setup Mojo interface to the backend.
-  pageHandler = mojom.ProcessInternalsHandler.getRemote();
+  pageHandler = ProcessInternalsHandler.getRemote();
 
   // Get the Site Isolation mode and populate it.
   pageHandler.getIsolationMode().then((response) => {
@@ -269,4 +272,3 @@
 
   $('refresh-button').addEventListener('click', loadWebContentsInfo);
 });
-})();
diff --git a/content/browser/service_worker/service_worker_registry.cc b/content/browser/service_worker/service_worker_registry.cc
index 5e66b4f..7d83c82 100644
--- a/content/browser/service_worker/service_worker_registry.cc
+++ b/content/browser/service_worker/service_worker_registry.cc
@@ -128,6 +128,36 @@
       callback_;
 };
 
+class ServiceWorkerRegistry::InflightCallApplyPolicyUpdates
+    : public ServiceWorkerRegistry::InflightCall {
+ public:
+  InflightCallApplyPolicyUpdates(
+      std::vector<storage::mojom::LocalStoragePolicyUpdatePtr> policy_updates,
+      base::RepeatingCallback<
+          void(storage::mojom::ServiceWorkerDatabaseStatus status)> callback)
+      : policy_updates_(std::move(policy_updates)),
+        callback_(std::move(callback)) {}
+  ~InflightCallApplyPolicyUpdates() override = default;
+
+  void Run(ServiceWorkerRegistry* registry) override {
+    DCHECK(registry);
+    DCHECK(registry->GetRemoteStorageControl().is_connected());
+    std::vector<storage::mojom::LocalStoragePolicyUpdatePtr>
+        passed_policy_updates;
+    for (const auto& entry : policy_updates_)
+      passed_policy_updates.push_back(entry.Clone());
+
+    registry->GetRemoteStorageControl()->ApplyPolicyUpdates(
+        std::move(passed_policy_updates), callback_);
+  }
+
+ private:
+  std::vector<storage::mojom::LocalStoragePolicyUpdatePtr> policy_updates_;
+  base::RepeatingCallback<void(
+      storage::mojom::ServiceWorkerDatabaseStatus status)>
+      callback_;
+};
+
 // A helper class that runs on the IO thread to observe storage policy updates.
 class ServiceWorkerRegistry::StoragePolicyObserver
     : public storage::SpecialStoragePolicy::Observer {
@@ -1407,6 +1437,13 @@
   FinishRemoteCall(call_id);
 }
 
+void ServiceWorkerRegistry::DidApplyPolicyUpdates(
+    uint64_t call_id,
+    storage::mojom::ServiceWorkerDatabaseStatus status) {
+  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  FinishRemoteCall(call_id);
+}
+
 void ServiceWorkerRegistry::DidGetRegisteredOriginsOnStartup(
     const std::vector<url::Origin>& origins) {
   DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
@@ -1440,8 +1477,14 @@
     }
   }
 
-  if (!policy_updates.empty())
-    GetRemoteStorageControl()->ApplyPolicyUpdates(std::move(policy_updates));
+  if (!policy_updates.empty()) {
+    uint64_t call_id = GetNextCallId();
+    auto call = std::make_unique<InflightCallApplyPolicyUpdates>(
+        std::move(policy_updates),
+        base::BindRepeating(&ServiceWorkerRegistry::DidApplyPolicyUpdates,
+                            weak_factory_.GetWeakPtr(), call_id));
+    StartRemoteCall(call_id, std::move(call));
+  }
 }
 
 bool ServiceWorkerRegistry::ShouldPurgeOnShutdown(const url::Origin& origin) {
diff --git a/content/browser/service_worker/service_worker_registry.h b/content/browser/service_worker/service_worker_registry.h
index c10a3508..826e653 100644
--- a/content/browser/service_worker/service_worker_registry.h
+++ b/content/browser/service_worker/service_worker_registry.h
@@ -253,6 +253,8 @@
  private:
   friend class ServiceWorkerRegistryTest;
   FRIEND_TEST_ALL_PREFIXES(ServiceWorkerRegistryTest, StoragePolicyChange);
+  FRIEND_TEST_ALL_PREFIXES(ServiceWorkerRegistryTest,
+                           RetryInflightCalls_ApplyPolicyUpdates);
 
   void Start();
 
@@ -385,6 +387,9 @@
                                const std::vector<url::Origin>& origins);
   void DidPerformStorageCleanup(base::OnceClosure callback, uint64_t call_id);
   void DidDisable(uint64_t call_id);
+  void DidApplyPolicyUpdates(
+      uint64_t call_id,
+      storage::mojom::ServiceWorkerDatabaseStatus status);
 
   // TODO(bashi): Consider introducing a helper class that handles the below.
   // These are almost the same as DOMStorageContextWrapper.
@@ -410,9 +415,13 @@
   // represent a mojo remote call of which parameters are copyable.
   class InflightCallWithInvoker;
 
-  // An InflightCall implementation for StoreRegistration(). This specialization
-  // is needed to hold move-only parameters and clone them for retry.
+  // InflightCall implementations that need to clone move-only parameters before
+  // invoking mojo method calls.
+  //
+  // For StoreRegistration():
   class InflightCallStoreRegistration;
+  // For ApplyPolicyUpdates():
+  class InflightCallApplyPolicyUpdates;
 
   uint64_t GetNextCallId();
   void StartRemoteCall(uint64_t call_id, std::unique_ptr<InflightCall> call);
diff --git a/content/browser/service_worker/service_worker_registry_unittest.cc b/content/browser/service_worker/service_worker_registry_unittest.cc
index 8213f50..3224837b 100644
--- a/content/browser/service_worker/service_worker_registry_unittest.cc
+++ b/content/browser/service_worker/service_worker_registry_unittest.cc
@@ -1642,6 +1642,37 @@
       kExpectedRetryCountForRecovery, kExpectedSampleCount);
 }
 
+// Similar to `StoragePolicyChange` test but restart the remote storage to make
+// sure ApplyPolicyUpdates() is retried.
+TEST_F(ServiceWorkerRegistryTest, RetryInflightCalls_ApplyPolicyUpdates) {
+  EnsureRemoteCallsAreExecuted();
+
+  const GURL kScope("http://www.example.com/scope/");
+  const GURL kScriptUrl("http://www.example.com/script.js");
+  const auto kOrigin(url::Origin::Create(kScope));
+
+  scoped_refptr<ServiceWorkerRegistration> registration =
+      CreateServiceWorkerRegistrationAndVersion(context(), kScope, kScriptUrl,
+                                                /*resource_id=*/1);
+
+  ASSERT_EQ(StoreRegistration(registration, registration->waiting_version()),
+            blink::ServiceWorkerStatusCode::kOk);
+  EXPECT_FALSE(registry()->ShouldPurgeOnShutdown(kOrigin));
+
+  // Update storage policy to mark the origin should be purged on shutdown.
+  EXPECT_EQ(inflight_call_count(), 0U);
+  special_storage_policy()->AddSessionOnly(kOrigin.GetURL());
+  special_storage_policy()->NotifyPolicyChanged();
+  EXPECT_EQ(inflight_call_count(), 1U);
+
+  registry()->SimulateStorageRestartForTesting();
+
+  EnsureRemoteCallsAreExecuted();
+  EXPECT_EQ(inflight_call_count(), 0U);
+
+  EXPECT_TRUE(registry()->ShouldPurgeOnShutdown(kOrigin));
+}
+
 class ServiceWorkerRegistryOriginTrialsTest : public ServiceWorkerRegistryTest {
  public:
   ServiceWorkerRegistryOriginTrialsTest() {
diff --git a/content/browser/service_worker/service_worker_storage.cc b/content/browser/service_worker/service_worker_storage.cc
index aaf07b2..afefc51 100644
--- a/content/browser/service_worker/service_worker_storage.cc
+++ b/content/browser/service_worker/service_worker_storage.cc
@@ -1189,7 +1189,29 @@
 
 void ServiceWorkerStorage::ApplyPolicyUpdates(
     const std::vector<storage::mojom::LocalStoragePolicyUpdatePtr>&
-        policy_updates) {
+        policy_updates,
+    DatabaseStatusCallback callback) {
+  switch (state_) {
+    case STORAGE_STATE_DISABLED:
+      std::move(callback).Run(ServiceWorkerDatabase::Status::kErrorDisabled);
+      return;
+    case STORAGE_STATE_INITIALIZING:
+    case STORAGE_STATE_UNINITIALIZED: {
+      // An explicit clone is needed to pass `policy_updates` to LazyInitialize.
+      std::vector<storage::mojom::LocalStoragePolicyUpdatePtr>
+          cloned_policy_updates;
+      for (const auto& entry : policy_updates)
+        cloned_policy_updates.push_back(entry.Clone());
+
+      LazyInitialize(base::BindOnce(
+          &ServiceWorkerStorage::ApplyPolicyUpdates, weak_factory_.GetWeakPtr(),
+          std::move(cloned_policy_updates), std::move(callback)));
+      return;
+    }
+    case STORAGE_STATE_INITIALIZED:
+      break;
+  }
+
   for (const auto& update : policy_updates) {
     GURL url = update->origin.GetURL();
     if (!update->purge_on_shutdown)
@@ -1197,6 +1219,8 @@
     else
       origins_to_purge_on_shutdown_.insert(std::move(url));
   }
+
+  std::move(callback).Run(ServiceWorkerDatabase::Status::kOk);
 }
 
 ServiceWorkerStorage::ServiceWorkerStorage(
diff --git a/content/browser/service_worker/service_worker_storage.h b/content/browser/service_worker/service_worker_storage.h
index 9c051c5..43836e00 100644
--- a/content/browser/service_worker/service_worker_storage.h
+++ b/content/browser/service_worker/service_worker_storage.h
@@ -284,7 +284,8 @@
   // Applies |policy_updates|.
   void ApplyPolicyUpdates(
       const std::vector<storage::mojom::LocalStoragePolicyUpdatePtr>&
-          policy_updates);
+          policy_updates,
+      DatabaseStatusCallback callback);
 
   void LazyInitializeForTest();
 
diff --git a/content/browser/service_worker/service_worker_storage_control_impl.cc b/content/browser/service_worker/service_worker_storage_control_impl.cc
index 362328b..1a1d6e2 100644
--- a/content/browser/service_worker/service_worker_storage_control_impl.cc
+++ b/content/browser/service_worker/service_worker_storage_control_impl.cc
@@ -369,8 +369,9 @@
 
 void ServiceWorkerStorageControlImpl::ApplyPolicyUpdates(
     const std::vector<storage::mojom::LocalStoragePolicyUpdatePtr>
-        policy_updates) {
-  storage_->ApplyPolicyUpdates(std::move(policy_updates));
+        policy_updates,
+    ApplyPolicyUpdatesCallback callback) {
+  storage_->ApplyPolicyUpdates(std::move(policy_updates), std::move(callback));
 }
 
 void ServiceWorkerStorageControlImpl::GetPurgingResourceIdsForTest(
diff --git a/content/browser/service_worker/service_worker_storage_control_impl.h b/content/browser/service_worker/service_worker_storage_control_impl.h
index fe5e558..1ff3a5e 100644
--- a/content/browser/service_worker/service_worker_storage_control_impl.h
+++ b/content/browser/service_worker/service_worker_storage_control_impl.h
@@ -148,7 +148,8 @@
   void PerformStorageCleanup(PerformStorageCleanupCallback callback) override;
   void ApplyPolicyUpdates(
       const std::vector<storage::mojom::LocalStoragePolicyUpdatePtr>
-          policy_updates) override;
+          policy_updates,
+      ApplyPolicyUpdatesCallback callback) override;
   void GetPurgingResourceIdsForTest(
       GetPurgingResourceIdsForTestCallback callback) override;
   void GetPurgeableResourceIdsForTest(
diff --git a/content/browser/service_worker/service_worker_storage_control_impl_unittest.cc b/content/browser/service_worker/service_worker_storage_control_impl_unittest.cc
index a25ffb7..8e3de3f 100644
--- a/content/browser/service_worker/service_worker_storage_control_impl_unittest.cc
+++ b/content/browser/service_worker/service_worker_storage_control_impl_unittest.cc
@@ -1447,7 +1447,14 @@
   std::vector<storage::mojom::LocalStoragePolicyUpdatePtr> updates;
   updates.push_back(storage::mojom::LocalStoragePolicyUpdate::New(
       url::Origin::Create(kScope2.GetOrigin()), /*purge_on_shutdown=*/true));
-  storage()->ApplyPolicyUpdates(std::move(updates));
+  base::RunLoop loop;
+  storage()->ApplyPolicyUpdates(
+      std::move(updates),
+      base::BindLambdaForTesting([&](DatabaseStatus status) {
+        EXPECT_EQ(status, DatabaseStatus::kOk);
+        loop.Quit();
+      }));
+  loop.Run();
 
   // Restart the storage and check the registration for |kScope1| exists
   // but not for |kScope2|.
diff --git a/content/browser/web_package/signed_exchange_handler.cc b/content/browser/web_package/signed_exchange_handler.cc
index 094aa7a..51a99af 100644
--- a/content/browser/web_package/signed_exchange_handler.cc
+++ b/content/browser/web_package/signed_exchange_handler.cc
@@ -540,14 +540,10 @@
   if (!net::asn1::HasCanSignHttpExchangesDraftExtension(
           net::x509_util::CryptoBufferAsStringPiece(
               verified_cert->cert_buffer())) &&
-      !base::FeatureList::IsEnabled(
-          features::kAllowSignedHTTPExchangeCertsWithoutExtension) &&
       !unverified_cert_chain_->ShouldIgnoreErrors()) {
     signed_exchange_utils::ReportErrorAndTraceEvent(
         devtools_proxy_.get(),
-        "Certificate must have CanSignHttpExchangesDraft extension. To ignore "
-        "this error for testing, enable "
-        "chrome://flags/#allow-sxg-certs-without-extension.",
+        "Certificate must have CanSignHttpExchangesDraft extension.",
         std::make_pair(0 /* signature_index */,
                        SignedExchangeError::Field::kSignatureCertUrl));
     return SignedExchangeLoadResult::kCertRequirementsNotMet;
diff --git a/content/browser/web_package/signed_exchange_handler_unittest.cc b/content/browser/web_package/signed_exchange_handler_unittest.cc
index cfa20744..66eb121 100644
--- a/content/browser/web_package/signed_exchange_handler_unittest.cc
+++ b/content/browser/web_package/signed_exchange_handler_unittest.cc
@@ -656,32 +656,6 @@
   EXPECT_EQ(static_cast<int>(expected_payload.size()), rv);
 }
 
-TEST_P(SignedExchangeHandlerTest, CertWithoutExtensionAllowedByFeatureFlag) {
-  base::test::ScopedFeatureList scoped_feature_list_;
-  scoped_feature_list_.InitAndEnableFeature(
-      features::kAllowSignedHTTPExchangeCertsWithoutExtension);
-
-  mock_cert_fetcher_factory_->ExpectFetch(
-      GURL("https://cert.example.org/cert.msg"),
-      GetTestFileContents("test.example.org-noext.public.pem.cbor"));
-  SetupMockCertVerifier("prime256v1-sha256-noext.public.pem",
-                        CreateCertVerifyResult());
-  SetSourceStreamContents("test.example.org_noext_test.sxg");
-
-  CreateSignedExchangeHandler(CreateTestURLRequestContext());
-  WaitForHeader();
-
-  ASSERT_TRUE(read_header());
-  EXPECT_EQ(SignedExchangeLoadResult::kSuccess, result());
-  EXPECT_EQ(net::OK, error());
-  std::string payload;
-  int rv = ReadPayloadStream(&payload);
-  std::string expected_payload = GetTestFileContents("test.html");
-
-  EXPECT_EQ(expected_payload, payload);
-  EXPECT_EQ(static_cast<int>(expected_payload.size()), rv);
-}
-
 TEST_P(SignedExchangeHandlerTest,
        CertWithoutExtensionAllowedByIgnoreErrorsSPKIListFlag) {
   SetIgnoreCertificateErrorsSPKIList(kPEMECDSAP256SPKIHash);
diff --git a/content/browser/webauth/authenticator_impl_unittest.cc b/content/browser/webauth/authenticator_impl_unittest.cc
index c6868a6..c981331 100644
--- a/content/browser/webauth/authenticator_impl_unittest.cc
+++ b/content/browser/webauth/authenticator_impl_unittest.cc
@@ -3947,6 +3947,11 @@
   device::VirtualCtap2Device::Config config;
   config.pin_support = true;
   config.always_uv = true;
+
+  // Enable u2f support. Normally, this would allow chrome to create a
+  // credential without internal user verification, but we should not attempt
+  // that with the alwaysUv flag on.
+  config.u2f_support = true;
   virtual_device_factory_->SetCtap2Config(config);
   virtual_device_factory_->mutable_state()->pin = kTestPIN;
   test_client_.expected = {{device::kMaxPinRetries, kTestPIN}};
@@ -4192,6 +4197,7 @@
   device::VirtualCtap2Device::Config config;
   config.pin_support = true;
   config.always_uv = true;
+  config.u2f_support = true;
   virtual_device_factory_->SetCtap2Config(config);
   virtual_device_factory_->mutable_state()->pin = kTestPIN;
   PublicKeyCredentialRequestOptionsPtr options =
diff --git a/content/browser/webui/shared_resources_data_source.cc b/content/browser/webui/shared_resources_data_source.cc
index 548e8d6..f4418345 100644
--- a/content/browser/webui/shared_resources_data_source.cc
+++ b/content/browser/webui/shared_resources_data_source.cc
@@ -81,6 +81,7 @@
   return std::map<int, std::string>{
       {IDR_ORIGIN_MOJO_HTML, "mojo/url/mojom/origin.mojom.html"},
       {IDR_ORIGIN_MOJO_JS, "mojo/url/mojom/origin.mojom-lite.js"},
+      {IDR_ORIGIN_MOJO_WEBUI_JS, "mojo/url/mojom/origin.mojom-webui.js"},
       {IDR_UNGUESSABLE_TOKEN_MOJO_HTML,
        "mojo/mojo/public/mojom/base/unguessable_token.mojom.html"},
       {IDR_UNGUESSABLE_TOKEN_MOJO_JS,
@@ -88,8 +89,8 @@
       {IDR_URL_MOJO_HTML, "mojo/url/mojom/url.mojom.html"},
       {IDR_URL_MOJO_JS, "mojo/url/mojom/url.mojom-lite.js"},
       {IDR_URL_MOJOM_WEBUI_JS, "mojo/url/mojom/url.mojom-webui.js"},
-      {IDR_VULKAN_INFO_MOJO_JS, "gpu/ipc/common/vulkan_info.mojom-lite.js"},
-      {IDR_VULKAN_TYPES_MOJO_JS, "gpu/ipc/common/vulkan_types.mojom-lite.js"},
+      {IDR_VULKAN_INFO_MOJO_JS, "gpu/ipc/common/vulkan_info.mojom-webui.js"},
+      {IDR_VULKAN_TYPES_MOJO_JS, "gpu/ipc/common/vulkan_types.mojom-webui.js"},
   };
 }
 
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc
index 829407a2..cf8a1a6 100644
--- a/content/child/runtime_features.cc
+++ b/content/child/runtime_features.cc
@@ -368,6 +368,7 @@
            blink::features::kIgnoreCrossOriginWindowWhenNamedAccessOnWindow},
           {"LangClientHintHeader", features::kLangClientHintHeader},
           {"LayoutNG", blink::features::kLayoutNG},
+          {"LayoutNGTable", blink::features::kLayoutNGTable},
           {"LayoutNGFieldset", blink::features::kLayoutNGFieldset},
           {"LayoutNGFragmentItem", blink::features::kFragmentItem},
           {"LayoutNGTextControl", blink::features::kLayoutNGTextControl},
diff --git a/content/content_resources.grd b/content/content_resources.grd
index 6c27e86c..036574f 100644
--- a/content/content_resources.grd
+++ b/content/content_resources.grd
@@ -28,6 +28,7 @@
       <include name="IDR_HISTOGRAMS_INTERNALS_JS" file="browser/resources/histograms/histograms_internals.js" type="BINDATA" />
       <include name="IDR_ORIGIN_MOJO_HTML" file="${root_gen_dir}/url/mojom/origin.mojom.html" use_base_dir="false" type="BINDATA" />
       <include name="IDR_ORIGIN_MOJO_JS" file="${root_gen_dir}/url/mojom/origin.mojom-lite.js" use_base_dir="false" type="BINDATA" />
+      <include name="IDR_ORIGIN_MOJO_WEBUI_JS" file="${root_gen_dir}/mojom-webui/url/mojom/origin.mojom-webui.js" use_base_dir="false" type="BINDATA" />
       <include name="IDR_UKM_INTERNALS_HTML" file="../components/ukm/debug/ukm_internals.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
       <include name="IDR_UKM_INTERNALS_JS" file="../components/ukm/debug/ukm_internals.js" type="BINDATA" />
       <include name="IDR_UKM_INTERNALS_CSS" file="../components/ukm/debug/ukm_internals.css" type="BINDATA" />
@@ -36,8 +37,8 @@
       <include name="IDR_URL_MOJO_HTML" file="${root_gen_dir}/url/mojom/url.mojom.html" use_base_dir="false" type="BINDATA" />
       <include name="IDR_URL_MOJO_JS" file="${root_gen_dir}/url/mojom/url.mojom-lite.js" use_base_dir="false" type="BINDATA" />
       <include name="IDR_URL_MOJOM_WEBUI_JS" file="${root_gen_dir}/mojom-webui/url/mojom/url.mojom-webui.js" use_base_dir="false" type="BINDATA" />
-      <include name="IDR_VULKAN_INFO_MOJO_JS" file="${root_gen_dir}/gpu/ipc/common/vulkan_info.mojom-lite.js" use_base_dir="false" type="BINDATA" />
-      <include name="IDR_VULKAN_TYPES_MOJO_JS" file="${root_gen_dir}/gpu/ipc/common/vulkan_types.mojom-lite.js" use_base_dir="false" type="BINDATA" />
+      <include name="IDR_VULKAN_INFO_MOJO_JS" file="${root_gen_dir}/mojom-webui/gpu/ipc/common/vulkan_info.mojom-webui.js" use_base_dir="false" type="BINDATA" />
+      <include name="IDR_VULKAN_TYPES_MOJO_JS" file="${root_gen_dir}/mojom-webui/gpu/ipc/common/vulkan_types.mojom-webui.js" use_base_dir="false" type="BINDATA" />
     </includes>
   </release>
 </grit>
diff --git a/content/dev_ui_content_resources.grd b/content/dev_ui_content_resources.grd
index 38e132b3..d59286d 100644
--- a/content/dev_ui_content_resources.grd
+++ b/content/dev_ui_content_resources.grd
@@ -21,9 +21,12 @@
       <include name="IDR_CONVERSION_INTERNALS_HTML" file="browser/resources/conversions/conversion_internals.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
       <include name="IDR_CONVERSION_INTERNALS_JS" file="browser/resources/conversions/conversion_internals.js" type="BINDATA" />
       <include name="IDR_CONVERSION_INTERNALS_CSS" file="browser/resources/conversions/conversion_internals.css" type="BINDATA" />
-      <include name="IDR_CONVERSION_INTERNALS_MOJOM_JS" file="${root_gen_dir}/content/browser/conversions/conversion_internals.mojom-lite.js" use_base_dir="false" type="BINDATA" />
+      <include name="IDR_CONVERSION_INTERNALS_MOJOM_JS" file="${root_gen_dir}/mojom-webui/content/browser/conversions/conversion_internals.mojom-webui.js" use_base_dir="false" type="BINDATA" />
+      <include name="IDR_GPU_BROWSER_BRIDGE_JS" file="browser/resources/gpu/browser_bridge.js" type="BINDATA" />
+      <include name="IDR_GPU_INFO_VIEW_JS" file="browser/resources/gpu/info_view.js" type="BINDATA" />
       <include name="IDR_GPU_INTERNALS_HTML" file="browser/resources/gpu/gpu_internals.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
-      <include name="IDR_GPU_INTERNALS_JS" file="browser/resources/gpu/gpu_internals.js" flattenhtml="true" type="BINDATA" />
+      <include name="IDR_GPU_INTERNALS_JS" file="browser/resources/gpu/gpu_internals.js" type="BINDATA" />
+      <include name="IDR_GPU_VULKAN_INFO_JS" file="browser/resources/gpu/vulkan_info.js" type="BINDATA" />
       <include name="IDR_INDEXED_DB_INTERNALS_HTML" file="browser/resources/indexed_db/indexeddb_internals.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
       <include name="IDR_INDEXED_DB_INTERNALS_JS" file="browser/resources/indexed_db/indexeddb_internals.js" type="BINDATA" />
       <include name="IDR_INDEXED_DB_INTERNALS_CSS" file="browser/resources/indexed_db/indexeddb_internals.css" type="BINDATA" />
@@ -31,7 +34,7 @@
       <include name="IDR_NETWORK_ERROR_LISTING_JS" file="browser/resources/net/network_errors_listing.js" type="BINDATA" />
       <include name="IDR_NETWORK_ERROR_LISTING_CSS" file="browser/resources/net/network_errors_listing.css" type="BINDATA" />
       <include name="IDR_PROCESS_INTERNALS_HTML" file="browser/resources/process/process_internals.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
-      <include name="IDR_PROCESS_INTERNALS_MOJO_JS" file="${root_gen_dir}/content/browser/process_internals/process_internals.mojom-lite.js" use_base_dir="false" type="BINDATA" />
+      <include name="IDR_PROCESS_INTERNALS_MOJO_JS" file="${root_gen_dir}/mojom-webui/content/browser/process_internals/process_internals.mojom-webui.js" use_base_dir="false" type="BINDATA" />
       <include name="IDR_PROCESS_INTERNALS_CSS" file="browser/resources/process/process_internals.css" flattenhtml="true" type="BINDATA" />
       <include name="IDR_PROCESS_INTERNALS_JS" file="browser/resources/process/process_internals.js" type="BINDATA" />
       <include name="IDR_SERVICE_WORKER_INTERNALS_HTML" file="browser/resources/service_worker/serviceworker_internals.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index dc3fd9a..ce8905d0 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -29,14 +29,6 @@
     "AllowContentInitiatedDataUrlNavigations",
     base::FEATURE_DISABLED_BY_DEFAULT};
 
-// Accepts Origin-Signed HTTP Exchanges to be signed with certificates
-// that do not have CanSignHttpExchangesDraft extension.
-// TODO(https://crbug.com/862003): Remove when certificates with
-// CanSignHttpExchangesDraft extension are available from trusted CAs.
-const base::Feature kAllowSignedHTTPExchangeCertsWithoutExtension{
-    "AllowSignedHTTPExchangeCertsWithoutExtension",
-    base::FEATURE_DISABLED_BY_DEFAULT};
-
 // Allows Blink to request fonts from the Android Downloadable Fonts API through
 // the service implemented on the Java side.
 const base::Feature kAndroidDownloadableFontsMatching{
@@ -456,14 +448,8 @@
     "OpenXrExtendedFeatureSupport", base::FEATURE_DISABLED_BY_DEFAULT};
 
 // History navigation in response to horizontal overscroll (aka gesture-nav).
-const base::Feature kOverscrollHistoryNavigation {
-  "OverscrollHistoryNavigation",
-#if defined(OS_ANDROID)
-      base::FEATURE_DISABLED_BY_DEFAULT
-#else
-      base::FEATURE_ENABLED_BY_DEFAULT
-#endif
-};
+const base::Feature kOverscrollHistoryNavigation{
+    "OverscrollHistoryNavigation", base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Whether web apps can run periodic tasks upon network connectivity.
 const base::Feature kPeriodicBackgroundSync{"PeriodicBackgroundSync",
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index f8a1e77..9940f38 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -20,8 +20,6 @@
 CONTENT_EXPORT extern const base::Feature
     kAllowContentInitiatedDataUrlNavigations;
 CONTENT_EXPORT extern const base::Feature kAndroidDownloadableFontsMatching;
-CONTENT_EXPORT extern const base::Feature
-    kAllowSignedHTTPExchangeCertsWithoutExtension;
 CONTENT_EXPORT extern const base::Feature kAudioServiceLaunchOnStartup;
 CONTENT_EXPORT extern const base::Feature kAudioServiceOutOfProcess;
 CONTENT_EXPORT extern const base::Feature kAudioServiceSandbox;
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 21582a4..2d17b29 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -5386,10 +5386,14 @@
   // Note: Calling swap() will detach and delete |previous_frame|, so do not
   // reference it after this.
   WebFrame* previous_web_frame = ResolveWebFrame(previous_routing_id_);
+
+  // With RenderDocument it's possible for the frame to be deleted as a side
+  // effect of JS event handlers called during swap.
+  bool is_main_frame = is_main_frame_;
   if (!previous_web_frame->Swap(frame_)) {
     // Main frames should always swap successfully because there is no parent
     // frame to cause them to become detached.
-    DCHECK(!is_main_frame_);
+    DCHECK(!is_main_frame);
     return false;
   }
 
diff --git a/content/test/content_browser_test_utils_internal.cc b/content/test/content_browser_test_utils_internal.cc
index 2894399..51fa4f1 100644
--- a/content/test/content_browser_test_utils_internal.cc
+++ b/content/test/content_browser_test_utils_internal.cc
@@ -299,6 +299,10 @@
     return base::StringPrintf("Z%d", static_cast<int>(index - 25));
 }
 
+std::string DepictFrameTree(FrameTreeNode& root) {
+  return FrameTreeVisualizer().DepictFrameTree(&root);
+}
+
 Shell* OpenPopup(const ToRenderFrameHost& opener,
                  const GURL& url,
                  const std::string& name) {
diff --git a/content/test/content_browser_test_utils_internal.h b/content/test/content_browser_test_utils_internal.h
index af970bc737..bada8ac8 100644
--- a/content/test/content_browser_test_utils_internal.h
+++ b/content/test/content_browser_test_utils_internal.h
@@ -103,6 +103,13 @@
   DISALLOW_COPY_AND_ASSIGN(FrameTreeVisualizer);
 };
 
+// Uses FrameTreeVisualizer to draw a text representation of the FrameTree that
+// is appropriate for use in assertions. If you are going to depict multiple
+// trees in a single test, you might want to construct a longer-lived instance
+// of FrameTreeVisualizer as this will ensure consistent naming of the site
+// instances across all calls.
+std::string DepictFrameTree(FrameTreeNode& root);
+
 // Uses window.open to open a popup from the frame |opener| with the specified
 // |url|, |name| and window |features|. |expect_return_from_window_open| is used
 // to indicate if the caller expects window.open() to return a non-null value.
diff --git a/content/test/data/accessibility/aria/aria-description.html b/content/test/data/accessibility/aria/aria-description.html
index 5ce71a6b..ecb299d073 100644
--- a/content/test/data/accessibility/aria/aria-description.html
+++ b/content/test/data/accessibility/aria/aria-description.html
@@ -3,6 +3,6 @@
 <body>
   <div aria-label="description" aria-description="Text description" ></div>
   <div aria-label="both" aria-description="describedby overrides description" aria-describedby="desc1" ></div>
-  <div role="tooltip" id="desc1">Description from describedby</div> 
+  <div role="tooltip" id="desc1">Description from describedby</div>
 </body>
 </html>
diff --git a/content/test/data/accessibility/html/ruby-expected-android.txt b/content/test/data/accessibility/html/ruby-expected-android.txt
index 94fa057..3a419b6d 100644
--- a/content/test/data/accessibility/html/ruby-expected-android.txt
+++ b/content/test/data/accessibility/html/ruby-expected-android.txt
@@ -1,5 +1,3 @@
 android.webkit.WebView focusable focused scrollable
 ++android.view.View
-++++android.view.View
-++++++android.view.View name='ruby text'
-++++++android.widget.TextView name='ruby base'
\ No newline at end of file
+++++android.view.View name='ruby base' hint='ruby text'
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/ruby-expected-auralinux.txt b/content/test/data/accessibility/html/ruby-expected-auralinux.txt
index 0fbf4855..f19669a 100644
--- a/content/test/data/accessibility/html/ruby-expected-auralinux.txt
+++ b/content/test/data/accessibility/html/ruby-expected-auralinux.txt
@@ -1,6 +1,4 @@
 [document web]
 ++[section]
-++++[static]
-++++++[panel]
-++++++++[static] name='ruby text'
-++++++[static] name='ruby base'
+++++[section] description='ruby text' described-by
+++++++[static] name='ruby base'
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/ruby-expected-blink.txt b/content/test/data/accessibility/html/ruby-expected-blink.txt
index 92dff8bc..b20688d9 100644
--- a/content/test/data/accessibility/html/ruby-expected-blink.txt
+++ b/content/test/data/accessibility/html/ruby-expected-blink.txt
@@ -1,9 +1,7 @@
 rootWebArea
 ++genericContainer ignored
 ++++genericContainer
-++++++ruby
-++++++++rubyAnnotation
-++++++++++staticText name='ruby text'
-++++++++++++inlineTextBox name='ruby text'
+++++++ruby description='ruby text' descriptionFrom=relatedElement
 ++++++++staticText name='ruby base'
 ++++++++++inlineTextBox name='ruby base'
+++++++++rubyAnnotation ignored name='ruby text'
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/ruby-expected-mac.txt b/content/test/data/accessibility/html/ruby-expected-mac.txt
index 3990f8e..7e64c556 100644
--- a/content/test/data/accessibility/html/ruby-expected-mac.txt
+++ b/content/test/data/accessibility/html/ruby-expected-mac.txt
@@ -1,4 +1,4 @@
 AXWebArea
 ++AXGroup
-++++AXStaticText AXValue='ruby text'
-++++AXStaticText AXValue='ruby base'
+++++AXGroup AXHelp='ruby text'
+++++++AXStaticText AXValue='ruby base'
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/ruby-expected-uia-win.txt b/content/test/data/accessibility/html/ruby-expected-uia-win.txt
index 18fc8a4..51df88a26 100644
--- a/content/test/data/accessibility/html/ruby-expected-uia-win.txt
+++ b/content/test/data/accessibility/html/ruby-expected-uia-win.txt
@@ -1,6 +1,4 @@
 Document
 ++Group IsControlElement=false
-++++Pane IsControlElement=false
-++++++Text IsControlElement=false
-++++++++Text Name='ruby text'
-++++++Text Name='ruby base'
+++++Group
+++++++Text Name='ruby base'
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/ruby-expected-win.txt b/content/test/data/accessibility/html/ruby-expected-win.txt
index eaee683..cfe70c7 100644
--- a/content/test/data/accessibility/html/ruby-expected-win.txt
+++ b/content/test/data/accessibility/html/ruby-expected-win.txt
@@ -1,6 +1,4 @@
 ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE
 ++IA2_ROLE_SECTION
-++++IA2_ROLE_TEXT_FRAME
-++++++ROLE_SYSTEM_STATICTEXT
-++++++++ROLE_SYSTEM_STATICTEXT name='ruby text'
-++++++ROLE_SYSTEM_STATICTEXT name='ruby base'
+++++IA2_ROLE_SECTION description='ruby text'
+++++++ROLE_SYSTEM_STATICTEXT name='ruby base'
\ No newline at end of file
diff --git a/content/test/gpu/gpu_tests/gpu_process_integration_test.py b/content/test/gpu/gpu_tests/gpu_process_integration_test.py
index 434a756e0..4d9a8a2 100644
--- a/content/test/gpu/gpu_tests/gpu_process_integration_test.py
+++ b/content/test/gpu/gpu_tests/gpu_process_integration_test.py
@@ -39,6 +39,14 @@
 """
 
 
+def _GetBrowserBridgeProperty(tab, path):
+  """The GPU WebUI uses JS modules and may not have initialized the global
+    browserBridge object by the time we can start injecting JavaScript. This
+    ensures we don't have that problem."""
+  tab.WaitForJavaScriptCondition('window.gpuPagePopulated', timeout=10)
+  return tab.EvaluateJavaScript('browserBridge.' + path)
+
+
 class GpuProcessIntegrationTest(gpu_integration_test.GpuIntegrationTest):
   @classmethod
   def Name(cls):
@@ -211,7 +219,7 @@
                 'workarounds are not equal: %s != %s, diff: %s' %
                 (browser_list, gpu_list, list(diff)))
 
-    basic_infos = tab.EvaluateJavaScript('browserBridge.gpuInfo.basicInfo')
+    basic_infos = _GetBrowserBridgeProperty(tab, 'gpuInfo.basicInfo')
     disabled_gl_extensions = None
     for info in basic_infos:
       if info['description'].startswith('Disabled Extensions'):
@@ -276,8 +284,8 @@
         cba.DISABLE_GPU_COMPOSITING,
     ])
     self._Navigate(test_path)
-    feature_status_list = self.tab.EvaluateJavaScript(
-        'browserBridge.gpuInfo.featureStatus.featureStatus')
+    feature_status_list = _GetBrowserBridgeProperty(
+        self.tab, 'gpuInfo.featureStatus.featureStatus')
     result = True
     for name, status in feature_status_list.items():
       if name == 'webgl':
@@ -293,8 +301,8 @@
     # Hit test group 2 with entry 153 from kSoftwareRenderingListEntries.
     self.RestartBrowserIfNecessaryWithArgs(['--gpu-blocklist-test-group=2'])
     self._Navigate(test_path)
-    feature_status_list = self.tab.EvaluateJavaScript(
-        'browserBridge.gpuInfo.featureStatus.featureStatus')
+    feature_status_list = _GetBrowserBridgeProperty(
+        self.tab, 'gpuInfo.featureStatus.featureStatus')
     for name, status in feature_status_list.items():
       if name == 'webgl' and status != 'unavailable_software':
         self.fail('WebGL status for SwiftShader failed: %s' % status)
@@ -307,8 +315,8 @@
     if sys.platform.startswith('linux'):
       return
 
-    feature_status_for_hardware_gpu_list = self.tab.EvaluateJavaScript(
-        'browserBridge.gpuInfo.featureStatusForHardwareGpu.featureStatus')
+    feature_status_for_hardware_gpu_list = _GetBrowserBridgeProperty(
+        self.tab, 'gpuInfo.featureStatusForHardwareGpu.featureStatus')
     for name, status in feature_status_for_hardware_gpu_list.items():
       if name == 'webgl' and status != 'unavailable_off':
         self.fail('WebGL status for hardware GPU failed: %s' % status)
diff --git a/content/test/gpu/gpu_tests/hardware_accelerated_feature_integration_test.py b/content/test/gpu/gpu_tests/hardware_accelerated_feature_integration_test.py
index b5dca70..fbf722e 100644
--- a/content/test/gpu/gpu_tests/hardware_accelerated_feature_integration_test.py
+++ b/content/test/gpu/gpu_tests/hardware_accelerated_feature_integration_test.py
@@ -64,6 +64,7 @@
     feature = args[0]
     self._Navigate(test_path)
     tab = self.tab
+    tab.WaitForJavaScriptCondition('window.gpuPagePopulated', timeout=10)
     if not tab.EvaluateJavaScript(
         'VerifyHardwareAccelerated({{ feature }})', feature=feature):
       print 'Test failed. Printing page contents:'
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
index a3b98e6..37ccd70 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
@@ -122,9 +122,6 @@
 # under crbug.com/963205 once these two failures are fixed.
 crbug.com/1136231 [ win ] conformance/extensions/s3tc-and-rgtc.html [ Failure ]
 crbug.com/1136231 [ linux ] conformance/extensions/s3tc-and-rgtc.html [ Failure ]
-crbug.com/1152259 [ win ] conformance/reading/read-pixels-test.html [ Failure ]
-crbug.com/1152259 [ linux ] conformance/reading/read-pixels-test.html [ Failure ]
-crbug.com/1152259 [ mac passthrough ] conformance/reading/read-pixels-test.html [ Failure ]
 
 crbug.com/953120 conformance/programs/program-handling.html [ Failure ]
 
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
index d842e1c..c6e233fd 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
@@ -205,8 +205,6 @@
 # under crbug.com/963205 and crbug.com/964321 once these two failures are fixed.
 crbug.com/1136231 [ win ] conformance/extensions/s3tc-and-rgtc.html [ Failure ]
 crbug.com/1136231 [ linux ] conformance/extensions/s3tc-and-rgtc.html [ Failure ]
-crbug.com/1152259 [ win ] conformance/reading/read-pixels-test.html [ Failure ]
-crbug.com/1152259 [ linux ] conformance/reading/read-pixels-test.html [ Failure ]
 
 # Skipping new tests
 crbug.com/angleproject/5038 conformance/extensions/ext-color-buffer-half-float.html [ Skip ]
diff --git a/content/test/navigation_simulator_impl.cc b/content/test/navigation_simulator_impl.cc
index 268c0c45..1312bd2e 100644
--- a/content/test/navigation_simulator_impl.cc
+++ b/content/test/navigation_simulator_impl.cc
@@ -1358,6 +1358,11 @@
           navigation_url_, params->item_sequence_number,
           params->document_sequence_number));
 
+  params->is_overriding_user_agent =
+      request_ ? (request_->commit_params().is_overriding_user_agent &&
+                  frame_tree_node_->IsMainFrame())
+               : false;
+
   return params;
 }
 
diff --git a/device/fido/ctap2_device_operation.h b/device/fido/ctap2_device_operation.h
index 36f7d12..5c4abc6 100644
--- a/device/fido/ctap2_device_operation.h
+++ b/device/fido/ctap2_device_operation.h
@@ -122,7 +122,7 @@
     // TODO: it would be nice to see which device each response is coming from,
     // but that breaks every mock test because they aren't expecting a call to
     // GetId().
-    if (!device_response) {
+    if (!device_response || device_response->empty()) {
       FIDO_LOG(ERROR) << "-> (error reading)";
       std::move(this->callback())
           .Run(CtapDeviceResponseCode::kCtap2ErrOther, base::nullopt);
@@ -131,8 +131,8 @@
 
     auto response_code = GetResponseCode(*device_response);
     if (response_code != CtapDeviceResponseCode::kSuccess) {
-      FIDO_LOG(DEBUG) << "-> (CTAP2 error code "
-                      << static_cast<int>(response_code) << ")";
+      FIDO_LOG(DEBUG) << "-> (CTAP2 error code " << +device_response->at(0)
+                      << ")";
       std::move(this->callback()).Run(response_code, base::nullopt);
       return;
     }
diff --git a/device/fido/device_response_converter.cc b/device/fido/device_response_converter.cc
index 29cda8a..e7b6029 100644
--- a/device/fido/device_response_converter.cc
+++ b/device/fido/device_response_converter.cc
@@ -58,9 +58,8 @@
   if (buffer.empty())
     return CtapDeviceResponseCode::kCtap2ErrInvalidCBOR;
 
-  auto code = static_cast<CtapDeviceResponseCode>(buffer[0]);
-  return base::Contains(kCtapResponseCodeList, code)
-             ? code
+  return kCtapResponseCodeList.contains(buffer[0])
+             ? static_cast<CtapDeviceResponseCode>(buffer[0])
              : CtapDeviceResponseCode::kCtap2ErrInvalidCBOR;
 }
 
@@ -196,9 +195,15 @@
 
 base::Optional<AuthenticatorGetInfoResponse> ReadCTAPGetInfoResponse(
     base::span<const uint8_t> buffer) {
-  if (buffer.size() <= kResponseCodeLength ||
-      GetResponseCode(buffer) != CtapDeviceResponseCode::kSuccess)
+  if (buffer.size() <= kResponseCodeLength) {
+    FIDO_LOG(ERROR) << "-> (GetInfo response too short: " << buffer.size()
+                    << " bytes)";
     return base::nullopt;
+  }
+  if (GetResponseCode(buffer) != CtapDeviceResponseCode::kSuccess) {
+    FIDO_LOG(ERROR) << "-> (GetInfo CTAP2 error code " << +buffer[0] << ")";
+    return base::nullopt;
+  }
 
   cbor::Reader::DecoderError error;
   base::Optional<CBOR> decoded_response =
diff --git a/device/fido/fido_constants.h b/device/fido/fido_constants.h
index 7aceaac..31d21a6 100644
--- a/device/fido/fido_constants.h
+++ b/device/fido/fido_constants.h
@@ -11,6 +11,7 @@
 #include <vector>
 
 #include "base/component_export.h"
+#include "base/containers/fixed_flat_set.h"
 #include "base/time/time.h"
 #include "device/fido/fido_types.h"
 
@@ -117,9 +118,13 @@
   kCtap2ErrPinPolicyViolation = 0x37,
   kCtap2ErrPinTokenExpired = 0x38,
   kCtap2ErrRequestTooLarge = 0x39,
+  kCtap2ErrActionTimeout = 0x3A,
+  kCtap2ErrUpRequired = 0x3B,
   kCtap2ErrUvBlocked = 0x3C,
   kCtap2ErrIntegrityFailure = 0x3D,
+  kCtap2ErrInvalidSubcommand = 0x3E,
   kCtap2ErrUvInvalid = 0x3F,
+  kCtap2ErrUnauthorizedPermission = 0x40,
   kCtap2ErrOther = 0x7F,
   kCtap2ErrSpecLast = 0xDF,
   kCtap2ErrExtensionFirst = 0xE0,
@@ -128,59 +133,64 @@
   kCtap2ErrVendorLast = 0xFF
 };
 
-constexpr std::array<CtapDeviceResponseCode, 51> kCtapResponseCodeList{
-    CtapDeviceResponseCode::kSuccess,
-    CtapDeviceResponseCode::kCtap1ErrInvalidCommand,
-    CtapDeviceResponseCode::kCtap1ErrInvalidParameter,
-    CtapDeviceResponseCode::kCtap1ErrInvalidLength,
-    CtapDeviceResponseCode::kCtap1ErrInvalidSeq,
-    CtapDeviceResponseCode::kCtap1ErrTimeout,
-    CtapDeviceResponseCode::kCtap1ErrChannelBusy,
-    CtapDeviceResponseCode::kCtap1ErrLockRequired,
-    CtapDeviceResponseCode::kCtap1ErrInvalidChannel,
-    CtapDeviceResponseCode::kCtap2ErrCBORUnexpectedType,
-    CtapDeviceResponseCode::kCtap2ErrInvalidCBOR,
-    CtapDeviceResponseCode::kCtap2ErrMissingParameter,
-    CtapDeviceResponseCode::kCtap2ErrLimitExceeded,
-    CtapDeviceResponseCode::kCtap2ErrUnsupportedExtension,
-    CtapDeviceResponseCode::kCtap2ErrTooManyElements,
-    CtapDeviceResponseCode::kCtap2ErrLargeBlobStorageFull,
-    CtapDeviceResponseCode::kCtap2ErrCredentialExcluded,
-    CtapDeviceResponseCode::kCtap2ErrProcesssing,
-    CtapDeviceResponseCode::kCtap2ErrInvalidCredential,
-    CtapDeviceResponseCode::kCtap2ErrUserActionPending,
-    CtapDeviceResponseCode::kCtap2ErrOperationPending,
-    CtapDeviceResponseCode::kCtap2ErrNoOperations,
-    CtapDeviceResponseCode::kCtap2ErrUnsupportedAlgorithm,
-    CtapDeviceResponseCode::kCtap2ErrOperationDenied,
-    CtapDeviceResponseCode::kCtap2ErrKeyStoreFull,
-    CtapDeviceResponseCode::kCtap2ErrNotBusy,
-    CtapDeviceResponseCode::kCtap2ErrNoOperationPending,
-    CtapDeviceResponseCode::kCtap2ErrUnsupportedOption,
-    CtapDeviceResponseCode::kCtap2ErrInvalidOption,
-    CtapDeviceResponseCode::kCtap2ErrKeepAliveCancel,
-    CtapDeviceResponseCode::kCtap2ErrNoCredentials,
-    CtapDeviceResponseCode::kCtap2ErrUserActionTimeout,
-    CtapDeviceResponseCode::kCtap2ErrNotAllowed,
-    CtapDeviceResponseCode::kCtap2ErrPinInvalid,
-    CtapDeviceResponseCode::kCtap2ErrPinBlocked,
-    CtapDeviceResponseCode::kCtap2ErrPinAuthInvalid,
-    CtapDeviceResponseCode::kCtap2ErrPinAuthBlocked,
-    CtapDeviceResponseCode::kCtap2ErrPinNotSet,
-    CtapDeviceResponseCode::kCtap2ErrPinRequired,
-    CtapDeviceResponseCode::kCtap2ErrPinPolicyViolation,
-    CtapDeviceResponseCode::kCtap2ErrPinTokenExpired,
-    CtapDeviceResponseCode::kCtap2ErrRequestTooLarge,
-    CtapDeviceResponseCode::kCtap2ErrUvBlocked,
-    CtapDeviceResponseCode::kCtap2ErrIntegrityFailure,
-    CtapDeviceResponseCode::kCtap2ErrUvInvalid,
-    CtapDeviceResponseCode::kCtap2ErrOther,
-    CtapDeviceResponseCode::kCtap2ErrSpecLast,
-    CtapDeviceResponseCode::kCtap2ErrExtensionFirst,
-    CtapDeviceResponseCode::kCtap2ErrExtensionLast,
-    CtapDeviceResponseCode::kCtap2ErrVendorFirst,
-    CtapDeviceResponseCode::kCtap2ErrVendorLast,
-};
+constexpr auto kCtapResponseCodeList = base::MakeFixedFlatSet<uint8_t>({
+    static_cast<uint8_t>(CtapDeviceResponseCode::kSuccess),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap1ErrInvalidCommand),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap1ErrInvalidParameter),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap1ErrInvalidLength),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap1ErrInvalidSeq),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap1ErrTimeout),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap1ErrChannelBusy),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap1ErrLockRequired),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap1ErrInvalidChannel),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrCBORUnexpectedType),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrInvalidCBOR),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrMissingParameter),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrLimitExceeded),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrUnsupportedExtension),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrTooManyElements),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrLargeBlobStorageFull),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrCredentialExcluded),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrProcesssing),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrInvalidCredential),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrUserActionPending),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrOperationPending),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrNoOperations),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrUnsupportedAlgorithm),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrOperationDenied),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrKeyStoreFull),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrNotBusy),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrNoOperationPending),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrUnsupportedOption),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrInvalidOption),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrKeepAliveCancel),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrNoCredentials),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrUserActionTimeout),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrNotAllowed),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrPinInvalid),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrPinBlocked),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrPinAuthInvalid),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrPinAuthBlocked),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrPinNotSet),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrPinRequired),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrPinPolicyViolation),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrPinTokenExpired),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrRequestTooLarge),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrActionTimeout),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrUpRequired),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrUvBlocked),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrIntegrityFailure),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrInvalidSubcommand),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrUvInvalid),
+    static_cast<uint8_t>(
+        CtapDeviceResponseCode::kCtap2ErrUnauthorizedPermission),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrOther),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrSpecLast),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrExtensionFirst),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrExtensionLast),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrVendorFirst),
+    static_cast<uint8_t>(CtapDeviceResponseCode::kCtap2ErrVendorLast),
+});
 
 // Commands supported by CTAPHID device as specified in
 // https://fidoalliance.org/specs/fido-v2.0-rd-20170927/fido-client-to-authenticator-protocol-v2.0-rd-20170927.html#ctaphid-commands
diff --git a/device/fido/virtual_ctap2_device.cc b/device/fido/virtual_ctap2_device.cc
index 3f372af4..c60b8b38 100644
--- a/device/fido/virtual_ctap2_device.cc
+++ b/device/fido/virtual_ctap2_device.cc
@@ -19,6 +19,7 @@
 #include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/threading/thread_task_runner_handle.h"
+#include "components/apdu/apdu_response.h"
 #include "components/cbor/reader.h"
 #include "components/cbor/writer.h"
 #include "crypto/ec_private_key.h"
@@ -483,8 +484,6 @@
   Init({ProtocolVersion::kCtap2});
   std::vector<ProtocolVersion> versions = {ProtocolVersion::kCtap2};
   if (config.u2f_support) {
-    // Devices with alwaysUv may disable u2f if they don't support internal uv.
-    DCHECK(!config.always_uv || config.internal_uv_support);
     versions.emplace_back(ProtocolVersion::kU2f);
     u2f_device_ = std::make_unique<VirtualU2fDevice>(NewReferenceToState());
   }
@@ -689,8 +688,19 @@
   auto cmd_type = command[0];
   // The CTAP2 commands start at one, so a "command" of zero indicates that this
   // is a U2F message.
-  if (cmd_type == 0 && config_.u2f_support &&
-      (!config_.always_uv || mutable_state()->fingerprints_enrolled)) {
+  if (cmd_type == 0 && config_.u2f_support) {
+    if (config_.always_uv && !mutable_state()->fingerprints_enrolled) {
+      // The U2F_REGISTER and U2F_AUTHENTICATE commands MUST immediately fail
+      // and return SW_COMMAND_NOT_ALLOWED if the alwaysUv option is true and
+      // the device is not protected by a built-in user verification method.
+      // Have the authenticator will just fail all u2f requests for simplicity.
+      NOTREACHED();
+      std::move(cb).Run(
+          apdu::ApduResponse({},
+                             apdu::ApduResponse::Status::SW_COMMAND_NOT_ALLOWED)
+              .GetEncodedResponse());
+      return 0;
+    }
     u2f_device_->DeviceTransact(std::move(command), std::move(cb));
     return 0;
   }
diff --git a/docs/speed/metrics_changelog/2020_11_cls.md b/docs/speed/metrics_changelog/2020_11_cls.md
index 3141774d..de6b421 100644
--- a/docs/speed/metrics_changelog/2020_11_cls.md
+++ b/docs/speed/metrics_changelog/2020_11_cls.md
@@ -16,23 +16,15 @@
 
 ### Bug fix for content-visibility: auto
 
-When the `content-visibility: auto` feature was shipped in Chrome 85, a CLS-impacting
-flaw was present: the first time that content is rendered near the screen, a double render
-occurs, once with sizing determined by `contain-intrinsic-size` and the second time
-by the actual size of the content.
+When the `content-visibility: auto` feature was shipped in Chrome 85, a
+CLS-impacting flaw was present: changes between the skipped and not-skipped
+state of a `content-visibility: auto` subtree caused an observed layout shift
+in the `content;visibility: auto` element as it resized.
 
-If the content was actually on-screen during the double render, it would affect
-CLS scores; therefore the flaw mostly affects above-the-fold
-`content-visibility:auto` content. For such content, there was an unavoidable
-impact on CLS due to the double-render. In Chrome 85, this was a somewhat
-accurate result, because there was a user-visible flicker for
-such above-the-fold content. In Chrome 86, this was
-[fixed](https://chromium-review.googlesource.com/c/chromium/src/+/2348415)
-to avoid a flicker, but the problem with CLS remained.
-
-In Chrome 88, the CLS issue was [fixed](https://chromium-review.googlesource.com/c/chromium/src/+/2556211).
-Going forward, there should be no first-render CLS penalty for
-`content-visibility:auto` content.
+In Chrome 88, the CLS issue was [fixed](https://crbug.com/1151526).
+Going forward, there should be no CLS penalty for such elements. (Note that
+there still may be a layout shift for onscreen elements adjacent to (but not
+descendants of) the `content-visibility: auto` element.
 
 ## How does this affect a site's metrics?
 
diff --git a/docs/speed/metrics_changelog/cls.md b/docs/speed/metrics_changelog/cls.md
index 19904eee..e4ae25e 100644
--- a/docs/speed/metrics_changelog/cls.md
+++ b/docs/speed/metrics_changelog/cls.md
@@ -5,7 +5,7 @@
 * Chrome 88
   * Metric definition improvement: [Cumulative layout shift properly detects shifts of fixed position elements](2020_11_cls.md)
   * Metric definition improvement: [Cumulative layout shift properly detects shifts of descendents of a sticky element](2020_11_cls.md)
-  * Metric definition improvement: [No penalty for first unskipped render of content-visibility:auto content](2020_11_cls.md)
+  * Metric definition improvement: [no penalty for content-visibility: auto content](2020_11_cls.md)
 * Chrome 87
   * Metric definition improvement: [Fix problem in Cumulative Layout shift calculation of impact region](2020_10_cls_2.md)
   * Metric definition improvement: [Cumulative Layout Shift properly handles clipping of elements styled contain:paint](2020_10_cls_2.md)
diff --git a/extensions/browser/api/declarative_net_request/action_tracker.cc b/extensions/browser/api/declarative_net_request/action_tracker.cc
index 619cf80c..5393dbd 100644
--- a/extensions/browser/api/declarative_net_request/action_tracker.cc
+++ b/extensions/browser/api/declarative_net_request/action_tracker.cc
@@ -322,6 +322,23 @@
              : tracked_info->second.matched_rules.size();
 }
 
+void ActionTracker::IncrementActionCountForTab(const ExtensionId& extension_id,
+                                               int tab_id,
+                                               int increment) {
+  TrackedInfo& tracked_info = rules_tracked_[{extension_id, tab_id}];
+  size_t new_action_count =
+      std::max<int>(tracked_info.action_count + increment, 0);
+
+  if (tracked_info.action_count == new_action_count)
+    return;
+
+  DCHECK(ExtensionsAPIClient::Get());
+  ExtensionsAPIClient::Get()->UpdateActionCount(browser_context_, extension_id,
+                                                tab_id, new_action_count,
+                                                false /* clear_badge_text */);
+  tracked_info.action_count = new_action_count;
+}
+
 template <typename T>
 ActionTracker::TrackedInfoContextKey<T>::TrackedInfoContextKey(
     ExtensionId extension_id,
diff --git a/extensions/browser/api/declarative_net_request/action_tracker.h b/extensions/browser/api/declarative_net_request/action_tracker.h
index 4c310ca..f2d0161 100644
--- a/extensions/browser/api/declarative_net_request/action_tracker.h
+++ b/extensions/browser/api/declarative_net_request/action_tracker.h
@@ -103,6 +103,13 @@
   int GetPendingRuleCountForTest(const ExtensionId& extension_id,
                                  int64_t navigation_id);
 
+  // Increments the action count for the given |extension_id| and |tab_id|.
+  // A negative value for |increment| will decrement the action count, but the
+  // action count will never be less than 0.
+  void IncrementActionCountForTab(const ExtensionId& extension_id,
+                                  int tab_id,
+                                  int increment);
+
  private:
   // Template key type used for TrackedInfo, specified by an extension_id and
   // another ID.
diff --git a/extensions/browser/api/declarative_net_request/constants.cc b/extensions/browser/api/declarative_net_request/constants.cc
index 35c5d7f..e1c9170 100644
--- a/extensions/browser/api/declarative_net_request/constants.cc
+++ b/extensions/browser/api/declarative_net_request/constants.cc
@@ -106,6 +106,11 @@
     "limit.";
 const char kInternalErrorUpdatingEnabledRulesets[] = "Internal error.";
 
+const char kTabNotFoundError[] = "No tab with id: *.";
+const char kIncrementActionCountWithoutUseAsBadgeTextError[] =
+    "Cannot increment action count unless displaying action count as badge "
+    "text.";
+
 const char kIndexAndPersistRulesTimeHistogram[] =
     "Extensions.DeclarativeNetRequest.IndexAndPersistRulesTime";
 const char kManifestRulesCountHistogram[] =
diff --git a/extensions/browser/api/declarative_net_request/constants.h b/extensions/browser/api/declarative_net_request/constants.h
index c36d275..90c6c01 100644
--- a/extensions/browser/api/declarative_net_request/constants.h
+++ b/extensions/browser/api/declarative_net_request/constants.h
@@ -174,6 +174,10 @@
 extern const char kEnabledRulesetsRegexRuleCountExceeded[];
 extern const char kInternalErrorUpdatingEnabledRulesets[];
 
+// setExtensionActionOptions API errors.
+extern const char kTabNotFoundError[];
+extern const char kIncrementActionCountWithoutUseAsBadgeTextError[];
+
 // Histogram names.
 extern const char kIndexAndPersistRulesTimeHistogram[];
 extern const char kManifestRulesCountHistogram[];
diff --git a/extensions/browser/api/declarative_net_request/declarative_net_request_api.cc b/extensions/browser/api/declarative_net_request/declarative_net_request_api.cc
index 042eac34..4cd65fe76 100644
--- a/extensions/browser/api/declarative_net_request/declarative_net_request_api.cc
+++ b/extensions/browser/api/declarative_net_request/declarative_net_request_api.cc
@@ -30,6 +30,7 @@
 #include "extensions/browser/api/extensions_api_client.h"
 #include "extensions/browser/extension_file_task_runner.h"
 #include "extensions/browser/extension_prefs.h"
+#include "extensions/browser/extensions_browser_client.h"
 #include "extensions/browser/quota_service.h"
 #include "extensions/common/api/declarative_net_request.h"
 #include "extensions/common/api/declarative_net_request/constants.h"
@@ -392,34 +393,58 @@
   EXTENSION_FUNCTION_VALIDATE(params);
   EXTENSION_FUNCTION_VALIDATE(error.empty());
 
-  bool use_action_count_as_badge_text =
-      params->options.display_action_count_as_badge_text;
+  declarative_net_request::RulesMonitorService* rules_monitor_service =
+      declarative_net_request::RulesMonitorService::Get(browser_context());
+  DCHECK(rules_monitor_service);
+
   ExtensionPrefs* prefs = ExtensionPrefs::Get(browser_context());
-  if (use_action_count_as_badge_text ==
-      prefs->GetDNRUseActionCountAsBadgeText(extension_id()))
-    return RespondNow(NoArguments());
+  declarative_net_request::ActionTracker& action_tracker =
+      rules_monitor_service->action_tracker();
 
-  prefs->SetDNRUseActionCountAsBadgeText(extension_id(),
-                                         use_action_count_as_badge_text);
+  bool use_action_count_as_badge_text =
+      prefs->GetDNRUseActionCountAsBadgeText(extension_id());
 
-  // If the preference is switched on, update the extension's badge text with
-  // the number of actions matched for this extension. Otherwise, clear the
-  // action count for the extension's icon and show the default badge text if
-  // set.
-  if (use_action_count_as_badge_text) {
-    declarative_net_request::RulesMonitorService* rules_monitor_service =
-        declarative_net_request::RulesMonitorService::Get(browser_context());
-    DCHECK(rules_monitor_service);
+  if (params->options.display_action_count_as_badge_text &&
+      *params->options.display_action_count_as_badge_text !=
+          use_action_count_as_badge_text) {
+    use_action_count_as_badge_text =
+        *params->options.display_action_count_as_badge_text;
+    prefs->SetDNRUseActionCountAsBadgeText(extension_id(),
+                                           use_action_count_as_badge_text);
 
-    const declarative_net_request::ActionTracker& action_tracker =
-        rules_monitor_service->action_tracker();
-    action_tracker.OnPreferenceEnabled(extension_id());
-  } else {
-    DCHECK(ExtensionsAPIClient::Get());
-    ExtensionsAPIClient::Get()->ClearActionCount(browser_context(),
-                                                 *extension());
+    // If the preference is switched on, update the extension's badge text
+    // with the number of actions matched for this extension. Otherwise, clear
+    // the action count for the extension's icon and show the default badge
+    // text if set.
+    if (use_action_count_as_badge_text)
+      action_tracker.OnPreferenceEnabled(extension_id());
+    else {
+      DCHECK(ExtensionsAPIClient::Get());
+      ExtensionsAPIClient::Get()->ClearActionCount(browser_context(),
+                                                   *extension());
+    }
   }
 
+  if (params->options.tab_update) {
+    if (!use_action_count_as_badge_text) {
+      return RespondNow(
+          Error(declarative_net_request::
+                    kIncrementActionCountWithoutUseAsBadgeTextError));
+    }
+
+    const auto& update_options = *params->options.tab_update;
+    int tab_id = update_options.tab_id;
+
+    if (!ExtensionsBrowserClient::Get()->IsValidTabId(browser_context(),
+                                                      tab_id)) {
+      return RespondNow(Error(ErrorUtils::FormatErrorMessage(
+          declarative_net_request::kTabNotFoundError,
+          base::NumberToString(tab_id))));
+    }
+
+    action_tracker.IncrementActionCountForTab(extension_id(), tab_id,
+                                              update_options.increment);
+  }
   return RespondNow(NoArguments());
 }
 
diff --git a/extensions/browser/extensions_browser_client.cc b/extensions/browser/extensions_browser_client.cc
index cd58b88..d738595 100644
--- a/extensions/browser/extensions_browser_client.cc
+++ b/extensions/browser/extensions_browser_client.cc
@@ -124,4 +124,9 @@
   return false;
 }
 
+bool ExtensionsBrowserClient::IsValidTabId(content::BrowserContext* context,
+                                           int tab_id) const {
+  return false;
+}
+
 }  // namespace extensions
diff --git a/extensions/browser/extensions_browser_client.h b/extensions/browser/extensions_browser_client.h
index 70a0dc0..7a222e3f 100644
--- a/extensions/browser/extensions_browser_client.h
+++ b/extensions/browser/extensions_browser_client.h
@@ -370,6 +370,9 @@
   // Protection policy.
   virtual bool IsScreenshotRestricted(content::WebContents* web_contents) const;
 
+  // Returns true if the given |tab_id| exists.
+  virtual bool IsValidTabId(content::BrowserContext* context, int tab_id) const;
+
  private:
   std::vector<std::unique_ptr<ExtensionsBrowserAPIProvider>> providers_;
 };
diff --git a/extensions/common/api/declarative_net_request.idl b/extensions/common/api/declarative_net_request.idl
index 3ff9096..405d770 100644
--- a/extensions/common/api/declarative_net_request.idl
+++ b/extensions/common/api/declarative_net_request.idl
@@ -425,10 +425,20 @@
     DOMString[]? enableRulesetIds;
   };
 
+  dictionary TabActionCountUpdate {
+    // The tab for which to update the action count.
+    long tabId;
+    // The amount to increment the tab's action count by. Negative values will
+    // decrement the count.
+    long increment;
+  };
+
   dictionary ExtensionActionOptions {
     // Whether to automatically display the action count for a page as the
-    // extension's badge text. False by default.
-    boolean displayActionCountAsBadgeText;
+    // extension's badge text. This preference is persisted across sessions.
+    boolean? displayActionCountAsBadgeText;
+    // Details of how the tab's action count should be adjusted.
+    TabActionCountUpdate? tabUpdate;
   };
 
   callback EmptyCallback = void();
@@ -531,10 +541,12 @@
     static void getMatchedRules(optional MatchedRulesFilter filter,
                                 GetMatchedRulesCallback callback);
 
-    // Configures how matched actions will be displayed on the extension action.
-    // This preference is persisted across sessions.
+    // Configures if the action count for tabs should be displayed as the
+    // extension action's badge text and provides a way for that action count to
+    // be incremented.
     static void setExtensionActionOptions(
-        ExtensionActionOptions options);
+        ExtensionActionOptions options,
+        optional EmptyCallback callback);
 
     // Checks if the given regular expression will be supported as a
     // <code>regexFilter</code> rule condition.
diff --git a/gpu/command_buffer/common/gles2_cmd_utils.cc b/gpu/command_buffer/common/gles2_cmd_utils.cc
index c8590aca..804a2b8 100644
--- a/gpu/command_buffer/common/gles2_cmd_utils.cc
+++ b/gpu/command_buffer/common/gles2_cmd_utils.cc
@@ -1092,7 +1092,6 @@
     case GL_R16UI:
     case GL_RG16UI:
     case GL_RGBA16UI:
-    case GL_RGB10_A2:
     case GL_RGB10_A2UI:
     case GL_R16_EXT:
     case GL_RG16_EXT:
diff --git a/gpu/config/gpu_switches.cc b/gpu/config/gpu_switches.cc
index 82ede09b..761c23ac 100644
--- a/gpu/config/gpu_switches.cc
+++ b/gpu/config/gpu_switches.cc
@@ -102,4 +102,9 @@
 const char kDisableVulkanFallbackToGLForTesting[] =
     "disable-vulkan-fallback-to-gl-for-testing";
 
+#if BUILDFLAG(ENABLE_PLATFORM_HEVC)
+// Enables playback of clear (unencrypted) HEVC content for testing purposes.
+const char kEnableClearHevcForTesting[] = "enable-clear-hevc-for-testing";
+#endif
+
 }  // namespace switches
diff --git a/gpu/config/gpu_switches.h b/gpu/config/gpu_switches.h
index 7135afdb..f935a3f 100644
--- a/gpu/config/gpu_switches.h
+++ b/gpu/config/gpu_switches.h
@@ -6,6 +6,7 @@
 #define GPU_CONFIG_GPU_SWITCHES_H_
 
 #include "gpu/gpu_export.h"
+#include "media/media_buildflags.h"
 
 namespace switches {
 
@@ -34,6 +35,9 @@
 GPU_EXPORT extern const char kEnableVulkanProtectedMemory[];
 GPU_EXPORT extern const char kEnforceVulkanProtectedMemory[];
 GPU_EXPORT extern const char kDisableVulkanFallbackToGLForTesting[];
+#if BUILDFLAG(ENABLE_PLATFORM_HEVC)
+GPU_EXPORT extern const char kEnableClearHevcForTesting[];
+#endif
 
 }  // namespace switches
 
diff --git a/gpu/ipc/common/BUILD.gn b/gpu/ipc/common/BUILD.gn
index fde4f9e2..f665e4eb 100644
--- a/gpu/ipc/common/BUILD.gn
+++ b/gpu/ipc/common/BUILD.gn
@@ -546,6 +546,8 @@
       traits_public_deps = [ ":vulkan_types_mojom_traits" ]
     },
   ]
+
+  webui_module_path = "/"
 }
 
 mojom("test_interfaces") {
diff --git a/gpu/vulkan/x/vulkan_implementation_x11.cc b/gpu/vulkan/x/vulkan_implementation_x11.cc
index 638345b..f3f48cc 100644
--- a/gpu/vulkan/x/vulkan_implementation_x11.cc
+++ b/gpu/vulkan/x/vulkan_implementation_x11.cc
@@ -104,7 +104,8 @@
     return true;
   auto* connection = x11::Connection::Get();
   return vkGetPhysicalDeviceXcbPresentationSupportKHR(
-      device, queue_family_index, connection->XcbConnection(),
+      device, queue_family_index,
+      connection->GetXlibDisplay().GetXcbConnection(),
       static_cast<xcb_visualid_t>(connection->default_root_visual().visual_id));
 }
 
diff --git a/gpu/vulkan/x/vulkan_surface_x11.cc b/gpu/vulkan/x/vulkan_surface_x11.cc
index 29cc30a..82d43d9 100644
--- a/gpu/vulkan/x/vulkan_surface_x11.cc
+++ b/gpu/vulkan/x/vulkan_surface_x11.cc
@@ -76,7 +76,7 @@
   VkSurfaceKHR vk_surface;
   const VkXcbSurfaceCreateInfoKHR surface_create_info = {
       .sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR,
-      .connection = connection->XcbConnection(),
+      .connection = connection->GetXlibDisplay().GetXcbConnection(),
       .window = static_cast<xcb_window_t>(window),
   };
   VkResult result = vkCreateXcbSurfaceKHR(vk_instance, &surface_create_info,
diff --git a/infra/config/generated/commit-queue.cfg b/infra/config/generated/commit-queue.cfg
index 1ac7786..5869554 100644
--- a/infra/config/generated/commit-queue.cfg
+++ b/infra/config/generated/commit-queue.cfg
@@ -1434,6 +1434,10 @@
         includable_only: true
       }
       builders {
+        name: "chromium/try/tricium-oilpan-analysis"
+        includable_only: true
+      }
+      builders {
         name: "chromium/try/tricium-simple"
         includable_only: true
       }
diff --git a/infra/config/generated/cr-buildbucket.cfg b/infra/config/generated/cr-buildbucket.cfg
index d94d161..c739705 100644
--- a/infra/config/generated/cr-buildbucket.cfg
+++ b/infra/config/generated/cr-buildbucket.cfg
@@ -17020,11 +17020,11 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"chromium.fyi\",\"recipe\":\"chromium\",\"xcode_build_version\":\"12b5035g\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"chromium.fyi\",\"recipe\":\"chromium\",\"xcode_build_version\":\"12b5044c\"}"
       execution_timeout_secs: 36000
       caches {
-        name: "xcode_ios_12b5035g"
-        path: "xcode_ios_12b5035g.app"
+        name: "xcode_ios_12b5044c"
+        path: "xcode_ios_12b5044c.app"
       }
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
@@ -18184,6 +18184,100 @@
       }
     }
     builders {
+      name: "linux-paeverywhere-x64-fyi-dbg"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      exe {
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        cmd: "recipes"
+      }
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"chromium.fyi\",\"recipe\":\"chromium\"}"
+      execution_timeout_secs: 36000
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+      experiments {
+        key: "chromium.resultdb.result_sink"
+        value: 100
+      }
+      experiments {
+        key: "luci.use_realms"
+        value: 100
+      }
+      resultdb {
+        enable: true
+        bq_exports {
+          project: "luci-resultdb"
+          dataset: "chromium"
+          table: "ci_test_results"
+          test_results {}
+        }
+        bq_exports {
+          project: "luci-resultdb"
+          dataset: "chromium"
+          table: "gpu_ci_test_results"
+          test_results {
+            predicate {
+              test_id_regexp: "ninja://(chrome/test:|content/test:fuchsia_)telemetry_gpu_integration_test/.+"
+            }
+          }
+        }
+      }
+    }
+    builders {
+      name: "linux-paeverywhere-x64-fyi-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      exe {
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        cmd: "recipes"
+      }
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"chromium.fyi\",\"recipe\":\"chromium\"}"
+      execution_timeout_secs: 36000
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+      experiments {
+        key: "chromium.resultdb.result_sink"
+        value: 100
+      }
+      experiments {
+        key: "luci.use_realms"
+        value: 100
+      }
+      resultdb {
+        enable: true
+        bq_exports {
+          project: "luci-resultdb"
+          dataset: "chromium"
+          table: "ci_test_results"
+          test_results {}
+        }
+        bq_exports {
+          project: "luci-resultdb"
+          dataset: "chromium"
+          table: "gpu_ci_test_results"
+          test_results {
+            predicate {
+              test_id_regexp: "ninja://(chrome/test:|content/test:fuchsia_)telemetry_gpu_integration_test/.+"
+            }
+          }
+        }
+      }
+    }
+    builders {
       name: "linux-perfetto-rel"
       swarming_host: "chromium-swarm.appspot.com"
       swarming_tags: "vpython:native-python-wrapper"
@@ -19355,6 +19449,98 @@
       }
     }
     builders {
+      name: "mac-paeverywhere-x64-fyi-dbg"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Mac"
+      dimensions: "pool:luci.chromium.ci"
+      exe {
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        cmd: "recipes"
+      }
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"chromium.fyi\",\"recipe\":\"chromium\"}"
+      execution_timeout_secs: 36000
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+      experiments {
+        key: "chromium.resultdb.result_sink"
+        value: 100
+      }
+      experiments {
+        key: "luci.use_realms"
+        value: 100
+      }
+      resultdb {
+        enable: true
+        bq_exports {
+          project: "luci-resultdb"
+          dataset: "chromium"
+          table: "ci_test_results"
+          test_results {}
+        }
+        bq_exports {
+          project: "luci-resultdb"
+          dataset: "chromium"
+          table: "gpu_ci_test_results"
+          test_results {
+            predicate {
+              test_id_regexp: "ninja://(chrome/test:|content/test:fuchsia_)telemetry_gpu_integration_test/.+"
+            }
+          }
+        }
+      }
+    }
+    builders {
+      name: "mac-paeverywhere-x64-fyi-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Mac"
+      dimensions: "pool:luci.chromium.ci"
+      exe {
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        cmd: "recipes"
+      }
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"chromium.fyi\",\"recipe\":\"chromium\"}"
+      execution_timeout_secs: 36000
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+      experiments {
+        key: "chromium.resultdb.result_sink"
+        value: 100
+      }
+      experiments {
+        key: "luci.use_realms"
+        value: 100
+      }
+      resultdb {
+        enable: true
+        bq_exports {
+          project: "luci-resultdb"
+          dataset: "chromium"
+          table: "ci_test_results"
+          test_results {}
+        }
+        bq_exports {
+          project: "luci-resultdb"
+          dataset: "chromium"
+          table: "gpu_ci_test_results"
+          test_results {
+            predicate {
+              test_id_regexp: "ninja://(chrome/test:|content/test:fuchsia_)telemetry_gpu_integration_test/.+"
+            }
+          }
+        }
+      }
+    }
+    builders {
       name: "mac-swangle-chromium-x64"
       swarming_host: "chromium-swarm.appspot.com"
       swarming_tags: "vpython:native-python-wrapper"
@@ -32495,7 +32681,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"12b5035g\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"12b5044c\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -32503,8 +32689,8 @@
         path: "win_toolchain"
       }
       caches {
-        name: "xcode_ios_12b5035g"
-        path: "xcode_ios_12b5035g.app"
+        name: "xcode_ios_12b5044c"
+        path: "xcode_ios_12b5044c.app"
       }
       build_numbers: YES
       service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
@@ -37840,6 +38026,61 @@
       }
     }
     builders {
+      name: "tricium-oilpan-analysis"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      exe {
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        cmd: "recipes"
+      }
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"tricium_oilpan\"}"
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches {
+        name: "win_toolchain"
+        path: "win_toolchain"
+      }
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage {
+        value: 5
+      }
+      experiments {
+        key: "chromium.resultdb.result_sink"
+        value: 100
+      }
+      experiments {
+        key: "luci.use_realms"
+        value: 100
+      }
+      resultdb {
+        enable: true
+        bq_exports {
+          project: "luci-resultdb"
+          dataset: "chromium"
+          table: "try_test_results"
+          test_results {}
+        }
+        bq_exports {
+          project: "luci-resultdb"
+          dataset: "chromium"
+          table: "gpu_try_test_results"
+          test_results {
+            predicate {
+              test_id_regexp: "ninja://(chrome/test:|content/test:fuchsia_)telemetry_gpu_integration_test/.+"
+            }
+          }
+        }
+      }
+    }
+    builders {
       name: "tricium-simple"
       swarming_host: "chromium-swarm.appspot.com"
       swarming_tags: "vpython:native-python-wrapper"
diff --git a/infra/config/generated/goma-usage.pyl b/infra/config/generated/goma-usage.pyl
index 1072600d..30c413c1 100644
--- a/infra/config/generated/goma-usage.pyl
+++ b/infra/config/generated/goma-usage.pyl
@@ -3,15 +3,15 @@
 # This is consumed by presubmit checks that need to validate the config
 
 {
-  # 61150 (scheduler total) + 344990 (weighted CQ total)
+  # 61470 (scheduler total) + 344990 (weighted CQ total)
   # (weighted CQ total) = 6899.8 (CQ total) * 50 (CQ weight)
-  '*weighted total*': 406140,
+  '*weighted total*': 406460,
   'scheduler': {
-    '*total*': 61150,
+    '*total*': 61470,
     'triggered': {
-      '*total*': 59600,
+      '*total*': 59920,
       ('https://chromium.googlesource.com/chromium/src', 'regexp:refs/heads/master'): {
-        '*total*': 58720,
+        '*total*': 59040,
         # 4 concurrent builds x 80 jobs
         'ci/ASAN Debug': 320,
         # 5 concurrent builds x 80 jobs
@@ -319,6 +319,8 @@
         'ci/linux-lacros-builder-rel': 80,
         'ci/linux-official': 200,
         'ci/linux-ozone-rel': 500,
+        'ci/linux-paeverywhere-x64-fyi-dbg': 80,
+        'ci/linux-paeverywhere-x64-fyi-rel': 80,
         'ci/linux-perfetto-rel': 80,
         'ci/linux-swangle-chromium-x64': 80,
         'ci/linux-swangle-tot-angle-x64': 80,
@@ -343,6 +345,8 @@
         'ci/mac-mojo-rel': 40,
         # jobs count assumes an 8-core machine
         'ci/mac-official': 80,
+        'ci/mac-paeverywhere-x64-fyi-dbg': 80,
+        'ci/mac-paeverywhere-x64-fyi-rel': 80,
         # jobs count assumes an 8-core machine
         'ci/mac-swangle-chromium-x64': 80,
         # jobs count assumes an 8-core machine
diff --git a/infra/config/generated/luci-milo.cfg b/infra/config/generated/luci-milo.cfg
index f97d737..0bdcf8c 100644
--- a/infra/config/generated/luci-milo.cfg
+++ b/infra/config/generated/luci-milo.cfg
@@ -5435,6 +5435,26 @@
     short_name: "64rel"
   }
   builders {
+    name: "buildbucket/luci.chromium.ci/linux-paeverywhere-x64-fyi-dbg"
+    category: "paeverywhere|linux"
+    short_name: "64dbg"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.ci/linux-paeverywhere-x64-fyi-rel"
+    category: "paeverywhere|linux"
+    short_name: "64rel"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.ci/mac-paeverywhere-x64-fyi-dbg"
+    category: "paeverywhere|mac"
+    short_name: "64dbg"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.ci/mac-paeverywhere-x64-fyi-rel"
+    category: "paeverywhere|mac"
+    short_name: "64rel"
+  }
+  builders {
     name: "buildbucket/luci.chromium.ci/win-paeverywhere-x86-fyi-dbg"
     category: "paeverywhere|win"
     short_name: "32dbg"
@@ -12263,6 +12283,9 @@
     name: "buildbucket/luci.chromium.try/tricium-metrics-analysis"
   }
   builders {
+    name: "buildbucket/luci.chromium.try/tricium-oilpan-analysis"
+  }
+  builders {
     name: "buildbucket/luci.chromium.try/tricium-simple"
   }
   builders {
@@ -12994,6 +13017,9 @@
     name: "buildbucket/luci.chromium.try/tricium-metrics-analysis"
   }
   builders {
+    name: "buildbucket/luci.chromium.try/tricium-oilpan-analysis"
+  }
+  builders {
     name: "buildbucket/luci.chromium.try/tricium-simple"
   }
   builder_view_only: true
diff --git a/infra/config/generated/luci-notify.cfg b/infra/config/generated/luci-notify.cfg
index 7e83bb20..ef264a0a 100644
--- a/infra/config/generated/luci-notify.cfg
+++ b/infra/config/generated/luci-notify.cfg
@@ -3082,6 +3082,32 @@
 }
 notifiers {
   notifications {
+    on_change: true
+    email {
+      recipients: "chrome-memory-safety+bots@google.com"
+    }
+  }
+  builders {
+    bucket: "ci"
+    name: "linux-paeverywhere-x64-fyi-dbg"
+    repository: "https://chromium.googlesource.com/chromium/src"
+  }
+}
+notifiers {
+  notifications {
+    on_change: true
+    email {
+      recipients: "chrome-memory-safety+bots@google.com"
+    }
+  }
+  builders {
+    bucket: "ci"
+    name: "linux-paeverywhere-x64-fyi-rel"
+    repository: "https://chromium.googlesource.com/chromium/src"
+  }
+}
+notifiers {
+  notifications {
     on_occurrence: FAILURE
     failed_step_regexp: "bot_update|compile|gclient runhooks|runhooks|update"
     email {
@@ -3165,6 +3191,32 @@
 }
 notifiers {
   notifications {
+    on_change: true
+    email {
+      recipients: "chrome-memory-safety+bots@google.com"
+    }
+  }
+  builders {
+    bucket: "ci"
+    name: "mac-paeverywhere-x64-fyi-dbg"
+    repository: "https://chromium.googlesource.com/chromium/src"
+  }
+}
+notifiers {
+  notifications {
+    on_change: true
+    email {
+      recipients: "chrome-memory-safety+bots@google.com"
+    }
+  }
+  builders {
+    bucket: "ci"
+    name: "mac-paeverywhere-x64-fyi-rel"
+    repository: "https://chromium.googlesource.com/chromium/src"
+  }
+}
+notifiers {
+  notifications {
     on_new_status: FAILURE
     email {
       recipients: "chromium-component-mapping@google.com"
diff --git a/infra/config/generated/luci-scheduler.cfg b/infra/config/generated/luci-scheduler.cfg
index db73ef4..b8a6f8e 100644
--- a/infra/config/generated/luci-scheduler.cfg
+++ b/infra/config/generated/luci-scheduler.cfg
@@ -5491,6 +5491,26 @@
   }
 }
 job {
+  id: "linux-paeverywhere-x64-fyi-dbg"
+  realm: "ci"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "linux-paeverywhere-x64-fyi-dbg"
+  }
+}
+job {
+  id: "linux-paeverywhere-x64-fyi-rel"
+  realm: "ci"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "linux-paeverywhere-x64-fyi-rel"
+  }
+}
+job {
   id: "linux-perfetto-rel"
   realm: "ci"
   acl_sets: "ci"
@@ -5824,6 +5844,26 @@
   }
 }
 job {
+  id: "mac-paeverywhere-x64-fyi-dbg"
+  realm: "ci"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "mac-paeverywhere-x64-fyi-dbg"
+  }
+}
+job {
+  id: "mac-paeverywhere-x64-fyi-rel"
+  realm: "ci"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "mac-paeverywhere-x64-fyi-rel"
+  }
+}
+job {
   id: "mac-swangle-chromium-x64"
   realm: "ci"
   acl_sets: "ci"
@@ -6652,6 +6692,8 @@
   triggers: "linux-lacros-builder-rel"
   triggers: "linux-official"
   triggers: "linux-ozone-rel"
+  triggers: "linux-paeverywhere-x64-fyi-dbg"
+  triggers: "linux-paeverywhere-x64-fyi-rel"
   triggers: "linux-perfetto-rel"
   triggers: "linux-swangle-chromium-x64"
   triggers: "linux-swangle-tot-angle-x64"
@@ -6674,6 +6716,8 @@
   triggers: "mac-hermetic-upgrade-rel"
   triggers: "mac-mojo-rel"
   triggers: "mac-official"
+  triggers: "mac-paeverywhere-x64-fyi-dbg"
+  triggers: "mac-paeverywhere-x64-fyi-rel"
   triggers: "mac-swangle-chromium-x64"
   triggers: "mac-updater-builder-dbg"
   triggers: "mac-updater-builder-rel"
diff --git a/infra/config/generated/tricium-prod.cfg b/infra/config/generated/tricium-prod.cfg
index 1034e632..3f34a03 100644
--- a/infra/config/generated/tricium-prod.cfg
+++ b/infra/config/generated/tricium-prod.cfg
@@ -59,6 +59,29 @@
   }
 }
 
+functions {
+  type: ANALYZER
+  name: "OilpanAnalyzer"
+  needs: GIT_FILE_DETAILS
+  provides: RESULTS
+  path_filters: "*.c"
+  path_filters: "*.cc"
+  path_filters: "*.cpp"
+  path_filters: "*.h"
+  owner: "yukiy@chromium.org"
+  monorail_component: "Infra>Platform>Tricium>Analyzer"
+  impls {
+    runtime_platform: LINUX
+    provides_for_platform: LINUX
+    recipe {
+      project: "chromium"
+      bucket: "try"
+      builder: "tricium-oilpan-analysis"
+    }
+    deadline: 900
+  }
+}
+
 # Wrapper for simple legacy analyzers.
 functions {
   type: ANALYZER
@@ -90,6 +113,11 @@
 }
 
 selections {
+  function: "OilpanAnalyzer"
+  platform: LINUX
+}
+
+selections {
   function: "Simple"
   platform: LINUX
 }
diff --git a/infra/config/lib/builders.star b/infra/config/lib/builders.star
index dd52f2d..58dd6ea 100644
--- a/infra/config/lib/builders.star
+++ b/infra/config/lib/builders.star
@@ -137,7 +137,7 @@
     # (current default) xc12 gm seed
     x12a7209 = xcode_enum("xcode_ios_12a7209", "xcode_ios_12a7209.app"),
     # latest Xcode 12 beta version.
-    x12b5035g = xcode_enum("xcode_ios_12b5035g", "xcode_ios_12b5035g.app"),
+    x12b5044c = xcode_enum("xcode_ios_12b5044c", "xcode_ios_12b5044c.app"),
 )
 
 ################################################################################
diff --git a/infra/config/recipes.star b/infra/config/recipes.star
index 1fb975c..e0d73d95 100644
--- a/infra/config/recipes.star
+++ b/infra/config/recipes.star
@@ -134,6 +134,10 @@
 )
 
 build_recipe(
+    name = "recipe:tricium_oilpan",
+)
+
+build_recipe(
     name = "recipe:tricium_simple",
 )
 
diff --git a/infra/config/subprojects/chromium/ci.star b/infra/config/subprojects/chromium/ci.star
index ea9468df..8fac0a3 100644
--- a/infra/config/subprojects/chromium/ci.star
+++ b/infra/config/subprojects/chromium/ci.star
@@ -2589,6 +2589,28 @@
 )
 
 ci.fyi_builder(
+    name = "linux-paeverywhere-x64-fyi-dbg",
+    builderless = True,
+    console_view_entry = ci.console_view_entry(
+        category = "paeverywhere|linux",
+        short_name = "64dbg",
+    ),
+    notifies = ["chrome-memory-safety"],
+    os = os.LINUX_DEFAULT,
+)
+
+ci.fyi_builder(
+    name = "linux-paeverywhere-x64-fyi-rel",
+    builderless = True,
+    console_view_entry = ci.console_view_entry(
+        category = "paeverywhere|linux",
+        short_name = "64rel",
+    ),
+    notifies = ["chrome-memory-safety"],
+    os = os.LINUX_DEFAULT,
+)
+
+ci.fyi_builder(
     name = "linux-perfetto-rel",
     console_view_entry = ci.console_view_entry(
         category = "linux",
@@ -2740,6 +2762,28 @@
     triggered_by = ["mac-updater-builder-rel"],
 )
 
+ci.fyi_builder(
+    name = "mac-paeverywhere-x64-fyi-dbg",
+    builderless = True,
+    console_view_entry = ci.console_view_entry(
+        category = "paeverywhere|mac",
+        short_name = "64dbg",
+    ),
+    notifies = ["chrome-memory-safety"],
+    os = os.MAC_ANY,
+)
+
+ci.fyi_builder(
+    name = "mac-paeverywhere-x64-fyi-rel",
+    builderless = True,
+    console_view_entry = ci.console_view_entry(
+        category = "paeverywhere|mac",
+        short_name = "64rel",
+    ),
+    notifies = ["chrome-memory-safety"],
+    os = os.MAC_ANY,
+)
+
 ci.updater_builder(
     name = "win-updater-builder-dbg",
     console_view_entry = ci.console_view_entry(
@@ -3124,9 +3168,9 @@
         category = "iOS|iOS14",
         short_name = "sdk14",
     ),
-    caches = [xcode_cache.x12b5035g],
+    caches = [xcode_cache.x12b5044c],
     properties = {
-        "xcode_build_version": "12b5035g",
+        "xcode_build_version": "12b5044c",
     },
 )
 
diff --git a/infra/config/subprojects/chromium/try.star b/infra/config/subprojects/chromium/try.star
index 4fff5a9..4001f369 100644
--- a/infra/config/subprojects/chromium/try.star
+++ b/infra/config/subprojects/chromium/try.star
@@ -1225,6 +1225,11 @@
 )
 
 try_.chromium_linux_builder(
+    name = "tricium-oilpan-analysis",
+    executable = "recipe:tricium_oilpan",
+)
+
+try_.chromium_linux_builder(
     name = "tricium-simple",
     executable = "recipe:tricium_simple",
 )
@@ -1404,9 +1409,9 @@
 
 try_.chromium_mac_ios_builder(
     name = "ios14-sdk-simulator",
-    caches = [xcode_cache.x12b5035g],
+    caches = [xcode_cache.x12b5044c],
     properties = {
-        "xcode_build_version": "12b5035g",
+        "xcode_build_version": "12b5044c",
     },
 )
 
diff --git a/infra/config/tricium-prod.cfg b/infra/config/tricium-prod.cfg
index 1034e632..3f34a03 100644
--- a/infra/config/tricium-prod.cfg
+++ b/infra/config/tricium-prod.cfg
@@ -59,6 +59,29 @@
   }
 }
 
+functions {
+  type: ANALYZER
+  name: "OilpanAnalyzer"
+  needs: GIT_FILE_DETAILS
+  provides: RESULTS
+  path_filters: "*.c"
+  path_filters: "*.cc"
+  path_filters: "*.cpp"
+  path_filters: "*.h"
+  owner: "yukiy@chromium.org"
+  monorail_component: "Infra>Platform>Tricium>Analyzer"
+  impls {
+    runtime_platform: LINUX
+    provides_for_platform: LINUX
+    recipe {
+      project: "chromium"
+      bucket: "try"
+      builder: "tricium-oilpan-analysis"
+    }
+    deadline: 900
+  }
+}
+
 # Wrapper for simple legacy analyzers.
 functions {
   type: ANALYZER
@@ -90,6 +113,11 @@
 }
 
 selections {
+  function: "OilpanAnalyzer"
+  platform: LINUX
+}
+
+selections {
   function: "Simple"
   platform: LINUX
 }
diff --git a/ios/chrome/browser/crash_report/synthetic_crash_report_util.mm b/ios/chrome/browser/crash_report/synthetic_crash_report_util.mm
index ebcb788..e6de909c 100644
--- a/ios/chrome/browser/crash_report/synthetic_crash_report_util.mm
+++ b/ios/chrome/browser/crash_report/synthetic_crash_report_util.mm
@@ -106,8 +106,11 @@
                                       base::SysInfo::HardwareModelName());
   AppendConfigWithBreakpadServerParam(config, "breadcrumbs",
                                       base::JoinString(breadcrumbs, "\n"));
-  AppendConfigWithBreakpadServerParam(
-      config, "signature", breadcrumbs.back().substr(strlen("00:00 ")));
+
+  std::string signature = breadcrumbs.empty()
+                              ? "No Breadcrumbs"
+                              : breadcrumbs.back().substr(strlen("00:00 "));
+  AppendConfigWithBreakpadServerParam(config, "signature", signature);
 
   for (NSString* key in previous_session.reportParameters.allKeys) {
     AppendConfigWithBreakpadServerParam(
diff --git a/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm b/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm
index 07d18a5..f66385c 100644
--- a/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm
+++ b/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm
@@ -344,9 +344,6 @@
       task_info(mach_task_self(), TASK_VM_INFO,
                 reinterpret_cast<task_info_t>(&task_info_data), &count);
   if (kr == KERN_SUCCESS) {
-    base::UmaHistogramMemoryKB(
-        "Memory.Browser",
-        (task_info_data.resident_size - task_info_data.reusable) / 1024);
     mach_vm_size_t footprint_mb = task_info_data.phys_footprint / 1024 / 1024;
     base::UmaHistogramMemoryLargeMB("Memory.Browser.MemoryFootprint",
                                     footprint_mb);
diff --git a/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.mm b/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.mm
index a893663..8f70367 100644
--- a/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.mm
+++ b/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.mm
@@ -75,6 +75,7 @@
     case signin_metrics::AccessPoint::ACCESS_POINT_ACCOUNT_RENAMED:
     case signin_metrics::AccessPoint::ACCESS_POINT_WEB_SIGNIN:
     case signin_metrics::AccessPoint::ACCESS_POINT_SAFETY_CHECK:
+    case signin_metrics::AccessPoint::ACCESS_POINT_KALEIDOSCOPE:
     case signin_metrics::AccessPoint::ACCESS_POINT_MAX:
       return false;
   }
@@ -126,6 +127,7 @@
     case signin_metrics::AccessPoint::ACCESS_POINT_ACCOUNT_RENAMED:
     case signin_metrics::AccessPoint::ACCESS_POINT_WEB_SIGNIN:
     case signin_metrics::AccessPoint::ACCESS_POINT_SAFETY_CHECK:
+    case signin_metrics::AccessPoint::ACCESS_POINT_KALEIDOSCOPE:
     case signin_metrics::AccessPoint::ACCESS_POINT_MAX:
       NOTREACHED() << "Unexpected value for access point "
                    << static_cast<int>(access_point);
@@ -179,6 +181,7 @@
     case signin_metrics::AccessPoint::ACCESS_POINT_ACCOUNT_RENAMED:
     case signin_metrics::AccessPoint::ACCESS_POINT_WEB_SIGNIN:
     case signin_metrics::AccessPoint::ACCESS_POINT_SAFETY_CHECK:
+    case signin_metrics::AccessPoint::ACCESS_POINT_KALEIDOSCOPE:
     case signin_metrics::AccessPoint::ACCESS_POINT_MAX:
       NOTREACHED() << "Unexpected value for access point "
                    << static_cast<int>(access_point);
@@ -232,6 +235,7 @@
     case signin_metrics::AccessPoint::ACCESS_POINT_ACCOUNT_RENAMED:
     case signin_metrics::AccessPoint::ACCESS_POINT_WEB_SIGNIN:
     case signin_metrics::AccessPoint::ACCESS_POINT_SAFETY_CHECK:
+    case signin_metrics::AccessPoint::ACCESS_POINT_KALEIDOSCOPE:
     case signin_metrics::AccessPoint::ACCESS_POINT_MAX:
       NOTREACHED() << "Unexpected value for access point "
                    << static_cast<int>(access_point);
@@ -277,6 +281,7 @@
     case signin_metrics::AccessPoint::ACCESS_POINT_ACCOUNT_RENAMED:
     case signin_metrics::AccessPoint::ACCESS_POINT_WEB_SIGNIN:
     case signin_metrics::AccessPoint::ACCESS_POINT_SAFETY_CHECK:
+    case signin_metrics::AccessPoint::ACCESS_POINT_KALEIDOSCOPE:
     case signin_metrics::AccessPoint::ACCESS_POINT_MAX:
       return nullptr;
   }
@@ -320,6 +325,7 @@
     case signin_metrics::AccessPoint::ACCESS_POINT_ACCOUNT_RENAMED:
     case signin_metrics::AccessPoint::ACCESS_POINT_WEB_SIGNIN:
     case signin_metrics::AccessPoint::ACCESS_POINT_SAFETY_CHECK:
+    case signin_metrics::AccessPoint::ACCESS_POINT_KALEIDOSCOPE:
     case signin_metrics::AccessPoint::ACCESS_POINT_MAX:
       return nullptr;
   }
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_util.mm b/ios/chrome/browser/ui/omnibox/omnibox_util.mm
index 49537571c..9f7e7fab 100644
--- a/ios/chrome/browser/ui/omnibox/omnibox_util.mm
+++ b/ios/chrome/browser/ui/omnibox/omnibox_util.mm
@@ -90,14 +90,11 @@
     case security_state::NONE:
       return INFO;
     case security_state::WARNING:
-      if (security_state::ShouldShowDangerTriangleForWarningLevel())
-        return NOT_SECURE_WARNING;
-      return INFO;
+    case security_state::DANGEROUS:
+      return NOT_SECURE_WARNING;
     case security_state::SECURE:
     case security_state::SECURE_WITH_POLICY_INSTALLED_CERT:
       return SECURE;
-    case security_state::DANGEROUS:
-      return NOT_SECURE_WARNING;
     case security_state::SECURITY_LEVEL_COUNT:
       NOTREACHED();
       return LOCATION_BAR_SECURITY_ICON_TYPE_COUNT;
diff --git a/ios/chrome/browser/ui/page_info/page_info_site_security_mediator.mm b/ios/chrome/browser/ui/page_info/page_info_site_security_mediator.mm
index 534977a..a809b10 100644
--- a/ios/chrome/browser/ui/page_info/page_info_site_security_mediator.mm
+++ b/ios/chrome/browser/ui/page_info/page_info_site_security_mediator.mm
@@ -112,11 +112,7 @@
     // Not HTTPS. This maps to the WARNING security level. Show the grey
     // triangle icon in page info based on the same logic used to determine
     // the iconography in the omnibox.
-    if (security_state::ShouldShowDangerTriangleForWarningLevel()) {
-      dataHolder.iconImageName = kSecurityIconDangerous;
-    } else {
-      dataHolder.iconImageName = kSecurityIconNotSecure;
-    }
+    dataHolder.iconImageName = kSecurityIconDangerous;
 
     dataHolder.message =
         [NSString stringWithFormat:@"%@ BEGIN_LINK %@ END_LINK",
@@ -168,11 +164,7 @@
     // so assume the WARNING state when determining whether to swap the icon for
     // a grey triangle. This will result in an inconsistency between the omnibox
     // and page info if the mixed content WARNING feature is disabled.
-    if (security_state::ShouldShowDangerTriangleForWarningLevel()) {
-      dataHolder.iconImageName = kSecurityIconDangerous;
-    } else {
-      dataHolder.iconImageName = kSecurityIconNotSecure;
-    }
+    dataHolder.iconImageName = kSecurityIconDangerous;
 
     dataHolder.message = BuildMessage(@[
       [NSString stringWithFormat:@"%@ BEGIN_LINK %@ END_LINK",
diff --git a/ios/chrome/browser/ui/webui/flags_ui.cc b/ios/chrome/browser/ui/webui/flags_ui.cc
index 8d0c021..2317c6c 100644
--- a/ios/chrome/browser/ui/webui/flags_ui.cc
+++ b/ios/chrome/browser/ui/webui/flags_ui.cc
@@ -230,6 +230,7 @@
   source->AddLocalizedString("reset", IDS_FLAGS_UI_PAGE_RESET);
   source->AddLocalizedString("reset-acknowledged",
                              IDS_FLAGS_UI_RESET_ACKNOWLEDGED);
+  source->AddLocalizedString("search-label", IDS_FLAGS_UI_SEARCH_LABEL);
   source->AddLocalizedString("search-placeholder",
                              IDS_FLAGS_UI_SEARCH_PLACEHOLDER);
   source->AddLocalizedString("title", IDS_FLAGS_UI_TITLE);
diff --git a/media/gpu/vaapi/vaapi_video_decoder.cc b/media/gpu/vaapi/vaapi_video_decoder.cc
index 21a4de9..b68479d9 100644
--- a/media/gpu/vaapi/vaapi_video_decoder.cc
+++ b/media/gpu/vaapi/vaapi_video_decoder.cc
@@ -9,9 +9,11 @@
 
 #include "base/bind.h"
 #include "base/callback_helpers.h"
+#include "base/command_line.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/trace_event/trace_event.h"
+#include "gpu/config/gpu_switches.h"
 #include "media/base/bind_to_current_loop.h"
 #include "media/base/format_utils.h"
 #include "media/base/video_frame.h"
@@ -174,6 +176,14 @@
         base::BindRepeating(&VaapiVideoDecoder::OnCdmContextEvent,
                             weak_this_factory_.GetWeakPtr()));
 #endif
+#if BUILDFLAG(ENABLE_PLATFORM_HEVC)
+  } else if (config.codec() == kCodecHEVC &&
+             !base::CommandLine::ForCurrentProcess()->HasSwitch(
+                 switches::kEnableClearHevcForTesting)) {
+    DVLOG(1) << "Clear HEVC content is not supported";
+    std::move(init_cb).Run(StatusCode::kClearContentUnsupported);
+    return;
+#endif
   }
 
   // We expect the decoder to have released all output buffers (by the client
diff --git a/mojo/public/js/mojo_bindings_resources.grd b/mojo/public/js/mojo_bindings_resources.grd
index 999a411e..cfe32d3 100644
--- a/mojo/public/js/mojo_bindings_resources.grd
+++ b/mojo/public/js/mojo_bindings_resources.grd
@@ -80,6 +80,11 @@
           use_base_dir="false"
           resource_path="mojo/mojo/public/mojom/base/text_direction.mojom-lite.js"
           type="BINDATA" />
+      <include name="IDR_MOJO_UNGUESSABLE_TOKEN_MOJOM_WEBUI_JS"
+          file="${root_gen_dir}/mojom-webui/mojo/public/mojom/base/unguessable_token.mojom-webui.js"
+          use_base_dir="false"
+          resource_path="mojo/mojo/public/mojom/base/unguessable_token.mojom-webui.js"
+          type="BINDATA" />
       <if expr="is_win or is_macosx or is_linux or is_android">
         <include name="IDR_MOJO_PROCESS_ID_MOJOM_WEBUI_JS"
             file="${root_gen_dir}/mojom-webui/mojo/public/mojom/base/process_id.mojom-webui.js"
diff --git a/net/base/port_util.cc b/net/base/port_util.cc
index 72af86d..12bfd9a 100644
--- a/net/base/port_util.cc
+++ b/net/base/port_util.cc
@@ -37,6 +37,7 @@
     42,    // name
     43,    // nicname
     53,    // domain
+    69,    // tftp
     77,    // priv-rjs
     79,    // finger
     87,    // ttylink
@@ -54,8 +55,10 @@
     119,   // nntp
     123,   // NTP
     135,   // loc-srv /epmap
+    137,   // netbios
     139,   // netbios
     143,   // imap2
+    161,   // snmp
     179,   // BGP
     389,   // ldap
     427,   // SLP (Also used by Apple Filing Protocol)
@@ -70,6 +73,7 @@
     532,   // netnews
     540,   // uucp
     548,   // AFP (Apple Filing Protocol)
+    554,   // rtsp
     556,   // remotefs
     563,   // nntp+ssl
     587,   // smtp (rfc6409)
@@ -77,12 +81,16 @@
     636,   // ldap+ssl
     993,   // ldap+ssl
     995,   // pop3+ssl
+    1719,  // h323gatestat
+    1720,  // h323hostcall
+    1723,  // pptp
     2049,  // nfs
     3659,  // apple-sasl / PasswordServer
     4045,  // lockd
     5060,  // sip
     5061,  // sips
     6000,  // X11
+    6566,  // sane-port
     6665,  // Alternate IRC [Apple addition]
     6666,  // Alternate IRC [Apple addition]
     6667,  // Standard IRC [Apple addition]
diff --git a/sandbox/policy/mac/network.sb b/sandbox/policy/mac/network.sb
index d6dcbcdd..550a623 100644
--- a/sandbox/policy/mac/network.sb
+++ b/sandbox/policy/mac/network.sb
@@ -112,6 +112,7 @@
 ; Kerberos support. This should be removed after GSS is moved out of the
 ; network service. https://crbug.com/1017830
 (allow mach-lookup
+  (global-name "com.apple.GSSCred") ; https://crbug.com/1134449
   (global-name "org.h5l.kcm")
 )
 (allow file-read*
diff --git a/sandbox/win/src/crosscall_params.h b/sandbox/win/src/crosscall_params.h
index eae3f89..3c97f3f 100644
--- a/sandbox/win/src/crosscall_params.h
+++ b/sandbox/win/src/crosscall_params.h
@@ -179,7 +179,7 @@
 // that NUMBER_PARAMS = 2 and a 32-bit build:
 //
 // [ tag                4 bytes]
-// [ IsOnOut            4 bytes]
+// [ IsInOut            4 bytes]
 // [ call return       52 bytes]
 // [ params count       4 bytes]
 // [ parameter 0 type   4 bytes]
diff --git a/services/network/cors/cors_url_loader.cc b/services/network/cors/cors_url_loader.cc
index 0286bad..0bdef72a 100644
--- a/services/network/cors/cors_url_loader.cc
+++ b/services/network/cors/cors_url_loader.cc
@@ -533,6 +533,13 @@
                                          status.error_code);
   }
 
+  // TODO(crbug.com/1152550): Remove this histogram after platform apps no
+  // longer require relaxing CORB/CORS in their content scripts.
+  if (status.error_code == net::OK) {
+    UMA_HISTOGRAM_BOOLEAN("NetworkService.CorsForcedOffForIsolatedWorldOrigin",
+                          has_cors_been_affected_by_isolated_world_origin_);
+  }
+
   forwarding_client_->OnComplete(status);
   std::move(delete_callback_).Run(this);
   // |this| is deleted here.
@@ -555,6 +562,8 @@
   }
 
   if (HasSpecialAccessToDestination()) {
+    has_cors_been_affected_by_isolated_world_origin_ =
+        request_.isolated_world_origin.has_value();
     return;
   }
 
diff --git a/services/network/cors/cors_url_loader.h b/services/network/cors/cors_url_loader.h
index 98de492..4fa1963 100644
--- a/services/network/cors/cors_url_loader.h
+++ b/services/network/cors/cors_url_loader.h
@@ -195,6 +195,8 @@
 
   net::IsolationInfo isolation_info_;
 
+  bool has_cors_been_affected_by_isolated_world_origin_ = false;
+
   // Used to run asynchronous class instance bound callbacks safely.
   base::WeakPtrFactory<CorsURLLoader> weak_factory_{this};
 
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json
index e76c24f6..de97e5d5 100644
--- a/testing/buildbot/chromium.android.fyi.json
+++ b/testing/buildbot/chromium.android.fyi.json
@@ -19,6 +19,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -65,6 +68,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -101,6 +107,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -137,6 +146,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -172,6 +184,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -208,6 +223,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -244,6 +262,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -279,6 +300,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -314,6 +338,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -349,6 +376,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -384,6 +414,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -420,6 +453,9 @@
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
         "name": "webkit_unit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -455,6 +491,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -490,6 +529,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -525,6 +567,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -561,6 +606,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -596,6 +644,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -632,6 +683,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -667,6 +721,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -702,6 +759,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -737,6 +797,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -868,6 +931,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -905,6 +971,9 @@
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
         "name": "network_service_out_of_process_components_browsertests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -940,6 +1009,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -976,6 +1048,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1015,6 +1090,9 @@
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
         "name": "network_service_out_of_process_content_browsertests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1052,6 +1130,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1091,6 +1172,9 @@
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
         "name": "network_service_out_of_process_content_shell_test_apk",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1127,6 +1211,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1162,6 +1249,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1197,6 +1287,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1232,6 +1325,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1267,6 +1363,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1302,6 +1401,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1337,6 +1439,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1372,6 +1477,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1407,6 +1515,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1445,6 +1556,9 @@
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
         "name": "gl_tests_validating",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1480,6 +1594,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1515,6 +1632,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1550,6 +1670,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1585,6 +1708,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1620,6 +1746,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1655,6 +1784,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1690,6 +1822,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1725,6 +1860,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1760,6 +1898,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1795,6 +1936,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1831,6 +1975,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1866,6 +2013,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1901,6 +2051,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1936,6 +2089,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1971,6 +2127,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2006,6 +2165,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2041,6 +2203,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2077,6 +2242,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2113,6 +2281,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2148,6 +2319,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2183,6 +2357,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2218,6 +2395,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2253,6 +2433,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2288,6 +2471,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2323,6 +2509,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2358,6 +2547,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2393,6 +2585,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2428,6 +2623,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2463,6 +2661,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2498,6 +2699,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2534,6 +2738,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2569,6 +2776,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2604,6 +2814,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2639,6 +2852,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2674,6 +2890,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2709,6 +2928,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2744,6 +2966,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -2788,6 +3013,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2827,6 +3055,9 @@
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
         "name": "network_service_webview_instrumentation_test_apk",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2863,6 +3094,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2898,6 +3132,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2933,6 +3170,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2973,6 +3213,9 @@
           "script": "//third_party/blink/tools/merge_web_test_results.py"
         },
         "name": "chrome_public_wpt",
+        "resultdb": {
+          "enable": true
+        },
         "results_handler": "layout tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -3001,6 +3244,9 @@
           "script": "//third_party/blink/tools/merge_web_test_results.py"
         },
         "name": "system_webview_wpt",
+        "resultdb": {
+          "enable": true
+        },
         "results_handler": "layout tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -3029,6 +3275,9 @@
           "script": "//third_party/blink/tools/merge_web_test_results.py"
         },
         "name": "weblayer_shell_wpt",
+        "resultdb": {
+          "enable": true
+        },
         "results_handler": "layout tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -3068,6 +3317,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "weblayer_instrumentation_test_apk_ToT_Tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3137,6 +3389,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "weblayer_instrumentation_test_versions_apk_M85_Client_Library_Tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3211,6 +3466,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "weblayer_instrumentation_test_versions_apk_M85_Implementation_Library_Tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3285,6 +3543,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "weblayer_instrumentation_test_versions_apk_M86_Client_Library_Tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3359,6 +3620,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "weblayer_instrumentation_test_versions_apk_M86_Implementation_Library_Tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3433,6 +3697,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "weblayer_instrumentation_test_versions_apk_M87_Client_Library_Tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3507,6 +3774,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "weblayer_instrumentation_test_versions_apk_M87_Implementation_Library_Tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3581,6 +3851,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "weblayer_instrumentation_test_versions_apk_M88 Client Tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3655,6 +3928,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "weblayer_instrumentation_test_versions_apk_M88 Implementation Tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3724,6 +4000,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "weblayer_instrumentation_test_apk_ToT_Tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3793,6 +4072,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "weblayer_instrumentation_test_versions_apk_M85_Client_Library_Tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3867,6 +4149,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "weblayer_instrumentation_test_versions_apk_M85_Implementation_Library_Tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3941,6 +4226,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "weblayer_instrumentation_test_versions_apk_M86_Client_Library_Tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4015,6 +4303,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "weblayer_instrumentation_test_versions_apk_M86_Implementation_Library_Tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4089,6 +4380,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "weblayer_instrumentation_test_versions_apk_M87_Client_Library_Tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4163,6 +4457,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "weblayer_instrumentation_test_versions_apk_M87_Implementation_Library_Tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4237,6 +4534,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "weblayer_instrumentation_test_versions_apk_M88 Client Tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4311,6 +4611,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "weblayer_instrumentation_test_versions_apk_M88 Implementation Tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4380,6 +4683,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "weblayer_instrumentation_test_apk_ToT_Tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4449,6 +4755,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "weblayer_instrumentation_test_versions_apk_M85_Client_Library_Tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4523,6 +4832,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "weblayer_instrumentation_test_versions_apk_M85_Implementation_Library_Tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4597,6 +4909,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "weblayer_instrumentation_test_versions_apk_M86_Client_Library_Tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4671,6 +4986,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "weblayer_instrumentation_test_versions_apk_M86_Implementation_Library_Tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4745,6 +5063,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "weblayer_instrumentation_test_versions_apk_M87_Client_Library_Tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4819,6 +5140,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "weblayer_instrumentation_test_versions_apk_M87_Implementation_Library_Tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4893,6 +5217,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "weblayer_instrumentation_test_versions_apk_M88 Client Tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4967,6 +5294,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "weblayer_instrumentation_test_versions_apk_M88 Implementation Tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json
index d538d7b..d6eb2384 100644
--- a/testing/buildbot/chromium.android.json
+++ b/testing/buildbot/chromium.android.json
@@ -22,6 +22,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -70,6 +73,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -126,6 +132,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "webview_cts_tests_no_field_trial",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -180,6 +189,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -230,6 +242,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "webview_ui_test_app_test_apk_no_field_trial",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -282,6 +297,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -329,6 +347,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -384,6 +405,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "webview_cts_tests_no_field_trial",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -437,6 +461,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -486,6 +513,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "webview_ui_test_app_test_apk_no_field_trial",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -537,6 +567,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -585,6 +618,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -633,6 +669,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -689,6 +728,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "webview_cts_tests_no_field_trial",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -743,6 +785,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -794,6 +839,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "webview_instrumentation_test_apk_no_field_trial",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -843,6 +891,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -893,6 +944,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "webview_ui_test_app_test_apk_no_field_trial",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -945,6 +999,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -993,6 +1050,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -1041,6 +1101,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -1097,6 +1160,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "webview_cts_tests_no_field_trial",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -1151,6 +1217,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -1202,6 +1271,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "webview_instrumentation_test_apk_no_field_trial",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -1251,6 +1323,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -1301,6 +1376,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "webview_ui_test_app_test_apk_no_field_trial",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -1353,6 +1431,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -1400,6 +1481,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -1447,6 +1531,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -1502,6 +1589,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "webview_cts_tests_no_field_trial",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -1555,6 +1645,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -1605,6 +1698,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "webview_instrumentation_test_apk_no_field_trial",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -1653,6 +1749,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -1702,6 +1801,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "webview_ui_test_app_test_apk_no_field_trial",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -1923,6 +2025,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -1970,6 +2075,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -2018,6 +2126,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -2065,6 +2176,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -2107,6 +2221,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2138,6 +2255,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -2185,6 +2305,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -2232,6 +2355,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -2279,6 +2405,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -2326,6 +2455,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -2374,6 +2506,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "webkit_unit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -2422,6 +2557,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -2469,6 +2607,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -2516,6 +2657,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -2564,6 +2708,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -2611,6 +2758,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -2658,6 +2808,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -2705,6 +2858,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -2752,6 +2908,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -2799,6 +2958,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -2964,6 +3126,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3012,6 +3177,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3061,6 +3229,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_out_of_process_components_browsertests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3108,6 +3279,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3156,6 +3330,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3206,6 +3383,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_out_of_process_content_browsertests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3254,6 +3434,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3304,6 +3487,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_out_of_process_content_shell_test_apk",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3352,6 +3538,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3400,6 +3589,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3447,6 +3639,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3494,6 +3689,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3541,6 +3739,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3588,6 +3789,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3635,6 +3839,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3682,6 +3889,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3729,6 +3939,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3778,6 +3991,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "gl_tests_validating",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3825,6 +4041,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3872,6 +4091,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3919,6 +4141,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3966,6 +4191,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4013,6 +4241,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4060,6 +4291,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4107,6 +4341,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4154,6 +4391,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4201,6 +4441,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4248,6 +4491,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4295,6 +4541,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4342,6 +4591,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4389,6 +4641,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4436,6 +4691,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4483,6 +4741,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4532,6 +4793,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4579,6 +4843,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4626,6 +4893,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4673,6 +4943,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4720,6 +4993,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4767,6 +5043,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4814,6 +5093,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4861,6 +5143,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4908,6 +5193,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4955,6 +5243,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5003,6 +5294,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5050,6 +5344,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5097,6 +5394,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5144,6 +5444,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5191,6 +5494,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5238,6 +5544,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5285,6 +5594,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5332,6 +5644,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5379,6 +5694,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5426,6 +5744,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5473,6 +5794,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5524,6 +5848,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_webview_instrumentation_test_apk",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5572,6 +5899,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5619,6 +5949,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5670,6 +6003,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5717,6 +6053,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5765,6 +6104,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5812,6 +6154,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5854,6 +6199,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5885,6 +6233,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5932,6 +6283,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5979,6 +6333,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6026,6 +6383,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6073,6 +6433,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6121,6 +6484,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "webkit_unit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6169,6 +6535,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6216,6 +6585,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6263,6 +6635,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6311,6 +6686,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6358,6 +6736,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6405,6 +6786,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6452,6 +6836,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6499,6 +6886,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6546,6 +6936,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6650,6 +7043,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6697,6 +7093,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6746,6 +7145,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6794,6 +7196,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6842,6 +7247,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6890,6 +7298,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6937,6 +7348,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6984,6 +7398,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7031,6 +7448,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7078,6 +7498,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7125,6 +7548,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7172,6 +7598,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7219,6 +7648,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7268,6 +7700,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "gl_tests_validating",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7315,6 +7750,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7362,6 +7800,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7409,6 +7850,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7456,6 +7900,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7503,6 +7950,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7550,6 +8000,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7597,6 +8050,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7644,6 +8100,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7691,6 +8150,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7738,6 +8200,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7785,6 +8250,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7832,6 +8300,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7879,6 +8350,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7926,6 +8400,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7973,6 +8450,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8021,6 +8501,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8068,6 +8551,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8115,6 +8601,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8162,6 +8651,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8209,6 +8701,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8256,6 +8751,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8303,6 +8801,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8350,6 +8851,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8397,6 +8901,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8444,6 +8951,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8492,6 +9002,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8539,6 +9052,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8586,6 +9102,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8633,6 +9152,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8680,6 +9202,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8727,6 +9252,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8774,6 +9302,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8821,6 +9352,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8868,6 +9402,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8915,6 +9452,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8962,6 +9502,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9010,6 +9553,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9057,6 +9603,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9108,6 +9657,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9154,6 +9706,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9201,6 +9756,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9247,6 +9805,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9288,6 +9849,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9318,6 +9882,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9364,6 +9931,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9410,6 +9980,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9456,6 +10029,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9502,6 +10078,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9549,6 +10128,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "webkit_unit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9597,6 +10179,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9643,6 +10228,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9689,6 +10277,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9736,6 +10327,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9782,6 +10376,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9828,6 +10425,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9874,6 +10474,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9920,6 +10523,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9966,6 +10572,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -10128,6 +10737,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -10175,6 +10787,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -10223,6 +10838,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_out_of_process_components_browsertests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -10269,6 +10887,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -10316,6 +10937,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -10365,6 +10989,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_out_of_process_content_browsertests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -10412,6 +11039,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -10461,6 +11091,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_out_of_process_content_shell_test_apk",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -10508,6 +11141,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -10555,6 +11191,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -10601,6 +11240,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -10647,6 +11289,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -10693,6 +11338,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -10739,6 +11387,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -10785,6 +11436,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -10831,6 +11485,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -10877,6 +11534,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -10925,6 +11585,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "gl_tests_validating",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -10971,6 +11634,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -11017,6 +11683,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -11063,6 +11732,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -11109,6 +11781,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -11155,6 +11830,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -11201,6 +11879,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -11247,6 +11928,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -11293,6 +11977,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -11339,6 +12026,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -11385,6 +12075,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -11431,6 +12124,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -11477,6 +12173,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -11523,6 +12222,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -11569,6 +12271,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -11615,6 +12320,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -11662,6 +12370,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -11708,6 +12419,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -11754,6 +12468,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -11800,6 +12517,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -11846,6 +12566,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -11892,6 +12615,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -11938,6 +12664,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -11984,6 +12713,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -12030,6 +12762,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -12076,6 +12811,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -12123,6 +12861,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -12169,6 +12910,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -12215,6 +12959,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -12261,6 +13008,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -12307,6 +13057,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -12353,6 +13106,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -12399,6 +13155,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -12445,6 +13204,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -12491,6 +13253,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -12537,6 +13302,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -12583,6 +13351,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -12633,6 +13404,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_webview_instrumentation_test_apk",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -12680,6 +13454,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -12726,6 +13503,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -12776,6 +13556,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -12823,6 +13606,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -12871,6 +13657,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -12918,6 +13707,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -12960,6 +13752,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12991,6 +13786,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -13038,6 +13836,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -13085,6 +13886,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -13132,6 +13936,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -13179,6 +13986,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -13227,6 +14037,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "webkit_unit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -13275,6 +14088,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -13322,6 +14138,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -13369,6 +14188,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -13417,6 +14239,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -13464,6 +14289,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -13511,6 +14339,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -13558,6 +14389,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -13605,6 +14439,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -13652,6 +14489,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -13758,6 +14598,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -13805,6 +14648,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -13854,6 +14700,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -13902,6 +14751,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -13950,6 +14802,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -13998,6 +14853,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -14045,6 +14903,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -14092,6 +14953,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -14139,6 +15003,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -14186,6 +15053,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -14233,6 +15103,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -14280,6 +15153,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -14327,6 +15203,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -14376,6 +15255,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "gl_tests_validating",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -14423,6 +15305,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -14470,6 +15355,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -14517,6 +15405,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -14564,6 +15455,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -14611,6 +15505,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -14658,6 +15555,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -14705,6 +15605,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -14752,6 +15655,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -14799,6 +15705,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -14846,6 +15755,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -14893,6 +15805,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -14940,6 +15855,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -14987,6 +15905,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -15034,6 +15955,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -15081,6 +16005,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -15129,6 +16056,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -15176,6 +16106,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -15223,6 +16156,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -15270,6 +16206,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -15317,6 +16256,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -15364,6 +16306,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -15411,6 +16356,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -15458,6 +16406,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -15505,6 +16456,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -15552,6 +16506,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -15600,6 +16557,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -15647,6 +16607,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -15694,6 +16657,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -15741,6 +16707,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -15788,6 +16757,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -15835,6 +16807,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -15882,6 +16857,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -15929,6 +16907,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -15976,6 +16957,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16023,6 +17007,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16070,6 +17057,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16118,6 +17108,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16165,6 +17158,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16216,6 +17212,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16257,6 +17256,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "chrome_public_test_vr_apk-ddready-cardboard",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16306,6 +17308,9 @@
           "--gerrit-patchset=${patch_set}",
           "--buildbucket-id=${buildbucket_build_id}"
         ],
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16351,6 +17356,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "chrome_public_test_vr_apk-ddready-don-enabled",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16388,6 +17396,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16425,6 +17436,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16462,6 +17476,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16500,6 +17517,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16541,6 +17561,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16648,6 +17671,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "chrome_public_test_vr_apk-ddready-cardboard",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16706,6 +17732,9 @@
           "--gerrit-patchset=${patch_set}",
           "--buildbucket-id=${buildbucket_build_id}"
         ],
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16760,6 +17789,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "chrome_public_test_vr_apk-ddready-don-enabled",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16809,6 +17841,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "chrome_public_test_vr_apk-vega",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16855,6 +17890,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16901,6 +17939,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16947,6 +17988,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16994,6 +18038,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17042,6 +18089,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17096,6 +18146,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17143,6 +18196,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17190,6 +18246,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17244,6 +18303,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17290,6 +18352,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17337,6 +18402,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17383,6 +18451,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17424,6 +18495,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -17454,6 +18528,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17500,6 +18577,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17546,6 +18626,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17592,6 +18675,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17638,6 +18724,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17685,6 +18774,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "webkit_unit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17732,6 +18824,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17778,6 +18873,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17824,6 +18922,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17871,6 +18972,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17917,6 +19021,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17963,6 +19070,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18009,6 +19119,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18055,6 +19168,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18101,6 +19217,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18263,6 +19382,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18310,6 +19432,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18358,6 +19483,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_out_of_process_components_browsertests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18404,6 +19532,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18451,6 +19582,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18500,6 +19634,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_out_of_process_content_browsertests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18547,6 +19684,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18596,6 +19736,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_out_of_process_content_shell_test_apk",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18643,6 +19786,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18690,6 +19836,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18736,6 +19885,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18782,6 +19934,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18828,6 +19983,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18874,6 +20032,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18920,6 +20081,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18966,6 +20130,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -19012,6 +20179,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -19060,6 +20230,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "gl_tests_validating",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -19106,6 +20279,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -19152,6 +20328,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -19198,6 +20377,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -19244,6 +20426,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -19290,6 +20475,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -19336,6 +20524,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -19382,6 +20573,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -19428,6 +20622,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -19474,6 +20671,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -19520,6 +20720,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -19566,6 +20769,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -19612,6 +20818,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -19658,6 +20867,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -19704,6 +20916,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -19750,6 +20965,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -19797,6 +21015,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -19843,6 +21064,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -19889,6 +21113,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -19935,6 +21162,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -19981,6 +21211,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -20027,6 +21260,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -20073,6 +21309,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -20119,6 +21358,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -20165,6 +21407,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -20211,6 +21456,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -20258,6 +21506,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -20304,6 +21555,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -20350,6 +21604,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -20396,6 +21653,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -20442,6 +21702,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -20488,6 +21751,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -20534,6 +21800,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -20580,6 +21849,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -20626,6 +21898,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -20672,6 +21947,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -20718,6 +21996,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -20768,6 +22049,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_webview_instrumentation_test_apk",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -20815,6 +22099,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -20861,6 +22148,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -20902,6 +22192,9 @@
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
         "name": "monochrome_public_apk_checker",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20918,126 +22211,189 @@
     "junit_tests": [
       {
         "name": "android_webview_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "android_webview_junit_tests",
         "test_id_prefix": "ninja://android_webview/test:android_webview_junit_tests/"
       },
       {
         "name": "base_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "base_junit_tests",
         "test_id_prefix": "ninja://base:base_junit_tests/"
       },
       {
         "name": "chrome_java_test_pagecontroller_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "chrome_java_test_pagecontroller_junit_tests",
         "test_id_prefix": "ninja://chrome/test/android:chrome_java_test_pagecontroller_junit_tests/"
       },
       {
         "name": "chrome_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "chrome_junit_tests",
         "test_id_prefix": "ninja://chrome/android:chrome_junit_tests/"
       },
       {
         "name": "components_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "components_junit_tests",
         "test_id_prefix": "ninja://components:components_junit_tests/"
       },
       {
         "name": "content_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "content_junit_tests",
         "test_id_prefix": "ninja://content/public/android:content_junit_tests/"
       },
       {
         "name": "device_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "device_junit_tests",
         "test_id_prefix": "ninja://device:device_junit_tests/"
       },
       {
         "name": "junit_unit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "junit_unit_tests",
         "test_id_prefix": "ninja://testing/android/junit:junit_unit_tests/"
       },
       {
         "name": "keyboard_accessory_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "keyboard_accessory_junit_tests",
         "test_id_prefix": "ninja://chrome/android/features/keyboard_accessory:keyboard_accessory_junit_tests/"
       },
       {
         "name": "media_base_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "media_base_junit_tests",
         "test_id_prefix": "ninja://media/base/android:media_base_junit_tests/"
       },
       {
         "name": "module_installer_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "module_installer_junit_tests",
         "test_id_prefix": "ninja://components/module_installer/android:module_installer_junit_tests/"
       },
       {
         "name": "net_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "net_junit_tests",
         "test_id_prefix": "ninja://net/android:net_junit_tests/"
       },
       {
         "name": "paint_preview_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "paint_preview_junit_tests",
         "test_id_prefix": "ninja://components/paint_preview/player/android:paint_preview_junit_tests/"
       },
       {
         "name": "password_check_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "password_check_junit_tests",
         "test_id_prefix": "ninja://chrome/browser/password_check/android:password_check_junit_tests/"
       },
       {
         "name": "password_manager_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "password_manager_junit_tests",
         "test_id_prefix": "ninja://chrome/browser/password_manager/android:password_manager_junit_tests/"
       },
       {
         "name": "services_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "services_junit_tests",
         "test_id_prefix": "ninja://services:services_junit_tests/"
       },
       {
         "name": "touch_to_fill_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "touch_to_fill_junit_tests",
         "test_id_prefix": "ninja://chrome/browser/touch_to_fill/android:touch_to_fill_junit_tests/"
       },
       {
         "name": "ui_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "ui_junit_tests",
         "test_id_prefix": "ninja://ui/android:ui_junit_tests/"
       },
       {
         "name": "webapk_client_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "webapk_client_junit_tests",
         "test_id_prefix": "ninja://chrome/android/webapk/libs/client:webapk_client_junit_tests/"
       },
       {
         "name": "webapk_shell_apk_h2o_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "webapk_shell_apk_h2o_junit_tests",
         "test_id_prefix": "ninja://chrome/android/webapk/shell_apk:webapk_shell_apk_h2o_junit_tests/"
       },
       {
         "name": "webapk_shell_apk_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "webapk_shell_apk_junit_tests",
         "test_id_prefix": "ninja://chrome/android/webapk/shell_apk:webapk_shell_apk_junit_tests/"
@@ -21062,6 +22418,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "bf_cache_android_browsertests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -21168,6 +22527,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "bf_cache_content_browsertests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -21217,6 +22579,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "bf_cache_content_shell_test_apk",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -21266,6 +22631,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "bf_cache_content_unittests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -21316,6 +22684,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "bf_cache_unit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -21371,6 +22742,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -21417,6 +22791,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -21463,6 +22840,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -21509,6 +22889,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -21555,6 +22938,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -21601,6 +22987,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -21647,6 +23036,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -21689,7 +23081,7 @@
         },
         "name": "cronet_sizes",
         "resultdb": {
-          "enable": false
+          "enable": true
         },
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -21771,6 +23163,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -21817,6 +23212,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -21863,6 +23261,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -21909,6 +23310,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -21955,6 +23359,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -22001,6 +23408,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -22047,6 +23457,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -22098,6 +23511,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -22144,6 +23560,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -22190,6 +23609,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -22236,6 +23658,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -22282,6 +23707,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -22328,6 +23756,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -22374,6 +23805,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -22519,6 +23953,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -22565,6 +24002,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -22611,6 +24051,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -22657,6 +24100,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -22703,6 +24149,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -22749,6 +24198,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -22795,6 +24247,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -22850,6 +24305,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -22896,6 +24354,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -22942,6 +24403,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -22988,6 +24452,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -23034,6 +24501,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -23080,6 +24550,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -23126,6 +24599,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -23177,6 +24653,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -23223,6 +24702,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -23269,6 +24751,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -23315,6 +24800,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -23361,6 +24849,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -23407,6 +24898,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -23453,6 +24947,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -23599,6 +25096,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -23702,6 +25202,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -23758,6 +25261,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -23804,6 +25310,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -23845,6 +25354,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -23875,6 +25387,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -23921,6 +25436,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -23967,6 +25485,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -24013,6 +25534,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -24059,6 +25583,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -24105,6 +25632,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -24151,6 +25681,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -24197,6 +25730,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -24244,6 +25780,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -24290,6 +25829,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -24336,6 +25878,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -24382,6 +25927,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -24430,6 +25978,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -24477,6 +26028,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -24523,6 +26077,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -24570,6 +26127,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -24617,6 +26177,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -24664,6 +26227,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -24710,6 +26276,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -24756,6 +26325,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -24802,6 +26374,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -24848,6 +26423,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -24894,6 +26472,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -24940,6 +26521,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -24986,6 +26570,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -25034,6 +26621,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "gl_tests_validating",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -25080,6 +26670,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -25126,6 +26719,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -25172,6 +26768,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -25218,6 +26817,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -25264,6 +26866,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -25310,6 +26915,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -25356,6 +26964,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -25402,6 +27013,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -25448,6 +27062,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -25494,6 +27111,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -25540,6 +27160,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -25586,6 +27209,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -25632,6 +27258,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -25678,6 +27307,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -25724,6 +27356,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -25772,6 +27407,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -25818,6 +27456,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -25864,6 +27505,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -25910,6 +27554,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -25956,6 +27603,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -26002,6 +27652,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -26048,6 +27701,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -26094,6 +27750,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -26140,6 +27799,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -26186,6 +27848,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -26233,6 +27898,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -26279,6 +27947,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -26325,6 +27996,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -26371,6 +28045,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -26417,6 +28094,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -26463,6 +28143,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -26509,6 +28192,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -26564,6 +28250,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -26611,6 +28300,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -26658,6 +28350,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -26700,6 +28395,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26731,6 +28429,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -26778,6 +28479,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -26825,6 +28529,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -26872,6 +28579,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -26919,6 +28629,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -26967,6 +28680,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "webkit_unit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -27015,6 +28731,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -27062,6 +28781,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -27109,6 +28831,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -27157,6 +28882,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -27204,6 +28932,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -27251,6 +28982,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -27298,6 +29032,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -27345,6 +29082,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -27392,6 +29132,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -27498,6 +29241,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -27546,6 +29292,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -27593,6 +29342,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -27641,6 +29393,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -27689,6 +29444,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -27736,6 +29494,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -27783,6 +29544,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -27830,6 +29594,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -27877,6 +29644,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -27924,6 +29694,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -27971,6 +29744,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -28018,6 +29794,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -28067,6 +29846,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "gl_tests_validating",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -28114,6 +29896,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -28161,6 +29946,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -28208,6 +29996,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -28255,6 +30046,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -28302,6 +30096,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -28349,6 +30146,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -28396,6 +30196,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -28443,6 +30246,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -28490,6 +30296,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -28537,6 +30346,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -28584,6 +30396,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -28631,6 +30446,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -28678,6 +30496,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -28725,6 +30546,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -28772,6 +30596,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -28820,6 +30647,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -28867,6 +30697,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -28914,6 +30747,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -28961,6 +30797,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -29008,6 +30847,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -29055,6 +30897,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -29102,6 +30947,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -29149,6 +30997,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -29196,6 +31047,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -29243,6 +31097,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -29290,6 +31147,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -29337,6 +31197,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -29384,6 +31247,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -29431,6 +31297,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -29478,6 +31347,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -29525,6 +31397,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -29572,6 +31447,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -29619,6 +31497,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -29666,6 +31547,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -29713,6 +31597,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -29760,6 +31647,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -29807,6 +31697,9 @@
           "script": "//tools/perf/process_perf_results.py"
         },
         "name": "components_perftests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -29833,8 +31726,7 @@
         },
         "name": "content_shell_crash_test",
         "resultdb": {
-          "enable": true,
-          "result_format": "single"
+          "enable": true
         },
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -29887,6 +31779,9 @@
       {
         "isolate_profile_data": true,
         "name": "android_webview_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "android_webview_junit_tests",
         "test_id_prefix": "ninja://android_webview/test:android_webview_junit_tests/"
@@ -29894,6 +31789,9 @@
       {
         "isolate_profile_data": true,
         "name": "base_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "base_junit_tests",
         "test_id_prefix": "ninja://base:base_junit_tests/"
@@ -29901,6 +31799,9 @@
       {
         "isolate_profile_data": true,
         "name": "chrome_java_test_pagecontroller_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "chrome_java_test_pagecontroller_junit_tests",
         "test_id_prefix": "ninja://chrome/test/android:chrome_java_test_pagecontroller_junit_tests/"
@@ -29908,6 +31809,9 @@
       {
         "isolate_profile_data": true,
         "name": "chrome_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "chrome_junit_tests",
         "test_id_prefix": "ninja://chrome/android:chrome_junit_tests/"
@@ -29915,6 +31819,9 @@
       {
         "isolate_profile_data": true,
         "name": "components_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "components_junit_tests",
         "test_id_prefix": "ninja://components:components_junit_tests/"
@@ -29922,6 +31829,9 @@
       {
         "isolate_profile_data": true,
         "name": "content_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "content_junit_tests",
         "test_id_prefix": "ninja://content/public/android:content_junit_tests/"
@@ -29929,6 +31839,9 @@
       {
         "isolate_profile_data": true,
         "name": "device_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "device_junit_tests",
         "test_id_prefix": "ninja://device:device_junit_tests/"
@@ -29936,6 +31849,9 @@
       {
         "isolate_profile_data": true,
         "name": "junit_unit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "junit_unit_tests",
         "test_id_prefix": "ninja://testing/android/junit:junit_unit_tests/"
@@ -29943,6 +31859,9 @@
       {
         "isolate_profile_data": true,
         "name": "keyboard_accessory_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "keyboard_accessory_junit_tests",
         "test_id_prefix": "ninja://chrome/android/features/keyboard_accessory:keyboard_accessory_junit_tests/"
@@ -29950,6 +31869,9 @@
       {
         "isolate_profile_data": true,
         "name": "media_base_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "media_base_junit_tests",
         "test_id_prefix": "ninja://media/base/android:media_base_junit_tests/"
@@ -29957,6 +31879,9 @@
       {
         "isolate_profile_data": true,
         "name": "module_installer_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "module_installer_junit_tests",
         "test_id_prefix": "ninja://components/module_installer/android:module_installer_junit_tests/"
@@ -29964,6 +31889,9 @@
       {
         "isolate_profile_data": true,
         "name": "net_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "net_junit_tests",
         "test_id_prefix": "ninja://net/android:net_junit_tests/"
@@ -29971,6 +31899,9 @@
       {
         "isolate_profile_data": true,
         "name": "paint_preview_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "paint_preview_junit_tests",
         "test_id_prefix": "ninja://components/paint_preview/player/android:paint_preview_junit_tests/"
@@ -29978,6 +31909,9 @@
       {
         "isolate_profile_data": true,
         "name": "password_check_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "password_check_junit_tests",
         "test_id_prefix": "ninja://chrome/browser/password_check/android:password_check_junit_tests/"
@@ -29985,6 +31919,9 @@
       {
         "isolate_profile_data": true,
         "name": "password_manager_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "password_manager_junit_tests",
         "test_id_prefix": "ninja://chrome/browser/password_manager/android:password_manager_junit_tests/"
@@ -29992,6 +31929,9 @@
       {
         "isolate_profile_data": true,
         "name": "services_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "services_junit_tests",
         "test_id_prefix": "ninja://services:services_junit_tests/"
@@ -29999,6 +31939,9 @@
       {
         "isolate_profile_data": true,
         "name": "touch_to_fill_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "touch_to_fill_junit_tests",
         "test_id_prefix": "ninja://chrome/browser/touch_to_fill/android:touch_to_fill_junit_tests/"
@@ -30006,6 +31949,9 @@
       {
         "isolate_profile_data": true,
         "name": "ui_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "ui_junit_tests",
         "test_id_prefix": "ninja://ui/android:ui_junit_tests/"
@@ -30013,6 +31959,9 @@
       {
         "isolate_profile_data": true,
         "name": "webapk_client_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "webapk_client_junit_tests",
         "test_id_prefix": "ninja://chrome/android/webapk/libs/client:webapk_client_junit_tests/"
@@ -30020,6 +31969,9 @@
       {
         "isolate_profile_data": true,
         "name": "webapk_shell_apk_h2o_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "webapk_shell_apk_h2o_junit_tests",
         "test_id_prefix": "ninja://chrome/android/webapk/shell_apk:webapk_shell_apk_h2o_junit_tests/"
@@ -30027,6 +31979,9 @@
       {
         "isolate_profile_data": true,
         "name": "webapk_shell_apk_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "webapk_shell_apk_junit_tests",
         "test_id_prefix": "ninja://chrome/android/webapk/shell_apk:webapk_shell_apk_junit_tests/"
@@ -30051,6 +32006,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -30110,6 +32068,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -30174,6 +32135,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -30233,6 +32197,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -30293,6 +32260,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -30352,6 +32322,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -30406,6 +32379,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -30449,6 +32425,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -30508,6 +32487,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -30567,6 +32549,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -30626,6 +32611,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -30685,6 +32673,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -30745,6 +32736,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "webkit_unit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -30805,6 +32799,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -30864,6 +32861,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -30923,6 +32923,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -30983,6 +32986,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -31042,6 +33048,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -31102,6 +33111,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -31167,6 +33179,9 @@
           "--gerrit-patchset=${patch_set}",
           "--buildbucket-id=${buildbucket_build_id}"
         ],
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -31226,6 +33241,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -31285,6 +33303,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -31344,6 +33365,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -31545,6 +33569,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -31606,6 +33633,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_out_of_process_components_browsertests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -31665,6 +33695,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -31726,6 +33759,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -31789,6 +33825,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_out_of_process_content_browsertests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -31850,6 +33889,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -31913,6 +33955,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_out_of_process_content_shell_test_apk",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -31973,6 +34018,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -32033,6 +34081,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -32092,6 +34143,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -32151,6 +34205,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -32210,6 +34267,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -32269,6 +34329,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -32328,6 +34391,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -32387,6 +34453,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -32446,6 +34515,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -32508,6 +34580,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "gl_tests_validating",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -32567,6 +34642,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -32626,6 +34704,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -32685,6 +34766,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -32744,6 +34828,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -32803,6 +34890,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -32862,6 +34952,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -32921,6 +35014,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -32980,6 +35076,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -33039,6 +35138,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -33098,6 +35200,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -33158,6 +35263,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -33217,6 +35325,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -33276,6 +35387,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -33335,6 +35449,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -33395,6 +35512,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -33456,6 +35576,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -33515,6 +35638,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -33574,6 +35700,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -33633,6 +35762,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -33692,6 +35824,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -33751,6 +35886,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -33810,6 +35948,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -33869,6 +36010,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -33928,6 +36072,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -33987,6 +36134,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -34047,6 +36197,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -34106,6 +36259,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -34165,6 +36321,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -34224,6 +36383,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -34283,6 +36445,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -34346,6 +36511,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_webview_instrumentation_test_apk",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -34406,6 +36574,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -34465,6 +36636,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -34524,6 +36698,9 @@
           "script": "//tools/perf/process_perf_results.py"
         },
         "name": "components_perftests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -34560,6 +36737,9 @@
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
         "name": "monochrome_public_apk_checker",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -34608,6 +36788,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -34654,6 +36837,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -34701,6 +36887,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -34747,6 +36936,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -34788,6 +36980,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -34818,6 +37013,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -34864,6 +37062,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -34910,6 +37111,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -34956,6 +37160,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -35003,6 +37210,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -35050,6 +37260,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "webkit_unit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -35097,6 +37310,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -35143,6 +37359,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -35189,6 +37408,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -35236,6 +37458,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -35282,6 +37507,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -35328,6 +37556,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -35374,6 +37605,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -35420,6 +37654,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -35466,6 +37703,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -35572,6 +37812,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -35619,6 +37862,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -35665,6 +37911,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -35713,6 +37962,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -35760,6 +38012,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -35807,6 +38062,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -35854,6 +38112,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -35900,6 +38161,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -35946,6 +38210,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -35992,6 +38259,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -36038,6 +38308,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -36084,6 +38357,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -36130,6 +38406,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -36176,6 +38455,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -36224,6 +38506,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "gl_tests_validating",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -36270,6 +38555,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -36316,6 +38604,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -36362,6 +38653,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -36408,6 +38702,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -36454,6 +38751,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -36500,6 +38800,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -36546,6 +38849,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -36592,6 +38898,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -36638,6 +38947,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -36684,6 +38996,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -36730,6 +39045,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -36776,6 +39094,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -36822,6 +39143,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -36868,6 +39192,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -36914,6 +39241,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -36960,6 +39290,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -37006,6 +39339,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -37052,6 +39388,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -37099,6 +39438,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -37146,6 +39488,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -37192,6 +39537,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -37238,6 +39586,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -37284,6 +39635,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -37330,6 +39684,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -37376,6 +39733,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -37422,6 +39782,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -37468,6 +39831,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -37514,6 +39880,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -37560,6 +39929,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -37607,6 +39979,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -37653,6 +40028,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -37699,6 +40077,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -37745,6 +40126,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -37791,6 +40175,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -37837,6 +40224,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -37883,6 +40273,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -37929,6 +40322,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -37975,6 +40371,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -38021,6 +40420,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -38067,6 +40469,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -38117,6 +40522,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_webview_instrumentation_test_apk",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -38164,6 +40572,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -38210,6 +40621,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -38256,6 +40670,9 @@
           "script": "//tools/perf/process_perf_results.py"
         },
         "name": "components_perftests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -38281,8 +40698,7 @@
         },
         "name": "content_shell_crash_test",
         "resultdb": {
-          "enable": true,
-          "result_format": "single"
+          "enable": true
         },
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -38305,6 +40721,9 @@
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
         "name": "monochrome_public_apk_checker",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -38399,6 +40818,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -38446,6 +40868,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -38493,6 +40918,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -38544,6 +40972,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "chrome_public_test_vr_apk-ddready-cardboard",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -38603,6 +41034,9 @@
           "--gerrit-patchset=${patch_set}",
           "--buildbucket-id=${buildbucket_build_id}"
         ],
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -38658,6 +41092,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "chrome_public_test_vr_apk-ddready-don-enabled",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -38705,6 +41142,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -38752,6 +41192,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -38799,6 +41242,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -38848,6 +41294,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -38895,6 +41344,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -38952,6 +41404,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -38999,6 +41454,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -39046,6 +41504,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -39093,6 +41554,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -39140,6 +41604,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -39188,6 +41655,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -39235,6 +41705,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -39282,6 +41755,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -39329,6 +41805,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -39376,6 +41855,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -39423,6 +41905,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -39476,6 +41961,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -39529,6 +42017,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -39589,6 +42080,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -39649,6 +42143,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -39708,6 +42205,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -39762,6 +42262,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -39805,6 +42308,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -39864,6 +42370,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -39923,6 +42432,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -39982,6 +42494,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -40041,6 +42556,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -40101,6 +42619,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "webkit_unit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -40161,6 +42682,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -40220,6 +42744,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -40279,6 +42806,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -40339,6 +42869,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -40398,6 +42931,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -40458,6 +42994,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -40517,6 +43056,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -40576,6 +43118,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -40635,6 +43180,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -40838,6 +43386,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -40899,6 +43450,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_out_of_process_components_browsertests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -40958,6 +43512,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -41019,6 +43576,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -41082,6 +43642,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_out_of_process_content_browsertests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -41143,6 +43706,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -41206,6 +43772,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_out_of_process_content_shell_test_apk",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -41266,6 +43835,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -41326,6 +43898,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -41385,6 +43960,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -41444,6 +44022,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -41503,6 +44084,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -41562,6 +44146,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -41621,6 +44208,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -41680,6 +44270,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -41739,6 +44332,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -41801,6 +44397,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "gl_tests_validating",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -41860,6 +44459,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -41919,6 +44521,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -41978,6 +44583,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -42037,6 +44645,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -42096,6 +44707,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -42155,6 +44769,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -42214,6 +44831,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -42273,6 +44893,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -42332,6 +44955,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -42391,6 +45017,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -42451,6 +45080,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -42510,6 +45142,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -42569,6 +45204,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -42628,6 +45266,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -42687,6 +45328,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -42746,6 +45390,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -42805,6 +45452,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -42865,6 +45515,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -42926,6 +45579,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -42985,6 +45641,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -43044,6 +45703,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -43103,6 +45765,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -43162,6 +45827,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -43221,6 +45889,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -43280,6 +45951,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -43339,6 +46013,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -43398,6 +46075,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -43457,6 +46137,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -43516,6 +46199,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -43576,6 +46262,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -43636,6 +46325,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -43695,6 +46387,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -43754,6 +46449,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -43813,6 +46511,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -43872,6 +46573,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -43931,6 +46635,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -43990,6 +46697,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -44056,6 +46766,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -44119,6 +46832,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_webview_instrumentation_test_apk",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -44179,6 +46895,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -44238,6 +46957,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -44297,6 +47019,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
diff --git a/testing/buildbot/chromium.clang.json b/testing/buildbot/chromium.clang.json
index 4b4241e..f56af5d0e 100644
--- a/testing/buildbot/chromium.clang.json
+++ b/testing/buildbot/chromium.clang.json
@@ -5140,6 +5140,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5186,6 +5189,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5233,6 +5239,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5279,6 +5288,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5320,6 +5332,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5350,6 +5365,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5396,6 +5414,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5442,6 +5463,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5488,6 +5512,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5534,6 +5561,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5581,6 +5611,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "webkit_unit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5628,6 +5661,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5674,6 +5710,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5720,6 +5759,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5767,6 +5809,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5813,6 +5858,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5859,6 +5907,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5905,6 +5956,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6065,6 +6119,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6113,6 +6170,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_out_of_process_components_browsertests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6159,6 +6219,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6206,6 +6269,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6255,6 +6321,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_out_of_process_content_browsertests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6302,6 +6371,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6351,6 +6423,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_out_of_process_content_shell_test_apk",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6398,6 +6473,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6445,6 +6523,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6491,6 +6572,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6537,6 +6621,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6583,6 +6670,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6629,6 +6719,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6675,6 +6768,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6721,6 +6817,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6767,6 +6866,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6815,6 +6917,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "gl_tests_validating",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6861,6 +6966,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6907,6 +7015,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6953,6 +7064,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6999,6 +7113,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7045,6 +7162,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7091,6 +7211,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7137,6 +7260,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7183,6 +7309,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7229,6 +7358,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7275,6 +7407,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7321,6 +7456,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7367,6 +7505,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7413,6 +7554,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7459,6 +7603,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7505,6 +7652,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7552,6 +7702,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7598,6 +7751,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7644,6 +7800,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7690,6 +7849,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7736,6 +7898,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7782,6 +7947,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7828,6 +7996,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7874,6 +8045,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7920,6 +8094,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7966,6 +8143,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8013,6 +8193,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8059,6 +8242,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8105,6 +8291,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8151,6 +8340,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8197,6 +8389,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8243,6 +8438,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8289,6 +8487,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8330,6 +8531,9 @@
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
         "name": "monochrome_public_apk_checker",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8346,126 +8550,189 @@
     "junit_tests": [
       {
         "name": "android_webview_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "android_webview_junit_tests",
         "test_id_prefix": "ninja://android_webview/test:android_webview_junit_tests/"
       },
       {
         "name": "base_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "base_junit_tests",
         "test_id_prefix": "ninja://base:base_junit_tests/"
       },
       {
         "name": "chrome_java_test_pagecontroller_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "chrome_java_test_pagecontroller_junit_tests",
         "test_id_prefix": "ninja://chrome/test/android:chrome_java_test_pagecontroller_junit_tests/"
       },
       {
         "name": "chrome_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "chrome_junit_tests",
         "test_id_prefix": "ninja://chrome/android:chrome_junit_tests/"
       },
       {
         "name": "components_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "components_junit_tests",
         "test_id_prefix": "ninja://components:components_junit_tests/"
       },
       {
         "name": "content_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "content_junit_tests",
         "test_id_prefix": "ninja://content/public/android:content_junit_tests/"
       },
       {
         "name": "device_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "device_junit_tests",
         "test_id_prefix": "ninja://device:device_junit_tests/"
       },
       {
         "name": "junit_unit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "junit_unit_tests",
         "test_id_prefix": "ninja://testing/android/junit:junit_unit_tests/"
       },
       {
         "name": "keyboard_accessory_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "keyboard_accessory_junit_tests",
         "test_id_prefix": "ninja://chrome/android/features/keyboard_accessory:keyboard_accessory_junit_tests/"
       },
       {
         "name": "media_base_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "media_base_junit_tests",
         "test_id_prefix": "ninja://media/base/android:media_base_junit_tests/"
       },
       {
         "name": "module_installer_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "module_installer_junit_tests",
         "test_id_prefix": "ninja://components/module_installer/android:module_installer_junit_tests/"
       },
       {
         "name": "net_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "net_junit_tests",
         "test_id_prefix": "ninja://net/android:net_junit_tests/"
       },
       {
         "name": "paint_preview_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "paint_preview_junit_tests",
         "test_id_prefix": "ninja://components/paint_preview/player/android:paint_preview_junit_tests/"
       },
       {
         "name": "password_check_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "password_check_junit_tests",
         "test_id_prefix": "ninja://chrome/browser/password_check/android:password_check_junit_tests/"
       },
       {
         "name": "password_manager_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "password_manager_junit_tests",
         "test_id_prefix": "ninja://chrome/browser/password_manager/android:password_manager_junit_tests/"
       },
       {
         "name": "services_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "services_junit_tests",
         "test_id_prefix": "ninja://services:services_junit_tests/"
       },
       {
         "name": "touch_to_fill_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "touch_to_fill_junit_tests",
         "test_id_prefix": "ninja://chrome/browser/touch_to_fill/android:touch_to_fill_junit_tests/"
       },
       {
         "name": "ui_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "ui_junit_tests",
         "test_id_prefix": "ninja://ui/android:ui_junit_tests/"
       },
       {
         "name": "webapk_client_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "webapk_client_junit_tests",
         "test_id_prefix": "ninja://chrome/android/webapk/libs/client:webapk_client_junit_tests/"
       },
       {
         "name": "webapk_shell_apk_h2o_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "webapk_shell_apk_h2o_junit_tests",
         "test_id_prefix": "ninja://chrome/android/webapk/shell_apk:webapk_shell_apk_h2o_junit_tests/"
       },
       {
         "name": "webapk_shell_apk_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "webapk_shell_apk_junit_tests",
         "test_id_prefix": "ninja://chrome/android/webapk/shell_apk:webapk_shell_apk_junit_tests/"
@@ -8507,6 +8774,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8543,6 +8813,9 @@
     "junit_tests": [
       {
         "name": "base_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "base_junit_tests",
         "test_id_prefix": "ninja://base:base_junit_tests/"
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index ccbc638..da24421 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -1936,6 +1936,9 @@
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
         "name": "site_per_process_android_browsertests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1992,6 +1995,9 @@
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
         "name": "site_per_process_components_browsertests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2015,6 +2021,9 @@
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
         "name": "site_per_process_components_unittests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2040,6 +2049,9 @@
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
         "name": "site_per_process_content_browsertests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2064,6 +2076,9 @@
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
         "name": "site_per_process_content_shell_test_apk",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2088,6 +2103,9 @@
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
         "name": "site_per_process_content_unittests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2111,6 +2129,9 @@
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
         "name": "site_per_process_unit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2138,6 +2159,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3390,6 +3414,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3437,6 +3464,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3485,6 +3515,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3532,6 +3565,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3574,6 +3610,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3605,6 +3644,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3652,6 +3694,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3699,6 +3744,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3746,6 +3794,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3793,6 +3844,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3841,6 +3895,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "webkit_unit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3889,6 +3946,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3936,6 +3996,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3983,6 +4046,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4031,6 +4097,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4078,6 +4147,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4125,6 +4197,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4172,6 +4247,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4219,6 +4297,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4266,6 +4347,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4431,6 +4515,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4479,6 +4566,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4528,6 +4618,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_out_of_process_components_browsertests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4575,6 +4668,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4623,6 +4719,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4673,6 +4772,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_out_of_process_content_browsertests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4721,6 +4823,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4771,6 +4876,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_out_of_process_content_shell_test_apk",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4819,6 +4927,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4867,6 +4978,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4914,6 +5028,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4961,6 +5078,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5008,6 +5128,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5055,6 +5178,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5102,6 +5228,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5149,6 +5278,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5196,6 +5328,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5245,6 +5380,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "gl_tests_validating",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5292,6 +5430,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5339,6 +5480,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5386,6 +5530,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5433,6 +5580,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5480,6 +5630,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5527,6 +5680,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5574,6 +5730,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5621,6 +5780,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5668,6 +5830,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5715,6 +5880,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5762,6 +5930,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5809,6 +5980,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5856,6 +6030,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5903,6 +6080,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5950,6 +6130,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5998,6 +6181,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6045,6 +6231,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6092,6 +6281,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6139,6 +6331,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6186,6 +6381,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6233,6 +6431,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6280,6 +6481,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6327,6 +6531,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6374,6 +6581,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6421,6 +6631,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6469,6 +6682,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6516,6 +6732,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6563,6 +6782,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6610,6 +6832,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6657,6 +6882,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6704,6 +6932,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6751,6 +6982,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6798,6 +7032,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6845,6 +7082,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6892,6 +7132,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6939,6 +7182,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6992,6 +7238,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7043,6 +7292,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_webview_instrumentation_test_apk",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7091,6 +7343,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7138,6 +7393,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7185,6 +7443,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7222,6 +7483,9 @@
       {
         "isolate_profile_data": true,
         "name": "android_webview_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "android_webview_junit_tests",
         "test_id_prefix": "ninja://android_webview/test:android_webview_junit_tests/"
@@ -7229,6 +7493,9 @@
       {
         "isolate_profile_data": true,
         "name": "base_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "base_junit_tests",
         "test_id_prefix": "ninja://base:base_junit_tests/"
@@ -7236,6 +7503,9 @@
       {
         "isolate_profile_data": true,
         "name": "chrome_java_test_pagecontroller_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "chrome_java_test_pagecontroller_junit_tests",
         "test_id_prefix": "ninja://chrome/test/android:chrome_java_test_pagecontroller_junit_tests/"
@@ -7243,6 +7513,9 @@
       {
         "isolate_profile_data": true,
         "name": "chrome_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "chrome_junit_tests",
         "test_id_prefix": "ninja://chrome/android:chrome_junit_tests/"
@@ -7250,6 +7523,9 @@
       {
         "isolate_profile_data": true,
         "name": "components_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "components_junit_tests",
         "test_id_prefix": "ninja://components:components_junit_tests/"
@@ -7257,6 +7533,9 @@
       {
         "isolate_profile_data": true,
         "name": "content_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "content_junit_tests",
         "test_id_prefix": "ninja://content/public/android:content_junit_tests/"
@@ -7264,6 +7543,9 @@
       {
         "isolate_profile_data": true,
         "name": "device_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "device_junit_tests",
         "test_id_prefix": "ninja://device:device_junit_tests/"
@@ -7271,6 +7553,9 @@
       {
         "isolate_profile_data": true,
         "name": "junit_unit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "junit_unit_tests",
         "test_id_prefix": "ninja://testing/android/junit:junit_unit_tests/"
@@ -7278,6 +7563,9 @@
       {
         "isolate_profile_data": true,
         "name": "keyboard_accessory_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "keyboard_accessory_junit_tests",
         "test_id_prefix": "ninja://chrome/android/features/keyboard_accessory:keyboard_accessory_junit_tests/"
@@ -7285,6 +7573,9 @@
       {
         "isolate_profile_data": true,
         "name": "media_base_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "media_base_junit_tests",
         "test_id_prefix": "ninja://media/base/android:media_base_junit_tests/"
@@ -7292,6 +7583,9 @@
       {
         "isolate_profile_data": true,
         "name": "module_installer_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "module_installer_junit_tests",
         "test_id_prefix": "ninja://components/module_installer/android:module_installer_junit_tests/"
@@ -7299,6 +7593,9 @@
       {
         "isolate_profile_data": true,
         "name": "net_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "net_junit_tests",
         "test_id_prefix": "ninja://net/android:net_junit_tests/"
@@ -7306,6 +7603,9 @@
       {
         "isolate_profile_data": true,
         "name": "paint_preview_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "paint_preview_junit_tests",
         "test_id_prefix": "ninja://components/paint_preview/player/android:paint_preview_junit_tests/"
@@ -7313,6 +7613,9 @@
       {
         "isolate_profile_data": true,
         "name": "password_check_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "password_check_junit_tests",
         "test_id_prefix": "ninja://chrome/browser/password_check/android:password_check_junit_tests/"
@@ -7320,6 +7623,9 @@
       {
         "isolate_profile_data": true,
         "name": "password_manager_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "password_manager_junit_tests",
         "test_id_prefix": "ninja://chrome/browser/password_manager/android:password_manager_junit_tests/"
@@ -7327,6 +7633,9 @@
       {
         "isolate_profile_data": true,
         "name": "services_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "services_junit_tests",
         "test_id_prefix": "ninja://services:services_junit_tests/"
@@ -7334,6 +7643,9 @@
       {
         "isolate_profile_data": true,
         "name": "touch_to_fill_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "touch_to_fill_junit_tests",
         "test_id_prefix": "ninja://chrome/browser/touch_to_fill/android:touch_to_fill_junit_tests/"
@@ -7341,6 +7653,9 @@
       {
         "isolate_profile_data": true,
         "name": "ui_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "ui_junit_tests",
         "test_id_prefix": "ninja://ui/android:ui_junit_tests/"
@@ -7348,6 +7663,9 @@
       {
         "isolate_profile_data": true,
         "name": "webapk_client_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "webapk_client_junit_tests",
         "test_id_prefix": "ninja://chrome/android/webapk/libs/client:webapk_client_junit_tests/"
@@ -7355,6 +7673,9 @@
       {
         "isolate_profile_data": true,
         "name": "webapk_shell_apk_h2o_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "webapk_shell_apk_h2o_junit_tests",
         "test_id_prefix": "ninja://chrome/android/webapk/shell_apk:webapk_shell_apk_h2o_junit_tests/"
@@ -7362,6 +7683,9 @@
       {
         "isolate_profile_data": true,
         "name": "webapk_shell_apk_junit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {},
         "test": "webapk_shell_apk_junit_tests",
         "test_id_prefix": "ninja://chrome/android/webapk/shell_apk:webapk_shell_apk_junit_tests/"
@@ -7385,6 +7709,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7433,6 +7760,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7482,6 +7812,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7525,6 +7858,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7557,6 +7893,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7605,6 +7944,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7653,6 +7995,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7701,6 +8046,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7749,6 +8097,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7797,6 +8148,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7845,6 +8199,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7893,6 +8250,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7942,6 +8302,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -7990,6 +8353,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8038,6 +8404,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8086,6 +8455,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8134,6 +8506,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8182,6 +8557,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8230,6 +8608,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8278,6 +8659,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8326,6 +8710,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8374,6 +8761,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8422,6 +8812,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8472,6 +8865,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "gl_tests_validating",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8520,6 +8916,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8568,6 +8967,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8616,6 +9018,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8664,6 +9069,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8712,6 +9120,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8760,6 +9171,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8808,6 +9222,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8856,6 +9273,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8904,6 +9324,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -8952,6 +9375,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9000,6 +9426,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9048,6 +9477,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9096,6 +9528,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9144,6 +9579,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9192,6 +9630,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9241,6 +9682,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9289,6 +9733,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9337,6 +9784,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9385,6 +9835,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9433,6 +9886,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9481,6 +9937,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9529,6 +9988,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9577,6 +10039,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9625,6 +10090,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9673,6 +10141,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9721,6 +10192,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9769,6 +10243,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9817,6 +10294,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -9859,6 +10339,66 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "android_browsertests",
+        "test_id_prefix": "ninja://chrome/test:android_browsertests/"
+      },
+      {
+        "args": [
+          "--test-launcher-batch-limit=1"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "android_sync_integration_tests",
+        "test_id_prefix": "ninja://chrome/test:android_sync_integration_tests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "android_webview_unittests",
+        "test_id_prefix": "ninja://android_webview/test:android_webview_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9877,6 +10417,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9895,6 +10438,27 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "breakpad_unittests",
+        "test_id_prefix": "ninja://third_party/breakpad:breakpad_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9909,6 +10473,100 @@
         "test_id_prefix": "ninja://chrome/android:chrome_public_smoke_test/"
       },
       {
+        "args": [
+          "--git-revision=${got_revision}"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "precommit_args": [
+          "--gerrit-issue=${patch_issue}",
+          "--gerrit-patchset=${patch_set}",
+          "--buildbucket-id=${buildbucket_build_id}"
+        ],
+        "resultdb": {
+          "enable": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chrome-gold@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 20
+        },
+        "test": "chrome_public_test_apk",
+        "test_id_prefix": "ninja://chrome/android:chrome_public_test_apk/"
+      },
+      {
+        "args": [
+          "--shared-prefs-file=//chrome/android/shared_preference_files/test/vr_cardboard_skipdon_setupcomplete.json",
+          "--additional-apk=//third_party/gvr-android-sdk/test-apks/vr_services/vr_services_current.apk"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
+        },
+        "test": "chrome_public_test_vr_apk",
+        "test_id_prefix": "ninja://chrome/android:chrome_public_test_vr_apk/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 3
+        },
+        "test": "content_shell_test_apk",
+        "test_id_prefix": "ninja://content/shell/android:content_shell_test_apk/"
+      },
+      {
+        "args": [
+          "--use-cmd-decoder=validating"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "name": "gl_tests_validating",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gl_tests",
+        "test_id_prefix": "ninja://gpu:gl_tests/"
+      },
+      {
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9923,6 +10581,63 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
+        "test": "gl_unittests",
+        "test_id_prefix": "ninja://ui/gl:gl_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "mojo_test_apk",
+        "test_id_prefix": "ninja://mojo/public/java/system:mojo_test_apk/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "ui_android_unittests",
+        "test_id_prefix": "ninja://ui/android:ui_android_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "resultdb": {
+          "enable": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
         "test": "unit_tests",
         "test_id_prefix": "ninja://chrome/test:unit_tests/"
       },
@@ -9931,6 +10646,46 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "vr_android_unittests",
+        "test_id_prefix": "ninja://chrome/browser/android/vr:vr_android_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 7
+        },
+        "test": "webview_instrumentation_test_apk",
+        "test_id_prefix": "ninja://android_webview/test:webview_instrumentation_test_apk/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9963,6 +10718,63 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
+        "test": "android_browsertests",
+        "test_id_prefix": "ninja://chrome/test:android_browsertests/"
+      },
+      {
+        "args": [
+          "--test-launcher-batch-limit=1"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "android_sync_integration_tests",
+        "test_id_prefix": "ninja://chrome/test:android_sync_integration_tests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "android_webview_unittests",
+        "test_id_prefix": "ninja://android_webview/test:android_webview_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
         "test": "base_unittests",
         "test_id_prefix": "ninja://base:base_unittests/"
       },
@@ -9999,10 +10811,176 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
+        "test": "breakpad_unittests",
+        "test_id_prefix": "ninja://third_party/breakpad:breakpad_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
         "test": "chrome_public_smoke_test",
         "test_id_prefix": "ninja://chrome/android:chrome_public_smoke_test/"
       },
       {
+        "args": [
+          "--git-revision=${got_revision}"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "precommit_args": [
+          "--gerrit-issue=${patch_issue}",
+          "--gerrit-patchset=${patch_set}",
+          "--buildbucket-id=${buildbucket_build_id}"
+        ],
+        "resultdb": {
+          "enable": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chrome-gold@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 20
+        },
+        "test": "chrome_public_test_apk",
+        "test_id_prefix": "ninja://chrome/android:chrome_public_test_apk/"
+      },
+      {
+        "args": [
+          "--shared-prefs-file=//chrome/android/shared_preference_files/test/vr_cardboard_skipdon_setupcomplete.json",
+          "--additional-apk=//third_party/gvr-android-sdk/test-apks/vr_services/vr_services_current.apk"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
+        },
+        "test": "chrome_public_test_vr_apk",
+        "test_id_prefix": "ninja://chrome/android:chrome_public_test_vr_apk/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 3
+        },
+        "test": "content_shell_test_apk",
+        "test_id_prefix": "ninja://content/shell/android:content_shell_test_apk/"
+      },
+      {
+        "args": [
+          "--use-cmd-decoder=validating"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "name": "gl_tests_validating",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gl_tests",
+        "test_id_prefix": "ninja://gpu:gl_tests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gl_unittests",
+        "test_id_prefix": "ninja://ui/gl:gl_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "mojo_test_apk",
+        "test_id_prefix": "ninja://mojo/public/java/system:mojo_test_apk/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "ui_android_unittests",
+        "test_id_prefix": "ninja://ui/android:ui_android_unittests/"
+      },
+      {
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -10035,6 +11013,43 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
+        "test": "vr_android_unittests",
+        "test_id_prefix": "ninja://chrome/browser/android/vr:vr_android_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 7
+        },
+        "test": "webview_instrumentation_test_apk",
+        "test_id_prefix": "ninja://android_webview/test:webview_instrumentation_test_apk/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
         "test": "wtf_unittests",
         "test_id_prefix": "ninja://third_party/blink/renderer/platform/wtf:wtf_unittests/"
       }
@@ -10047,6 +11062,66 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "android_browsertests",
+        "test_id_prefix": "ninja://chrome/test:android_browsertests/"
+      },
+      {
+        "args": [
+          "--test-launcher-batch-limit=1"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "android_sync_integration_tests",
+        "test_id_prefix": "ninja://chrome/test:android_sync_integration_tests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "android_webview_unittests",
+        "test_id_prefix": "ninja://android_webview/test:android_webview_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10065,6 +11140,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10083,6 +11161,27 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "breakpad_unittests",
+        "test_id_prefix": "ninja://third_party/breakpad:breakpad_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10097,6 +11196,100 @@
         "test_id_prefix": "ninja://chrome/android:chrome_public_smoke_test/"
       },
       {
+        "args": [
+          "--git-revision=${got_revision}"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "precommit_args": [
+          "--gerrit-issue=${patch_issue}",
+          "--gerrit-patchset=${patch_set}",
+          "--buildbucket-id=${buildbucket_build_id}"
+        ],
+        "resultdb": {
+          "enable": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chrome-gold@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 20
+        },
+        "test": "chrome_public_test_apk",
+        "test_id_prefix": "ninja://chrome/android:chrome_public_test_apk/"
+      },
+      {
+        "args": [
+          "--shared-prefs-file=//chrome/android/shared_preference_files/test/vr_cardboard_skipdon_setupcomplete.json",
+          "--additional-apk=//third_party/gvr-android-sdk/test-apks/vr_services/vr_services_current.apk"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
+        },
+        "test": "chrome_public_test_vr_apk",
+        "test_id_prefix": "ninja://chrome/android:chrome_public_test_vr_apk/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 3
+        },
+        "test": "content_shell_test_apk",
+        "test_id_prefix": "ninja://content/shell/android:content_shell_test_apk/"
+      },
+      {
+        "args": [
+          "--use-cmd-decoder=validating"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "name": "gl_tests_validating",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gl_tests",
+        "test_id_prefix": "ninja://gpu:gl_tests/"
+      },
+      {
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -10111,6 +11304,63 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
+        "test": "gl_unittests",
+        "test_id_prefix": "ninja://ui/gl:gl_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "mojo_test_apk",
+        "test_id_prefix": "ninja://mojo/public/java/system:mojo_test_apk/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "ui_android_unittests",
+        "test_id_prefix": "ninja://ui/android:ui_android_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "resultdb": {
+          "enable": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
         "test": "unit_tests",
         "test_id_prefix": "ninja://chrome/test:unit_tests/"
       },
@@ -10119,6 +11369,46 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "vr_android_unittests",
+        "test_id_prefix": "ninja://chrome/browser/android/vr:vr_android_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 7
+        },
+        "test": "webview_instrumentation_test_apk",
+        "test_id_prefix": "ninja://android_webview/test:webview_instrumentation_test_apk/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10141,6 +11431,66 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "android_browsertests",
+        "test_id_prefix": "ninja://chrome/test:android_browsertests/"
+      },
+      {
+        "args": [
+          "--test-launcher-batch-limit=1"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "android_sync_integration_tests",
+        "test_id_prefix": "ninja://chrome/test:android_sync_integration_tests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "android_webview_unittests",
+        "test_id_prefix": "ninja://android_webview/test:android_webview_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10159,6 +11509,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10177,6 +11530,27 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "breakpad_unittests",
+        "test_id_prefix": "ninja://third_party/breakpad:breakpad_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10191,6 +11565,100 @@
         "test_id_prefix": "ninja://chrome/android:chrome_public_smoke_test/"
       },
       {
+        "args": [
+          "--git-revision=${got_revision}"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "precommit_args": [
+          "--gerrit-issue=${patch_issue}",
+          "--gerrit-patchset=${patch_set}",
+          "--buildbucket-id=${buildbucket_build_id}"
+        ],
+        "resultdb": {
+          "enable": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chrome-gold@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 20
+        },
+        "test": "chrome_public_test_apk",
+        "test_id_prefix": "ninja://chrome/android:chrome_public_test_apk/"
+      },
+      {
+        "args": [
+          "--shared-prefs-file=//chrome/android/shared_preference_files/test/vr_cardboard_skipdon_setupcomplete.json",
+          "--additional-apk=//third_party/gvr-android-sdk/test-apks/vr_services/vr_services_current.apk"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
+        },
+        "test": "chrome_public_test_vr_apk",
+        "test_id_prefix": "ninja://chrome/android:chrome_public_test_vr_apk/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 3
+        },
+        "test": "content_shell_test_apk",
+        "test_id_prefix": "ninja://content/shell/android:content_shell_test_apk/"
+      },
+      {
+        "args": [
+          "--use-cmd-decoder=validating"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "name": "gl_tests_validating",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gl_tests",
+        "test_id_prefix": "ninja://gpu:gl_tests/"
+      },
+      {
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -10205,6 +11673,63 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
+        "test": "gl_unittests",
+        "test_id_prefix": "ninja://ui/gl:gl_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "mojo_test_apk",
+        "test_id_prefix": "ninja://mojo/public/java/system:mojo_test_apk/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "ui_android_unittests",
+        "test_id_prefix": "ninja://ui/android:ui_android_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "resultdb": {
+          "enable": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
         "test": "unit_tests",
         "test_id_prefix": "ninja://chrome/test:unit_tests/"
       },
@@ -10213,6 +11738,46 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "vr_android_unittests",
+        "test_id_prefix": "ninja://chrome/browser/android/vr:vr_android_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "walleye",
+              "os": "Android"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 7
+        },
+        "test": "webview_instrumentation_test_apk",
+        "test_id_prefix": "ninja://android_webview/test:webview_instrumentation_test_apk/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -35858,7 +37423,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "absl_hardening_tests",
@@ -35883,7 +37448,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -35900,7 +37465,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "base_unittests",
@@ -35925,7 +37490,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -35942,7 +37507,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "base_unittests",
@@ -35967,7 +37532,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -35984,7 +37549,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "base_unittests",
@@ -36009,7 +37574,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -36026,7 +37591,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "boringssl_crypto_tests",
@@ -36051,7 +37616,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -36068,7 +37633,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "boringssl_ssl_tests",
@@ -36093,7 +37658,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -36110,7 +37675,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "components_unittests",
@@ -36135,7 +37700,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -36152,7 +37717,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "components_unittests",
@@ -36177,7 +37742,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -36194,7 +37759,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "components_unittests",
@@ -36219,7 +37784,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -36236,7 +37801,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "crypto_unittests",
@@ -36261,7 +37826,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -36278,7 +37843,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "gfx_unittests",
@@ -36303,7 +37868,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -36320,7 +37885,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "gfx_unittests",
@@ -36345,7 +37910,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -36362,7 +37927,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "gfx_unittests",
@@ -36387,7 +37952,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -36404,7 +37969,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "google_apis_unittests",
@@ -36429,7 +37994,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -36446,7 +38011,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -36472,7 +38037,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -36489,7 +38054,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -36515,7 +38080,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -36532,7 +38097,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -36558,7 +38123,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -36575,7 +38140,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -36601,7 +38166,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -36618,7 +38183,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -36644,7 +38209,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -36662,7 +38227,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -36688,7 +38253,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -36706,7 +38271,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -36732,7 +38297,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -36750,7 +38315,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -36776,7 +38341,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -36794,7 +38359,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -36820,7 +38385,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -36838,7 +38403,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -36864,7 +38429,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -36882,7 +38447,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -36908,7 +38473,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -36926,7 +38491,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -36952,7 +38517,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -36970,7 +38535,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -36996,7 +38561,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -37013,7 +38578,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -37039,7 +38604,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -37056,7 +38621,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -37082,7 +38647,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -37099,7 +38664,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -37125,7 +38690,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -37142,7 +38707,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -37168,7 +38733,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -37185,7 +38750,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -37211,7 +38776,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -37228,7 +38793,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -37254,7 +38819,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -37271,7 +38836,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -37297,7 +38862,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -37314,7 +38879,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -37340,7 +38905,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -37358,7 +38923,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -37384,7 +38949,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -37402,7 +38967,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -37428,7 +38993,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -37446,7 +39011,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -37472,7 +39037,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -37490,7 +39055,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_chrome_unittests",
@@ -37515,7 +39080,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -37532,7 +39097,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_chrome_unittests",
@@ -37557,7 +39122,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -37574,7 +39139,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_chrome_unittests",
@@ -37599,7 +39164,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -37616,7 +39181,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -37642,7 +39207,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -37659,7 +39224,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -37685,7 +39250,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -37702,7 +39267,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -37728,7 +39293,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -37745,7 +39310,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -37771,7 +39336,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -37788,7 +39353,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_components_unittests",
@@ -37813,7 +39378,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -37830,7 +39395,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_net_unittests",
@@ -37855,7 +39420,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -37872,7 +39437,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_remoting_unittests",
@@ -37897,7 +39462,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -37914,7 +39479,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -37940,7 +39505,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -37957,7 +39522,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -37983,7 +39548,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -38000,7 +39565,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -38026,7 +39591,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -38043,7 +39608,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -38069,7 +39634,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -38086,7 +39651,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_testing_unittests",
@@ -38111,7 +39676,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -38128,7 +39693,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_web_inttests",
@@ -38153,7 +39718,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -38170,7 +39735,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_web_inttests",
@@ -38195,7 +39760,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -38212,7 +39777,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_web_inttests",
@@ -38237,7 +39802,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -38254,7 +39819,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -38280,7 +39845,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -38297,7 +39862,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -38323,7 +39888,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -38340,7 +39905,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -38366,7 +39931,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -38383,7 +39948,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -38409,7 +39974,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -38426,7 +39991,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_web_unittests",
@@ -38451,7 +40016,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -38468,7 +40033,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_web_unittests",
@@ -38493,7 +40058,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -38510,7 +40075,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_web_unittests",
@@ -38535,7 +40100,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -38552,7 +40117,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_web_view_inttests",
@@ -38577,7 +40142,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -38594,7 +40159,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_web_view_inttests",
@@ -38619,7 +40184,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -38636,7 +40201,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_web_view_inttests",
@@ -38661,7 +40226,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -38678,7 +40243,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_web_view_unittests",
@@ -38703,7 +40268,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -38720,7 +40285,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_web_view_unittests",
@@ -38745,7 +40310,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -38762,7 +40327,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_web_view_unittests",
@@ -38787,7 +40352,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -38804,7 +40369,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "net_unittests",
@@ -38829,7 +40394,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -38846,7 +40411,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "services_unittests",
@@ -38871,7 +40436,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -38888,7 +40453,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "skia_unittests",
@@ -38913,7 +40478,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -38930,7 +40495,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "skia_unittests",
@@ -38955,7 +40520,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -38972,7 +40537,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "skia_unittests",
@@ -38997,7 +40562,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -39014,7 +40579,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "sql_unittests",
@@ -39039,7 +40604,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -39056,7 +40621,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ui_base_unittests",
@@ -39081,7 +40646,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -39098,7 +40663,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ui_base_unittests",
@@ -39123,7 +40688,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -39140,7 +40705,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ui_base_unittests",
@@ -39165,7 +40730,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -39182,7 +40747,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "url_unittests",
@@ -39207,7 +40772,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -39231,7 +40796,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "absl_hardening_tests",
@@ -39256,7 +40821,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -39273,7 +40838,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "base_unittests",
@@ -39298,7 +40863,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -39315,7 +40880,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "base_unittests",
@@ -39340,7 +40905,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -39357,7 +40922,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "boringssl_crypto_tests",
@@ -39382,7 +40947,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -39399,7 +40964,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "boringssl_ssl_tests",
@@ -39424,7 +40989,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -39441,7 +41006,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "components_unittests",
@@ -39466,7 +41031,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -39483,7 +41048,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "components_unittests",
@@ -39508,7 +41073,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -39525,7 +41090,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "crypto_unittests",
@@ -39550,7 +41115,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -39567,7 +41132,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "gfx_unittests",
@@ -39592,7 +41157,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -39609,7 +41174,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "gfx_unittests",
@@ -39634,7 +41199,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -39651,7 +41216,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "google_apis_unittests",
@@ -39676,7 +41241,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -39693,7 +41258,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -39719,7 +41284,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -39736,7 +41301,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -39762,7 +41327,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -39779,7 +41344,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -39805,7 +41370,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -39822,7 +41387,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -39848,7 +41413,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -39866,7 +41431,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -39892,7 +41457,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -39910,7 +41475,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -39936,7 +41501,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -39954,7 +41519,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -39980,7 +41545,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -39998,7 +41563,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -40024,7 +41589,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -40042,7 +41607,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -40068,7 +41633,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -40086,7 +41651,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -40112,7 +41677,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -40129,7 +41694,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -40155,7 +41720,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -40172,7 +41737,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -40198,7 +41763,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -40215,7 +41780,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -40241,7 +41806,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -40258,7 +41823,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -40284,7 +41849,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -40301,7 +41866,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -40327,7 +41892,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -40344,7 +41909,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -40370,7 +41935,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -40388,7 +41953,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -40414,7 +41979,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -40432,7 +41997,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -40458,7 +42023,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -40476,7 +42041,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_chrome_unittests",
@@ -40501,7 +42066,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -40518,7 +42083,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_chrome_unittests",
@@ -40543,7 +42108,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -40560,7 +42125,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -40586,7 +42151,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -40603,7 +42168,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -40629,7 +42194,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -40646,7 +42211,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -40672,7 +42237,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -40689,7 +42254,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_components_unittests",
@@ -40714,7 +42279,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -40731,7 +42296,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_net_unittests",
@@ -40756,7 +42321,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -40773,7 +42338,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_remoting_unittests",
@@ -40798,7 +42363,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -40815,7 +42380,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -40841,7 +42406,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -40858,7 +42423,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -40884,7 +42449,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -40901,7 +42466,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -40927,7 +42492,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -40944,7 +42509,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_testing_unittests",
@@ -40969,7 +42534,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -40986,7 +42551,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_web_inttests",
@@ -41011,7 +42576,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -41028,7 +42593,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_web_inttests",
@@ -41053,7 +42618,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -41070,7 +42635,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -41096,7 +42661,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -41113,7 +42678,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -41139,7 +42704,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -41156,7 +42721,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest",
           "--xcode-parallelization"
         ],
@@ -41182,7 +42747,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -41199,7 +42764,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_web_unittests",
@@ -41224,7 +42789,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -41241,7 +42806,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_web_unittests",
@@ -41266,7 +42831,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -41283,7 +42848,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_web_view_inttests",
@@ -41308,7 +42873,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -41325,7 +42890,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_web_view_inttests",
@@ -41350,7 +42915,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -41367,7 +42932,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_web_view_unittests",
@@ -41392,7 +42957,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -41409,7 +42974,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ios_web_view_unittests",
@@ -41434,7 +42999,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -41451,7 +43016,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "net_unittests",
@@ -41476,7 +43041,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -41493,7 +43058,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "services_unittests",
@@ -41518,7 +43083,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -41535,7 +43100,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "skia_unittests",
@@ -41560,7 +43125,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -41577,7 +43142,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "skia_unittests",
@@ -41602,7 +43167,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -41619,7 +43184,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "sql_unittests",
@@ -41644,7 +43209,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -41661,7 +43226,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ui_base_unittests",
@@ -41686,7 +43251,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -41703,7 +43268,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "ui_base_unittests",
@@ -41728,7 +43293,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -41745,7 +43310,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "12b5035g",
+          "12b5044c",
           "--xctest"
         ],
         "isolate_name": "url_unittests",
@@ -41770,7 +43335,7 @@
           ],
           "named_caches": [
             {
-              "name": "xcode_ios_12b5035g",
+              "name": "xcode_ios_12b5044c",
               "path": "Xcode.app"
             }
           ],
@@ -53349,6 +54914,266 @@
       }
     ]
   },
+  "linux-paeverywhere-x64-fyi-dbg": {
+    "gtest_tests": [
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "base_unittests",
+        "test_id_prefix": "ninja://base:base_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "blink_platform_unittests",
+        "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_platform_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "openscreen_unittests",
+        "test_id_prefix": "ninja://chrome/browser/media/router:openscreen_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "traffic_annotation_auditor_unittests",
+        "test_id_prefix": "ninja://tools/traffic_annotation/auditor:traffic_annotation_auditor_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "unit_tests",
+        "test_id_prefix": "ninja://chrome/test:unit_tests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "wtf_unittests",
+        "test_id_prefix": "ninja://third_party/blink/renderer/platform/wtf:wtf_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "x11_unittests",
+        "test_id_prefix": "ninja://ui/platform_window/x11:x11_unittests/"
+      }
+    ]
+  },
+  "linux-paeverywhere-x64-fyi-rel": {
+    "gtest_tests": [
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "base_unittests",
+        "test_id_prefix": "ninja://base:base_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "blink_platform_unittests",
+        "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_platform_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "openscreen_unittests",
+        "test_id_prefix": "ninja://chrome/browser/media/router:openscreen_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "traffic_annotation_auditor_unittests",
+        "test_id_prefix": "ninja://tools/traffic_annotation/auditor:traffic_annotation_auditor_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "unit_tests",
+        "test_id_prefix": "ninja://chrome/test:unit_tests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "wtf_unittests",
+        "test_id_prefix": "ninja://third_party/blink/renderer/platform/wtf:wtf_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "x11_unittests",
+        "test_id_prefix": "ninja://ui/platform_window/x11:x11_unittests/"
+      }
+    ]
+  },
   "linux-perfetto-rel": {
     "additional_compile_targets": [
       "chrome"
@@ -58940,6 +60765,304 @@
       }
     ]
   },
+  "mac-paeverywhere-x64-fyi-dbg": {
+    "gtest_tests": [
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Mac-10.15"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "base_unittests",
+        "test_id_prefix": "ninja://base:base_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Mac-10.15"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "blink_platform_unittests",
+        "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_platform_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Mac-10.15"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "openscreen_unittests",
+        "test_id_prefix": "ninja://chrome/browser/media/router:openscreen_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Mac-10.15"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "sandbox_mac_unittests",
+        "test_id_prefix": "ninja://sandbox/mac:sandbox_mac_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Mac-10.15"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "unit_tests",
+        "test_id_prefix": "ninja://chrome/test:unit_tests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Mac-10.15"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "updater_tests",
+        "test_id_prefix": "ninja://chrome/updater:updater_tests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Mac-10.15"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "wtf_unittests",
+        "test_id_prefix": "ninja://third_party/blink/renderer/platform/wtf:wtf_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "name": "xr_browser_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Mac-10.15"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "xr_browser_tests",
+        "test_id_prefix": "ninja://chrome/test:xr_browser_tests/"
+      }
+    ]
+  },
+  "mac-paeverywhere-x64-fyi-rel": {
+    "gtest_tests": [
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Mac-10.15"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "base_unittests",
+        "test_id_prefix": "ninja://base:base_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Mac-10.15"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "blink_platform_unittests",
+        "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_platform_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Mac-10.15"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "openscreen_unittests",
+        "test_id_prefix": "ninja://chrome/browser/media/router:openscreen_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Mac-10.15"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "sandbox_mac_unittests",
+        "test_id_prefix": "ninja://sandbox/mac:sandbox_mac_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Mac-10.15"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "unit_tests",
+        "test_id_prefix": "ninja://chrome/test:unit_tests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Mac-10.15"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "updater_tests",
+        "test_id_prefix": "ninja://chrome/updater:updater_tests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Mac-10.15"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "wtf_unittests",
+        "test_id_prefix": "ninja://third_party/blink/renderer/platform/wtf:wtf_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "name": "xr_browser_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Mac-10.15"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "xr_browser_tests",
+        "test_id_prefix": "ninja://chrome/test:xr_browser_tests/"
+      }
+    ]
+  },
   "mac-upload-perfetto": {
     "additional_compile_targets": [
       "trace_processor_shell"
@@ -59467,6 +61590,24 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
+        "test": "traffic_annotation_auditor_unittests",
+        "test_id_prefix": "ninja://tools/traffic_annotation/auditor:traffic_annotation_auditor_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Windows-10-18363"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
         "test": "unit_tests",
         "test_id_prefix": "ninja://chrome/test:unit_tests/"
       },
@@ -59852,6 +61993,24 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
+        "test": "traffic_annotation_auditor_unittests",
+        "test_id_prefix": "ninja://tools/traffic_annotation/auditor:traffic_annotation_auditor_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Windows-10-18363"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
         "test": "unit_tests",
         "test_id_prefix": "ninja://chrome/test:unit_tests/"
       },
@@ -60237,6 +62396,24 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
+        "test": "traffic_annotation_auditor_unittests",
+        "test_id_prefix": "ninja://tools/traffic_annotation/auditor:traffic_annotation_auditor_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Windows-10-18363"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
         "test": "unit_tests",
         "test_id_prefix": "ninja://chrome/test:unit_tests/"
       },
@@ -60622,6 +62799,24 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
+        "test": "traffic_annotation_auditor_unittests",
+        "test_id_prefix": "ninja://tools/traffic_annotation/auditor:traffic_annotation_auditor_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Windows-10-18363"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
         "test": "unit_tests",
         "test_id_prefix": "ninja://chrome/test:unit_tests/"
       },
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json
index 5b43b992..6e85053 100644
--- a/testing/buildbot/chromium.gpu.fyi.json
+++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -2762,6 +2762,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -2790,6 +2793,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -2828,6 +2834,9 @@
           "script": "//tools/perf/process_perf_results.py"
         },
         "name": "angle_perftests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -2863,6 +2872,9 @@
           "--gerrit-patchset=${patch_set}",
           "--buildbucket-id=${buildbucket_build_id}"
         ],
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -2895,6 +2907,9 @@
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
         "name": "angle_deqp_egl_vulkan_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -2926,6 +2941,9 @@
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
         "name": "angle_deqp_gles2_vulkan_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -2957,6 +2975,9 @@
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
         "name": "angle_deqp_gles31_vulkan_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -2988,6 +3009,9 @@
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
         "name": "angle_deqp_gles3_vulkan_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -3019,6 +3043,9 @@
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
         "name": "angle_deqp_khr_gles2_vulkan_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -3049,6 +3076,9 @@
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
         "name": "angle_deqp_khr_gles31_vulkan_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -3080,6 +3110,9 @@
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
         "name": "angle_deqp_khr_gles32_vulkan_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -3110,6 +3143,9 @@
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
         "name": "angle_deqp_khr_gles3_vulkan_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -3147,6 +3183,9 @@
           "script": "//tools/perf/process_perf_results.py"
         },
         "name": "angle_perftests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -3182,6 +3221,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -3210,6 +3252,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -3248,6 +3293,9 @@
           "script": "//tools/perf/process_perf_results.py"
         },
         "name": "angle_perftests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -3283,6 +3331,9 @@
           "--gerrit-patchset=${patch_set}",
           "--buildbucket-id=${buildbucket_build_id}"
         ],
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -3315,6 +3366,9 @@
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
         "name": "angle_deqp_egl_vulkan_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -3346,6 +3400,9 @@
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
         "name": "angle_deqp_gles2_vulkan_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -3377,6 +3434,9 @@
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
         "name": "angle_deqp_gles31_vulkan_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -3408,6 +3468,9 @@
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
         "name": "angle_deqp_gles3_vulkan_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -3439,6 +3502,9 @@
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
         "name": "angle_deqp_khr_gles2_vulkan_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -3469,6 +3535,9 @@
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
         "name": "angle_deqp_khr_gles31_vulkan_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -3500,6 +3569,9 @@
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
         "name": "angle_deqp_khr_gles32_vulkan_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -3530,6 +3602,9 @@
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
         "name": "angle_deqp_khr_gles3_vulkan_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -3562,6 +3637,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -3591,6 +3669,9 @@
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
         "name": "gl_tests_validating",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3634,6 +3715,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3677,6 +3761,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4111,6 +4198,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -4140,6 +4230,9 @@
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
         "name": "gl_tests_validating",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4183,6 +4276,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4226,6 +4322,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4662,6 +4761,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -4689,6 +4791,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4786,6 +4891,9 @@
           "script": "//tools/perf/process_perf_results.py"
         },
         "name": "angle_perftests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -5081,6 +5189,9 @@
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
         "name": "rendering_representative_perf_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -5254,6 +5365,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -5283,6 +5397,9 @@
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
         "name": "gl_tests_validating",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5326,6 +5443,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5369,6 +5489,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5803,6 +5926,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -5832,6 +5958,9 @@
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
         "name": "gl_tests_validating",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5875,6 +6004,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5918,6 +6050,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5972,6 +6107,9 @@
           "script": "//tools/perf/process_perf_results.py"
         },
         "name": "angle_perftests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
@@ -6604,6 +6742,9 @@
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
         "name": "vulkan_content_browsertests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json
index b08ff8f..044c4b84 100644
--- a/testing/buildbot/chromium.linux.json
+++ b/testing/buildbot/chromium.linux.json
@@ -1120,6 +1120,23 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
+        "test": "cast_accessibility_unittests",
+        "test_id_prefix": "ninja://chromecast/browser/accessibility/flutter:cast_accessibility_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
         "test": "cast_audio_backend_unittests",
         "test_id_prefix": "ninja://chromecast/media/cma/backend:cast_audio_backend_unittests/"
       },
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json
index 6ae5567e..32d6d91 100644
--- a/testing/buildbot/chromium.memory.json
+++ b/testing/buildbot/chromium.memory.json
@@ -15720,6 +15720,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -15766,6 +15769,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -15813,6 +15819,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -15859,6 +15868,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -15900,6 +15912,9 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15930,6 +15945,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -15976,6 +15994,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16022,6 +16043,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16068,6 +16092,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16114,6 +16141,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16161,6 +16191,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "webkit_unit_tests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16208,6 +16241,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16254,6 +16290,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16301,6 +16340,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16348,6 +16390,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16394,6 +16439,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16440,6 +16488,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16486,6 +16537,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16532,6 +16586,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16578,6 +16635,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16626,6 +16686,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16673,6 +16736,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16720,6 +16786,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16766,6 +16835,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16812,6 +16884,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16858,6 +16933,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16904,6 +16982,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16950,6 +17031,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -16996,6 +17080,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17042,6 +17129,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17090,6 +17180,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "gl_tests_validating",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17136,6 +17229,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17182,6 +17278,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17228,6 +17327,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17274,6 +17376,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17320,6 +17425,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17367,6 +17475,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17413,6 +17524,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17459,6 +17573,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17505,6 +17622,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17551,6 +17671,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17597,6 +17720,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17643,6 +17769,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17689,6 +17818,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17735,6 +17867,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17782,6 +17917,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17829,6 +17967,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17875,6 +18016,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17921,6 +18065,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -17967,6 +18114,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18013,6 +18163,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18059,6 +18212,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18105,6 +18261,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18151,6 +18310,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18198,6 +18360,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18245,6 +18410,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18291,6 +18459,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18337,6 +18508,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18383,6 +18557,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18429,6 +18606,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18475,6 +18655,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -18521,6 +18704,9 @@
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
diff --git a/testing/buildbot/chromium.mojo.json b/testing/buildbot/chromium.mojo.json
index 7585f6d..3a5d336 100644
--- a/testing/buildbot/chromium.mojo.json
+++ b/testing/buildbot/chromium.mojo.json
@@ -285,6 +285,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_out_of_process_components_browsertests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -333,6 +336,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_out_of_process_content_browsertests",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -382,6 +388,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_out_of_process_content_shell_test_apk",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -432,6 +441,9 @@
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "network_service_webview_instrumentation_test_apk",
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl
index f39543d2..09565e1a 100644
--- a/testing/buildbot/gn_isolate_map.pyl
+++ b/testing/buildbot/gn_isolate_map.pyl
@@ -341,6 +341,10 @@
     "label": "//media/capture:capture_unittests",
     "type": "windowed_test_launcher",
   },
+  "cast_accessibility_unittests": {
+    "label": "//chromecast/browser/accessibility/flutter:cast_accessibility_unittests",
+    "type": "console_test_launcher",
+  },
   "cast_runner_browsertests": {
     "label": "//fuchsia/runners:cast_runner_browsertests",
     "type": "console_test_launcher",
diff --git a/testing/buildbot/mixins.pyl b/testing/buildbot/mixins.pyl
index 1c0d344..92f6cc4 100644
--- a/testing/buildbot/mixins.pyl
+++ b/testing/buildbot/mixins.pyl
@@ -1075,17 +1075,17 @@
     },
   },
   # latest Xcode 12 beta version.
-  'xcode_12b5035g': {
+  'xcode_12b5044c': {
     '$mixin_append': {
       'args': [
         '--xcode-build-version',
-        '12b5035g'
+        '12b5044c'
       ],
     },
     'swarming': {
       'named_caches': [
         {
-          'name': 'xcode_ios_12b5035g',
+          'name': 'xcode_ios_12b5044c',
           'path': 'Xcode.app',
         },
       ],
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index 140e73b..3af80154 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -403,6 +403,7 @@
     },
 
     'cast_video_specific_chromium_gtests': {
+      'cast_accessibility_unittests': {},
       'cast_graphics_unittests': {},
       'exo_unittests': {},
       'views_unittests': {
@@ -6135,11 +6136,26 @@
     ],
 
     'paeverywhere_android_gtests': [
+      'android_specific_chromium_gtests',
       'android_smoke_tests',
       'paeverywhere_common_tests'
     ],
 
+    'paeverywhere_linux_gtests': [
+      'chromium_gtests_for_linux_and_mac_only',
+      'chromium_gtests_for_linux_only',
+      'chromium_gtests_for_win_and_linux_only',
+      'paeverywhere_common_tests',
+    ],
+
+    'paeverywhere_mac_gtests': [
+      'chromium_gtests_for_linux_and_mac_only',
+      'mac_specific_chromium_gtests',
+      'paeverywhere_common_tests',
+    ],
+
     'paeverywhere_win_gtests': [
+      'chromium_gtests_for_win_and_linux_only',
       'paeverywhere_common_tests',
       'win_specific_chromium_gtests',
     ],
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index 8e6b8ad..ad2c90d 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -583,6 +583,9 @@
         'test_suites': {
           'gtest_tests': 'webview_bot_system_gtests',
         },
+        'mixins': [
+          'enable_resultdb'
+        ],
         'swarming': {
           'dimension_sets': [
             {
@@ -602,6 +605,9 @@
         'test_suites': {
           'gtest_tests': 'webview_bot_system_gtests',
         },
+        'mixins': [
+          'enable_resultdb'
+        ],
         'swarming': {
           'dimension_sets': [
             {
@@ -620,6 +626,9 @@
         'test_suites': {
           'gtest_tests': 'webview_bot_all_gtests',
         },
+        'mixins': [
+          'enable_resultdb'
+        ],
         'swarming': {
           'dimension_sets': [
             {
@@ -637,6 +646,7 @@
       },
       'Android WebView O (dbg)': {
         'mixins': [
+          'enable_resultdb',
           'oreo_fleet',
           'walleye',
         ],
@@ -651,6 +661,7 @@
       },
       'Android WebView P (dbg)': {
         'mixins': [
+          'enable_resultdb',
           'pie_fleet',
           'walleye',
         ],
@@ -698,6 +709,9 @@
         'test_suites': {
           'gtest_tests': 'android_lollipop_marshmallow_gtests',
         },
+        'mixins': [
+          'enable_resultdb'
+        ],
         'swarming': {
           'dimension_sets': [
             {
@@ -715,6 +729,9 @@
         'test_suites': {
           'gtest_tests': 'android_lollipop_marshmallow_gtests',
         },
+        'mixins': [
+          'enable_resultdb'
+        ],
         'swarming': {
           'dimension_sets': [
             {
@@ -729,6 +746,7 @@
       },
       'Marshmallow 64 bit Tester': {
         'mixins': [
+          'enable_resultdb',
           'marshmallow',
           'bullhead',
         ],
@@ -741,6 +759,9 @@
         'test_suites': {
           'gtest_tests': 'android_lollipop_marshmallow_gtests',
         },
+        'mixins': [
+          'enable_resultdb'
+        ],
         'swarming': {
           'dimension_sets': [
             {
@@ -757,6 +778,9 @@
         'test_suites': {
           'gtest_tests': 'android_nougat_gtests',
         },
+        'mixins': [
+          'enable_resultdb'
+        ],
         'swarming': {
           'dimension_sets': [
             {
@@ -784,6 +808,9 @@
         'test_suites': {
           'gtest_tests': 'android_oreo_gtests',
         },
+        'mixins': [
+          'enable_resultdb',
+        ],
       },
       'android-10-arm64-rel': {
         'swarming': {
@@ -801,12 +828,16 @@
         },
         'use_swarming': True,
         'os_type': 'android',
+        'mixins': [
+          'enable_resultdb'
+        ],
       },
       'android-arm64-proguard-rel': {
         'additional_compile_targets': [
           'all',
         ],
         'mixins': [
+          'enable_resultdb',
           'marshmallow',
           'bullhead',
         ],
@@ -819,6 +850,7 @@
       },
       'android-bfcache-rel': {
         'mixins': [
+          'enable_resultdb',
           'lollipop',
           'hammerhead',
         ],
@@ -829,6 +861,7 @@
       },
       'android-cronet-arm-dbg': {
         'mixins': [
+          'enable_resultdb',
           'lollipop',
           'hammerhead',
         ],
@@ -852,6 +885,7 @@
       },
       'android-cronet-arm-rel-kitkat-tests': {
         'mixins': [
+          'enable_resultdb',
           'kitkat',
           'hammerhead',
         ],
@@ -862,6 +896,7 @@
       },
       'android-cronet-arm-rel-lollipop-tests': {
         'mixins': [
+          'enable_resultdb',
           'lollipop',
           'hammerhead',
         ],
@@ -904,6 +939,7 @@
       },
       'android-cronet-arm64-rel-marshmallow-tests': {
         'mixins': [
+          'enable_resultdb',
           'marshmallow',
           'bullhead',
         ],
@@ -914,6 +950,7 @@
       },
       'android-cronet-asan-arm-rel': {
         'mixins': [
+          'enable_resultdb',
           'bullhead',
           'marshmallow',
         ],
@@ -928,6 +965,7 @@
       },
       'android-cronet-marshmallow-arm64-rel': {
         'mixins': [
+          'enable_resultdb',
           'marshmallow',
           'bullhead',
         ],
@@ -972,6 +1010,9 @@
         'test_suites': {
           'gtest_tests': 'android_incremental_tests',
         },
+        'mixins': [
+          'enable_resultdb'
+        ],
         'swarming': {
           'dimension_sets': [
             {
@@ -985,6 +1026,7 @@
       },
       'android-lollipop-arm-rel': {
         'mixins': [
+          'enable_resultdb',
           'hammerhead',
           'lollipop',
         ],
@@ -1001,6 +1043,7 @@
       },
       'android-marshmallow-arm64-rel': {
         'mixins': [
+          'enable_resultdb',
           'bullhead',
           'isolate_profile_data',
           'marshmallow',
@@ -1018,6 +1061,7 @@
       },
       'android-marshmallow-x86-rel': {
         'mixins': [
+          'enable_resultdb',
           'marshmallow-x86-emulator',
           'emulator-4-cores',
           'linux-xenial',
@@ -1030,6 +1074,7 @@
       },
       'android-marshmallow-x86-rel-non-cq': {
         'mixins': [
+          'enable_resultdb',
           'marshmallow-x86-emulator',
           'emulator-4-cores',
           'linux-xenial',
@@ -1043,6 +1088,7 @@
       },
       'android-nougat-arm64-rel': {
         'mixins': [
+          'enable_resultdb',
           'nougat',
           'sailfish',
         ],
@@ -1058,6 +1104,7 @@
       },
       'android-pie-arm64-dbg': {
         'mixins': [
+          'enable_resultdb',
           'pie_fleet',
           'walleye',
         ],
@@ -1068,6 +1115,7 @@
       },
       'android-pie-arm64-rel': {
         'mixins': [
+          'enable_resultdb',
           'pie_fleet',
           'walleye',
         ],
@@ -1088,6 +1136,7 @@
       },
       'android-pie-x86-rel': {
         'mixins': [
+          'enable_resultdb',
           'pie-x86-emulator',
           'emulator-4-cores',
           'linux-xenial',
@@ -1106,6 +1155,7 @@
     'machines': {
       'Android WebView P FYI (rel)': {
         'mixins': [
+          'enable_resultdb',
           'pie_fleet',
           'walleye',
         ],
@@ -1117,6 +1167,7 @@
       },
       'android-inverse-fieldtrials-pie-x86-fyi-rel': {
         'mixins': [
+          'enable_resultdb',
           'pie-x86-emulator',
           'emulator-4-cores',
           'linux-xenial',
@@ -1128,6 +1179,7 @@
       },
       'android-pie-arm64-wpt-rel-non-cq': {
         'mixins': [
+          'enable_resultdb',
           'pie_fleet',
           'walleye',
         ],
@@ -1139,6 +1191,7 @@
       },
       'android-weblayer-10-x86-rel-tests': {
         'mixins': [
+          'enable_resultdb',
           '10-x86-emulator',
           'emulator-4-cores',
           'linux-xenial',
@@ -1151,6 +1204,7 @@
       },
       'android-weblayer-marshmallow-x86-rel-tests': {
         'mixins': [
+          'enable_resultdb',
           'marshmallow-x86-emulator',
           'emulator-4-cores',
           'linux-xenial',
@@ -1163,6 +1217,7 @@
       },
       'android-weblayer-pie-x86-rel-tests': {
         'mixins': [
+          'enable_resultdb',
           'pie-x86-emulator',
           'emulator-4-cores',
           'linux-xenial',
@@ -1355,6 +1410,7 @@
       },
       'ToTAndroid': {
         'mixins': [
+          'enable_resultdb',
           'lollipop',
           'hammerhead',
         ],
@@ -1400,6 +1456,9 @@
           'gtest_tests': 'chromium_android_asan_gtests',
           'junit_tests': 'chromium_android_asan_junit_tests',
         },
+        'mixins': [
+          'enable_resultdb'
+        ],
         'swarming': {
           'dimension_sets': [
             {
@@ -2183,9 +2242,13 @@
         'test_suites': {
           'gtest_tests': 'site_isolation_android_fyi_gtests',
         },
+        'mixins': [
+          'enable_resultdb'
+        ],
       },
       'VR Linux': {
         'mixins': [
+          'enable_resultdb',
           'linux-xenial',
         ],
         'additional_compile_targets': [
@@ -2232,6 +2295,7 @@
       },
       'android-code-coverage': {
         'mixins': [
+          'enable_resultdb',
           'bullhead',
           'isolate_profile_data',
           'marshmallow',
@@ -2244,6 +2308,7 @@
       },
       'android-code-coverage-native': {
         'mixins': [
+          'enable_resultdb',
           'isolate_profile_data',
           'pie_fleet',
           'walleye',
@@ -2259,6 +2324,7 @@
           'gtest_tests': 'paeverywhere_android_gtests',
         },
         'mixins': [
+          'enable_resultdb',
           'walleye',
         ],
       },
@@ -2275,6 +2341,7 @@
           'gtest_tests': 'paeverywhere_android_gtests',
         },
         'mixins': [
+          'enable_resultdb',
           'walleye',
         ],
       },
@@ -2283,6 +2350,7 @@
           'gtest_tests': 'paeverywhere_android_gtests',
         },
         'mixins': [
+          'enable_resultdb',
           'walleye',
         ],
       },
@@ -2474,7 +2542,7 @@
           'mac_10.15',
           'mac_toolchain',
           'out_dir_arg',
-          'xcode_12b5035g',
+          'xcode_12b5044c',
           'xctest',
         ],
         'test_suites': {
@@ -2491,7 +2559,7 @@
           'mac_10.15',
           'mac_toolchain',
           'out_dir_arg',
-          'xcode_12b5035g',
+          'xcode_12b5044c',
           'xctest',
         ],
         'test_suites': {
@@ -2642,6 +2710,24 @@
           'gtest_tests': 'linux_lacros_gtests',
         },
       },
+      'linux-paeverywhere-x64-fyi-dbg': {
+        'test_suites': {
+          'gtest_tests': 'paeverywhere_linux_gtests',
+        },
+        'mixins': [
+          'linux-xenial',
+          'x86-64',
+        ],
+      },
+      'linux-paeverywhere-x64-fyi-rel': {
+        'test_suites': {
+          'gtest_tests': 'paeverywhere_linux_gtests',
+        },
+        'mixins': [
+          'linux-xenial',
+          'x86-64',
+        ],
+      },
       'linux-perfetto-rel': {
         'additional_compile_targets': [ 'chrome' ],
         'mixins': [
@@ -2725,6 +2811,24 @@
           'isolated_scripts': 'chromium_mac_rel_isolated_scripts',
         },
       },
+      'mac-paeverywhere-x64-fyi-dbg': {
+        'test_suites': {
+          'gtest_tests': 'paeverywhere_mac_gtests',
+        },
+        'mixins': [
+          'mac_10.15',
+          'x86-64',
+        ],
+      },
+      'mac-paeverywhere-x64-fyi-rel': {
+        'test_suites': {
+          'gtest_tests': 'paeverywhere_mac_gtests',
+        },
+        'mixins': [
+          'mac_10.15',
+          'x86-64',
+        ],
+      },
       'mac-upload-perfetto': {
         'additional_compile_targets': [ 'trace_processor_shell' ],
         'test_suites': {
@@ -3479,6 +3583,7 @@
         'os_type': 'android',
         'skip_merge_script': True,
         'mixins': [
+          'enable_resultdb',
           'gpu-swarming-pool',
           'android_q',
           'walleye',
@@ -3495,6 +3600,7 @@
         'os_type': 'android',
         'skip_merge_script': True,
         'mixins': [
+          'enable_resultdb',
           'gpu-swarming-pool',
           'android_q',
           'walleye',
@@ -3506,6 +3612,7 @@
       'Android FYI 64 Perf (Pixel 2)': {
         'os_type': 'android',
         'mixins': [
+          'enable_resultdb',
           'gpu-swarming-pool',
           'android_q',
           'walleye',
@@ -3518,6 +3625,7 @@
         'os_type': 'android',
         'skip_merge_script': True,
         'mixins': [
+          'enable_resultdb',
           'gpu-swarming-pool',
           'android_q',
           'walleye',
@@ -3534,6 +3642,7 @@
         'os_type': 'android',
         'skip_merge_script': True,
         'mixins': [
+          'enable_resultdb',
           'gpu-swarming-pool',
           'android_q',
           'walleye',
@@ -3547,6 +3656,7 @@
         'os_type': 'android',
         'skip_merge_script': True,
         'mixins': [
+          'enable_resultdb',
           'foster',
           'gpu-swarming-pool',
           'nougat_generic',
@@ -3561,6 +3671,7 @@
         'os_type': 'android',
         'skip_merge_script': True,
         'mixins': [
+          'enable_resultdb',
           'gpu-swarming-pool',
           'hammerhead',
           'lollipop_generic',
@@ -3575,6 +3686,7 @@
         'os_type': 'android',
         'skip_merge_script': True,
         'mixins': [
+          'enable_resultdb',
           'marshmallow',
           'bullhead',
         ],
@@ -3590,6 +3702,7 @@
         'os_type': 'android',
         'skip_merge_script': True,
         'mixins': [
+          'enable_resultdb',
           'gpu-swarming-pool',
           'lollipop_generic',
           'shamu',
@@ -3605,6 +3718,7 @@
         'os_type': 'android',
         'skip_merge_script': True,
         'mixins': [
+          'enable_resultdb',
           'flounder',
           'gpu-swarming-pool',
           'marshmallow_generic',
@@ -3620,6 +3734,7 @@
         'os_type': 'android',
         'skip_merge_script': True,
         'mixins': [
+          'enable_resultdb',
           'pie_fleet',
           'walleye',
         ],
@@ -3634,6 +3749,7 @@
         'browser_config': 'android-chromium',
         'skip_merge_script': True,
         'mixins': [
+          'enable_resultdb',
           'marshmallow',
           'bullhead',
        ],
@@ -3646,6 +3762,7 @@
         'browser_config': 'android-chromium',
         'skip_merge_script': True,
         'mixins': [
+          'enable_resultdb',
           'pie_fleet',
           'walleye',
         ],
@@ -4990,6 +5107,7 @@
           'gtest_tests': 'chromium_android_gtests',
         },
         'mixins': [
+          'enable_resultdb',
           'bullhead',
           'marshmallow',
         ],
@@ -5061,6 +5179,9 @@
         'test_suites': {
           'gtest_tests': 'network_service_android_gtests',
         },
+        'mixins': [
+          'enable_resultdb',
+        ],
       },
       'mac-mojo-rel': {
         'mixins': [
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index a669b81..6d8ab83 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -3135,22 +3135,6 @@
             ]
         }
     ],
-    "GestureNavigation": [
-        {
-            "platforms": [
-                "android",
-                "android_weblayer"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "OverscrollHistoryNavigation"
-                    ]
-                }
-            ]
-        }
-    ],
     "GlobalMediaControlsInProductHelp": [
         {
             "platforms": [
@@ -4119,6 +4103,26 @@
             ]
         }
     ],
+    "LookalikeTargetEmbeddingHeuristic": [
+        {
+            "platforms": [
+                "android",
+                "chromeos",
+                "ios",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "TargetEmbeddingLookalikes"
+                    ]
+                }
+            ]
+        }
+    ],
     "LowPriorityAdProcesses": [
         {
             "platforms": [
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc
index ff62f7fc..88ccabbf 100644
--- a/third_party/blink/common/features.cc
+++ b/third_party/blink/common/features.cc
@@ -94,6 +94,10 @@
 // Enable LayoutNG.
 const base::Feature kLayoutNG{"LayoutNG", base::FEATURE_ENABLED_BY_DEFAULT};
 
+// Enable TableNG
+const base::Feature kLayoutNGTable{"LayoutNGTable",
+                                   base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Enable LayoutNGFieldset by default. This feature is for a kill switch.
 const base::Feature kLayoutNGFieldset{"LayoutNGFieldset",
                                       base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/third_party/blink/perf_tests/parser/declarative-shadow-dom-cloning.html b/third_party/blink/perf_tests/parser/declarative-shadow-dom-cloning.html
index 47f72891..e11a3992 100644
--- a/third_party/blink/perf_tests/parser/declarative-shadow-dom-cloning.html
+++ b/third_party/blink/perf_tests/parser/declarative-shadow-dom-cloning.html
@@ -13,13 +13,18 @@
   }
 }
 
+function setInnerHTML(el,content) {
+  const fragment = (new DOMParser()).parseFromString(`<pre>${content}</pre>`, 'text/html', {includeShadowRoots: true});
+  (el instanceof HTMLTemplateElement ? el.content : el).replaceChildren(...fragment.body.firstChild.childNodes);
+}
+
 const hostChildren = 100;
 
 function buildTemplate(slotted) {
   const template = document.createElement('template');
   document.body.appendChild(template);
   const html = createDeepShadowTemplateContent(hostChildren, slotted);
-  template.setInnerHTML(html, {includeShadowRoots: true});
+  setInnerHTML(template,html);
   return template;
 }
 
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h
index ceb0376..40caedc 100644
--- a/third_party/blink/public/common/features.h
+++ b/third_party/blink/public/common/features.h
@@ -39,6 +39,7 @@
 BLINK_COMMON_EXPORT extern const base::Feature kTopLevelAwait;
 BLINK_COMMON_EXPORT extern const base::Feature kEditingNG;
 BLINK_COMMON_EXPORT extern const base::Feature kLayoutNG;
+BLINK_COMMON_EXPORT extern const base::Feature kLayoutNGTable;
 BLINK_COMMON_EXPORT extern const base::Feature kLayoutNGFieldset;
 BLINK_COMMON_EXPORT extern const base::Feature kLayoutNGTextControl;
 BLINK_COMMON_EXPORT extern const base::Feature kFragmentItem;
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
index 907d193..1f24081 100644
--- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl
+++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -53,6 +53,7 @@
       labelfor
       labelwrapped
       legend
+      rubyannotation
       tablecaption
       title
       other
diff --git a/third_party/blink/renderer/bindings/generated_in_core.gni b/third_party/blink/renderer/bindings/generated_in_core.gni
index 7bc97a2..5d2f428 100644
--- a/third_party/blink/renderer/bindings/generated_in_core.gni
+++ b/third_party/blink/renderer/bindings/generated_in_core.gni
@@ -1373,6 +1373,8 @@
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_wheel_event.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_window.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_window.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_window_controls_overlay.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_window_controls_overlay.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_worker.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_worker.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_worker_global_scope.cc",
diff --git a/third_party/blink/renderer/bindings/idl_in_core.gni b/third_party/blink/renderer/bindings/idl_in_core.gni
index 768d466..2435cac 100644
--- a/third_party/blink/renderer/bindings/idl_in_core.gni
+++ b/third_party/blink/renderer/bindings/idl_in_core.gni
@@ -273,6 +273,7 @@
           "//third_party/blink/renderer/core/frame/navigator_ua_brand_version.idl",
           "//third_party/blink/renderer/core/frame/navigator_ua_data.idl",
           "//third_party/blink/renderer/core/frame/navigator_user_activation.idl",
+          "//third_party/blink/renderer/core/frame/navigator_window_controls_overlay.idl",
           "//third_party/blink/renderer/core/frame/report.idl",
           "//third_party/blink/renderer/core/frame/report_body.idl",
           "//third_party/blink/renderer/core/frame/reporting_observer.idl",
@@ -287,6 +288,7 @@
           "//third_party/blink/renderer/core/frame/user_activation.idl",
           "//third_party/blink/renderer/core/frame/visual_viewport.idl",
           "//third_party/blink/renderer/core/frame/window.idl",
+          "//third_party/blink/renderer/core/frame/window_controls_overlay.idl",
           "//third_party/blink/renderer/core/frame/window_event_handlers.idl",
           "//third_party/blink/renderer/core/frame/window_or_worker_global_scope.idl",
           "//third_party/blink/renderer/core/frame/window_post_message_options.idl",
diff --git a/third_party/blink/renderer/core/clipboard/data_transfer.cc b/third_party/blink/renderer/core/clipboard/data_transfer.cc
index 79ff44e..8c99eb1 100644
--- a/third_party/blink/renderer/core/clipboard/data_transfer.cc
+++ b/third_party/blink/renderer/core/clipboard/data_transfer.cc
@@ -252,10 +252,6 @@
 
   // The specification states that dropEffect can be changed at all times, even
   // if the DataTransfer instance is protected or neutered.
-  //
-  // Allowing these changes seems inconsequential, but findDropZone() in
-  // EventHandler.cpp relies on being able to call setDropEffect during
-  // dragenter, when the DataTransfer policy is DataTransferTypesReadable.
   drop_effect_ = effect;
 }
 
@@ -587,16 +583,6 @@
   drop_effect_ = ConvertDragOperationToEffectAllowed(op);
 }
 
-bool DataTransfer::HasDropZoneType(const String& keyword) {
-  if (keyword.StartsWith("file:"))
-    return HasFileOfType(keyword.Substring(5));
-
-  if (keyword.StartsWith("string:"))
-    return HasStringOfType(keyword.Substring(7));
-
-  return false;
-}
-
 DataTransferItemList* DataTransfer::items() {
   // TODO: According to the spec, we are supposed to return the same collection
   // of items each time. We now return a wrapper that always wraps the *same*
@@ -654,30 +640,6 @@
   return data_object_->Types().Contains(type);
 }
 
-DragOperation ConvertDropZoneOperationToDragOperation(
-    const String& drag_operation) {
-  if (drag_operation == "copy")
-    return kDragOperationCopy;
-  if (drag_operation == "move")
-    return kDragOperationMove;
-  if (drag_operation == "link")
-    return kDragOperationLink;
-  return kDragOperationNone;
-}
-
-String ConvertDragOperationToDropZoneOperation(DragOperation operation) {
-  switch (operation) {
-    case kDragOperationCopy:
-      return String("copy");
-    case kDragOperationMove:
-      return String("move");
-    case kDragOperationLink:
-      return String("link");
-    default:
-      return String("copy");
-  }
-}
-
 void DataTransfer::Trace(Visitor* visitor) const {
   visitor->Trace(data_object_);
   visitor->Trace(drag_image_);
diff --git a/third_party/blink/renderer/core/clipboard/data_transfer.h b/third_party/blink/renderer/core/clipboard/data_transfer.h
index 278e7ce..5d9bceb 100644
--- a/third_party/blink/renderer/core/clipboard/data_transfer.h
+++ b/third_party/blink/renderer/core/clipboard/data_transfer.h
@@ -25,6 +25,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_CLIPBOARD_DATA_TRANSFER_H_
 
 #include <memory>
+
 #include "third_party/blink/public/common/page/drag_operation.h"
 #include "third_party/blink/renderer/core/clipboard/data_object.h"
 #include "third_party/blink/renderer/core/core_export.h"
@@ -128,8 +129,6 @@
   void SetSourceOperation(DragOperation);
   void SetDestinationOperation(DragOperation);
 
-  bool HasDropZoneType(const String&);
-
   DataTransferItemList* items();
 
   DataObject* GetDataObject() const;
@@ -180,10 +179,6 @@
   Member<Node> drag_image_element_;
 };
 
-DragOperation ConvertDropZoneOperationToDragOperation(
-    const String& drag_operation);
-String ConvertDragOperationToDropZoneOperation(DragOperation);
-
 }  // namespace blink
 
 #endif  // THIRD_PARTY_BLINK_RENDERER_CORE_CLIPBOARD_DATA_TRANSFER_H_
diff --git a/third_party/blink/renderer/core/core_idl_files.gni b/third_party/blink/renderer/core/core_idl_files.gni
index 3b079d4..7b56fa6 100644
--- a/third_party/blink/renderer/core/core_idl_files.gni
+++ b/third_party/blink/renderer/core/core_idl_files.gni
@@ -201,6 +201,7 @@
                     "frame/test_report_body.idl",
                     "frame/user_activation.idl",
                     "frame/visual_viewport.idl",
+                    "frame/window_controls_overlay.idl",
                     "geometry/dom_matrix.idl",
                     "geometry/dom_matrix_read_only.idl",
                     "geometry/dom_point.idl",
@@ -555,6 +556,7 @@
                     "frame/navigator_scheduling.idl",
                     "frame/navigator_ua.idl",
                     "frame/navigator_user_activation.idl",
+                    "frame/navigator_window_controls_overlay.idl",
                     "frame/window_event_handlers.idl",
                     "frame/window_or_worker_global_scope.idl",
                     "fullscreen/document_fullscreen.idl",
diff --git a/third_party/blink/renderer/core/editing/editing_strategy.cc b/third_party/blink/renderer/core/editing/editing_strategy.cc
index 535905a..65a9467 100644
--- a/third_party/blink/renderer/core/editing/editing_strategy.cc
+++ b/third_party/blink/renderer/core/editing/editing_strategy.cc
@@ -4,8 +4,9 @@
 
 #include "third_party/blink/renderer/core/editing/editing_strategy.h"
 
+#include "third_party/blink/renderer/core/dom/text.h"
 #include "third_party/blink/renderer/core/editing/editing_utilities.h"
-#include "third_party/blink/renderer/core/layout/layout_object.h"
+#include "third_party/blink/renderer/core/layout/layout_text.h"
 
 namespace {
 
@@ -34,8 +35,8 @@
 int EditingAlgorithm<Traversal>::CaretMaxOffset(const Node& node) {
   // For rendered text nodes, return the last position that a caret could
   // occupy.
-  if (node.IsTextNode() && node.GetLayoutObject())
-    return node.GetLayoutObject()->CaretMaxOffset();
+  if (IsA<Text>(node) && node.GetLayoutObject())
+    return To<Text>(node).GetLayoutObject()->CaretMaxOffset();
   // For containers return the number of children. For others do the same as
   // above.
   return LastOffsetForEditing(&node);
diff --git a/third_party/blink/renderer/core/editing/inline_box_position.cc b/third_party/blink/renderer/core/editing/inline_box_position.cc
index 14cab4d..d607686 100644
--- a/third_party/blink/renderer/core/editing/inline_box_position.cc
+++ b/third_party/blink/renderer/core/editing/inline_box_position.cc
@@ -324,20 +324,23 @@
   const PositionTemplate<Strategy>& position = adjusted.GetPosition();
   DCHECK(!position.AnchorNode()->IsShadowRoot()) << adjusted;
   DCHECK(position.AnchorNode()->GetLayoutObject()) << adjusted;
-  const LayoutObject& layout_object = *position.AnchorNode()->GetLayoutObject();
+  LayoutObject& layout_object = *position.AnchorNode()->GetLayoutObject();
   const int caret_offset = position.ComputeEditingOffset();
-  const int round_offset =
-      std::min(caret_offset, layout_object.CaretMaxOffset());
 
   if (layout_object.IsText()) {
     // TODO(yoichio): Consider |ToLayoutText(layout_object)->TextStartOffset()|
     // for first-letter tested with LocalCaretRectTest::FloatFirstLetter.
-    return ComputeInlineBoxPositionForTextNode(
-        &To<LayoutText>(layout_object), round_offset, adjusted.Affinity());
+    const LayoutText& layout_text = To<LayoutText>(layout_object);
+    const int round_offset =
+        std::min(caret_offset, layout_text.CaretMaxOffset());
+    return ComputeInlineBoxPositionForTextNode(&layout_text, round_offset,
+                                               adjusted.Affinity());
   }
 
   DCHECK(layout_object.IsAtomicInlineLevel());
   DCHECK(layout_object.IsInline());
+  const int round_offset =
+      std::min(caret_offset, LineLayoutItem(&layout_object).CaretMaxOffset());
   return ComputeInlineBoxPositionForAtomicInline(&layout_object, round_offset);
 }
 
diff --git a/third_party/blink/renderer/core/editing/visible_selection.cc b/third_party/blink/renderer/core/editing/visible_selection.cc
index c6ab0e1..8bc4ed3 100644
--- a/third_party/blink/renderer/core/editing/visible_selection.cc
+++ b/third_party/blink/renderer/core/editing/visible_selection.cc
@@ -264,37 +264,6 @@
   return base_.IsValidFor(document) && extent_.IsValidFor(document);
 }
 
-// TODO(yosin) This function breaks the invariant of this class.
-// But because we use VisibleSelection to store values in editing commands for
-// use when undoing the command, we need to be able to create a selection that
-// while currently invalid, will be valid once the changes are undone. This is a
-// design problem. To fix it we either need to change the invariants of
-// |VisibleSelection| or create a new class for editing to use that can
-// manipulate selections that are not currently valid.
-template <typename Strategy>
-VisibleSelectionTemplate<Strategy>
-VisibleSelectionTemplate<Strategy>::CreateWithoutValidationDeprecated(
-    const PositionTemplate<Strategy>& base,
-    const PositionTemplate<Strategy>& extent,
-    TextAffinity affinity) {
-  DCHECK(base.IsNotNull());
-  DCHECK(extent.IsNotNull());
-
-  VisibleSelectionTemplate<Strategy> visible_selection;
-  visible_selection.base_ = base;
-  visible_selection.extent_ = extent;
-  visible_selection.base_is_first_ = base.CompareTo(extent) <= 0;
-  if (base == extent) {
-    visible_selection.affinity_ = affinity;
-    return visible_selection;
-  }
-  // Since |affinity_| for non-|CaretSelection| is always |kDownstream|,
-  // we should keep this invariant. Note: This function can be called with
-  // |affinity_| is |kUpstream|.
-  visible_selection.affinity_ = TextAffinity::kDownstream;
-  return visible_selection;
-}
-
 template <typename Strategy>
 bool VisibleSelectionTemplate<Strategy>::IsContentEditable() const {
   return IsEditablePosition(Start());
diff --git a/third_party/blink/renderer/core/editing/visible_selection.h b/third_party/blink/renderer/core/editing/visible_selection.h
index 95dfd06..ff900d1 100644
--- a/third_party/blink/renderer/core/editing/visible_selection.h
+++ b/third_party/blink/renderer/core/editing/visible_selection.h
@@ -87,14 +87,6 @@
 
   bool IsValidFor(const Document&) const;
 
-  // TODO(editing-dev): |CreateWithoutValidationDeprecated()| is allowed
-  // only to use in |TypingCommand| to remove part of grapheme cluster.
-  // Note: |base| and |extent| can be disconnect position.
-  static VisibleSelectionTemplate<Strategy> CreateWithoutValidationDeprecated(
-      const PositionTemplate<Strategy>& base,
-      const PositionTemplate<Strategy>& extent,
-      TextAffinity);
-
   void Trace(Visitor*) const;
 
 #if DCHECK_IS_ON()
diff --git a/third_party/blink/renderer/core/editing/visible_units.cc b/third_party/blink/renderer/core/editing/visible_units.cc
index 1ae38de..9a574384 100644
--- a/third_party/blink/renderer/core/editing/visible_units.cc
+++ b/third_party/blink/renderer/core/editing/visible_units.cc
@@ -558,10 +558,11 @@
 
 // TODO(yosin): We should use |AssociatedLayoutObjectOf()| in "visible_units.cc"
 // where it takes |LayoutObject| from |Position|.
-
 int CaretMinOffset(const Node* node) {
   const LayoutObject* layout_object = AssociatedLayoutObjectOf(*node, 0);
-  return layout_object ? layout_object->CaretMinOffset() : 0;
+  if (const LayoutText* layout_text = DynamicTo<LayoutText>(layout_object))
+    return layout_text->CaretMinOffset();
+  return 0;
 }
 
 int CaretMaxOffset(const Node* n) {
@@ -774,7 +775,8 @@
       // Until we resolve that, disable this so we can run the web tests!
       // DCHECK_GE(currentOffset, layoutObject->caretMaxOffset());
       return PositionTemplate<Strategy>(
-          current_node, layout_object->CaretMaxOffset() + text_start_offset);
+          current_node,
+          text_layout_object->CaretMaxOffset() + text_start_offset);
     }
 
     DCHECK_GE(current_pos.OffsetInLeafNode(),
@@ -895,9 +897,8 @@
     // ignored.
     if (EditingIgnoresContent(*current_node) ||
         IsDisplayInsideTable(current_node)) {
-      if (current_pos.OffsetInLeafNode() <= layout_object->CaretMinOffset())
-        return PositionTemplate<Strategy>::EditingPositionOf(
-            current_node, layout_object->CaretMinOffset());
+      if (current_pos.OffsetInLeafNode() <= 0)
+        return PositionTemplate<Strategy>::EditingPositionOf(current_node, 0);
       continue;
     }
 
@@ -912,7 +913,8 @@
       DCHECK(current_pos.AtStartOfNode() ||
              HasInvisibleFirstLetter(current_node));
       return PositionTemplate<Strategy>(
-          current_node, layout_object->CaretMinOffset() + text_start_offset);
+          current_node,
+          text_layout_object->CaretMinOffset() + text_start_offset);
     }
 
     DCHECK_GE(current_pos.OffsetInLeafNode(),
diff --git a/third_party/blink/renderer/core/editing/visible_units_paragraph.cc b/third_party/blink/renderer/core/editing/visible_units_paragraph.cc
index e78ec75..60892d8 100644
--- a/third_party/blink/renderer/core/editing/visible_units_paragraph.cc
+++ b/third_party/blink/renderer/core/editing/visible_units_paragraph.cc
@@ -221,8 +221,7 @@
 
       candidate_node = next_node_iterator;
       candidate_type = PositionAnchorType::kOffsetInAnchor;
-      candidate_offset =
-          layout_object->CaretMaxOffset() + text->TextStartOffset();
+      candidate_offset = text->CaretMaxOffset() + text->TextStartOffset();
       next_node_iterator = Strategy::Next(*next_node_iterator, start_block);
     } else if (EditingIgnoresContent(*next_node_iterator) ||
                IsDisplayInsideTable(next_node_iterator)) {
diff --git a/third_party/blink/renderer/core/frame/build.gni b/third_party/blink/renderer/core/frame/build.gni
index aea259f6..a154b84 100644
--- a/third_party/blink/renderer/core/frame/build.gni
+++ b/third_party/blink/renderer/core/frame/build.gni
@@ -217,6 +217,8 @@
   "web_local_frame_client.cc",
   "web_remote_frame_impl.h",
   "window_event_handlers.h",
+  "window_controls_overlay.cc",
+  "window_controls_overlay.h",
   "window_or_worker_global_scope.cc",
   "window_or_worker_global_scope.h",
 ]
diff --git a/third_party/blink/renderer/core/frame/frame.cc b/third_party/blink/renderer/core/frame/frame.cc
index 70f7f080..d5f7a43 100644
--- a/third_party/blink/renderer/core/frame/frame.cc
+++ b/third_party/blink/renderer/core/frame/frame.cc
@@ -151,7 +151,9 @@
     //    have unset itself as the provisional frame in `Swap()` already, so
     //    this should never be reached.
     // 3. Similarly, when swapping local->local, the actual navigation is
-    //    committing in this frame tree, and the same logic applies.
+    //    committing in this frame tree, and the same logic applies except for
+    //    one edge case where RenderDocument is enabled and a JS unload handler
+    //    removes its own frame, causing it to be detached during a swap.
     DCHECK_EQ(FrameDetachType::kRemove, type);
     provisional_frame_->Detach(type);
   }
@@ -539,12 +541,6 @@
   // is being called on an already-detached frame which should never happen...
   if (!old_frame->IsAttached())
     return false;
-  if (provisional_frame_) {
-    // `this` is about to be replaced, so if `provisional_frame_` is set, it
-    // should match `frame` which is being swapped in.
-    DCHECK_EQ(provisional_frame_, WebFrame::ToCoreFrame(*frame));
-    provisional_frame_ = nullptr;
-  }
   FrameOwner* owner = old_frame->Owner();
   FrameSwapScope frame_swap_scope(owner);
   Frame* new_frame_parent = WebFrame::ToCoreFrame(*frame) && frame->Parent()
@@ -572,6 +568,13 @@
     return false;
   }
 
+  if (provisional_frame_) {
+    // `this` is about to be replaced, so if `provisional_frame_` is set, it
+    // should match `frame` which is being swapped in.
+    DCHECK_EQ(provisional_frame_, WebFrame::ToCoreFrame(*frame));
+
+    provisional_frame_ = nullptr;
+  }
   // If there is a local parent, it might incorrectly declare itself complete
   // during the detach phase of this swap. Suppress its completion until swap is
   // over, at which point its completion will be correctly dependent on its
diff --git a/third_party/blink/renderer/core/frame/local_frame_client_impl.cc b/third_party/blink/renderer/core/frame/local_frame_client_impl.cc
index 31db0797..28e4f17 100644
--- a/third_party/blink/renderer/core/frame/local_frame_client_impl.cc
+++ b/third_party/blink/renderer/core/frame/local_frame_client_impl.cc
@@ -548,6 +548,12 @@
     web_frame_->Client()->DidCommitNavigation(
         commit_type, should_reset_browser_interface_broker, sandbox_flags,
         feature_policy_header, document_policy_header);
+
+    // With local to local swap it's possible for the frame to be deleted as a
+    // side effect of JS event handlers called in DidCommitNavigation
+    // (e.g. unload).
+    if (!web_frame_->Client())
+      return;
     if (web_frame_->GetFrame()->IsLocalRoot()) {
       // This update should be sent as soon as loading the new document begins
       // so that the browser and compositor could reset their states. However,
diff --git a/third_party/blink/renderer/core/frame/navigator_window_controls_overlay.idl b/third_party/blink/renderer/core/frame/navigator_window_controls_overlay.idl
new file mode 100644
index 0000000..2ea293c
--- /dev/null
+++ b/third_party/blink/renderer/core/frame/navigator_window_controls_overlay.idl
@@ -0,0 +1,12 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// https://github.com/WICG/window-controls-overlay/blob/master/explainer.md
+
+[
+    ImplementedAs=WindowControlsOverlay,
+    RuntimeEnabled=WebAppWindowControlsOverlay
+] partial interface Navigator {
+    [SameObject] readonly attribute WindowControlsOverlay windowControlsOverlay;
+};
diff --git a/third_party/blink/renderer/core/frame/window_controls_overlay.cc b/third_party/blink/renderer/core/frame/window_controls_overlay.cc
new file mode 100644
index 0000000..90e16a0
--- /dev/null
+++ b/third_party/blink/renderer/core/frame/window_controls_overlay.cc
@@ -0,0 +1,55 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "third_party/blink/renderer/core/frame/window_controls_overlay.h"
+
+#include "third_party/blink/renderer/core/frame/local_dom_window.h"
+#include "third_party/blink/renderer/core/frame/local_frame.h"
+#include "third_party/blink/renderer/core/frame/navigator.h"
+#include "third_party/blink/renderer/platform/heap/handle.h"
+
+namespace blink {
+
+// static
+const char WindowControlsOverlay::kSupplementName[] = "WindowControlsOverlay";
+
+// static
+WindowControlsOverlay* WindowControlsOverlay::windowControlsOverlay(
+    Navigator& navigator) {
+  auto* supplement =
+      Supplement<Navigator>::From<WindowControlsOverlay>(navigator);
+  if (!supplement) {
+    supplement = MakeGarbageCollected<WindowControlsOverlay>(navigator);
+    ProvideTo(navigator, supplement);
+  }
+  return supplement;
+}
+
+WindowControlsOverlay::WindowControlsOverlay(Navigator& navigator)
+    : Supplement<Navigator>(navigator) {}
+
+WindowControlsOverlay::~WindowControlsOverlay() = default;
+
+bool WindowControlsOverlay::visible() const {
+  if (!GetSupplementable()->DomWindow()->GetFrame())
+    return false;
+  // TODO(crbug.com/937121): Replace the hardcoded value in the next javascript
+  // API CL.
+  return false;
+}
+
+DOMRect* WindowControlsOverlay::getBoundingClientRect() const {
+  if (!GetSupplementable()->DomWindow()->GetFrame())
+    return DOMRect::Create(0, 0, 0, 0);
+  // TODO(crbug.com/937121): Replace the hardcoded value in the next javascript
+  // API CL.
+  return DOMRect::Create(0, 0, 0, 0);
+}
+
+void WindowControlsOverlay::Trace(blink::Visitor* visitor) const {
+  ScriptWrappable::Trace(visitor);
+  Supplement<Navigator>::Trace(visitor);
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/core/frame/window_controls_overlay.h b/third_party/blink/renderer/core/frame/window_controls_overlay.h
new file mode 100644
index 0000000..f9f5435
--- /dev/null
+++ b/third_party/blink/renderer/core/frame/window_controls_overlay.h
@@ -0,0 +1,42 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_WINDOW_CONTROLS_OVERLAY_H_
+#define THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_WINDOW_CONTROLS_OVERLAY_H_
+
+#include "third_party/blink/renderer/core/core_export.h"
+#include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
+#include "third_party/blink/renderer/platform/heap/handle.h"
+#include "third_party/blink/renderer/platform/supplementable.h"
+
+namespace blink {
+
+class DOMRect;
+class Navigator;
+
+class CORE_EXPORT WindowControlsOverlay final : public ScriptWrappable,
+                                                public Supplement<Navigator> {
+  DEFINE_WRAPPERTYPEINFO();
+
+ public:
+  static const char kSupplementName[];
+  // Web Exposed as navigator.windowControlsOverlay
+  static WindowControlsOverlay* windowControlsOverlay(Navigator& navigator);
+
+  explicit WindowControlsOverlay(Navigator& navigator);
+  WindowControlsOverlay(const WindowControlsOverlay&) = delete;
+  ~WindowControlsOverlay() override;
+
+  WindowControlsOverlay& operator=(const WindowControlsOverlay&) = delete;
+
+  bool visible() const;
+  DOMRect* getBoundingClientRect() const;
+
+  // ScriptWrappable
+  void Trace(Visitor*) const override;
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_WINDOW_CONTROLS_OVERLAY_H_
diff --git a/third_party/blink/renderer/core/frame/window_controls_overlay.idl b/third_party/blink/renderer/core/frame/window_controls_overlay.idl
new file mode 100644
index 0000000..1ef1d14
--- /dev/null
+++ b/third_party/blink/renderer/core/frame/window_controls_overlay.idl
@@ -0,0 +1,13 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// https://github.com/WICG/window-controls-overlay/blob/master/explainer.md
+
+[
+    RuntimeEnabled=WebAppWindowControlsOverlay,
+    Exposed=Window
+] interface WindowControlsOverlay {
+    readonly attribute boolean visible;
+    DOMRect getBoundingClientRect();
+};
diff --git a/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc b/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
index 4d538f9..f98a3f5 100644
--- a/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
+++ b/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
@@ -113,6 +113,10 @@
 constexpr int kUndefinedQualityValue = -1.0;
 constexpr int kMinimumAccelerated2dCanvasSize = 128 * 129;
 
+// A default size used for canvas memory allocation when canvas size is greater
+// than 2^20.
+constexpr uint32_t kMaximumCanvasSize = 2 << 20;
+
 }  // namespace
 
 HTMLCanvasElement::HTMLCanvasElement(Document& document)
@@ -1534,12 +1538,15 @@
   const int bytes_per_pixel = ColorParams().BytesPerPixel();
 
   intptr_t gpu_memory_usage = 0;
+  uint32_t canvas_width = std::min(kMaximumCanvasSize, width());
+  uint32_t canvas_height = std::min(kMaximumCanvasSize, height());
+
   if (gpu_buffer_count) {
     // Switch from cpu mode to gpu mode
     base::CheckedNumeric<intptr_t> checked_usage =
         gpu_buffer_count * bytes_per_pixel;
-    checked_usage *= width();
-    checked_usage *= height();
+    checked_usage *= canvas_width;
+    checked_usage *= canvas_height;
     gpu_memory_usage =
         checked_usage.ValueOrDefault(std::numeric_limits<intptr_t>::max());
   }
@@ -1548,8 +1555,8 @@
   // in all cases.
   base::CheckedNumeric<intptr_t> checked_usage =
       non_gpu_buffer_count * bytes_per_pixel;
-  checked_usage *= width();
-  checked_usage *= height();
+  checked_usage *= canvas_width;
+  checked_usage *= canvas_height;
   checked_usage += gpu_memory_usage;
   intptr_t externally_allocated_memory =
       checked_usage.ValueOrDefault(std::numeric_limits<intptr_t>::max());
diff --git a/third_party/blink/renderer/core/layout/api/line_layout_item.h b/third_party/blink/renderer/core/layout/api/line_layout_item.h
index 0b1a61b..069367d 100644
--- a/third_party/blink/renderer/core/layout/api/line_layout_item.h
+++ b/third_party/blink/renderer/core/layout/api/line_layout_item.h
@@ -229,9 +229,18 @@
     layout_object_->SetAncestorLineBoxDirty();
   }
 
-  int CaretMinOffset() const { return layout_object_->CaretMinOffset(); }
-
-  int CaretMaxOffset() const { return layout_object_->CaretMaxOffset(); }
+  // TODO(yosin): We should not use |CaretMaxOffset()|, because this function
+  // may be used for creating invalid pointer, e.g. <hr>@1.
+  int CaretMaxOffset() const {
+    if (layout_object_->IsAtomicInlineLevel()) {
+      if (Node* const node = layout_object_->GetNode())
+        return std::max(1u, GetNode()->CountChildren());
+      return 1;
+    }
+    if (layout_object_->IsHR())
+      return 1;
+    return 0;
+  }
 
   bool HasFlippedBlocksWritingMode() const {
     return layout_object_->HasFlippedBlocksWritingMode();
diff --git a/third_party/blink/renderer/core/layout/layout_box.h b/third_party/blink/renderer/core/layout/layout_box.h
index 4e53247..33bcb108 100644
--- a/third_party/blink/renderer/core/layout/layout_box.h
+++ b/third_party/blink/renderer/core/layout/layout_box.h
@@ -1914,6 +1914,7 @@
     void SavePreviousSize() {
       GetLayoutBox().previous_size_ = GetLayoutBox().Size();
     }
+    void ClearPreviousSize() { GetLayoutBox().previous_size_ = LayoutSize(); }
     void SavePreviousOverflowData();
     void ClearPreviousOverflowData() {
       DCHECK(!GetLayoutBox().HasVisualOverflow());
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc
index e62ce56..50603650 100644
--- a/third_party/blink/renderer/core/layout/layout_object.cc
+++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -3800,7 +3800,7 @@
 PositionWithAffinity LayoutObject::PositionForPoint(
     const PhysicalOffset&) const {
   NOT_DESTROYED();
-  return CreatePositionWithAffinity(CaretMinOffset());
+  return CreatePositionWithAffinity(0);
 }
 
 CompositingState LayoutObject::GetCompositingState() const {
@@ -4068,20 +4068,6 @@
          IsOutsideListMarkerForCustomContent();
 }
 
-int LayoutObject::CaretMinOffset() const {
-  NOT_DESTROYED();
-  return 0;
-}
-
-int LayoutObject::CaretMaxOffset() const {
-  NOT_DESTROYED();
-  if (IsAtomicInlineLevel())
-    return GetNode() ? std::max(1U, GetNode()->CountChildren()) : 1;
-  if (IsHR())
-    return 1;
-  return 0;
-}
-
 bool LayoutObject::IsInert() const {
   NOT_DESTROYED();
   const LayoutObject* layout_object = this;
diff --git a/third_party/blink/renderer/core/layout/layout_object.h b/third_party/blink/renderer/core/layout/layout_object.h
index 0e30a3e..5bdc78a 100644
--- a/third_party/blink/renderer/core/layout/layout_object.h
+++ b/third_party/blink/renderer/core/layout/layout_object.h
@@ -2730,9 +2730,6 @@
     return false;
   }
 
-  virtual int CaretMinOffset() const;
-  virtual int CaretMaxOffset() const;
-
   // ImageResourceObserver override.
   void ImageChanged(ImageResourceContent*, CanDeferInvalidation) final;
   void ImageChanged(WrappedImagePtr, CanDeferInvalidation) override {
diff --git a/third_party/blink/renderer/core/layout/layout_shift_tracker_test.cc b/third_party/blink/renderer/core/layout/layout_shift_tracker_test.cc
index 4ce7967c..2175f02 100644
--- a/third_party/blink/renderer/core/layout/layout_shift_tracker_test.cc
+++ b/third_party/blink/renderer/core/layout/layout_shift_tracker_test.cc
@@ -394,13 +394,13 @@
 TEST_F(LayoutShiftTrackerTest, ContentVisibilityAutoFirstPaint) {
   SetBodyInnerHTML(R"HTML(
     <style>
-      #target {
+      .auto {
         content-visibility: auto;
         contain-intrinsic-size: 1px;
         width: 100px;
       }
     </style>
-    <div id=target>
+    <div id=target class=auto>
       <div style="width: 100px; height: 100px"></div>
     </div>
   )HTML");
@@ -417,24 +417,23 @@
        ContentVisibilityAutoOffscreenAfterScrollFirstPaint) {
   SetBodyInnerHTML(R"HTML(
     <style>
-      #target {
+      .auto {
         content-visibility: auto;
         contain-intrinsic-size: 1px;
         width: 100px;
       }
     </style>
-    <div id=target style="position: relative; top: 100000px">
+    <div id=target class=auto style="position: relative; top: 100000px">
       <div style="width: 100px; height: 100px"></div>
     </div>
   )HTML");
   auto* target = To<LayoutBox>(GetLayoutObjectByElementId("target"));
-
   // #target starts offsceen, which doesn't count for CLS.
   EXPECT_FLOAT_EQ(0, GetLayoutShiftTracker().Score());
   EXPECT_EQ(LayoutSize(100, 1), target->Size());
 
   // In the next frame, we scroll it onto the screen, but it still doesn't
-  // count for CLS, and its subtree is not yet unskipped because the
+  // count for CLS, and its subtree is not yet unskipped, because the
   // intersection observation takes effect on the subsequent frame.
   GetDocument().domWindow()->scrollTo(0, 100000);
   UpdateAllLifecyclePhasesForTest();
@@ -453,13 +452,13 @@
 TEST_F(LayoutShiftTrackerTest, ContentVisibilityHiddenFirstPaint) {
   SetBodyInnerHTML(R"HTML(
     <style>
-      #target {
+      .auto {
         content-visibility: hidden;
         contain-intrinsic-size: 1px;
         width: 100px;
       }
     </style>
-    <div id=target>
+    <div id=target class=auto>
       <div style="width: 100px; height: 100px"></div>
     </div>
   )HTML");
@@ -470,4 +469,91 @@
   EXPECT_EQ(LayoutSize(100, 1), target->Size());
 }
 
+TEST_F(LayoutShiftTrackerTest, ContentVisibilityAutoResize) {
+  SetBodyInnerHTML(R"HTML(
+    <style>
+      .auto {
+        content-visibility: auto;
+        contain-intrinsic-size: 10px 3000px;
+        width: 100px;
+      }
+      .contained {
+        height: 100px;
+      }
+    </style>
+    <div class=auto><div class=contained></div></div>
+    <div class=auto id=target><div class=contained></div></div>
+  )HTML");
+
+  // Skipped subtrees don't cause CLS impact.
+  UpdateAllLifecyclePhasesForTest();
+  auto* target = To<LayoutBox>(GetLayoutObjectByElementId("target"));
+  EXPECT_FLOAT_EQ(0, GetLayoutShiftTracker().Score());
+  EXPECT_EQ(LayoutSize(100, 100), target->Size());
+}
+
+TEST_F(LayoutShiftTrackerTest,
+       ContentVisibilityAutoOnscreenAndOffscreenAfterScrollFirstPaint) {
+  SetBodyInnerHTML(R"HTML(
+    <style>
+      .auto {
+        content-visibility: auto;
+        contain-intrinsic-size: 1px;
+        width: 100px;
+      }
+    </style>
+    <div id=onscreen class=auto>
+      <div style="width: 100px; height: 100px"></div>
+    </div>
+    <div id=offscreen class=auto style="position: relative; top: 100000px">
+      <div style="width: 100px; height: 100px"></div>
+    </div>
+  )HTML");
+  auto* offscreen = To<LayoutBox>(GetLayoutObjectByElementId("offscreen"));
+  auto* onscreen = To<LayoutBox>(GetLayoutObjectByElementId("onscreen"));
+
+  // #offscreen starts offsceen, which doesn't count for CLS.
+  EXPECT_FLOAT_EQ(0, GetLayoutShiftTracker().Score());
+  EXPECT_EQ(LayoutSize(100, 1), offscreen->Size());
+  EXPECT_EQ(LayoutSize(100, 100), onscreen->Size());
+
+  // In the next frame, we scroll it onto the screen, but it still doesn't
+  // count for CLS, and its subtree is not yet unskipped, because the
+  // intersection observation takes effect on the subsequent frame.
+  GetDocument().domWindow()->scrollTo(0, 100000 + 100);
+  UpdateAllLifecyclePhasesForTest();
+  EXPECT_FLOAT_EQ(0, GetLayoutShiftTracker().Score());
+  EXPECT_EQ(LayoutSize(100, 1), offscreen->Size());
+  EXPECT_EQ(LayoutSize(100, 100), onscreen->Size());
+
+  // Now the subtree is unskipped, and #offscreen renders at size 100x100.
+  // Nevertheless, there is no impact on CLS.
+  UpdateAllLifecyclePhasesForTest();
+  offscreen = To<LayoutBox>(GetLayoutObjectByElementId("offscreen"));
+  onscreen = To<LayoutBox>(GetLayoutObjectByElementId("onscreen"));
+
+  // Target's LayoutObject gets re-attached.
+  offscreen = To<LayoutBox>(GetLayoutObjectByElementId("offscreen"));
+  EXPECT_FLOAT_EQ(0, GetLayoutShiftTracker().Score());
+  EXPECT_EQ(LayoutSize(100, 100), offscreen->Size());
+  EXPECT_EQ(LayoutSize(100, 1), onscreen->Size());
+
+  // Now scroll the element back off-screen.
+  GetDocument().domWindow()->scrollTo(0, 0);
+  UpdateAllLifecyclePhasesForTest();
+  EXPECT_FLOAT_EQ(0, GetLayoutShiftTracker().Score());
+  EXPECT_EQ(LayoutSize(100, 100), offscreen->Size());
+  EXPECT_EQ(LayoutSize(100, 1), onscreen->Size());
+
+  // In the subsequent frame, #offscreen becomes locked and changes its
+  // layout size (and vice-versa for #onscreen).
+  UpdateAllLifecyclePhasesForTest();
+  offscreen = To<LayoutBox>(GetLayoutObjectByElementId("offscreen"));
+  onscreen = To<LayoutBox>(GetLayoutObjectByElementId("onscreen"));
+
+  EXPECT_FLOAT_EQ(0, GetLayoutShiftTracker().Score());
+  EXPECT_EQ(LayoutSize(100, 1), offscreen->Size());
+  EXPECT_EQ(LayoutSize(100, 100), onscreen->Size());
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/layout_text.h b/third_party/blink/renderer/core/layout/layout_text.h
index 7734311..7ff680f 100644
--- a/third_party/blink/renderer/core/layout/layout_text.h
+++ b/third_party/blink/renderer/core/layout/layout_text.h
@@ -297,8 +297,8 @@
   bool IsBeforeNonCollapsedCharacter(unsigned) const;
   bool IsAfterNonCollapsedCharacter(unsigned) const;
 
-  int CaretMinOffset() const override;
-  int CaretMaxOffset() const override;
+  virtual int CaretMinOffset() const;
+  virtual int CaretMaxOffset() const;
   unsigned ResolvedTextLength() const;
 
   // True if any character remains after CSS white-space collapsing.
diff --git a/third_party/blink/renderer/core/layout/line/inline_box.cc b/third_party/blink/renderer/core/layout/line/inline_box.cc
index 4c4642c..51891cf 100644
--- a/third_party/blink/renderer/core/layout/line/inline_box.cc
+++ b/third_party/blink/renderer/core/layout/line/inline_box.cc
@@ -191,7 +191,7 @@
 }
 
 int InlineBox::CaretMinOffset() const {
-  return GetLineLayoutItem().CaretMinOffset();
+  return 0;
 }
 
 int InlineBox::CaretMaxOffset() const {
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item_test.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item_test.cc
index 56039f1b..f6e42fa 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item_test.cc
@@ -796,4 +796,27 @@
   TestFirstDirtyLineIndex("container", 0);
 }
 
+// This test creates various types of |NGFragmentItem| to check "natvis" (Native
+// DebugVisualizers) for Windows Visual Studio.
+TEST_F(NGFragmentItemTest, Disabled_DebugVisualizers) {
+  SetBodyInnerHTML(R"HTML(
+    <div id=container>
+      text
+      <span style="display: inline-block"></span>
+    </div>
+  )HTML");
+  auto* container =
+      To<LayoutBlockFlow>(GetLayoutObjectByElementId("container"));
+  NGInlineCursor cursor(*container);
+  cursor.MoveToFirstLine();
+  const NGFragmentItem* line = cursor.Current().Item();
+  EXPECT_NE(line, nullptr);
+  cursor.MoveToNext();
+  const NGFragmentItem* text = cursor.Current().Item();
+  EXPECT_NE(text, nullptr);
+  cursor.MoveToNext();
+  const NGFragmentItem* box = cursor.Current().Item();
+  EXPECT_NE(box, nullptr);
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc b/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc
index 8e2f9c9..d69c8c1 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc
@@ -236,11 +236,18 @@
                                      const LogicalSize& aspect_ratio,
                                      EBoxSizing box_sizing,
                                      LayoutUnit block_size) {
-  if (box_sizing == EBoxSizing::kBorderBox)
-    return block_size * aspect_ratio.inline_size / aspect_ratio.block_size;
+  // TODO(dgrogan/ikilpatrick): These calculations might need to be done in
+  // integer space, in a potential BoundedMultiplyAndDivide(LayoutUnit,
+  // LayoutUnit, LayoutUnit) function.
+  if (box_sizing == EBoxSizing::kBorderBox) {
+    return LayoutUnit::FromDoubleRound(block_size *
+                                       aspect_ratio.inline_size.ToDouble() /
+                                       aspect_ratio.block_size.ToDouble());
+  }
 
-  return ((block_size - border_padding.BlockSum()) * aspect_ratio.inline_size /
-          aspect_ratio.block_size) +
+  return LayoutUnit::FromDoubleRound((block_size - border_padding.BlockSum()) *
+                                     aspect_ratio.inline_size.ToDouble() /
+                                     aspect_ratio.block_size.ToDouble()) +
          border_padding.InlineSum();
 }
 
@@ -248,11 +255,16 @@
                                     const LogicalSize& aspect_ratio,
                                     EBoxSizing box_sizing,
                                     LayoutUnit inline_size) {
-  if (box_sizing == EBoxSizing::kBorderBox)
-    return inline_size * aspect_ratio.block_size / aspect_ratio.inline_size;
+  if (box_sizing == EBoxSizing::kBorderBox) {
+    return LayoutUnit::FromDoubleRound(inline_size *
+                                       aspect_ratio.block_size.ToDouble() /
+                                       aspect_ratio.inline_size.ToDouble());
+  }
 
-  return ((inline_size - border_padding.InlineSum()) * aspect_ratio.block_size /
-          aspect_ratio.inline_size) +
+  return LayoutUnit::FromDoubleRound(
+             (inline_size - border_padding.InlineSum()) *
+             aspect_ratio.block_size.ToDouble() /
+             aspect_ratio.inline_size.ToDouble()) +
          border_padding.BlockSum();
 }
 
diff --git a/third_party/blink/renderer/core/layout/ng/ng_length_utils.h b/third_party/blink/renderer/core/layout/ng/ng_length_utils.h
index 66ba61e..3070623 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_length_utils.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_length_utils.h
@@ -38,10 +38,11 @@
          style.LogicalMaxWidth().IsContentOrIntrinsic();
 }
 
-LayoutUnit InlineSizeFromAspectRatio(const NGBoxStrut& border_padding,
-                                     const LogicalSize& aspect_ratio,
-                                     EBoxSizing box_sizing,
-                                     LayoutUnit block_size);
+CORE_EXPORT LayoutUnit
+InlineSizeFromAspectRatio(const NGBoxStrut& border_padding,
+                          const LogicalSize& aspect_ratio,
+                          EBoxSizing box_sizing,
+                          LayoutUnit block_size);
 
 LayoutUnit BlockSizeFromAspectRatio(const NGBoxStrut& border_padding,
                                     const LogicalSize& aspect_ratio,
diff --git a/third_party/blink/renderer/core/layout/ng/ng_length_utils_test.cc b/third_party/blink/renderer/core/layout/ng/ng_length_utils_test.cc
index 535724d..1d37aa79 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_length_utils_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_length_utils_test.cc
@@ -589,5 +589,28 @@
   EXPECT_EQ(3, GetUsedColumnCount(3, 0, 10, 10));
 }
 
+LayoutUnit ComputeInlineSize(LogicalSize aspect_ratio, LayoutUnit block_size) {
+  return InlineSizeFromAspectRatio(NGBoxStrut(), aspect_ratio,
+                                   EBoxSizing::kBorderBox, block_size);
+}
+TEST_F(NGLengthUtilsTest, AspectRatio) {
+  EXPECT_EQ(LayoutUnit(8000),
+            ComputeInlineSize(LogicalSize(8000, 8000), LayoutUnit(8000)));
+  EXPECT_EQ(LayoutUnit(1),
+            ComputeInlineSize(LogicalSize(1, 10000), LayoutUnit(10000)));
+  EXPECT_EQ(LayoutUnit(4),
+            ComputeInlineSize(LogicalSize(1, 1000000), LayoutUnit(4000000)));
+  EXPECT_EQ(LayoutUnit(0),
+            ComputeInlineSize(LogicalSize(3, 5000000), LayoutUnit(5)));
+  // The literals are 8 million, 20 million, 10 million, 4 million.
+  EXPECT_EQ(
+      LayoutUnit(8000000),
+      ComputeInlineSize(LogicalSize(20000000, 10000000), LayoutUnit(4000000)));
+  // If you specify an aspect ratio of 10000:1 with a large block size,
+  // LayoutUnit saturates.
+  EXPECT_EQ(LayoutUnit::Max(),
+            ComputeInlineSize(LogicalSize(10000, 1), LayoutUnit(10000)));
+}
+
 }  // namespace
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc
index 9c3a661..00b7841 100644
--- a/third_party/blink/renderer/core/loader/document_loader.cc
+++ b/third_party/blink/renderer/core/loader/document_loader.cc
@@ -1845,6 +1845,19 @@
           previous_window != frame_->DomWindow(),
           frame_->DomWindow()->GetSandboxFlags(),
           security_init.FeaturePolicyHeader(), document_policy_.feature_state);
+      // Originally, before OOPIFs, the previous document associated with the
+      // frame will always already by detached at this point, so no JS unload
+      // handlers should run. However, with OOPIFs, this `LocalFrame` might
+      // still be provisional: it doesn't become swapped in until Blink notifies
+      // the embedder by calling `DidCommitNavigation()`. As a result,
+      // `DidCommitLoad()` might end up running the unload handlers for the
+      // previous *frame* when swapping it out, which might detach `this`.
+      //
+      // TODO(https://crbug.com/1153043): Fix this so that the frame is swapped
+      // in earlier, at `FrameLoader::DetachDocument()`. At that point, it is
+      // certain that the navigation will commit.
+      if (!frame_)
+        return;
     }
     // TODO(dgozman): make DidCreateScriptContext notification call currently
     // triggered by installing new document happen here, after commit.
diff --git a/third_party/blink/renderer/core/paint/box_paint_invalidator.cc b/third_party/blink/renderer/core/paint/box_paint_invalidator.cc
index 587e26a..105b35e 100644
--- a/third_party/blink/renderer/core/paint/box_paint_invalidator.cc
+++ b/third_party/blink/renderer/core/paint/box_paint_invalidator.cc
@@ -392,22 +392,15 @@
   return false;
 }
 
-static bool IsContentVisibilityAutoWithoutFirstIntersection(
-    const LayoutBox& box) {
-  if (!box.GetNode() || !box.GetNode()->IsElementNode())
-    return false;
-
-  auto* display_lock_context =
-      To<Element>(box.GetNode())->GetDisplayLockContext();
+static bool IsContentVisibilityAutoAndHidden(const LayoutBox& box) {
+  auto* display_lock_context = box.GetDisplayLockContext();
   if (!display_lock_context)
     return false;
 
-  if (!display_lock_context->IsLocked() ||
-      display_lock_context->HadAnyViewportIntersectionNotifications() ||
-      !display_lock_context->IsAuto())
+  if (!display_lock_context->IsAuto())
     return false;
 
-  return true;
+  return display_lock_context->IsLocked();
 }
 
 bool BoxPaintInvalidator::NeedsToSavePreviousOverflowData() {
@@ -430,20 +423,19 @@
 
 void BoxPaintInvalidator::SavePreviousBoxGeometriesIfNeeded() {
   auto mutable_box = box_.GetMutableForPainting();
-  // If a box has content-visibility:auto and has not yet been deemed to be near
-  // the viewport, then don't save its previous size. This prevents the
-  // LayoutShiftTracker (which computes CLS) from recording a layout shift when
-  // the element's subtree become unskipped for the first time. This is almost
-  // exactly equivalent to the current behavior of CLS computation for offscreen
-  // elements - i.e. those elements are not counted for CLS. The only difference
-  // is the one-frame leeway granted after box_ appears near the screen.
+  // Don't save previous sizes for hidden content-visibility: auto elements.
+  // This ensures content-visibility: auto never by itself causes a layout
+  // shift, because the LayoutShiftTracker will ignore elements whose previous
+  // or current size are empty.
   //
   // Note: The downside of this approach is that any change in size of |box_|
   // up to the time unskipping occurs will cause a full paint invalidation
   // of |box_|. Since this has no effect on its subtree (which is skipped),
   // and |box_| is not on-screen, this should not have a significant performance
   // impact.
-  if (!IsContentVisibilityAutoWithoutFirstIntersection(box_))
+  if (IsContentVisibilityAutoAndHidden(box_))
+    mutable_box.ClearPreviousSize();
+  else
     mutable_box.SavePreviousSize();
 
   if (NeedsToSavePreviousOverflowData())
diff --git a/third_party/blink/renderer/modules/accessibility/ax_enums.h b/third_party/blink/renderer/modules/accessibility/ax_enums.h
index 559d48364..4bf9993 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_enums.h
+++ b/third_party/blink/renderer/modules/accessibility/ax_enums.h
@@ -94,6 +94,7 @@
   kAXTextFromNativeHTMLLabelFor,
   kAXTextFromNativeHTMLLabelWrapped,
   kAXTextFromNativeHTMLLegend,
+  kAXTextFromNativeHTMLRubyAnnotation,
   kAXTextFromNativeHTMLTableCaption,
   kAXTextFromNativeHTMLTitleElement,
 };
diff --git a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
index 0e4567f2..171849f 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
@@ -388,6 +388,17 @@
       always_included_computed_roles.end())
     return kIncludeObject;
 
+  // Avoid double speech. The ruby text describes pronunciation of the ruby
+  // base, and generally produces redundant screen reader output. Expose it only
+  // as a description on the <ruby> element so that screen reader users can
+  // toggle it on/off as with other descriptions/annotations.
+  if (RoleValue() == ax::mojom::blink::Role::kRubyAnnotation ||
+      (RoleValue() == ax::mojom::blink::Role::kStaticText && ParentObject() &&
+       ParentObject()->RoleValue() ==
+           ax::mojom::blink::Role::kRubyAnnotation)) {
+    return kIgnoreObject;
+  }
+
   // If this element has aria attributes on it, it should not be ignored.
   if (HasGlobalARIAAttribute())
     return kIncludeObject;
@@ -3239,22 +3250,6 @@
   AddChild(RemoteSVGRootElement());
 }
 
-bool AXNodeObject::ShouldUseLayoutBuilderTraversal() const {
-  // TODO(accessibility) Look into having one method of traversal, otherwise
-  // it's possible for the same object to become a child of 2 different nodes,
-  // e.g. if it has a different layout parent and DOM parent.
-
-  Node* node = GetNode();
-  if (!node)
-    return false;
-
-  // <ruby>: special layout handling
-  if (IsA<HTMLRubyElement>(*node))
-    return false;
-
-  return true;
-}
-
 void AXNodeObject::AddNodeChildren() {
   for (Node* child = LayoutTreeBuilderTraversal::FirstChild(*node_); child;
        child = LayoutTreeBuilderTraversal::NextSibling(*child)) {
@@ -4426,6 +4421,17 @@
     AXRelatedObjectVector* related_objects) const {
   // If descriptionSources is non-null, relatedObjects is used in filling it in,
   // so it must be non-null as well.
+  // Important: create a DescriptionSource for every *potential* description
+  // source, even if it ends up not being present.
+  // When adding a new description_from type:
+  // * Also add it to AXValueNativeSourceType here:
+  //   blink/public/devtools_protocol/browser_protocol.pdl
+  // * Update InspectorTypeBuilderHelper to map the new enum to
+  //   the browser_protocol enum in NativeSourceType():
+  //   blink/renderer/modules/accessibility/inspector_type_builder_helper.cc
+  // * Update devtools_frontend to add a new string for the new type of
+  //   description. See AXNativeSourceTypes at:
+  //   devtools-frontend/src/front_end/accessibility/AccessibilityStrings.js
   if (description_sources)
     DCHECK(related_objects);
 
@@ -4524,6 +4530,43 @@
     }
   }
 
+  if (RoleValue() == ax::mojom::blink::Role::kRuby) {
+    description_from = ax::mojom::blink::DescriptionFrom::kRelatedElement;
+    if (description_sources) {
+      description_sources->push_back(DescriptionSource(found_description));
+      description_sources->back().type = description_from;
+      description_sources->back().native_source =
+          kAXTextFromNativeHTMLRubyAnnotation;
+    }
+    AXObject* ruby_annotation_ax_object = nullptr;
+    for (const auto& child : children_) {
+      if (child->RoleValue() == ax::mojom::blink::Role::kRubyAnnotation &&
+          child->GetNode() &&
+          child->GetNode()->HasTagName(html_names::kRtTag)) {
+        ruby_annotation_ax_object = child;
+        break;
+      }
+    }
+    if (ruby_annotation_ax_object) {
+      AXObjectSet visited;
+      description =
+          RecursiveTextAlternative(*ruby_annotation_ax_object, true, visited);
+      if (related_objects) {
+        related_objects->push_back(
+            MakeGarbageCollected<NameSourceRelatedObject>(
+                ruby_annotation_ax_object, description));
+      }
+      if (description_sources) {
+        DescriptionSource& source = description_sources->back();
+        source.related_objects = *related_objects;
+        source.text = description;
+        found_description = true;
+      } else {
+        return description;
+      }
+    }
+  }
+
   // table caption, 5.9.2 from:
   // http://rawgit.com/w3c/aria/master/html-aam/html-aam.html
   auto* table_element = DynamicTo<HTMLTableElement>(element);
diff --git a/third_party/blink/renderer/modules/accessibility/ax_node_object.h b/third_party/blink/renderer/modules/accessibility/ax_node_object.h
index 04fcc8ea..793b466 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_node_object.h
+++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.h
@@ -322,8 +322,6 @@
   bool IsHtmlTable() const;
   void AddTableChildren();
   void AddValidationMessageChild();
-  // For some nodes, only LayoutBuilderTraversal visits the necessary children.
-  bool ShouldUseLayoutBuilderTraversal() const override;
   ax::mojom::blink::Dropeffect ParseDropeffect(String& dropeffect) const;
 
   DISALLOW_COPY_AND_ASSIGN(AXNodeObject);
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.cc b/third_party/blink/renderer/modules/accessibility/ax_object.cc
index 82460e0..31a08cf 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object.cc
@@ -4589,7 +4589,6 @@
     // if the row might receive focus
     case ax::mojom::blink::Role::kRow:
     case ax::mojom::blink::Role::kRuby:
-    case ax::mojom::blink::Role::kRubyAnnotation:
     case ax::mojom::blink::Role::kSection:
     case ax::mojom::blink::Role::kStrong:
     case ax::mojom::blink::Role::kTime:
@@ -4619,6 +4618,22 @@
       }
       break;
 
+    case ax::mojom::blink::Role::kRubyAnnotation:
+      // Ruby annotations are removed from accessible names and instead used
+      // as a description of the parent Role::kRuby object. The benefit is that
+      // announcement of the description can be toggled on/off per user choice.
+      // In this way, ruby annotations are treated like other annotations, e.g.
+      // <mark aria-description="annotation">base text</mark>.
+      // In order to achieve the above:
+      // * When recursive is true:
+      //   Return false, so that the ruby annotation text does not contribute to
+      //   the name of the parent Role::kRuby, since it will also be in the
+      //   description of that object.
+      // * When recursive is false:
+      //   Return true, so that text is generated for the object. This text will
+      //   be assigned as the description of he parent Role::kRuby object.
+      return !recursive;
+
     case ax::mojom::blink::Role::kPdfActionableHighlight:
       LOG(ERROR) << "PDF specific highlight role, Blink shouldn't generate "
                     "this role type";
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.h b/third_party/blink/renderer/modules/accessibility/ax_object.h
index 6e0451b..b336448 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object.h
+++ b/third_party/blink/renderer/modules/accessibility/ax_object.h
@@ -1085,8 +1085,12 @@
   virtual AXObject* RawNextSibling() const { return nullptr; }
 
   virtual void AddChildren() {}
-  // For some nodes, only LayoutBuilderTraversal visits the necessary children.
-  virtual bool ShouldUseLayoutBuilderTraversal() const { return false; }
+  // If there is a DOM node, use LayoutBuilderTraversal, which visits DOM
+  // children and pseudo element nodes, otherwise this may be an anonymous node,
+  // such as an anonymous block that is inserted to enforce the rule that all
+  // children are blocks or all children are inlines. Anonymous blocks have a
+  // layout object but no DOM node.
+  virtual bool ShouldUseLayoutBuilderTraversal() const { return GetNode(); }
   virtual bool CanHaveChildren() const { return true; }
   bool HasChildren() const { return have_children_; }
   virtual void UpdateChildrenIfNecessary();
diff --git a/third_party/blink/renderer/modules/accessibility/inspector_type_builder_helper.cc b/third_party/blink/renderer/modules/accessibility/inspector_type_builder_helper.cc
index 87c63ef..5654a3f 100644
--- a/third_party/blink/renderer/modules/accessibility/inspector_type_builder_helper.cc
+++ b/third_party/blink/renderer/modules/accessibility/inspector_type_builder_helper.cc
@@ -200,6 +200,8 @@
       return SourceType::Labelfor;
     case kAXTextFromNativeHTMLLabelWrapped:
       return SourceType::Labelwrapped;
+    case kAXTextFromNativeHTMLRubyAnnotation:
+      return SourceType::Rubyannotation;
     case kAXTextFromNativeHTMLTableCaption:
       return SourceType::Tablecaption;
     case kAXTextFromNativeHTMLLegend:
diff --git a/third_party/blink/renderer/modules/screen_orientation/screen_orientation_controller.cc b/third_party/blink/renderer/modules/screen_orientation/screen_orientation_controller.cc
index c1d92d0..1d51152 100644
--- a/third_party/blink/renderer/modules/screen_orientation/screen_orientation_controller.cc
+++ b/third_party/blink/renderer/modules/screen_orientation/screen_orientation_controller.cc
@@ -147,6 +147,10 @@
 }
 
 void ScreenOrientationController::NotifyOrientationChanged() {
+  // TODO(dcheng): Remove this and check in the caller.
+  if (!DomWindow())
+    return;
+
   // Keep track of the frames that need to be notified before notifying the
   // current frame as it will prevent side effects from the change event
   // handlers.
diff --git a/third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.cc b/third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.cc
index f1c1a73f..c2702ad 100644
--- a/third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.cc
+++ b/third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.cc
@@ -5527,7 +5527,6 @@
         return false;
       }
       return true;
-    case GL_UNSIGNED_SHORT:
     case GL_UNSIGNED_SHORT_5_6_5:
     case GL_UNSIGNED_SHORT_4_4_4_4:
     case GL_UNSIGNED_SHORT_5_5_5_1:
@@ -5538,6 +5537,23 @@
         return false;
       }
       return true;
+    case GL_UNSIGNED_SHORT:
+      if (buffer && buffer->GetType() != DOMArrayBufferView::kTypeUint16) {
+        SynthesizeGLError(
+            GL_INVALID_OPERATION, "readPixels",
+            "type GL_UNSIGNED_SHORT but ArrayBufferView not Uint16Array");
+        return false;
+      }
+      if (format == GL_RGBA) {
+        if (!ExtensionEnabled(kEXTTextureNorm16Name)) {
+          SynthesizeGLError(
+              GL_INVALID_ENUM, "readPixels",
+              "invalid format/type combination RGBA/UNSIGNED_SHORT without "
+              "EXT_texture_norm16 support");
+          return false;
+        }
+      }
+      return true;
     case GL_SHORT:
       if (buffer && buffer->GetType() != DOMArrayBufferView::kTypeInt16) {
         SynthesizeGLError(GL_INVALID_OPERATION, "readPixels",
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index ec977bb2..5549499 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -1742,8 +1742,6 @@
 crbug.com/381684 [ Mac ] fonts/family-fallback-gardiner.html [ Skip ]
 crbug.com/381684 [ Win ] fonts/family-fallback-gardiner.html [ Skip ]
 
-crbug.com/636239 [ Win7 ] media/video-zoom-controls.html [ Failure ]
-
 crbug.com/377696 printing/setPrinting.html [ Failure ]
 
 # No support for WPT print-reftests:
@@ -2577,12 +2575,6 @@
 crbug.com/626703 external/wpt/mediacapture-record/MediaRecorder-peerconnection-no-sink.https.html [ Timeout ]
 crbug.com/626703 external/wpt/mediacapture-record/MediaRecorder-peerconnection.https.html [ Timeout ]
 crbug.com/626703 [ Win7 ] virtual/plz-dedicated-worker/external/wpt/service-workers/service-worker/update-bytecheck.https.html [ Timeout ]
-crbug.com/626703 external/wpt/fetch/api/request/request-bad-port.any.worker.html [ Timeout ]
-crbug.com/626703 virtual/plz-dedicated-worker/external/wpt/fetch/api/request/request-bad-port.any.worker.html [ Timeout ]
-crbug.com/626703 external/wpt/fetch/api/request/request-bad-port.any.sharedworker.html [ Timeout ]
-crbug.com/626703 virtual/plz-dedicated-worker/external/wpt/fetch/api/request/request-bad-port.any.sharedworker.html [ Timeout ]
-crbug.com/626703 external/wpt/fetch/api/request/request-bad-port.any.html [ Timeout ]
-crbug.com/626703 virtual/plz-dedicated-worker/external/wpt/fetch/api/request/request-bad-port.any.html [ Timeout ]
 crbug.com/626703 external/wpt/input-events/input-events-get-target-ranges-joining-dl-element-and-another-list.tentative.html?Backspace [ Timeout ]
 crbug.com/626703 external/wpt/input-events/input-events-get-target-ranges-deleting-in-list-items.tentative.html?Backspace,ul [ Timeout ]
 crbug.com/626703 external/wpt/input-events/input-events-get-target-ranges-joining-dl-elements.tentative.html?Backspace [ Timeout ]
@@ -5146,13 +5138,6 @@
 crbug.com/994692 [ Linux ] compositing/reflections/nested-reflection-anchor-point.html [ Pass Failure ]
 crbug.com/994692 [ Win ] compositing/reflections/nested-reflection-anchor-point.html [ Pass Failure ]
 
-# Video flakily not being being rendered on Mac
-crbug.com/988248 media/controls/captions-menu-always-visible.html [ Pass Failure ]
-crbug.com/988248 [ Mac ] media/controls/overflow-menu-always-visible.html [ Pass Failure ]
-crbug.com/988248 [ Mac ] media/video-persistence.html [ Pass Failure ]
-crbug.com/988248 [ Linux ] media/video-persistence.html [ Pass Failure ]
-crbug.com/988248 [ Mac ] media/video-zoom.html [ Pass Failure ]
-
 crbug.com/996219 [ Win ] virtual/text-antialias/emoji-vertical-origin-visual.html [ Failure ]
 
 # Sheriff 2019-08-22
@@ -6012,3 +5997,6 @@
 # for waitings in web tests to trigger a detection event.
 crbug.com/1032681 http/tests/subresource_filter/overlay_popup_ad/* [ Skip ]
 crbug.com/1032681 virtual/disable-frequency-capping-for-overlay-popup-detection/http/tests/subresource_filter/overlay_popup_ad/* [ Pass ]
+
+#Sheriff 2020-12-01
+crbug.com/1153626 http/tests/wasm/wasm_worker_termination_while_compiling.html [ Pass Crash ]
diff --git a/third_party/blink/web_tests/accessibility/element-role-mapping-normal-expected.txt b/third_party/blink/web_tests/accessibility/element-role-mapping-normal-expected.txt
index 5d8dabc..78ff5aa 100644
--- a/third_party/blink/web_tests/accessibility/element-role-mapping-normal-expected.txt
+++ b/third_party/blink/web_tests/accessibility/element-role-mapping-normal-expected.txt
@@ -65,11 +65,9 @@
         AXRole: AXStaticText "Paragraph"
             AXRole: AXInlineTextBox "Paragraph"
     AXRole: AXRuby
-        AXRole: AXRubyAnnotation
-            AXRole: AXStaticText "한국"
-                AXRole: AXInlineTextBox "한국"
         AXRole: AXStaticText "韓國"
             AXRole: AXInlineTextBox "韓國"
+        AXRole: AXRubyAnnotation "한국"
     AXRole: AXDescriptionList
         AXRole: AXDescriptionListTerm
             AXRole: AXStaticText "Coffee"
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-minimum-size-003.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-minimum-size-003.html
new file mode 100644
index 0000000..95d9e37
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-minimum-size-003.html
@@ -0,0 +1,23 @@
+<!doctype html>
+<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#min-size-auto">
+<link rel="help" href="https://crbug.com/1151608">
+<meta name="assert" content="automatic minimum size computation doesn't overflow when multiplying by the aspect ratio" />
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+
+<body onload="checkLayout('img')">
+
+<div id=log></div>
+
+<div style="display: flex; width: 300px;">
+  <img src="data:image/svg+xml,%3Csvg viewBox='0 0 1 1' width='8000' height='8000' xmlns='http://www.w3.org/2000/svg' %3E%3C/svg%3E" data-expected-width=8000 style="height: 8000px;">
+</div>
+
+<div style="display: flex; flex-direction: column; height: 300px;">
+  <img src="data:image/svg+xml,%3Csvg viewBox='0 0 1 1' width='8000' height='8000' xmlns='http://www.w3.org/2000/svg' %3E%3C/svg%3E" data-expected-height=8000 style="width: 8000px;">
+</div>
+
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/seg-break-transformation-001-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/seg-break-transformation-001-expected.txt
deleted file mode 100644
index 9612dd0..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/seg-break-transformation-001-expected.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-This is a testharness.js-based test.
-FAIL linebreak only assert_equals: expected 144 but got 151
-FAIL spaces linebreak assert_equals: expected 144 but got 151
-FAIL linebreak spaces assert_equals: expected 144 but got 151
-FAIL spaces linebreak spaces assert_equals: expected 144 but got 151
-FAIL multiple linebreaks assert_equals: expected 144 but got 151
-FAIL multiple linebreaks + spaces assert_equals: expected 144 but got 151
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/seg-break-transformation-002-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/seg-break-transformation-002-expected.txt
deleted file mode 100644
index 405bb8e..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/seg-break-transformation-002-expected.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-This is a testharness.js-based test.
-FAIL linebreak only assert_equals: expected 216 but got 223
-FAIL spaces linebreak assert_equals: expected 216 but got 223
-FAIL linebreak spaces assert_equals: expected 216 but got 223
-FAIL spaces linebreak spaces assert_equals: expected 216 but got 223
-FAIL multiple linebreaks assert_equals: expected 216 but got 223
-FAIL multiple linebreaks + spaces assert_equals: expected 216 but got 223
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/seg-break-transformation-003-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/seg-break-transformation-003-expected.txt
deleted file mode 100644
index 716b04b..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/seg-break-transformation-003-expected.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-This is a testharness.js-based test.
-FAIL linebreak only assert_equals: expected 48 but got 55
-FAIL spaces linebreak assert_equals: expected 48 but got 55
-FAIL linebreak spaces assert_equals: expected 48 but got 55
-FAIL spaces linebreak spaces assert_equals: expected 48 but got 55
-FAIL multiple linebreaks assert_equals: expected 48 but got 55
-FAIL multiple linebreaks + spaces assert_equals: expected 48 but got 55
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/seg-break-transformation-008-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/seg-break-transformation-008-expected.txt
deleted file mode 100644
index 69421f29..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/seg-break-transformation-008-expected.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-This is a testharness.js-based test.
-FAIL linebreak only assert_equals: expected 192 but got 199
-FAIL spaces linebreak assert_equals: expected 192 but got 199
-FAIL linebreak spaces assert_equals: expected 192 but got 199
-FAIL spaces linebreak spaces assert_equals: expected 192 but got 199
-FAIL multiple linebreaks assert_equals: expected 192 but got 199
-FAIL multiple linebreaks + spaces assert_equals: expected 192 but got 199
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/seg-break-transformation-009-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/seg-break-transformation-009-expected.txt
deleted file mode 100644
index 283611a..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/seg-break-transformation-009-expected.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-This is a testharness.js-based test.
-FAIL linebreak only assert_equals: expected 120 but got 127
-FAIL spaces linebreak assert_equals: expected 120 but got 127
-FAIL linebreak spaces assert_equals: expected 120 but got 127
-FAIL spaces linebreak spaces assert_equals: expected 120 but got 127
-FAIL multiple linebreaks assert_equals: expected 120 but got 127
-FAIL multiple linebreaks + spaces assert_equals: expected 120 but got 127
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-window-controls-overlay-expected.txt b/third_party/blink/web_tests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-window-controls-overlay-expected.txt
new file mode 100644
index 0000000..3c87e7a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-window-controls-overlay-expected.txt
@@ -0,0 +1,9 @@
+This is a testharness.js-based test.
+FAIL the windowControlsOverlay object should exist on the navigator object assert_idl_attribute: property "windowControlsOverlay" not found in prototype chain
+FAIL visible should be a member of the windowControlsOverlay object assert_idl_attribute: provided value is not an object
+FAIL visible should be false Cannot read property 'visible' of undefined
+FAIL getBoundingClientRect should be a method of the windowControlsOverlay object assert_idl_attribute: provided value is not an object
+FAIL getBoundingClientRect return type should be DOMRect Cannot read property 'getBoundingClientRect' of undefined
+FAIL getBoundingClientRect should return a empty DOMRect Cannot read property 'getBoundingClientRect' of undefined
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-window-controls-overlay.html b/third_party/blink/web_tests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-window-controls-overlay.html
new file mode 100644
index 0000000..069ff16
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-window-controls-overlay.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<meta charset='utf-8'>
+<title>navigator.windowControlsOverlay</title>
+
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+
+<script>
+  test(function(){
+    assert_idl_attribute(navigator, 'windowControlsOverlay');
+  }, 'the windowControlsOverlay object should exist on the navigator object');
+
+  test(function(){
+    assert_idl_attribute(navigator.windowControlsOverlay, 'visible');
+  }, 'visible should be a member of the windowControlsOverlay object');
+
+  test(function(){
+    assert_false(navigator.windowControlsOverlay.visible);
+  }, 'visible should be false');
+
+  test(function(){
+    assert_idl_attribute(navigator.windowControlsOverlay, 'getBoundingClientRect');
+  }, 'getBoundingClientRect should be a method of the windowControlsOverlay object');
+
+  test(function(){
+    var rect = navigator.windowControlsOverlay.getBoundingClientRect();
+    assert_true(rect instanceof DOMRect);
+  }, 'getBoundingClientRect return type should be DOMRect');
+
+  test(function(){
+    var rect = navigator.windowControlsOverlay.getBoundingClientRect();
+    assert_equals(rect.x, 0);
+    assert_equals(rect.y, 0);
+    assert_equals(rect.width, 0);
+    assert_equals(rect.height, 0);
+  }, 'getBoundingClientRect should return a empty DOMRect');
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/layout-instability/content-visibility-auto-offscreen.html b/third_party/blink/web_tests/external/wpt/layout-instability/content-visibility-auto-offscreen.html
index 8356a34..af60412 100644
--- a/third_party/blink/web_tests/external/wpt/layout-instability/content-visibility-auto-offscreen.html
+++ b/third_party/blink/web_tests/external/wpt/layout-instability/content-visibility-auto-offscreen.html
@@ -2,13 +2,16 @@
 <title>Layout Instability: off-screen content-visibility:auto content</title>
 <link rel="help" href="https://wicg.github.io/layout-instability/" />
 <style>
-  #target {
+  #auto {
     content-visibility: auto;
     contain-intrinsic-size: 1px;
     width: 100px;
   }
 </style>
-<div id=target style="position: relative; top: 100000px">
+<div class=auto>
+  <div style="width: 100px; height: 100px"></div>
+</div>
+<div class=auto style="position: relative; top: 100000px">
   <div style="width: 100px; height: 100px"></div>
 </div>
 <script src="/resources/testharness.js"></script>
@@ -21,7 +24,12 @@
   // Wait for the initial render to complete.
   await waitForAnimationFrames(2);
 
-  window.scrollTo(0, 100000);
+  window.scrollTo(0, 100000 + 100);
+  await waitForAnimationFrames(2);
+
+  assert_equals(watcher.score, 0);
+
+  window.scrollTo(0, 0);
   await waitForAnimationFrames(2);
 
   assert_equals(watcher.score, 0);
diff --git a/third_party/blink/web_tests/external/wpt/layout-instability/content-visibility-auto-resize.html b/third_party/blink/web_tests/external/wpt/layout-instability/content-visibility-auto-resize.html
new file mode 100644
index 0000000..b8de7f5
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/layout-instability/content-visibility-auto-resize.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<title>Layout Instability: resizing content-visibility:auto content</title>
+<link rel="help" href="https://wicg.github.io/layout-instability/" />
+<style>
+      .auto {
+        content-visibility: auto;
+        contain-intrinsic-size: 10px 3000px;
+        width: 100px;
+      }
+      .contained {
+        height: 100px;
+      }
+    </style>
+    <div class=a><div class=contained></div></div>
+    <div class=a ><div class=contained></div></div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/util.js"></script>
+<script>
+promise_test(async () => {
+  const watcher = new ScoreWatcher;
+
+  // Wait for the initial render to complete.
+  await waitForAnimationFrames(2);
+
+  assert_equals(watcher.score, 0);
+}, 'off-screen content-visibility:auto');
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/shadow-dom/declarative/support/helpers.js b/third_party/blink/web_tests/external/wpt/shadow-dom/declarative/support/helpers.js
index 70808e8..0be3add 100644
--- a/third_party/blink/web_tests/external/wpt/shadow-dom/declarative/support/helpers.js
+++ b/third_party/blink/web_tests/external/wpt/shadow-dom/declarative/support/helpers.js
@@ -1,4 +1,4 @@
 function setInnerHTML(el,content) {
   const fragment = (new DOMParser()).parseFromString(`<pre>${content}</pre>`, 'text/html', {includeShadowRoots: true});
-  el.replaceChildren(...fragment.body.firstChild.childNodes);
+  (el instanceof HTMLTemplateElement ? el.content : el).replaceChildren(...fragment.body.firstChild.childNodes);
 }
diff --git a/third_party/blink/web_tests/media/video-layer-crash.html b/third_party/blink/web_tests/media/video-layer-crash.html
index a8f87960c..ffeeea1 100644
--- a/third_party/blink/web_tests/media/video-layer-crash.html
+++ b/third_party/blink/web_tests/media/video-layer-crash.html
@@ -11,16 +11,18 @@
     <body>
         <p>Test dynamic removal of transformed and reflected video </p>
         &nbsp;<video id="one" style="transform:rotate(20deg)"></video><br>
-        &nbsp;<video style="transform:scale(0.5)"></video><br>
-        &nbsp;<video style="transform:skew(20deg)"></video><br>
+        &nbsp;<video class="otherVids" style="transform:scale(0.5)"></video><br>
+        &nbsp;<video class="otherVids" style="transform:skew(20deg)"></video><br>
         <script>
+            var videos = Array.from(document.getElementsByClassName("otherVids"));
+            var presentationPromise =
+                Promise.all(videos.map(video => videoPresentationPromise(video)));
+
             setSrcByTagName('video', 'content/test.ogv');
             document.body.removeChild(document.getElementById('one'));
             document.body.offsetLeft;
             async_test(t => {
-                waitForMultipleEvents("canplaythrough", 2, () => {
-                    t.done();
-                });
+                presentationPromise.then(() => t.done());
             });
         </script>
     </body>
diff --git a/third_party/blink/web_tests/media/video-zoom-controls.html b/third_party/blink/web_tests/media/video-zoom-controls.html
index 76d401b2..24ed0cb 100644
--- a/third_party/blink/web_tests/media/video-zoom-controls.html
+++ b/third_party/blink/web_tests/media/video-zoom-controls.html
@@ -14,7 +14,7 @@
     <script src="video-paint-test.js"></script>
     <script src="media-controls.js"></script>
 </head>
-<body onload="setSrcByTagName('video', 'content/test.ogv'); init()">
+<body onload="setVideoSrcAndWaitForFirstFrame('content/test.ogv');">
     <p>Zoomed video with controls.</p>
     <video width="160" height="120" controls></video>
     <video class="rotated" width="160" height="120" controls></video>
diff --git a/third_party/blink/web_tests/media/video-zoom.html b/third_party/blink/web_tests/media/video-zoom.html
index e6ae3ac..b65c5f91 100644
--- a/third_party/blink/web_tests/media/video-zoom.html
+++ b/third_party/blink/web_tests/media/video-zoom.html
@@ -3,25 +3,16 @@
     <style> video { zoom: 150%; border: 3px solid red; } </style>
     <script src=media-file.js></script>
     <script>
-        function waitForVideoPresentation(video) {
-            return new Promise(resolve => {
-                video.requestVideoFrameCallback(resolve);
-            });
-        }
-
         function init()
         {
+            var videosPresented = allVideosPresentedPromise();
             setSrcByTagName("video", "content/test.ogv");
 
             if (!window.testRunner)
                 return;
             testRunner.waitUntilDone();
 
-            let videos = Array.from(document.getElementsByTagName('video'));
-            Promise.all(videos.map(
-                video => waitForVideoPresentation(video))).then(() => {
-                    testRunner.notifyDone();
-                });
+            videosPresented.then(() => testRunner.notifyDone());
         }
     </script>
 
diff --git a/third_party/blink/web_tests/platform/mac-mac-arm11.0/media/video-zoom-expected.png b/third_party/blink/web_tests/platform/mac-mac-arm11.0/media/video-zoom-expected.png
new file mode 100644
index 0000000..34743ab
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac-arm11.0/media/video-zoom-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/media/video-zoom-expected.png b/third_party/blink/web_tests/platform/mac/media/video-zoom-expected.png
index 34743ab..c8144b6b 100644
--- a/third_party/blink/web_tests/platform/mac/media/video-zoom-expected.png
+++ b/third_party/blink/web_tests/platform/mac/media/video-zoom-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/media/video-zoom-controls-expected.png b/third_party/blink/web_tests/platform/win7/media/video-zoom-controls-expected.png
deleted file mode 100644
index 5e8687a..0000000
--- a/third_party/blink/web_tests/platform/win7/media/video-zoom-controls-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/media/video-zoom-expected.png b/third_party/blink/web_tests/platform/win7/media/video-zoom-expected.png
deleted file mode 100644
index ca939971..0000000
--- a/third_party/blink/web_tests/platform/win7/media/video-zoom-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/grpc/BUILD.gn b/third_party/grpc/BUILD.gn
index 0690227..48e5081 100644
--- a/third_party/grpc/BUILD.gn
+++ b/third_party/grpc/BUILD.gn
@@ -1514,6 +1514,9 @@
   public_configs = [
     ":grpc_config",
   ]
+  configs += [
+    ":grpc_config_private",
+  ]
   include_dirs = [
     "src/third_party/address_sorting/include",
   ]
@@ -1563,6 +1566,9 @@
     public_configs = [
       ":grpc_config",
     ]
+    configs += [
+      ":grpc_config_private",
+    ]
   }
 
 }
@@ -1621,6 +1627,9 @@
   public_configs = [
     ":grpc_config",
   ]
+  configs += [
+    ":grpc_config_private",
+  ]
   visibility = [ "./*" ]
   if (!is_win) {
     configs -= [ "//build/config/gcc:symbol_visibility_hidden" ]
diff --git a/third_party/grpc/template/BUILD.chromium.gn.template b/third_party/grpc/template/BUILD.chromium.gn.template
index 02acf61..cef612df 100644
--- a/third_party/grpc/template/BUILD.chromium.gn.template
+++ b/third_party/grpc/template/BUILD.chromium.gn.template
@@ -374,12 +374,12 @@
       if repeated:
         deps.append(":{}".format(repeated_lib_name))
     %>\
-  ${cc_library_internal(lib.name, indent, sources, deps, extra_stuff, [])}
+  ${cc_library_internal(lib.name, indent, sources, deps, extra_stuff, extra_configs)}
     % if repeated:
 
   # There are some .cc files that are in multiple places. GN doesn't like
   # that. Moving them to another target.
-  ${cc_library_internal(repeated_lib_name, indent, repeated, repeated_deps, extra_stuff, [])}
+  ${cc_library_internal(repeated_lib_name, indent, repeated, repeated_deps, extra_stuff, extra_configs)}
     % endif
   </%def>\
   <%def name="cc_library_internal(name, indent, sources, lib_deps, extra_stuff, extra_configs)">\
diff --git a/tools/clang/blink_gc_plugin/RecordInfo.h b/tools/clang/blink_gc_plugin/RecordInfo.h
index de44d86..20ef058 100644
--- a/tools/clang/blink_gc_plugin/RecordInfo.h
+++ b/tools/clang/blink_gc_plugin/RecordInfo.h
@@ -40,7 +40,7 @@
             RecordInfo* info,
             const TracingStatus& status)
       : spec_(spec), info_(info), status_(status) {}
-  const TracingStatus NeedsTracing() { return status_; }
+  const TracingStatus NeedsTracing() override { return status_; }
   const clang::CXXBaseSpecifier& spec() { return spec_; }
   RecordInfo* info() { return info_; }
 
@@ -54,7 +54,7 @@
  public:
   FieldPoint(clang::FieldDecl* field, Edge* edge)
       : field_(field), edge_(edge) {}
-  const TracingStatus NeedsTracing() {
+  const TracingStatus NeedsTracing() override {
     return edge_->NeedsTracing(Edge::kRecursive);
   }
   clang::FieldDecl* field() { return field_; }
diff --git a/tools/clang/plugins/FindBadConstructsAction.h b/tools/clang/plugins/FindBadConstructsAction.h
index 383db84..04cfc81 100644
--- a/tools/clang/plugins/FindBadConstructsAction.h
+++ b/tools/clang/plugins/FindBadConstructsAction.h
@@ -16,12 +16,11 @@
   FindBadConstructsAction();
 
  protected:
-  // Overridden from PluginASTAction:
-  virtual std::unique_ptr<clang::ASTConsumer> CreateASTConsumer(
+  std::unique_ptr<clang::ASTConsumer> CreateASTConsumer(
       clang::CompilerInstance& instance,
-      llvm::StringRef ref);
-  virtual bool ParseArgs(const clang::CompilerInstance& instance,
-                         const std::vector<std::string>& args);
+      llvm::StringRef ref) override;
+  bool ParseArgs(const clang::CompilerInstance& instance,
+                 const std::vector<std::string>& args) override;
 
  private:
   Options options_;
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 176f353..d458ef6 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -311,6 +311,8 @@
       'linux-chromium-tests-staging-builder': 'release_bot',
       'linux-code-coverage': 'clang_code_coverage',
       'linux-fieldtrial-rel': 'release_bot_minimal_symbols',
+      'linux-paeverywhere-x64-fyi-dbg': 'debug_bot_paeverywhere_x64',
+      'linux-paeverywhere-x64-fyi-rel': 'release_trybot_paeverywhere_x64',
       'linux-perfetto-rel': 'perfetto_release_bot',
       'linux-upload-perfetto': 'release_bot',
       'linux-wpt-fyi-rel': 'release_bot_minimal_symbols',
@@ -319,6 +321,8 @@
       'linux-wpt-payments-fyi-rel': 'release_bot_minimal_symbols',
       'mac-code-coverage': 'clang_code_coverage',
       'mac-hermetic-upgrade-rel': 'release_bot',
+      'mac-paeverywhere-x64-fyi-dbg': 'debug_bot_paeverywhere_x64',
+      'mac-paeverywhere-x64-fyi-rel': 'release_trybot_paeverywhere_x64',
       'mac-upload-perfetto': 'release_bot',
       'win-annotator-rel': 'release_bot',
       'win-celab-builder-rel': 'release_bot_minimal_symbols',
diff --git a/tools/mb/mb_config_expectations/chromium.fyi.json b/tools/mb/mb_config_expectations/chromium.fyi.json
index 2846b8f2..05b31b01 100644
--- a/tools/mb/mb_config_expectations/chromium.fyi.json
+++ b/tools/mb/mb_config_expectations/chromium.fyi.json
@@ -633,6 +633,27 @@
       "use_ozone": true
     }
   },
+  "linux-paeverywhere-x64-fyi-dbg": {
+    "gn_args": {
+      "is_component_build": true,
+      "is_debug": true,
+      "symbol_level": 1,
+      "target_cpu": "x64",
+      "use_allocator": "partition",
+      "use_goma": true
+    }
+  },
+  "linux-paeverywhere-x64-fyi-rel": {
+    "gn_args": {
+      "dcheck_always_on": true,
+      "is_component_build": false,
+      "is_debug": false,
+      "symbol_level": 1,
+      "target_cpu": "x64",
+      "use_allocator": "partition",
+      "use_goma": true
+    }
+  },
   "linux-perfetto-rel": {
     "gn_args": {
       "is_component_build": false,
@@ -697,6 +718,27 @@
       "use_goma": true
     }
   },
+  "mac-paeverywhere-x64-fyi-dbg": {
+    "gn_args": {
+      "is_component_build": true,
+      "is_debug": true,
+      "symbol_level": 1,
+      "target_cpu": "x64",
+      "use_allocator": "partition",
+      "use_goma": true
+    }
+  },
+  "mac-paeverywhere-x64-fyi-rel": {
+    "gn_args": {
+      "dcheck_always_on": true,
+      "is_component_build": false,
+      "is_debug": false,
+      "symbol_level": 1,
+      "target_cpu": "x64",
+      "use_allocator": "partition",
+      "use_goma": true
+    }
+  },
   "mac-upload-perfetto": {
     "gn_args": {
       "is_component_build": false,
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index f114b64..0ab56f34 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -21899,6 +21899,16 @@
   </description>
 </action>
 
+<action name="Signin_Impression_FromKaleidoscope">
+  <owner>beccahughes@chromium.org</owner>
+  <owner>steimel@chromium.org</owner>
+  <owner>mlamouri@chromium.org</owner>
+  <owner>media-dev@chromium.org</owner>
+  <description>
+    Recorded when showing a sign-in page from Kaleidoscope.
+  </description>
+</action>
+
 <action name="Signin_Impression_FromManageCardsBubble"
     not_user_triggered="true">
   <owner>manasverma@google.com</owner>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index d9dfd4c..c4faee1b 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -42032,6 +42032,7 @@
   <int value="-1766648764" label="OmniboxShortBookmarkSuggestions:disabled"/>
   <int value="-1766162197" label="AppServiceInstanceRegistry:enabled"/>
   <int value="-1766129470" label="DataSaverLiteModeRebranding:disabled"/>
+  <int value="-1763899404" label="LayoutNGTable:enabled"/>
   <int value="-1760624380"
       label="ImprovedCookieControlsForThirdPartyCookieBlocking:enabled"/>
   <int value="-1758468685" label="DownloadHomeV2:disabled"/>
@@ -43199,6 +43200,7 @@
   <int value="-683370370" label="EnableAppDataSearch:enabled"/>
   <int value="-683306022" label="OverscrollHistoryNavigation:enabled"/>
   <int value="-682580680" label="DisableOfficeEditingComponentApp:disabled"/>
+  <int value="-681434111" label="WebFeed:disabled"/>
   <int value="-680787130" label="ExperimentalVRFeatures:disabled"/>
   <int value="-680589442" label="MacRTL:disabled"/>
   <int value="-679500267" label="UseXpsForPrinting:disabled"/>
@@ -44313,6 +44315,7 @@
   <int value="423615350" label="enable-tab-audio-muting"/>
   <int value="423855924" label="enable-tab-switcher-theme-colors"/>
   <int value="425072496" label="GridLayoutForNtpShortcuts:enabled"/>
+  <int value="427184788" label="WebFeed:enabled"/>
   <int value="430776375" label="TextureLayerSkipWaitForActivation:disabled"/>
   <int value="430959979" label="SyncStandaloneTransport:disabled"/>
   <int value="431691805" label="MediaDocumentDownloadButton:enabled"/>
@@ -45070,6 +45073,7 @@
   <int value="1173244409" label="AutofillUseMobileLabelDisambiguation:enabled"/>
   <int value="1174088940" label="enable-wasm"/>
   <int value="1177120582" label="InstallableInkDrop:disabled"/>
+  <int value="1177174300" label="LayoutNGTable:disabled"/>
   <int value="1177628103" label="GaiaActionButtons:disabled"/>
   <int value="1179013979"
       label="OmniboxUIExperimentMaxAutocompleteMatches:enabled"/>
@@ -58076,6 +58080,12 @@
   <int value="1" label="User dismissed notification"/>
 </enum>
 
+<enum name="PhoneHubOptInEntryPoint">
+  <int value="0" label="New user opted in via multidevice setup flow"/>
+  <int value="1" label="User opted in via onboarding promotion"/>
+  <int value="2" label="User opted in via Settings page"/>
+</enum>
+
 <enum name="PhoneHubQuickAction">
   <int value="0" label="Toggle Hotspot On"/>
   <int value="1" label="Toggle Hotspot Off"/>
@@ -60002,6 +60012,7 @@
   <int value="6" label="PreviewPageRendered with no metafile (Deprecated)"/>
   <int value="7" label="Received bad printer settings"/>
   <int value="8" label="Capture metadata failed (Deprecated)"/>
+  <int value="9" label="Got empty printer settings"/>
 </enum>
 
 <enum name="PrintPreviewFontTypeType">
@@ -67490,6 +67501,7 @@
   <int value="30" label="Re-signin after an account rename"/>
   <int value="31" label="Sign-in promo in the web sign-in flow"/>
   <int value="32" label="Safety check settings page"/>
+  <int value="33" label="Kaleidoscope"/>
 </enum>
 
 <enum name="SigninAccountEquality">
diff --git a/tools/metrics/histograms/histograms_xml/browser/histograms.xml b/tools/metrics/histograms/histograms_xml/browser/histograms.xml
index aef341e..47f111a4 100644
--- a/tools/metrics/histograms/histograms_xml/browser/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/browser/histograms.xml
@@ -467,8 +467,8 @@
 
 <histogram name="BrowserRenderProcessHost.BackgroundTime" units="ms"
     expires_after="2021-04-04">
-  <owner>ericrobinson@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
+  <owner>chrome-ads-histograms@google.com</owner>
   <summary>
     Record the time spent in the background after RenderProcessHost
     initialization of the process. Recorded when the RenderProcessHost for the
@@ -540,8 +540,8 @@
 
 <histogram name="BrowserRenderProcessHost.FramePrioritiesSeen"
     enum="FramePrioritiesSeen" expires_after="2021-04-11">
-  <owner>ericrobinson@chromium.org</owner>
   <owner>csharrison@chromium.org</owner>
+  <owner>chrome-ads-histograms@google.com</owner>
   <summary>
     Determines what combination of low and normal priority frames were attached
     to a render process during its lifetime. Recorded when the host for the
@@ -573,8 +573,8 @@
 
 <histogram name="BrowserRenderProcessHost.TotalTime" units="ms"
     expires_after="2021-02-21">
-  <owner>ericrobinson@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
+  <owner>chrome-ads-histograms@google.com</owner>
   <summary>
     Record the lifetime of the RenderProcessHost after initialization of the
     process. Recorded when the RenderProcessHost for the process is destroyed.
diff --git a/tools/metrics/histograms/histograms_xml/network/histograms.xml b/tools/metrics/histograms/histograms_xml/network/histograms.xml
index a0134d88..4ea30e0 100644
--- a/tools/metrics/histograms/histograms_xml/network/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/network/histograms.xml
@@ -2101,6 +2101,21 @@
   </summary>
 </histogram>
 
+<histogram name="NetworkService.CorsForcedOffForIsolatedWorldOrigin"
+    enum="BooleanForceDisabled" expires_after="M92">
+  <owner>lukasza@chromium.org</owner>
+  <owner>rdevlin.cronin@chromium.org</owner>
+  <summary>
+    Whether CORS was turned off based on the origin of an isolated world (e.g.
+    for a content script of a platform app).
+
+    Logged in CorsURLLoader::HandleComplete for all successful requests.
+
+    The logged value depends on whether CorsURLLoader::SetCorsFlagIfNeeded had
+    been affected by network::ResourceRequest::isolated_world_origin.
+  </summary>
+</histogram>
+
 <histogram name="NetworkService.CrossOriginResourcePolicy.ReportOnlyResult"
     enum="NetworkServiceCorpResult" expires_after="2020-09-30">
   <owner>mkwst@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms_xml/others/histograms.xml b/tools/metrics/histograms/histograms_xml/others/histograms.xml
index 643c941..530d85e0 100644
--- a/tools/metrics/histograms/histograms_xml/others/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/others/histograms.xml
@@ -2848,7 +2848,7 @@
 </histogram>
 
 <histogram name="ContextMenu.DelayedElementDetails"
-    enum="ContextMenuDelayedElementDetails" expires_after="2020-12-11">
+    enum="ContextMenuDelayedElementDetails" expires_after="2021-05-23">
   <owner>michaeldo@chromium.org</owner>
   <owner>src/ios/web/web_state/ui/OWNERS</owner>
   <summary>
@@ -3044,7 +3044,7 @@
 </histogram>
 
 <histogram name="ContextMenu.WaitingForElementDetails" enum="BooleanHit"
-    expires_after="2020-12-11">
+    expires_after="2021-05-23">
   <owner>michaeldo@chromium.org</owner>
   <owner>src/ios/web/web_state/ui/OWNERS</owner>
   <summary>
@@ -6542,8 +6542,8 @@
 </histogram>
 
 <histogram name="HttpCache.HardReset" enum="Boolean" expires_after="2021-06-15">
-  <owner>ericrobinson@chromium.org</owner>
   <owner>shivanisha@chromium.org</owner>
+  <owner>jkarlin@chromium.org</owner>
   <summary>
     Whether the HttpCache was forced to reset upon creation, effectively
     clearing out its previous content. This is recorded when the cache is
@@ -16984,6 +16984,17 @@
   </summary>
 </histogram>
 
+<histogram name="WebApp.Preinstalled.UninstallAndReplaceCount" units="apps"
+    expires_after="2021-04-01">
+  <owner>alancutter@chromium.org</owner>
+  <owner>desktop-pwas-team@google.com</owner>
+  <summary>
+    Records how many preinstalled web app installations uninstalled and replaced
+    an old default app (web app or Chrome app). This corresponds to the
+    &quot;uninstall_and_replace&quot; field in preinstalled web app configs.
+  </summary>
+</histogram>
+
 <histogram name="WebApp.Shortcuts.Creation.Result"
     enum="ShortcutsCreationResult" expires_after="M93">
   <owner>phillis@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms_xml/page/histograms.xml b/tools/metrics/histograms/histograms_xml/page/histograms.xml
index 884eb83..5af2de1 100644
--- a/tools/metrics/histograms/histograms_xml/page/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/page/histograms.xml
@@ -679,10 +679,9 @@
   </summary>
 </histogram>
 
-<histogram base="true" name="PageLoad.Cpu" units="units"
-    expires_after="2022-01-05">
-  <owner>ericrobinson@chromium.org</owner>
-  <owner>csharrison@chromium.org</owner>
+<histogram base="true" name="PageLoad.Cpu" units="units" expires_after="M92">
+  <owner>johnidel@chromium.org</owner>
+  <owner>chrome-ads-histograms@google.com</owner>
   <summary>
     Only recorded if the page has at least one identified ad frame. Recorded in
     PageLoadMetrics when the page is destroyed. Cpu measures the wall time of
@@ -1267,8 +1266,9 @@
 </histogram>
 
 <histogram name="PageLoad.FrameCounts.AdFrames.PerFrame.OriginStatus"
-    enum="CrossOriginAdStatus" expires_after="M88">
-  <owner>ericrobinson@chromium.org</owner>
+    enum="CrossOriginAdStatus" expires_after="M92">
+  <owner>johnidel@chromium.org</owner>
+  <owner>chrome-ads-histograms@google.com</owner>
   <summary>
     For each identified ad frame, whether the origin of the ad matches the
     origin of the main frame, differs from the origin of the main frame, or is
diff --git a/tools/metrics/histograms/histograms_xml/phonehub/histograms.xml b/tools/metrics/histograms/histograms_xml/phonehub/histograms.xml
index ada49f1..bc4b438a 100644
--- a/tools/metrics/histograms/histograms_xml/phonehub/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/phonehub/histograms.xml
@@ -39,6 +39,16 @@
   <summary>The steady state feature status of PhoneHub on user login.</summary>
 </histogram>
 
+<histogram name="PhoneHub.Connection.Result" enum="BooleanSuccess"
+    expires_after="2021-11-30">
+  <owner>khorimoto@chromium.org</owner>
+  <owner>better-together-dev@google.com</owner>
+  <summary>
+    Measures PhoneHub connection success rate, considering attempts where the
+    phone is not nearby as failures.
+  </summary>
+</histogram>
+
 <histogram name="PhoneHub.Connectivity.Duration" units="ms" expires_after="M98">
   <owner>khorimoto@chromium.org</owner>
   <owner>better-together-dev@google.com</owner>
@@ -59,6 +69,9 @@
 
 <histogram name="PhoneHub.Connectivity.Success" enum="BooleanSuccess"
     expires_after="M98">
+  <obsolete>
+    Renamed to PhoneHub.Connection.Result on 11/2020 in M89.
+  </obsolete>
   <owner>khorimoto@chromium.org</owner>
   <owner>better-together-dev@google.com</owner>
   <summary>The success rate of connecting to the Phone.</summary>
@@ -109,6 +122,13 @@
   <summary>Events for the given notification opt-in prompt.</summary>
 </histogram>
 
+<histogram name="PhoneHub.OptInEntryPoint" enum="PhoneHubOptInEntryPoint"
+    expires_after="2021-11-25">
+  <owner>meilinw@chromium.org</owner>
+  <owner>khorimoto@chromium.org</owner>
+  <summary>Tracks the UI surface with which users enable Phone Hub.</summary>
+</histogram>
+
 <histogram name="PhoneHub.QuickActionClicked" enum="PhoneHubQuickAction"
     expires_after="2021-10-31">
   <owner>tengs@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms_xml/safe_browsing/histograms.xml b/tools/metrics/histograms/histograms_xml/safe_browsing/histograms.xml
index deab08b..b3c4dd92 100644
--- a/tools/metrics/histograms/histograms_xml/safe_browsing/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/safe_browsing/histograms.xml
@@ -591,7 +591,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.DelayedWarnings.Event"
-    enum="SafeBrowsingDelayedWarningEvent" expires_after="M89">
+    enum="SafeBrowsingDelayedWarningEvent" expires_after="M91">
   <owner>meacer@chromium.org</owner>
   <owner>chrome-safebrowsing-alerts@google.com</owner>
   <summary>
@@ -604,7 +604,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.DelayedWarnings.Event_UrlElisionDisabled"
-    enum="SafeBrowsingDelayedWarningEvent" expires_after="M89">
+    enum="SafeBrowsingDelayedWarningEvent" expires_after="M91">
   <owner>meacer@chromium.org</owner>
   <owner>chrome-safebrowsing-alerts@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/histograms_xml/stability/histograms.xml b/tools/metrics/histograms/histograms_xml/stability/histograms.xml
index ec42af7..e58012b 100644
--- a/tools/metrics/histograms/histograms_xml/stability/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/stability/histograms.xml
@@ -474,7 +474,7 @@
 </histogram>
 
 <histogram name="Stability.iOS.UTE.OSVersion" enum="VersionComparison"
-    expires_after="2020-12-01">
+    expires_after="2021-05-01">
   <owner>michaeldo@chromium.org</owner>
   <owner>olivierrobin@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/histograms_xml/subresource/histograms.xml b/tools/metrics/histograms/histograms_xml/subresource/histograms.xml
index c9fc6e1..958d987 100644
--- a/tools/metrics/histograms/histograms_xml/subresource/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/subresource/histograms.xml
@@ -23,8 +23,7 @@
 
 <histogram name="SubresourceFilter.Actions2" enum="SubresourceFilterActions2"
     expires_after="2021-04-18">
-  <owner>ericrobinson@google.com</owner>
-  <owner>jkarlin@chromium.org</owner>
+  <owner>alexmt@chromium.org</owner>
   <owner>chrome-ads-histograms@google.com</owner>
   <summary>
     Counts of various UI and user action events related to the
@@ -84,7 +83,7 @@
 
 <histogram name="SubresourceFilter.DocumentLoad.SubframeFilteringDelay.Allowed"
     units="microseconds" expires_after="M92">
-  <owner>ericrobinson@google.com</owner>
+  <owner>alexmt@chromium.org</owner>
   <owner>chrome-ads-histograms@google.com</owner>
   <summary>
     Records the total time a subframe navigation was delayed while calculating
@@ -99,7 +98,7 @@
 <histogram
     name="SubresourceFilter.DocumentLoad.SubframeFilteringDelay.Disallowed2"
     units="microseconds" expires_after="M92">
-  <owner>ericrobinson@google.com</owner>
+  <owner>alexmt@chromium.org</owner>
   <owner>chrome-ads-histograms@google.com</owner>
   <summary>
     Records the total time a subframe navigation was delayed while calculating
@@ -114,7 +113,7 @@
 <histogram
     name="SubresourceFilter.DocumentLoad.SubframeFilteringDelay.WouldDisallow"
     units="microseconds" expires_after="M92">
-  <owner>ericrobinson@google.com</owner>
+  <owner>alexmt@chromium.org</owner>
   <owner>chrome-ads-histograms@google.com</owner>
   <summary>
     Records the total time a subframe navigation was delayed while calculating
@@ -152,7 +151,7 @@
 
 <histogram name="SubresourceFilter.IndexRuleset.Verify.Status"
     enum="SubresourceFilterVerifyStatus" expires_after="2021-04-04">
-  <owner>ericrobinson@chromium.org</owner>
+  <owner>alexmt@chromium.org</owner>
   <owner>chrome-ads-histograms@google.com</owner>
   <summary>
     The result of the IndexRulesetMatcher Verify method. Either pass if both the
@@ -166,7 +165,7 @@
 
 <histogram name="SubresourceFilter.IndexRuleset.Verify2.WallDuration"
     units="ms" expires_after="M92">
-  <owner>ericrobinson@google.com</owner>
+  <owner>alexmt@chromium.org</owner>
   <owner>chrome-ads-histograms@google.com</owner>
   <summary>
     The total time it took to verify the indexed ruleset in the browser process.
@@ -262,7 +261,7 @@
 
 <histogram name="SubresourceFilter.PageLoad.ActivationList"
     enum="ActivationList" expires_after="2021-05-09">
-  <owner>ericrobinson@google.com</owner>
+  <owner>alexmt@chromium.org</owner>
   <owner>chrome-ads-histograms@google.com</owner>
   <summary>
     The ActivationList or NONE that the main frame navigation matched with.
@@ -272,7 +271,7 @@
 
 <histogram name="SubresourceFilter.PageLoad.ActivationState"
     enum="SubresourceFilterActivationState" expires_after="2021-05-09">
-  <owner>ericrobinson@google.com</owner>
+  <owner>alexmt@chromium.org</owner>
   <owner>chrome-ads-histograms@google.com</owner>
   <summary>
     Whenever a document load is committed in a main frame, records whether
@@ -352,7 +351,7 @@
 
 <histogram name="SubresourceFilter.PageLoad.SafeBrowsingDelay" units="ms"
     expires_after="M92">
-  <owner>ericrobinson@google.com</owner>
+  <owner>alexmt@chromium.org</owner>
   <owner>chrome-ads-histograms@google.com</owner>
   <summary>
     The navigation delay imposed by the subresource filter on a given navigation
@@ -420,7 +419,7 @@
 
 <histogram name="SubresourceFilter.SafeBrowsing.TotalCheckTime" units="ms"
     expires_after="M92">
-  <owner>ericrobinson@chromium.org</owner>
+  <owner>alexmt@chromium.org</owner>
   <owner>chrome-ads-histograms@google.com</owner>
   <summary>
     The time an individual Safe Browsing URL check took before finishing,
@@ -476,8 +475,8 @@
 </histogram>
 
 <histogram name="SubresourceFilter.WriteRuleset.Result"
-    enum="SubresourceFilterWriteRulesetResult" expires_after="M88">
-  <owner>ericrobinson@chromium.org</owner>
+    enum="SubresourceFilterWriteRulesetResult" expires_after="M92">
+  <owner>alexmt@chromium.org</owner>
   <owner>chrome-ads-histograms@google.com</owner>
   <summary>
     Whether indexing a version of the ruleset and writing it to disk succeeded,
diff --git a/tools/perf/benchmark.csv b/tools/perf/benchmark.csv
index c4db62e3..00bae90 100644
--- a/tools/perf/benchmark.csv
+++ b/tools/perf/benchmark.csv
@@ -3,6 +3,7 @@
 Googlers can view additional information about internal perf infrastructure at,https://goto.google.com/chrome-benchmarking-sheet
 Benchmark name,Individual owners,Component,Documentation,Tags
 UNSCHEDULED_blink_perf.service_worker,"shimazu@chromium.org, falken@chromium.org, ting.shao@intel.com",Blink>ServiceWorker,https://bit.ly/blink-perf-benchmarks,
+UNSCHEDULED_speedometer2-pcscan,tmrts@chromium.org,Blink,,
 base_perftests,"skyostil@chromium.org, gab@chromium.org",Internals>SequenceManager,https://chromium.googlesource.com/chromium/src/+/HEAD/base/README.md#performance-testing,
 blink_perf.accessibility,dmazzoni@chromium.org,Blink>Accessibility,https://bit.ly/blink-perf-benchmarks,all
 blink_perf.bindings,"jbroman@chromium.org, yukishiino@chromium.org, haraken@chromium.org",Blink>Bindings,https://bit.ly/blink-perf-benchmarks,all
diff --git a/tools/perf/benchmarks/speedometer2.py b/tools/perf/benchmarks/speedometer2.py
index 64e27ab..ba90c25c2 100644
--- a/tools/perf/benchmarks/speedometer2.py
+++ b/tools/perf/benchmarks/speedometer2.py
@@ -76,3 +76,18 @@
 
   def SetExtraBrowserOptions(self, options):
     options.AppendExtraBrowserArgs('--enable-features=V8VmFuture')
+
+
+@benchmark.Info(emails=['tmrts@chromium.org'], component='Blink')
+class Speedometer2PCScan(Speedometer2):
+  """Speedometer2 benchmark with the PCSscan flag.
+
+  Shows the performance of upcoming PCScan feature.
+  """
+
+  @classmethod
+  def Name(cls):
+    return 'UNSCHEDULED_speedometer2-pcscan'
+
+  def SetExtraBrowserOptions(self, options):
+    options.AppendExtraBrowserArgs('--enable-features=PartitionAllocPCScan')
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index 0529f79c..9b4d62fe 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,12 +5,12 @@
             "remote_path": "perfetto_binaries/trace_processor_shell/win/f37338cdaa2126eef2a11e1a6f0cb075888c20e6/trace_processor_shell.exe"
         },
         "mac": {
-            "hash": "78d036e9d284668b97ab4930ac68ce3f4d6f78e0",
-            "remote_path": "perfetto_binaries/trace_processor_shell/mac/f37338cdaa2126eef2a11e1a6f0cb075888c20e6/trace_processor_shell"
+            "hash": "93f80fdc5944e51cabff3dd7cf60c2b5968898a0",
+            "remote_path": "perfetto_binaries/trace_processor_shell/mac/42433abb9596f1f471251070f7fd7d135c3e9df0/trace_processor_shell"
         },
         "linux": {
-            "hash": "757b4657ed193f4d5dc0c9e3185a86b93a995d9c",
-            "remote_path": "perfetto_binaries/trace_processor_shell/linux/f37338cdaa2126eef2a11e1a6f0cb075888c20e6/trace_processor_shell"
+            "hash": "1d4d4a899be58fbaf9404144b7ccadc523f2bda8",
+            "remote_path": "perfetto_binaries/trace_processor_shell/linux/42433abb9596f1f471251070f7fd7d135c3e9df0/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/tools/perf/core/undocumented_benchmarks.py b/tools/perf/core/undocumented_benchmarks.py
index d108891..8e5d1be9 100644
--- a/tools/perf/core/undocumented_benchmarks.py
+++ b/tools/perf/core/undocumented_benchmarks.py
@@ -1,3 +1,4 @@
+
 # 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.
@@ -22,6 +23,7 @@
     'speedometer-future',
     'speedometer2',
     'speedometer2-future',
+    'UNSCHEDULED_speedometer2-pcscan',
     'startup.mobile',
     'system_health.webview_startup',
     'tab_switching.typical_25',
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config
index 06ef6bbf..2d4cee1bb 100644
--- a/tools/perf/expectations.config
+++ b/tools/perf/expectations.config
@@ -65,7 +65,6 @@
 crbug.com/966613 [ android-pixel-2 ] blink_perf.parser/query-selector-all-class-deep.html [ Skip ]
 crbug.com/966613 [ android-pixel-2 ] blink_perf.parser/query-selector-all-deep.html [ Skip ]
 crbug.com/966613 [ android-pixel-2 ] blink_perf.parser/query-selector-all-id-deep.html [ Skip ]
-crbug.com/1042130 blink_perf.parser/declarative-shadow-dom-cloning.html [ Skip ]
 
 # Benchmark: blink_perf.shadow_dom
 crbug.com/702319 [ android-nexus-5x ] blink_perf.shadow_dom/* [ Skip ]
diff --git a/tools/win/DebugVisualizers/blink.natvis b/tools/win/DebugVisualizers/blink.natvis
index 6fd480d..326ed20 100644
--- a/tools/win/DebugVisualizers/blink.natvis
+++ b/tools/win/DebugVisualizers/blink.natvis
@@ -290,7 +290,11 @@
     <Expand>
       <Item Name="Type">(blink::NGFragmentItem::ItemType)type_</Item>
       <Item Name="TextType" Condition="type_ == 0">(blink::NGTextType)sub_type_</Item>
+      <Item Name="Text" Condition="type_ == 0">text_</Item>
+      <Item Name="GeneratedText" Condition="type_ == 1">generated_text_</Item>
       <Item Name="LineBoxType" Condition="type_ == 2">(NGPhysicalLineBoxFragment::NGLineBoxType)sub_type_</Item>
+      <Item Name="Line" Condition="type_ == 2">line_</Item>
+      <Item Name="Box" Condition="type_ == 3">box_</Item>
       <Item Name="layout_object_">layout_object_</Item>
       <Item Name="rect_">rect_</Item>
       <Item Name="ink_overflow_type_">(NGInkOverflow::Type)ink_overflow_type_</Item>
diff --git a/ui/accessibility/platform/ax_platform_node_auralinux.cc b/ui/accessibility/platform/ax_platform_node_auralinux.cc
index 540a135..f02b7e5 100644
--- a/ui/accessibility/platform/ax_platform_node_auralinux.cc
+++ b/ui/accessibility/platform/ax_platform_node_auralinux.cc
@@ -2782,6 +2782,7 @@
     case ax::mojom::Role::kGenericContainer:
     case ax::mojom::Role::kFooterAsNonLandmark:
     case ax::mojom::Role::kHeaderAsNonLandmark:
+    case ax::mojom::Role::kRuby:
       return ATK_ROLE_SECTION;
     case ax::mojom::Role::kGraphicsDocument:
       return ATK_ROLE_DOCUMENT_FRAME;
@@ -2912,12 +2913,15 @@
       return ATK_ROLE_PANEL;
     case ax::mojom::Role::kRowHeader:
       return ATK_ROLE_ROW_HEADER;
-    case ax::mojom::Role::kRuby:
-      return kStaticRole;
     case ax::mojom::Role::kRubyAnnotation:
-      // TODO(accessibility) Panels are generally for containers of widgets.
-      // This should probably be a section (if a container) or static if text.
-      return ATK_ROLE_PANEL;
+      // Generally exposed as description on <ruby> (Role::kRuby) element, not
+      // as its own object in the tree.
+      // However, it's possible to make a kRubyAnnotation element show up in the
+      // AX tree, for example by adding tabindex="0" to the source <rp> or <rt>
+      // element or making the source element the target of an aria-owns.
+      // Therefore, browser side needs to gracefully handle it if it actually
+      // shows up in the tree.
+      return kStaticRole;
     case ax::mojom::Role::kSection: {
       if (GetName().empty()) {
         // Do not use ARIA mapping for nameless <section>.
diff --git a/ui/accessibility/platform/ax_platform_node_mac.mm b/ui/accessibility/platform/ax_platform_node_mac.mm
index 33e621a..db38795 100644
--- a/ui/accessibility/platform/ax_platform_node_mac.mm
+++ b/ui/accessibility/platform/ax_platform_node_mac.mm
@@ -36,6 +36,8 @@
 };
 
 RoleMap BuildRoleMap() {
+  // TODO(accessibility) Are any missing? Consider switch statement so that
+  // compiler doesn't allow missing roles;
   const RoleMap::value_type roles[] = {
       {ax::mojom::Role::kAbbr, NSAccessibilityGroupRole},
       {ax::mojom::Role::kAlert, NSAccessibilityGroupRole},
@@ -186,9 +188,7 @@
       {ax::mojom::Role::kRow, NSAccessibilityRowRole},
       {ax::mojom::Role::kRowGroup, NSAccessibilityGroupRole},
       {ax::mojom::Role::kRowHeader, @"AXCell"},
-      // TODO(accessibility) What should kRuby be? It's not listed? Any others
-      // missing? Maybe use switch statement so that compiler doesn't allow us
-      // to miss any.
+      {ax::mojom::Role::kRuby, NSAccessibilityGroupRole},
       {ax::mojom::Role::kRubyAnnotation, NSAccessibilityUnknownRole},
       {ax::mojom::Role::kScrollBar, NSAccessibilityScrollBarRole},
       {ax::mojom::Role::kSearch, NSAccessibilityGroupRole},
diff --git a/ui/accessibility/platform/ax_platform_node_win.cc b/ui/accessibility/platform/ax_platform_node_win.cc
index e8f8cda..7131fd4 100644
--- a/ui/accessibility/platform/ax_platform_node_win.cc
+++ b/ui/accessibility/platform/ax_platform_node_win.cc
@@ -5396,7 +5396,17 @@
       return ROLE_SYSTEM_ROWHEADER;
 
     case ax::mojom::Role::kRuby:
-      return ROLE_SYSTEM_TEXT;
+      return ROLE_SYSTEM_GROUPING;
+
+    case ax::mojom::Role::kRubyAnnotation:
+      // Generally exposed as description on <ruby> (Role::kRuby) element, not
+      // as its own object in the tree.
+      // However, it's possible to make a kRubyAnnotation element show up in the
+      // AX tree, for example by adding tabindex="0" to the source <rp> or <rt>
+      // element or making the source element the target of an aria-owns.
+      // Therefore, browser side needs to gracefully handle it if it actually
+      // shows up in the tree.
+      return ROLE_SYSTEM_STATICTEXT;
 
     case ax::mojom::Role::kSection: {
       if (GetNameAsString16().empty()) {
@@ -5425,7 +5435,6 @@
     case ax::mojom::Role::kSwitch:
       return ROLE_SYSTEM_CHECKBUTTON;
 
-    case ax::mojom::Role::kRubyAnnotation:
     case ax::mojom::Role::kStaticText:
       return ROLE_SYSTEM_STATICTEXT;
 
@@ -5798,7 +5807,7 @@
       ia2_role = IA2_ROLE_LANDMARK;
       break;
     case ax::mojom::Role::kRuby:
-      ia2_role = IA2_ROLE_TEXT_FRAME;
+      ia2_role = IA2_ROLE_SECTION;
       break;
     case ax::mojom::Role::kSearch:
       ia2_role = IA2_ROLE_LANDMARK;
@@ -6227,7 +6236,17 @@
       return L"rowheader";
 
     case ax::mojom::Role::kRuby:
-      return L"region";
+      return L"group";
+
+    case ax::mojom::Role::kRubyAnnotation:
+      // Generally exposed as description on <ruby> (Role::kRuby) element, not
+      // as its own object in the tree.
+      // However, it's possible to make a kRubyAnnotation element show up in the
+      // AX tree, for example by adding tabindex="0" to the source <rp> or <rt>
+      // element or making the source element the target of an aria-owns.
+      // Therefore, browser side needs to gracefully handle it if it actually
+      // shows up in the tree.
+      return L"description";
 
     case ax::mojom::Role::kSection: {
       if (GetNameAsString16().empty()) {
@@ -6259,7 +6278,6 @@
     case ax::mojom::Role::kSwitch:
       return L"switch";
 
-    case ax::mojom::Role::kRubyAnnotation:
     case ax::mojom::Role::kStaticText:
       return L"description";
 
@@ -6889,7 +6907,17 @@
       return UIA_DataItemControlTypeId;
 
     case ax::mojom::Role::kRuby:
-      return UIA_PaneControlTypeId;
+      return UIA_GroupControlTypeId;
+
+    case ax::mojom::Role::kRubyAnnotation:
+      // Generally exposed as description on <ruby> (Role::kRuby) element, not
+      // as its own object in the tree.
+      // However, it's possible to make a kRubyAnnotation element show up in the
+      // AX tree, for example by adding tabindex="0" to the source <rp> or <rt>
+      // element or making the source element the target of an aria-owns.
+      // Therefore, browser side needs to gracefully handle it if it actually
+      // shows up in the tree.
+      return UIA_TextControlTypeId;
 
     case ax::mojom::Role::kSection:
       return UIA_GroupControlTypeId;
@@ -6912,7 +6940,6 @@
     case ax::mojom::Role::kSwitch:
       return UIA_ButtonControlTypeId;
 
-    case ax::mojom::Role::kRubyAnnotation:
     case ax::mojom::Role::kStaticText:
       return UIA_TextControlTypeId;
 
diff --git a/ui/base/ime/chromeos/component_extension_ime_manager.cc b/ui/base/ime/chromeos/component_extension_ime_manager.cc
index 4c6132b..9f7a9f7 100644
--- a/ui/base/ime/chromeos/component_extension_ime_manager.cc
+++ b/ui/base/ime/chromeos/component_extension_ime_manager.cc
@@ -55,18 +55,15 @@
 
 ComponentExtensionIME::~ComponentExtensionIME() = default;
 
-ComponentExtensionIMEManager::ComponentExtensionIMEManager() {
+ComponentExtensionIMEManager::ComponentExtensionIMEManager(
+    std::unique_ptr<ComponentExtensionIMEManagerDelegate> delegate)
+    : delegate_(std::move(delegate)) {
   for (const auto& input_method : input_method::kInputMethods) {
     if (input_method.is_login_keyboard)
       login_layout_set_.insert(input_method.xkb_layout_id);
   }
-}
 
-ComponentExtensionIMEManager::~ComponentExtensionIMEManager() = default;
-
-void ComponentExtensionIMEManager::Initialize(
-    std::unique_ptr<ComponentExtensionIMEManagerDelegate> delegate) {
-  delegate_ = std::move(delegate);
+  // Creates internal mapping between input method id and engine components.
   std::vector<ComponentExtensionIME> ext_list = delegate_->ListIME();
   for (const auto& ext : ext_list) {
     bool extension_exists = IsAllowlistedExtension(ext.id);
@@ -82,6 +79,8 @@
   }
 }
 
+ComponentExtensionIMEManager::~ComponentExtensionIMEManager() = default;
+
 bool ComponentExtensionIMEManager::LoadComponentExtensionIME(
     Profile* profile,
     const std::string& input_method_id) {
diff --git a/ui/base/ime/chromeos/component_extension_ime_manager.h b/ui/base/ime/chromeos/component_extension_ime_manager.h
index 268e4222..b21391d9 100644
--- a/ui/base/ime/chromeos/component_extension_ime_manager.h
+++ b/ui/base/ime/chromeos/component_extension_ime_manager.h
@@ -51,14 +51,9 @@
 // This class manages component extension input method.
 class COMPONENT_EXPORT(UI_BASE_IME_CHROMEOS) ComponentExtensionIMEManager {
  public:
-  ComponentExtensionIMEManager();
-  virtual ~ComponentExtensionIMEManager();
-
-  // Initializes component extension manager. This function create internal
-  // mapping between input method id and engine components. This function must
-  // be called before using any other function.
-  void Initialize(
+  ComponentExtensionIMEManager(
       std::unique_ptr<ComponentExtensionIMEManagerDelegate> delegate);
+  virtual ~ComponentExtensionIMEManager();
 
   // Loads |input_method_id| component extension IME. This function returns true
   // on success. This function is safe to call multiple times. Returns false if
@@ -92,11 +87,11 @@
   std::unique_ptr<ComponentExtensionIMEManagerDelegate> delegate_;
 
   // The map of extension_id to ComponentExtensionIME instance.
-  // It's filled by Initialize() method and never changed during runtime.
+  // It's filled by ctor and never changed during runtime.
   std::map<std::string, ComponentExtensionIME> component_extension_imes_;
 
   // For quick check the validity of a given input method id.
-  // It's filled by Initialize() method and never changed during runtime.
+  // It's filled by ctor and never changed during runtime.
   std::set<std::string> input_method_id_set_;
 
   std::set<std::string> login_layout_set_;
diff --git a/ui/chromeos/ui_chromeos_strings.grd b/ui/chromeos/ui_chromeos_strings.grd
index 5c7ec78..01a02ce 100644
--- a/ui/chromeos/ui_chromeos_strings.grd
+++ b/ui/chromeos/ui_chromeos_strings.grd
@@ -724,269 +724,269 @@
         Kazakh
       </message>
 
-      <message name="IDS_IME_NAME_KEYBOARD_ARMENIAN_PHONETIC" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_ARMENIAN_PHONETIC" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Armenian
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_BELARUSIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_BELARUSIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Belarusian
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_BELGIAN_DUTCH" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_BELGIAN_DUTCH" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Dutch (Belgium)
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_BELGIAN_FRENCH" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_BELGIAN_FRENCH" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         French (Belgium)
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_BELGIAN_GERMAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_BELGIAN_GERMAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         German (Belgium)
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_BRAZILIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_BRAZILIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Portuguese (Brazil)
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_BULGARIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_BULGARIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Bulgarian
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_BULGARIAN_PHONETIC" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_BULGARIAN_PHONETIC" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Bulgarian with Phonetic keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_CANADIAN_ENGLISH" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_CANADIAN_ENGLISH" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         English (Canada)
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_CANADIAN_FRENCH" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_CANADIAN_FRENCH" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         French (Canada)
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_CANADIAN_MULTILINGUAL" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_CANADIAN_MULTILINGUAL" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         French (Canada) with Multilingual keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_CATALAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_CATALAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Catalan
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_CROATIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_CROATIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Croatian
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_CZECH" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_CZECH" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Czech
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_CZECH_QWERTY" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_CZECH_QWERTY" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Czech with Qwerty keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_DANISH" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_DANISH" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Danish
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_ESTONIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_ESTONIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Estonian
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_FAROESE" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_FAROESE" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Faroese
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_FILIPINO" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_FILIPINO" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Filipino
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_FINNISH" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_FINNISH" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Finnish
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_FRENCH_BEPO" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_FRENCH_BEPO" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         French (France) with Bépo keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_FRENCH" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_FRENCH" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         French (France)
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_GEORGIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_GEORGIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Georgian
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_GERMAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_GERMAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         German (Germany)
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_GERMAN_NEO_2" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_GERMAN_NEO_2" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         German (Germany) with Neo 2 keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_GREEK" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_GREEK" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Greek
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_HEBREW" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_HEBREW" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Hebrew
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_HUNGARIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_HUNGARIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Hungarian
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_HUNGARIAN_QWERTY" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_HUNGARIAN_QWERTY" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Hungarian with Qwerty keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_ICELANDIC" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_ICELANDIC" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Icelandic
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_INDONESIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_INDONESIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Indonesian
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_IRISH" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_IRISH" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Irish
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_ITALIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_ITALIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Italian
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_JAPANESE" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|. Native name in Japanese is '英数入力(日本語キーボード用)'. This refers to the keyboard with Japanese JIS layout that types Latin alphanumeric and symbol characters." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_JAPANESE" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|. Native name in Japanese is '英数入力(日本語キーボード用)'. This refers to the keyboard with Japanese JIS layout that types Latin alphanumeric and symbol characters." meaning="Input method name">
         Alphanumeric with Japanese keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_KAZAKH" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_KAZAKH" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Kazakh
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_LATIN_AMERICAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_LATIN_AMERICAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Spanish (Latin America)
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_LATVIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_LATVIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Latvian
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_LITHUANIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_LITHUANIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Lithuanian
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_MACEDONIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_MACEDONIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Macedonian
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_MALAY" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_MALAY" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Malay
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_MALTESE" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_MALTESE" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Maltese
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_MONGOLIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_MONGOLIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Mongolian
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_NETHERLANDS_US_INTERNATIONAL_PC" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_NETHERLANDS_US_INTERNATIONAL_PC" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Dutch (Netherlands) with US International PC keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_NETHERLANDS" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_NETHERLANDS" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Dutch (Netherlands)
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_NORWEGIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_NORWEGIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Norwegian
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_POLISH" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_POLISH" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Polish
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_PORTUGUESE" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_PORTUGUESE" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Portuguese (Portugal)
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_PORTUGUESE_US_INTERNATIONAL" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_PORTUGUESE_US_INTERNATIONAL" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Portuguese with US International keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_PORTUGUESE_US_INTERNATIONAL_PC" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_PORTUGUESE_US_INTERNATIONAL_PC" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Portuguese with US International PC keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_ROMANIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_ROMANIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Romanian
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_ROMANIAN_STANDARD" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_ROMANIAN_STANDARD" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Romanian with Standard keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_RUSSIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_RUSSIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Russian
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_RUSSIAN_PHONETIC" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_RUSSIAN_PHONETIC" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Russian with Phonetic keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_RUSSIAN_PHONETIC_AATSEEL" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_RUSSIAN_PHONETIC_AATSEEL" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Russian with Phonetic AATSEEL keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_RUSSIAN_PHONETIC_YAZHERT" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_RUSSIAN_PHONETIC_YAZHERT" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Russian with Phonetic YaZHert keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_SERBIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_SERBIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Serbian
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_SLOVAK" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_SLOVAK" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Slovak
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_SLOVENIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_SLOVENIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Slovenian
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_SPANISH" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_SPANISH" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Spanish (Spain)
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_SWEDISH" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_SWEDISH" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Swedish
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_SWISS_FRENCH" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_SWISS_FRENCH" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         French (Switzerland)
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_SWISS" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_SWISS" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         German (Switzerland)
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_TURKISH" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_TURKISH" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Turkish
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_TURKISH_F" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_TURKISH_F" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Turkish with F-keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_UK_DVORAK" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_UK_DVORAK" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         English (UK) with Dvorak keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_UK" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_UK" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         English (UK)
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_UKRAINIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_UKRAINIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Ukrainian
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_US_COLEMAK" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_US_COLEMAK" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         English (US) with Colemak keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_US_DVORAK" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_US_DVORAK" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         English (US) with Dvorak keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_US_DVP" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_US_DVP" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         English (US) with Programmer Dvorak keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_US_EXTENDED" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_US_EXTENDED" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         English (US) with Extended keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_US_INTERNATIONAL" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_US_INTERNATIONAL" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         English (US) with International keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_US_INTERNATIONAL_PC" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_US_INTERNATIONAL_PC" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         English (US) with International PC keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_US_WORKMAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_US_WORKMAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         English (US) with Workman keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_US_WORKMAN_INTERNATIONAL" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_US_WORKMAN_INTERNATIONAL" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         English (US) with Workman International keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_US" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_US" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         English (US)
       </message>
 
-      <message name="IDS_IME_NAME_INPUTMETHOD_ARRAY" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|. This is Array (\u884c\u5217) input method for Traditional Chinese." meaning="Input method name">
+      <message name="IDS_IME_NAME_INPUTMETHOD_ARRAY" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|. This is Array (\u884c\u5217) input method for Traditional Chinese." meaning="Input method name">
         Chinese Array
       </message>
-      <message name="IDS_IME_NAME_INPUTMETHOD_CANGJIE" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|. This is Cangjie input method for Tradition Chinese." meaning="Input method name">
+      <message name="IDS_IME_NAME_INPUTMETHOD_CANGJIE" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|. This is Cangjie input method for Tradition Chinese." meaning="Input method name">
         Chinese Cangjie
       </message>
-      <message name="IDS_IME_NAME_INPUTMETHOD_DAYI" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|. This is Dayi (\u5927\u6613) input method for Traditional Chinese." meaning="Input method name">
+      <message name="IDS_IME_NAME_INPUTMETHOD_DAYI" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|. This is Dayi (\u5927\u6613) input method for Traditional Chinese." meaning="Input method name">
         Chinese Dayi
       </message>
-      <message name="IDS_IME_NAME_INPUTMETHOD_MOZC_JP" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|. This is Google Japanese input method on Japanese JIS keyboard layout. Native name in Japanese is '日本語入力(日本語キーボード用)'." meaning="Input method name">
+      <message name="IDS_IME_NAME_INPUTMETHOD_MOZC_JP" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|. This is Google Japanese input method on Japanese JIS keyboard layout. Native name in Japanese is '日本語入力(日本語キーボード用)'." meaning="Input method name">
         Japanese
       </message>
-      <message name="IDS_IME_NAME_INPUTMETHOD_MOZC_US" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|. This is Google Japanese input method on US ANSI keyboard layout. Native name in Japanese is '日本語入力(USキーボード用)'" meaning="Input method name">
+      <message name="IDS_IME_NAME_INPUTMETHOD_MOZC_US" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|. This is Google Japanese input method on US ANSI keyboard layout. Native name in Japanese is '日本語入力(USキーボード用)'" meaning="Input method name">
         Japanese with US keyboard
       </message>
-      <message name="IDS_IME_NAME_INPUTMETHOD_PINYIN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|. This is Pinyin input method for Simplified Chinese." meaning="Input method name">
+      <message name="IDS_IME_NAME_INPUTMETHOD_PINYIN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|. This is Pinyin input method for Simplified Chinese." meaning="Input method name">
         Chinese Pinyin
       </message>
-      <message name="IDS_IME_NAME_INPUTMETHOD_QUICK" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|. This is Quick input method for Traditional Chinese." meaning="Input method name">
+      <message name="IDS_IME_NAME_INPUTMETHOD_QUICK" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|. This is Quick input method for Traditional Chinese." meaning="Input method name">
         Chinese Quick
       </message>
-      <message name="IDS_IME_NAME_INPUTMETHOD_TRADITIONAL_PINYIN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|. This is Pinyin input method for Traditional Chinese." meaning="Input method name">
+      <message name="IDS_IME_NAME_INPUTMETHOD_TRADITIONAL_PINYIN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|. This is Pinyin input method for Traditional Chinese." meaning="Input method name">
         Chinese (Traditional) Pinyin
       </message>
-      <message name="IDS_IME_NAME_INPUTMETHOD_WUBI" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|. This is Wubi input method for Simplified Chinese." meaning="Input method name">
+      <message name="IDS_IME_NAME_INPUTMETHOD_WUBI" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|. This is Wubi input method for Simplified Chinese." meaning="Input method name">
         Chinese Wubi
       </message>
-      <message name="IDS_IME_NAME_INPUTMETHOD_ZHUYIN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|. This is Zhuyin input method for Traditional Chinese." meaning="Input method name">
+      <message name="IDS_IME_NAME_INPUTMETHOD_ZHUYIN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|. This is Zhuyin input method for Traditional Chinese." meaning="Input method name">
         Chinese Zhuyin
       </message>
-      <message name="IDS_IME_NAME_INPUTMETHOD_CANTONESE" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|. This is Cantonese input method for Traditional Chinese." meaning="Input method name">
+      <message name="IDS_IME_NAME_INPUTMETHOD_CANTONESE" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|. This is Cantonese input method for Traditional Chinese." meaning="Input method name">
         Cantonese
       </message>
-      <message name="IDS_IME_NAME_INPUTMETHOD_HANGUL" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|. This is Korean Hangul input method." meaning="Input method name">
+      <message name="IDS_IME_NAME_INPUTMETHOD_HANGUL" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|. This is Korean Hangul input method." meaning="Input method name">
         Korean
       </message>
       <message name="IDS_IME_NAME_INPUTMETHOD_HANGUL_2_SET" desc="The input method name shows in system tray menu, this is Korean Hangul input method, 2 Set mode.">
@@ -1008,10 +1008,10 @@
         Hangul Ahnmatae
       </message>
 
-      <message name="IDS_IME_NAME_KEYBOARD_ARABIC" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_ARABIC" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Arabic
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_BENGALI_PHONETIC" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_BENGALI_PHONETIC" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Bangla Phonetic
       </message>
       <message name="IDS_IME_NAME_KEYBOARD_DEVANAGARI_PHONETIC" desc="The input method name shows in system tray menu and settings page.">
@@ -1020,143 +1020,143 @@
       <message name="IDS_IME_NAME_KEYBOARD_ETHIOPIC" desc="The input method name shows in system tray menu and settings page.">
         Ethiopic keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_GUJARATI_PHONETIC" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_GUJARATI_PHONETIC" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Gujarati Phonetic
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_KANNADA_PHONETIC" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_KANNADA_PHONETIC" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Kannada Phonetic
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_KHMER" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_KHMER" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Khmer
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_LAO" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_LAO" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Lao
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_MALAYALAM_PHONETIC" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_MALAYALAM_PHONETIC" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Malayalam Phonetic
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_MYANMAR" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_MYANMAR" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Burmese/Myanmar
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_MYANMAR_MYANSAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_MYANMAR_MYANSAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Burmese/Myanmar with Myansan keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_NEPALI_INSCRIPT" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_NEPALI_INSCRIPT" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Nepali with InScript keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_NEPALI_PHONETIC" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_NEPALI_PHONETIC" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Nepali with Phonetic keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_PERSIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_PERSIAN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Persian
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_SINHALA" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_SINHALA" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Sinhala
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_SORANIKURDISH_AR" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_SORANIKURDISH_AR" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Sorani Kurdish with Arabic-based keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_SORANIKURDISH_EN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_SORANIKURDISH_EN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Sorani Kurdish with English-based keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_TAMIL_INSCRIPT" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_TAMIL_INSCRIPT" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Tamil with InScript keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_TAMIL_ITRANS" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_TAMIL_ITRANS" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Tamil ITRANS
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_TAMIL_PHONETIC" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_TAMIL_PHONETIC" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Tamil Phonetic
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_TAMIL_TAMIL99" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_TAMIL_TAMIL99" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Tamil with Tamil99 keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_TAMIL_TYPEWRITER" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_TAMIL_TYPEWRITER" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Tamil with Typewriter keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_TELUGU_PHONETIC" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_TELUGU_PHONETIC" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Telugu Phonetic
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_THAI_KEDMANEE" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_THAI_KEDMANEE" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Thai with Kedmanee keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_THAI_PATTACHOTE" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_THAI_PATTACHOTE" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Thai with Pattachote keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_THAI_TIS" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_THAI_TIS" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Thai with TIS 820-2531 keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_VIETNAMESE_TCVN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_VIETNAMESE_TCVN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Vietnamese with TCVN keyboard
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_VIETNAMESE_TELEX" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_VIETNAMESE_TELEX" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Vietnamese Telex
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_VIETNAMESE_VIQR" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_VIETNAMESE_VIQR" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Vietnamese VIQR
       </message>
-      <message name="IDS_IME_NAME_KEYBOARD_VIETNAMESE_VNI" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_KEYBOARD_VIETNAMESE_VNI" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Vietnamese VNI
       </message>
 
-      <message name="IDS_IME_NAME_TRANSLITERATION_AM" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_TRANSLITERATION_AM" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Amharic Transliteration
       </message>
-      <message name="IDS_IME_NAME_TRANSLITERATION_AR" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_TRANSLITERATION_AR" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Arabic Transliteration
       </message>
-      <message name="IDS_IME_NAME_TRANSLITERATION_BN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_TRANSLITERATION_BN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Bangla Transliteration
       </message>
-      <message name="IDS_IME_NAME_TRANSLITERATION_EL" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_TRANSLITERATION_EL" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Greek Transliteration
       </message>
-      <message name="IDS_IME_NAME_TRANSLITERATION_FA" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_TRANSLITERATION_FA" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Persian Transliteration
       </message>
-      <message name="IDS_IME_NAME_TRANSLITERATION_GU" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_TRANSLITERATION_GU" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Gujarati Transliteration
       </message>
-      <message name="IDS_IME_NAME_TRANSLITERATION_HE" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_TRANSLITERATION_HE" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Hebrew Transliteration
       </message>
-      <message name="IDS_IME_NAME_TRANSLITERATION_HI" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_TRANSLITERATION_HI" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Hindi
       </message>
-      <message name="IDS_IME_NAME_TRANSLITERATION_KN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_TRANSLITERATION_KN" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Kannada Transliteration
       </message>
-      <message name="IDS_IME_NAME_TRANSLITERATION_ML" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_TRANSLITERATION_ML" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Malayalam Transliteration
       </message>
-      <message name="IDS_IME_NAME_TRANSLITERATION_MR" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_TRANSLITERATION_MR" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Marathi
       </message>
-      <message name="IDS_IME_NAME_TRANSLITERATION_NE" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_TRANSLITERATION_NE" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Nepali Transliteration
       </message>
-      <message name="IDS_IME_NAME_TRANSLITERATION_OR" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_TRANSLITERATION_OR" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Odia
       </message>
-      <message name="IDS_IME_NAME_TRANSLITERATION_PA" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_TRANSLITERATION_PA" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Punjabi
       </message>
-      <message name="IDS_IME_NAME_TRANSLITERATION_SA" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_TRANSLITERATION_SA" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Sanskrit
       </message>
-      <message name="IDS_IME_NAME_TRANSLITERATION_SR" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_TRANSLITERATION_SR" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Serbian Transliteration
       </message>
-      <message name="IDS_IME_NAME_TRANSLITERATION_TA" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_TRANSLITERATION_TA" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Tamil Transliteration
       </message>
-      <message name="IDS_IME_NAME_TRANSLITERATION_TE" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_TRANSLITERATION_TE" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Telugu Transliteration
       </message>
-      <message name="IDS_IME_NAME_TRANSLITERATION_TI" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_TRANSLITERATION_TI" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Tigrinya
       </message>
-      <message name="IDS_IME_NAME_TRANSLITERATION_UR" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|languages| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |languages|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |languages| when using a keyboard layout not designed for |languages|." meaning="Input method name">
+      <message name="IDS_IME_NAME_TRANSLITERATION_UR" desc="Input method name, shown in system tray menu, settings page, etc. following this template: “|language| (|variant|) |IME| with |layout| keyboard” which means “an input method that supports typing in the |variant| of |language|, using |IME| and a keyboard with |layout|. When a part in this template is unambiguous, it’s dropped for brevity. Translations should strive for similar consistency in structure among input method names. Note: On Chrome OS, an “input method” is a suite of all input functionalities. |IME| in the template refers to an optional aspect of an “input method” on Chrome OS, i.e. sophisticated transforms into text in |language| when using a keyboard layout not designed for |language|." meaning="Input method name">
         Urdu
       </message>
     </messages>
diff --git a/ui/file_manager/file_manager/foreground/css/file_manager.css b/ui/file_manager/file_manager/foreground/css/file_manager.css
index d14c87c..adab168a 100644
--- a/ui/file_manager/file_manager/foreground/css/file_manager.css
+++ b/ui/file_manager/file_manager/foreground/css/file_manager.css
@@ -120,12 +120,6 @@
   position: relative;
 }
 
-.dialog-navigation-list-footer {
-  display: flex;
-  flex: none;
-  flex-direction: column;
-}
-
 #directory-tree {
   bottom: 0;
   flex: none;
@@ -3531,203 +3525,6 @@
   min-height: calc(68px + 24px);
 }
 
-/* Progress center */
-
-@keyframes progress-center-toggle {
-  /* Height values of each frame are set by script.
-   * Keep the animation sync with JS. */
-  from {
-  }
-  to {
-  }
-}
-
-#progress-center {
-  background-color: transparent;
-  border-top: 1px solid rgb(214, 214, 214);
-  position: relative;
-  transition: background-color 300ms linear,
-              border 300ms linear;
-}
-
-#progress-center.animated {
-  animation: progress-center-toggle 300ms ease-out;
-}
-
-#progress-center-open-view {
-  max-height: 40vh;
-  opacity: 1;
-  overflow-y: auto;
-  padding-top: 10px;
-  transition: opacity 300ms linear;
-}
-
-#progress-center:not(.opened) #progress-center-open-view {
-  opacity: 0;
-  pointer-events: none;
-  position: absolute;
-}
-
-#progress-center-close-view {
-  opacity: 1;
-  padding-top: 20px;
-  transition: opacity 300ms linear;
-}
-
-#progress-center.opened #progress-center-close-view {
-  opacity: 0;
-  pointer-events: none;
-  position: absolute;
-}
-
-#progress-center.animated #progress-center-open-view,
-#progress-center.animated #progress-center-close-view {
-  left: 0;
-  pointer-events: none;
-  position: absolute;
-  right: 0;
-  top: 0;
-  z-index: 1;
-}
-
-#progress-center li {
-  display: flex;
-  /* This must not be margin-bottom to calculate parent's height correctly. */
-  padding-bottom: 16px;
-  padding-inline-end: 12px;
-}
-
-#progress-center label {
-  color: rgb(76, 76, 76);
-  display: block;
-  font-weight: 500;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-#progress-center li.error.single label {
-  white-space: normal;
-}
-
-#progress-center .progress-frame {
-  flex: 1 0 0;
-  overflow: hidden;
-  padding-inline-end: 12px;
-  padding-inline-start: 16px;
-}
-
-#progress-center .progress-bar {
-  background: rgb(224, 224, 224);
-  border-radius: 2px;
-  display: inline-block;
-  height: 4px;
-  margin-bottom: 3px;
-  opacity: 1;
-  overflow: hidden;
-  width: 100%;
-}
-
-#progress-center li.error .progress-bar,
-#progress-center-close-view.quiet .progress-bar {
-  display: none;
-}
-
-#progress-center .progress-track {
-  background: rgb(26, 194, 34);
-  height: 100%;
-}
-
-#progress-center .progress-track.animated {
-  transition: width 300ms linear;
-}
-
-#progress-center .button-frame {
-  align-self: flex-start;
-  flex: none;
-}
-
-#progress-center button {
-  border: none;
-  cursor: pointer;
-  display: inline-block;
-  height: 16px;
-  min-height: 0;
-  min-width: 0;
-  outline: none;
-  padding: 0;
-  vertical-align: middle;
-  width: 16px;
-}
-
-#progress-center button.close {
-  background: -webkit-image-set(
-      url(../images/files/ui/expand_more_active.png) 1x,
-      url(../images/files/ui/2x/expand_more_active.png) 2x)
-      no-repeat;
-  display: block;
-  margin-bottom: 20px;
-  margin-inline-end: 12px;
-  margin-inline-start: auto;
-}
-
-#progress-center button.open {
-  background: -webkit-image-set(
-      url(../images/files/ui/expand_less.png) 1x,
-      url(../images/files/ui/2x/expand_less.png) 2x)
-      no-repeat;
-  /* If progress bar exists, show open button at slighly higher position. */
-  margin-bottom: 14px;
-}
-
-#progress-center button.dismiss,
-#progress-center button.cancel {
-  background: -webkit-image-set(
-      url(../images/files/ui/cancel.png) 1x,
-      url(../images/files/ui/2x/cancel.png) 2x)
-      no-repeat;
-}
-
-#progress-center li.error button.open,
-#progress-center li.quiet button.open {
-  margin-bottom: 0;
-}
-
-#progress-center button.dismiss {
-  display: none;
-}
-
-/*
- * Dismiss button is shown only when
- * - Single error in close view.
- * - Error items in open view.
- */
-li#progress-center-close-view.error.single button.dismiss,
-#progress-center-open-view li.error button.dismiss {
-  display: block;
-}
-
-#progress-center-close-view:not(.single) button.cancel {
-  display: none;
-}
-
-#progress-center-close-view.single:not(.quiet) button.open {
-  display: none;
-}
-
-#progress-center-close-view.quiet button.cancel,
-#progress-center li:not(.cancelable) button.cancel {
-  display: none;
-}
-
-.text-measure {
-  pointer-events: none;
-  position: absolute;
-  top: 0;
-  visibility: hidden;
-  z-index: -1;
-}
-
 files-toggle-ripple {
   bottom: 0;
   left: 0;
diff --git a/ui/file_manager/file_manager/foreground/js/progress_center_item_group.js b/ui/file_manager/file_manager/foreground/js/progress_center_item_group.js
index 59aebf8..6b474af1 100644
--- a/ui/file_manager/file_manager/foreground/js/progress_center_item_group.js
+++ b/ui/file_manager/file_manager/foreground/js/progress_center_item_group.js
@@ -74,44 +74,6 @@
   }
 
   /**
-   * Makes the summarized item for the groups.
-   *
-   * When a group has only error items, getSummarizedItem of the item returns
-   * null. Basically the first result of the groups that the progress center
-   * panel contains is used as a summarized item. But If all the group returns
-   * null, the progress center panel generates the summarized item by using the
-   * method.
-   *
-   * @param {...ProgressCenterItemGroup} var_args List of groups.
-   * @return {ProgressCenterItem} Summarized item.
-   */
-  static getSummarizedErrorItem(var_args) {
-    const groups = Array.prototype.slice.call(arguments);
-    const errorItems = [];
-    for (let i = 0; i < groups.length; i++) {
-      for (const id in groups[i].items_) {
-        const item = groups[i].items_[id];
-        if (item.state === ProgressItemState.ERROR) {
-          errorItems.push(item);
-        }
-      }
-    }
-    if (errorItems.length === 0) {
-      return null;
-    }
-
-    if (errorItems.length === 1) {
-      return errorItems[0].clone();
-    }
-
-    const item = new ProgressCenterItem();
-    item.state = ProgressItemState.ERROR;
-    item.message = strf('ERROR_PROGRESS_SUMMARY_PLURAL', errorItems.length);
-    item.single = false;
-    return item;
-  }
-
-  /**
    * @return {ProgressCenterItemGroup.State} State of the group.
    */
   get state() {
@@ -119,19 +81,6 @@
   }
 
   /**
-   * @return {number} Number of error items that the group contains.
-   */
-  get numErrors() {
-    let result = 0;
-    for (const id in this.items_) {
-      if (this.items_[id].state === ProgressItemState.ERROR) {
-        result++;
-      }
-    }
-    return result;
-  }
-
-  /**
    * Obtains the progressing (or completed but animated) item.
    *
    * @param {string} id Item ID.
@@ -151,14 +100,6 @@
   }
 
   /**
-   * Obtains whether the summarized item should be animated or not.
-   * @return {boolean} Whether the summarized item should be animated or not.
-   */
-  isSummarizedAnimated() {
-    return this.summarizedItemAnimated_;
-  }
-
-  /**
    * Dismisses an error item.
    * @param {string} id Item id.
    */
diff --git a/ui/file_manager/file_manager/foreground/js/progress_center_item_group_unittest.js b/ui/file_manager/file_manager/foreground/js/progress_center_item_group_unittest.js
index 361fa9cb..dfcb6d0d 100644
--- a/ui/file_manager/file_manager/foreground/js/progress_center_item_group_unittest.js
+++ b/ui/file_manager/file_manager/foreground/js/progress_center_item_group_unittest.js
@@ -2,6 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+/**
+ * @fileoverview
+ *
+ * @suppress {visibility} To allow test code to reach to private attributes.
+ */
+
 'use strict';
 
 // Mock LoadTimeData strings.
@@ -28,7 +34,7 @@
   // Add an item.
   group.update(item);
   assertFalse(group.isAnimated(item.id));
-  assertFalse(group.isSummarizedAnimated());
+  assertFalse(group.summarizedItemAnimated_);
   assertEquals('TestItemMessage1', group.getItem(item.id).message);
   assertEquals('TestItemMessage1', group.getSummarizedItem(0).message);
   assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
@@ -37,7 +43,7 @@
   item.progressValue = 0.5;
   group.update(item);
   assertTrue(group.isAnimated(item.id));
-  assertTrue(group.isSummarizedAnimated());
+  assertTrue(group.summarizedItemAnimated_);
   assertEquals(0.5, group.getItem(item.id).progressValue);
   assertEquals(0.5, group.getSummarizedItem(0).progressValue);
   assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
@@ -47,7 +53,7 @@
   item.state = ProgressItemState.COMPLETED;
   group.update(item);
   assertTrue(group.isAnimated(item.id));
-  assertTrue(group.isSummarizedAnimated());
+  assertTrue(group.summarizedItemAnimated_);
   assertEquals(100, group.getItem(item.id).progressRateInPercent);
   assertEquals(100, group.getSummarizedItem(0).progressRateInPercent);
   assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
@@ -55,7 +61,7 @@
   // The animation of the item is completed.
   group.completeItemAnimation(item.id);
   assertFalse(group.isAnimated(item.id));
-  assertTrue(group.isSummarizedAnimated());
+  assertTrue(group.summarizedItemAnimated_);
   assertEquals(null, group.getItem(item.id));
   assertTrue(!!group.getSummarizedItem(0));
   assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
@@ -77,7 +83,7 @@
   // Add an item.
   group.update(item);
   assertFalse(group.isAnimated(item.id));
-  assertFalse(group.isSummarizedAnimated());
+  assertFalse(group.summarizedItemAnimated_);
   assertEquals('TestItemMessage1', group.getItem(item.id).message);
   assertEquals('TestItemMessage1', group.getSummarizedItem(0).message);
   assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
@@ -86,7 +92,7 @@
   item.progressValue = 0.5;
   group.update(item);
   assertTrue(group.isAnimated(item.id));
-  assertTrue(group.isSummarizedAnimated());
+  assertTrue(group.summarizedItemAnimated_);
   assertEquals(0.5, group.getItem(item.id).progressValue);
   assertEquals(0.5, group.getSummarizedItem(0).progressValue);
   assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
@@ -94,14 +100,14 @@
   // The animation of the item to 50% progress is completed.
   group.completeItemAnimation(item.id);
   assertFalse(group.isAnimated(item.id));
-  assertTrue(group.isSummarizedAnimated());
+  assertTrue(group.summarizedItemAnimated_);
   assertTrue(!!group.getItem(item.id));
   assertTrue(!!group.getSummarizedItem(0));
   assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
 
   // The animation of the summarized item to 50% progress is completed.
   group.completeSummarizedItemAnimation();
-  assertFalse(group.isSummarizedAnimated());
+  assertFalse(group.summarizedItemAnimated_);
   assertTrue(!!group.getSummarizedItem(0));
   assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
 
@@ -110,7 +116,7 @@
   item.state = ProgressItemState.COMPLETED;
   group.update(item);
   assertTrue(group.isAnimated(item.id));
-  assertTrue(group.isSummarizedAnimated());
+  assertTrue(group.summarizedItemAnimated_);
   assertEquals(100, group.getItem(item.id).progressRateInPercent);
   assertEquals(100, group.getSummarizedItem(0).progressRateInPercent);
   assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
@@ -122,7 +128,7 @@
   // The animation of the item to 100% progress is completed.
   group.completeItemAnimation(item.id);
   assertFalse(group.isAnimated(item.id));
-  assertFalse(group.isSummarizedAnimated());
+  assertFalse(group.summarizedItemAnimated_);
   assertFalse(!!group.getItem(item.id));
   assertFalse(!!group.getSummarizedItem(0));
   assertEquals(ProgressCenterItemGroup.State.EMPTY, group.state);
@@ -141,7 +147,7 @@
   // Add an item with 100% progress.
   group.update(item);
   assertFalse(group.isAnimated(item.id));
-  assertFalse(group.isSummarizedAnimated());
+  assertFalse(group.summarizedItemAnimated_);
   assertEquals('TestItemMessage1', group.getItem(item.id).message);
   assertEquals('TestItemMessage1', group.getSummarizedItem(0).message);
   assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
@@ -150,7 +156,7 @@
   item.state = ProgressItemState.COMPLETED;
   group.update(item);
   assertFalse(group.isAnimated(item.id));
-  assertFalse(group.isSummarizedAnimated());
+  assertFalse(group.summarizedItemAnimated_);
   assertEquals(null, group.getItem(item.id));
   assertEquals(null, group.getSummarizedItem(0));
   assertEquals(ProgressCenterItemGroup.State.EMPTY, group.state);
@@ -169,7 +175,7 @@
   // Add an item.
   group.update(item);
   assertFalse(group.isAnimated(item.id));
-  assertFalse(group.isSummarizedAnimated());
+  assertFalse(group.summarizedItemAnimated_);
   assertEquals('TestItemMessage1', group.getItem(item.id).message);
   assertEquals('TestItemMessage1', group.getSummarizedItem(0).message);
   assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
@@ -178,7 +184,7 @@
   item.progressValue = 1.0;
   group.update(item);
   assertTrue(group.isAnimated(item.id));
-  assertTrue(group.isSummarizedAnimated());
+  assertTrue(group.summarizedItemAnimated_);
   assertEquals('TestItemMessage1', group.getItem(item.id).message);
   assertEquals('TestItemMessage1', group.getSummarizedItem(0).message);
   assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
@@ -187,7 +193,7 @@
   item.state = ProgressItemState.COMPLETED;
   group.update(item);
   assertTrue(group.isAnimated(item.id));
-  assertTrue(group.isSummarizedAnimated());
+  assertTrue(group.summarizedItemAnimated_);
   assertTrue(!!group.getItem(item.id));
   assertTrue(!!group.getSummarizedItem(0));
   assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
@@ -215,7 +221,7 @@
   // Item 1 is added.
   group.update(item1);
   assertFalse(group.isAnimated(item1.id));
-  assertFalse(group.isSummarizedAnimated());
+  assertFalse(group.summarizedItemAnimated_);
   assertEquals('TestItemMessage1', group.getItem(item1.id).message);
   assertEquals('TestItemMessage1', group.getSummarizedItem(0).message);
   assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
@@ -224,7 +230,7 @@
   group.update(item2);
   assertFalse(group.isAnimated(item1.id));
   assertFalse(group.isAnimated(item2.id));
-  assertTrue(group.isSummarizedAnimated());
+  assertTrue(group.summarizedItemAnimated_);
   assertEquals('TestItemMessage1', group.getItem(item1.id).message);
   assertEquals('TestItemMessage2', group.getItem(item2.id).message);
   assertEquals('Copying...', group.getSummarizedItem(0).message);
@@ -240,7 +246,7 @@
   group.update(item1);
   assertTrue(group.isAnimated(item1.id));
   assertFalse(group.isAnimated(item2.id));
-  assertTrue(group.isSummarizedAnimated());
+  assertTrue(group.summarizedItemAnimated_);
   assertEquals('Copying...', group.getSummarizedItem(0).message);
   assertEquals(3.0, group.getSummarizedItem(0).progressMax);
   assertEquals(2.0, group.getSummarizedItem(0).progressValue);
@@ -249,7 +255,7 @@
   // Item 1's animation is completed.
   group.completeItemAnimation(item1.id);
   assertFalse(group.isAnimated(item1.id));
-  assertTrue(group.isSummarizedAnimated());
+  assertTrue(group.summarizedItemAnimated_);
   assertEquals('TestItemMessage2', group.getSummarizedItem(0).message);
   assertEquals(3.0, group.getSummarizedItem(0).progressMax);
   assertEquals(2.0, group.getSummarizedItem(0).progressValue);
@@ -260,7 +266,7 @@
   item2.state = ProgressItemState.COMPLETED;
   item2.progressValue = 2.0;
   group.update(item2);
-  assertTrue(group.isSummarizedAnimated());
+  assertTrue(group.summarizedItemAnimated_);
   assertEquals('TestItemMessage2', group.getSummarizedItem(0).message);
   assertEquals(ProgressItemState.COMPLETED, group.getSummarizedItem(0).state);
   assertEquals(3.0, group.getSummarizedItem(0).progressMax);
@@ -271,16 +277,17 @@
   group.completeItemAnimation(item2.id);
   assertFalse(group.isAnimated(item2.id));
   assertFalse(!!group.getItem(item2.id));
+  console.error('item2 state: ' + item2.state);
   assertEquals(3.0, group.getSummarizedItem(0).progressMax);
   assertEquals(3.0, group.getSummarizedItem(0).progressValue);
   assertEquals(ProgressItemState.COMPLETED, group.getSummarizedItem(0).state);
-  assertTrue(group.isSummarizedAnimated());
+  assertTrue(group.summarizedItemAnimated_);
   assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
 
   // Summarized item's animation is completed.
   group.completeSummarizedItemAnimation();
   assertFalse(!!group.getSummarizedItem(0));
-  assertFalse(group.isSummarizedAnimated());
+  assertFalse(group.summarizedItemAnimated_);
   assertEquals(ProgressCenterItemGroup.State.EMPTY, group.state);
 }
 
@@ -306,7 +313,7 @@
   assertTrue(!!group.getItem(item1.id));
   assertFalse(group.isAnimated(item1.id));
   assertEquals(null, group.getSummarizedItem(0));
-  assertFalse(group.isSummarizedAnimated());
+  assertFalse(group.summarizedItemAnimated_);
   assertEquals(ProgressCenterItemGroup.State.INACTIVE, group.state);
 
   // Add another item without dismissing the error item.
@@ -370,7 +377,7 @@
   group.update(item2);
   assertFalse(group.isAnimated(item1.id));
   assertFalse(group.isAnimated(item2.id));
-  assertFalse(group.isSummarizedAnimated());
+  assertFalse(group.summarizedItemAnimated_);
   assertEquals('Copying... 1 Error.', group.getSummarizedItem(0).message);
   assertEquals('Copying... 2 Errors.', group.getSummarizedItem(1).message);
   assertEquals(1.0, group.getSummarizedItem(0).progressMax);
@@ -383,7 +390,7 @@
   group.update(item1);
   assertTrue(group.isAnimated(item1.id));
   assertFalse(group.isAnimated(item2.id));
-  assertTrue(group.isSummarizedAnimated());
+  assertTrue(group.summarizedItemAnimated_);
   assertEquals('Copying... 1 Error.', group.getSummarizedItem(0).message);
   assertEquals(1.0, group.getSummarizedItem(0).progressMax);
   assertEquals(1.0, group.getSummarizedItem(0).progressValue);
@@ -395,21 +402,11 @@
   group.completeSummarizedItemAnimation();
 
   assertFalse(group.isAnimated(item1.id));
-  assertFalse(group.isSummarizedAnimated());
+  assertFalse(group.summarizedItemAnimated_);
   assertFalse(!!group.getSummarizedItem(0));
-  assertEquals(
-      'Error message.',
-      ProgressCenterItemGroup.getSummarizedErrorItem(group).message);
-  assertEquals(
-      '2 Errors.',
-      ProgressCenterItemGroup.getSummarizedErrorItem(group, group).message);
   assertFalse(!!group.getItem(item1.id));
   assertTrue(!!group.getItem(item2.id));
 
-  assertEquals(
-      'Error message.',
-      ProgressCenterItemGroup.getSummarizedErrorItem(group).message);
-  assertFalse(group.isSummarizedAnimated());
   assertEquals(ProgressCenterItemGroup.State.INACTIVE, group.state);
 
   // Dismiss error item.
@@ -447,14 +444,14 @@
   item2.progressValue = 1.5;
   group.update(item2);
   assertTrue(group.isAnimated(item2.id));
-  assertTrue(group.isSummarizedAnimated());
+  assertTrue(group.summarizedItemAnimated_);
 
   // Item 2 enters the error state.
   item2.state = ProgressItemState.ERROR;
   item2.message = 'Error message.';
   group.update(item2);
   assertFalse(group.isAnimated(item2.id));
-  assertFalse(group.isSummarizedAnimated());
+  assertFalse(group.summarizedItemAnimated_);
   assertEquals('Copying... 1 Error.', group.getSummarizedItem(0).message);
   assertEquals('Copying... 2 Errors.', group.getSummarizedItem(1).message);
   assertEquals(1.0, group.getSummarizedItem(0).progressMax);
@@ -480,10 +477,7 @@
   // Add an error item.
   group.update(item1);
   assertFalse(group.isAnimated(item1.id));
-  assertFalse(group.isSummarizedAnimated());
-  assertEquals(
-      'Error message 1',
-      ProgressCenterItemGroup.getSummarizedErrorItem(group).message);
+  assertFalse(group.summarizedItemAnimated_);
   assertEquals(ProgressCenterItemGroup.State.INACTIVE, group.state);
 
   // Add another error item.
@@ -491,10 +485,7 @@
   assertTrue(!!group.getItem(item1.id));
   assertTrue(!!group.getItem(item2.id));
   assertFalse(group.isAnimated(item2.id));
-  assertFalse(group.isSummarizedAnimated());
-  assertEquals(
-      '2 Errors.',
-      ProgressCenterItemGroup.getSummarizedErrorItem(group).message);
+  assertFalse(group.summarizedItemAnimated_);
   assertEquals(ProgressCenterItemGroup.State.INACTIVE, group.state);
 
   // Dismiss Error message 1.
@@ -502,9 +493,6 @@
 
   assertFalse(!!group.getItem(item1.id));
   assertTrue(!!group.getItem(item2.id));
-  assertEquals(
-      'Error message 2',
-      ProgressCenterItemGroup.getSummarizedErrorItem(group).message);
   assertEquals(ProgressCenterItemGroup.State.INACTIVE, group.state);
 }
 
@@ -530,7 +518,7 @@
   item.state = ProgressItemState.CANCELED;
   group.update(item);
   assertFalse(group.isAnimated(item.id));
-  assertFalse(group.isSummarizedAnimated());
+  assertFalse(group.summarizedItemAnimated_);
   assertEquals(null, group.getItem(item.id));
   assertEquals(null, group.getSummarizedItem(0));
   assertEquals(ProgressCenterItemGroup.State.EMPTY, group.state);
@@ -568,13 +556,10 @@
   group.update(item1);
   assertFalse(group.isAnimated(item1.id));
   assertFalse(group.isAnimated(item2.id));
-  assertFalse(group.isSummarizedAnimated());
+  assertFalse(group.summarizedItemAnimated_);
   assertEquals(null, group.getItem(item1.id));
   assertTrue(!!group.getItem(item2.id));
   assertEquals(null, group.getSummarizedItem(0));
-  assertEquals(
-      'Error message 2',
-      ProgressCenterItemGroup.getSummarizedErrorItem(group).message);
   assertEquals(ProgressCenterItemGroup.State.INACTIVE, group.state);
 }
 
@@ -591,7 +576,7 @@
   // Add an item.
   group.update(item);
   assertFalse(group.isAnimated(item.id));
-  assertFalse(group.isSummarizedAnimated());
+  assertFalse(group.summarizedItemAnimated_);
   assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
 
   // Start an animation of the item.
@@ -600,7 +585,7 @@
   assertTrue(group.isAnimated(item.id));
   // Summarized item should not animated because the panel does not show
   // progress bar for quiet and summarized item.
-  assertFalse(group.isSummarizedAnimated());
+  assertFalse(group.summarizedItemAnimated_);
   assertEquals(0.5, group.getItem(item.id).progressValue);
   assertEquals(0.5, group.getSummarizedItem(0).progressValue);
   assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
@@ -610,7 +595,7 @@
   item.state = ProgressItemState.COMPLETED;
   group.update(item);
   assertTrue(group.isAnimated(item.id));
-  assertFalse(group.isSummarizedAnimated());
+  assertFalse(group.summarizedItemAnimated_);
   assertEquals(100, group.getItem(item.id).progressRateInPercent);
   assertEquals(100, group.getSummarizedItem(0).progressRateInPercent);
   assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
@@ -618,7 +603,7 @@
   // The animation of the item is completed.
   group.completeItemAnimation(item.id);
   assertFalse(group.isAnimated(item.id));
-  assertFalse(group.isSummarizedAnimated());
+  assertFalse(group.summarizedItemAnimated_);
   assertEquals(null, group.getItem(item.id));
   assertFalse(!!group.getSummarizedItem(0));
   assertEquals(ProgressCenterItemGroup.State.EMPTY, group.state);
diff --git a/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.js b/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.js
index abe9994..a5a9cfcb 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.js
@@ -254,8 +254,7 @@
      * @type {!ProgressCenterPanel}
      * @const
      */
-    this.progressCenterPanel = new ProgressCenterPanel(
-        queryRequiredElement('#progress-center', this.element));
+    this.progressCenterPanel = new ProgressCenterPanel();
 
     /**
      * Activity feedback panel.
@@ -539,18 +538,6 @@
         util.queryDecoratedElement('#directory-tree-context-menu', cr.ui.Menu);
     this.directoryTree.disabledContextMenu =
         util.queryDecoratedElement('#disabled-context-menu', cr.ui.Menu);
-
-    // Visible height of the directory tree depends on the size of progress
-    // center panel. When the size of progress center panel changes, directory
-    // tree has to be notified to adjust its components (e.g. progress bar).
-    const relayoutLimiter = new AsyncUtil.RateLimiter(
-        directoryTree.relayout.bind(directoryTree), 200);
-    const observer =
-        new MutationObserver(relayoutLimiter.run.bind(relayoutLimiter));
-    observer.observe(
-        this.progressCenterPanel.element,
-        /** @type {MutationObserverInit} */
-        ({subtree: true, attributes: true, childList: true}));
   }
 
   /**
diff --git a/ui/file_manager/file_manager/foreground/js/ui/progress_center_panel.js b/ui/file_manager/file_manager/foreground/js/ui/progress_center_panel.js
index 9842f9f..e384813 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/progress_center_panel.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/progress_center_panel.js
@@ -3,213 +3,11 @@
 // found in the LICENSE file.
 
 /**
- * Item element of the progress center.
- * @extends HTMLDivElement
- */
-class ProgressCenterItemElement {
-  /**
-   * @param {Document} document Document which the new item belongs to.
-   */
-  constructor(document) {
-    /** @private {?ProgressItemState} */
-    this.state_ = null;
-
-    /** @private {?function()} */
-    this.cancelTransition_ = null;
-
-    /** @private {?Element} */
-    this.track_ = null;
-
-    const label = document.createElement('label');
-    label.className = 'label';
-
-    const progressBarIndicator = document.createElement('div');
-    progressBarIndicator.className = 'progress-track';
-
-    const progressBar = document.createElement('div');
-    progressBar.className = 'progress-bar';
-    progressBar.appendChild(progressBarIndicator);
-
-    const progressFrame = document.createElement('div');
-    progressFrame.className = 'progress-frame';
-    progressFrame.appendChild(label);
-    progressFrame.appendChild(progressBar);
-
-    const cancelButton = document.createElement('button');
-    cancelButton.className = 'cancel';
-    cancelButton.setAttribute('tabindex', '-1');
-
-    // Dismiss button is shown for error item.
-    const dismissButton = document.createElement('button');
-    dismissButton.classList.add('dismiss');
-    dismissButton.setAttribute('tabindex', '-1');
-
-    const buttonFrame = document.createElement('div');
-    buttonFrame.className = 'button-frame';
-    buttonFrame.appendChild(cancelButton);
-    buttonFrame.appendChild(dismissButton);
-
-    const itemElement = document.createElement('li');
-    itemElement.appendChild(progressFrame);
-    itemElement.appendChild(buttonFrame);
-
-    return ProgressCenterItemElement.decorate(itemElement);
-  }
-
-  /**
-   * Ensures the animation triggers.
-   *
-   * @param {function(?)} callback Function to set the transition end
-   *     properties.
-   * @return {function()} Function to cancel the request.
-   * @private
-   */
-  static safelySetAnimation_(callback) {
-    let requestId = window.requestAnimationFrame(() => {
-      // The transition start properties currently set are rendered at this
-      // frame. And the transition end properties set by the callback is
-      // rendered at the next frame.
-      requestId = window.requestAnimationFrame(callback);
-    });
-    return () => {
-      window.cancelAnimationFrame(requestId);
-    };
-  }
-
-  /**
-   * Decorates the given element as a progress item.
-   * @param {!Element} element Item to be decorated.
-   * @return {!ProgressCenterItemElement} Decorated item.
-   */
-  static decorate(element) {
-    element.__proto__ = ProgressCenterItemElement.prototype;
-    element = /** @type {!ProgressCenterItemElement} */ (element);
-    element.state_ = ProgressItemState.PROGRESSING;
-    element.track_ = element.querySelector('.progress-track');
-    element.track_.addEventListener(
-        'transitionend', element.onTransitionEnd_.bind(element));
-    element.cancelTransition_ = null;
-    return element;
-  }
-
-  get quiet() {
-    return this.classList.contains('quiet');
-  }
-
-  /**
-   * Updates the element view according to the item.
-   * @param {ProgressCenterItem} item Item to be referred for the update.
-   * @param {boolean} animated Whether the progress width is applied as animated
-   *     or not.
-   */
-  update(item, animated) {
-    // Set element attributes.
-    this.state_ = item.state;
-    this.setAttribute('data-progress-id', item.id);
-    this.classList.toggle('error', item.state === ProgressItemState.ERROR);
-    this.classList.toggle('cancelable', item.cancelable);
-    this.classList.toggle('single', item.single);
-    this.classList.toggle('quiet', item.quiet);
-
-    // Set label.
-    if (this.state_ === ProgressItemState.PROGRESSING ||
-        this.state_ === ProgressItemState.ERROR) {
-      this.querySelector('label').textContent = item.message;
-    } else if (this.state_ === ProgressItemState.CANCELED) {
-      this.querySelector('label').textContent = '';
-    }
-
-    // Cancel the previous property set.
-    if (this.cancelTransition_) {
-      this.cancelTransition_();
-      this.cancelTransition_ = null;
-    }
-
-    // Set track width.
-    const setWidth = ((nextWidthFrame) => {
-                       const currentWidthRate =
-                           parseInt(this.track_.style.width, 10);
-                       // Prevent assigning the same width to avoid stopping the
-                       // animation. animated == false may be intended to cancel
-                       // the animation, so in that case, the assignment should
-                       // be done.
-                       if (currentWidthRate === nextWidthFrame && animated) {
-                         return;
-                       }
-                       this.track_.hidden = false;
-                       this.track_.style.width = nextWidthFrame + '%';
-                       this.track_.classList.toggle('animated', animated);
-                     }).bind(null, item.progressRateInPercent);
-
-    if (animated) {
-      this.cancelTransition_ =
-          ProgressCenterItemElement.safelySetAnimation_(setWidth);
-    } else {
-      // For animated === false, we should call setWidth immediately to cancel
-      // the animation, otherwise the animation may complete before canceling
-      // it.
-      setWidth();
-    }
-  }
-
-  /**
-   * Resets the item.
-   */
-  reset() {
-    this.track_.hidden = true;
-    this.track_.width = '';
-    this.state_ = ProgressItemState.PROGRESSING;
-  }
-
-  /**
-   * Handles transition end events.
-   * @param {Event} event Transition end event.
-   * @private
-   */
-  onTransitionEnd_(event) {
-    if (event.propertyName !== 'width') {
-      return;
-    }
-    this.track_.classList.remove('animated');
-    this.dispatchEvent(new Event(
-        ProgressCenterItemElement.PROGRESS_ANIMATION_END_EVENT,
-        {bubbles: true}));
-  }
-}
-
-ProgressCenterItemElement.prototype.__proto__ = HTMLDivElement.prototype;
-
-/**
- * Event triggered when the item should be dismissed.
- * @const {string}
- */
-ProgressCenterItemElement.PROGRESS_ANIMATION_END_EVENT = 'progressAnimationEnd';
-
-/**
  * Progress center panel.
  * @implements {ProgressCenterPanelInterface}
  */
 class ProgressCenterPanel {
-  /**
-   * @param {!Element} element DOM Element of the process center panel.
-   */
-  constructor(element) {
-    /**
-     * Root element of the progress center.
-     * @type {!Element}
-     * @private
-     */
-    this.element_ = element;
-
-    /**
-     * Open view containing multiple progress items.
-     * @type {!HTMLDivElement}
-     * @private
-     */
-    this.openView_ = assertInstanceof(
-        queryRequiredElement('#progress-center-open-view', this.element_),
-        HTMLDivElement);
-
+  constructor() {
     /**
      * Reference to the feedback panel host.
      * TODO(crbug.com/947388) Add closure annotation here.
@@ -217,22 +15,6 @@
     this.feedbackHost_ = document.querySelector('#progress-panel');
 
     /**
-     * Close view that is a summarized progress item.
-     * @type {ProgressCenterItemElement}
-     * @private
-     */
-    this.closeView_ = ProgressCenterItemElement.decorate(
-        assert(this.element_.querySelector('#progress-center-close-view')));
-
-    /**
-     * Toggle animation rule of the progress center.
-     * @type {CSSKeyframesRule}
-     * @private
-     */
-    this.toggleAnimation_ =
-        ProgressCenterPanel.getToggleAnimation_(element.ownerDocument);
-
-    /**
      * Item group for normal priority items.
      * @type {ProgressCenterItemGroup}
      * @private
@@ -247,21 +29,6 @@
     this.quietItemGroup_ = new ProgressCenterItemGroup('quiet', true);
 
     /**
-     * Queries to obtains items for each group.
-     * @type {Object<string>}
-     * @private
-     */
-    this.itemQuery_ =
-        Object.preventExtensions({normal: 'li:not(.quiet)', quiet: 'li.quiet'});
-
-    /**
-     * Timeout IDs of the inactive state of each group.
-     * @type {Object<?number>}
-     * @private
-     */
-    this.timeoutId_ = Object.preventExtensions({normal: null, quiet: null});
-
-    /**
      * Callback to be called with the ID of the progress item when the cancel
      * button is clicked.
      * @type {?function(string)}
@@ -283,59 +50,6 @@
     if (window.IN_TEST) {
       this.PENDING_TIME_MS_ = 0;
     }
-
-    // Register event handlers.
-    element.addEventListener('click', this.onClick_.bind(this));
-    element.addEventListener(
-        'animationend', this.onToggleAnimationEnd_.bind(this));
-    element.addEventListener(
-        ProgressCenterItemElement.PROGRESS_ANIMATION_END_EVENT,
-        this.onItemAnimationEnd_.bind(this));
-  }
-
-  /**
-   * Obtains the toggle animation keyframes rule from the document.
-   * @param {Document} document Document containing the rule.
-   * @return {CSSKeyframesRule} Animation rule.
-   * @private
-   */
-  static getToggleAnimation_(document) {
-    for (let i = 0; i < document.styleSheets.length; i++) {
-      const styleSheet = document.styleSheets[i];
-      let rules = null;
-      // External stylesheets may not be accessible due to CORS restrictions.
-      // This try/catch is the only way avoid an exception when iterating over
-      // stylesheets that include chrome://resources.
-      // See https://crbug.com/775525/ for details.
-      try {
-        rules = styleSheet.cssRules;
-      } catch (err) {
-        if (err.name == 'SecurityError') {
-          continue;
-        }
-        throw err;
-      }
-
-      for (let j = 0; j < rules.length; j++) {
-        // HACK: closure does not define experimental CSSRules.
-        const keyFramesRule = CSSRule.KEYFRAMES_RULE || 7;
-        const rule = rules[j];
-        if (rule.type === keyFramesRule &&
-            rule.name === 'progress-center-toggle') {
-          return rule;
-        }
-      }
-    }
-
-    throw new Error('The progress-center-toggle rules is not found.');
-  }
-
-  /**
-   * Root element of the progress center.
-   * @type {HTMLElement}
-   */
-  get element() {
-    return this.element_;
   }
 
   /**
@@ -432,7 +146,6 @@
     return '';
   }
 
-
   /**
    * Generate primary text string for display on the feedback panel.
    * It is used for TransferDetails mode.
@@ -665,30 +378,6 @@
   }
 
   /**
-   * Handles the item animation end.
-   * @param {Event} event Item animation end event.
-   * @private
-   * @suppress {checkTypes}
-   * TODO(crbug.com/947388) Remove the suppress, and fix closure compile.
-   */
-  onItemAnimationEnd_(event) {
-    const targetGroup = event.target.classList.contains('quiet') ?
-        this.quietItemGroup_ :
-        this.normalItemGroup_;
-    if (event.target === this.closeView_) {
-      targetGroup.completeSummarizedItemAnimation();
-    } else {
-      const itemId = event.target.getAttribute('data-progress-id');
-      targetGroup.completeItemAnimation(itemId);
-      const panelItem = this.feedbackHost_.findPanelItemById(itemId);
-      if (panelItem) {
-        this.feedbackHost_.removePanelItem(panelItem);
-      }
-    }
-    this.updateCloseView_();
-  }
-
-  /**
    * Requests all item groups to dismiss an error item.
    * @param {string} id Item id.
    */
@@ -696,70 +385,6 @@
     this.normalItemGroup_.dismissErrorItem(id);
     this.quietItemGroup_.dismissErrorItem(id);
 
-    const element = this.getItemElement_(id);
-    if (element) {
-      this.openView_.removeChild(element);
-    }
-    this.updateCloseView_();
-  }
-
-  /**
-   * Updates the close view.
-   * @private
-   */
-  updateCloseView_() {
-    // Try to use the normal summarized item.
-    const normalSummarizedItem =
-        this.normalItemGroup_.getSummarizedItem(this.quietItemGroup_.numErrors);
-    if (normalSummarizedItem) {
-      // If the quiet animation is overridden by normal summarized item, discard
-      // the quiet animation.
-      if (this.quietItemGroup_.isSummarizedAnimated()) {
-        this.quietItemGroup_.completeSummarizedItemAnimation();
-      }
-
-      // Update the view state.
-      this.closeView_.update(
-          normalSummarizedItem, this.normalItemGroup_.isSummarizedAnimated());
-      this.element_.hidden = false;
-      return;
-    }
-
-    // Try to use the quiet summarized item.
-    const quietSummarizedItem =
-        this.quietItemGroup_.getSummarizedItem(this.normalItemGroup_.numErrors);
-    if (quietSummarizedItem) {
-      this.closeView_.update(
-          quietSummarizedItem, this.quietItemGroup_.isSummarizedAnimated());
-      this.element_.hidden = false;
-      return;
-    }
-
-    // Try to use the error summarized item.
-    const errorSummarizedItem = ProgressCenterItemGroup.getSummarizedErrorItem(
-        this.normalItemGroup_, this.quietItemGroup_);
-    if (errorSummarizedItem) {
-      this.closeView_.update(errorSummarizedItem, false);
-      this.element_.hidden = false;
-      return;
-    }
-
-    // Hide the progress center because there is no items to show.
-    this.closeView_.reset();
-    this.element_.hidden = true;
-    this.element_.classList.remove('opened');
-  }
-
-  /**
-   * Gets an item element having the specified ID.
-   * @param {string} id progress item ID.
-   * @return {ProgressCenterItemElement} Item element having the ID.
-   * @private
-   */
-  getItemElement_(id) {
-    const query = 'li[data-progress-id="' + id + '"]';
-    return /** @type {ProgressCenterItemElement} */ (
-        this.openView_.querySelector(query));
   }
 
   /**
@@ -771,69 +396,4 @@
   getGroupForItem_(item) {
     return item.quiet ? this.quietItemGroup_ : this.normalItemGroup_;
   }
-
-  /**
-   * Handles the animation end event of the progress center.
-   * @param {Event} event Animation end event.
-   * @private
-   */
-  onToggleAnimationEnd_(event) {
-    // Transition end of the root element's height.
-    if (event.target === this.element_ &&
-        event.animationName === 'progress-center-toggle') {
-      this.element_.classList.remove('animated');
-      return;
-    }
-  }
-
-  /**
-   * Handles the click event.
-   * @param {Event} event Click event.
-   * @private
-   */
-  onClick_(event) {
-    // Toggle button.
-    if (event.target.classList.contains('open') ||
-        event.target.classList.contains('close')) {
-      // If the progress center has already animated, just return.
-      if (this.element_.classList.contains('animated')) {
-        return;
-      }
-
-      // Obtains current and target height.
-      let currentHeight;
-      let targetHeight;
-      if (this.element_.classList.contains('opened')) {
-        currentHeight = this.openView_.getBoundingClientRect().height;
-        targetHeight = this.closeView_.getBoundingClientRect().height;
-      } else {
-        currentHeight = this.closeView_.getBoundingClientRect().height;
-        targetHeight = this.openView_.getBoundingClientRect().height;
-      }
-
-      // Set styles for animation.
-      this.toggleAnimation_.cssRules[0].style.height = currentHeight + 'px';
-      this.toggleAnimation_.cssRules[1].style.height = targetHeight + 'px';
-      this.element_.classList.add('animated');
-      this.element_.classList.toggle('opened');
-      return;
-    }
-
-    if (event.target.classList.contains('dismiss')) {
-      // To dismiss the error item in all windows, we send this to progress
-      // center in background page.
-      const itemElement = event.target.parentNode.parentNode;
-      const id = itemElement.getAttribute('data-progress-id');
-      this.dismissErrorItemCallback(id);
-    }
-
-    // Cancel button.
-    if (event.target.classList.contains('cancel')) {
-      const itemElement = event.target.parentNode.parentNode;
-      if (this.cancelCallback) {
-        const id = itemElement.getAttribute('data-progress-id');
-        this.cancelCallback(id);
-      }
-    }
-  }
 }
diff --git a/ui/file_manager/file_manager/main.html b/ui/file_manager/file_manager/main.html
index 782e86ed..525f133a 100644
--- a/ui/file_manager/file_manager/main.html
+++ b/ui/file_manager/file_manager/main.html
@@ -506,26 +506,6 @@
         <div class="dialog-navigation-list-contents" role="navigation">
           <tree id="directory-tree" role="tree" tabindex="0" files-ng></tree>
         </div>
-        <div class="dialog-navigation-list-footer" hidden>
-          <div id="progress-center" hidden>
-            <li id="progress-center-close-view">
-              <div class="progress-frame">
-                <label></label>
-                <div class="progress-bar">
-                  <div class="progress-track" hidden></div>
-                </div>
-              </div>
-              <div class="button-frame">
-                <button class="cancel" tabindex="-1"></button>
-                <button class="dismiss" tabindex="-1"></button>
-                <button class="open" tabindex="-1"></button>
-              </div>
-            </li>
-            <div id="progress-center-open-view">
-              <button class="close" tabindex="-1"></button>
-            </div>
-          </div>
-        </div>
       </div>
       <div class="splitter" id="navigation-list-splitter">
         <cr-button aria-hidden="true" class="splitter-button" tabindex="-1">
diff --git a/ui/file_manager/file_manager/test/BUILD.gn b/ui/file_manager/file_manager/test/BUILD.gn
index 3b9f7e2..f48e22d 100644
--- a/ui/file_manager/file_manager/test/BUILD.gn
+++ b/ui/file_manager/file_manager/test/BUILD.gn
@@ -25,7 +25,6 @@
     "crostini_tasks.js",
     "js/strings.js",
     "menu.js",
-    "progress_center.js",
   ]
   deps = [ "//ui/resources:webui_resources_grd" ]
   args = [ "--output=" + rebase_path(output, root_build_dir) ]
@@ -41,7 +40,6 @@
     ":crostini_tasks",
     ":menu",
     ":plugin_vm",
-    ":progress_center",
   ]
 }
 
@@ -56,7 +54,6 @@
     "$externs_path/metrics_private.js",
     "//ui/file_manager/externs/background/background_base.js",
     "//ui/file_manager/externs/background/progress_center.js",
-    "//ui/file_manager/externs/progress_center_panel.js",
     "//ui/file_manager/externs/background/crostini.js",
     "//ui/file_manager/externs/entry_location.js",
     "//ui/file_manager/externs/volume_info.js",
@@ -106,11 +103,3 @@
     "//ui/webui/resources/js:webui_resource_test",
   ]
 }
-
-js_library("progress_center") {
-  deps = [
-    "js:test_util",
-    "//ui/file_manager/file_manager/common/js:progress_center_common",
-    "//ui/webui/resources/js:webui_resource_test",
-  ]
-}
diff --git a/ui/file_manager/file_manager/test/progress_center.js b/ui/file_manager/file_manager/test/progress_center.js
deleted file mode 100644
index dcb6ec4b..0000000
--- a/ui/file_manager/file_manager/test/progress_center.js
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-const progressCenter = {};
-
-/**
- * @param {string} id
- * @param {string} message
- * @return {!ProgressCenterItem}
- */
-progressCenter.createItem = function(id, message) {
-  const item = new ProgressCenterItem();
-  item.id = id;
-  item.message = message;
-  return item;
-};
-
-progressCenter.testScrollWhenManyMessages = async (done) => {
-  const visibleClosed = '#progress-center:not([hidden]):not(.opened)';
-  const visibleOpen = '#progress-center:not([hidden]).opened';
-  const openIcon = '#progress-center-close-view .open';
-  const navListFooter = '.dialog-navigation-list-footer';
-
-  const items = [];
-  const center = fileManager.fileBrowserBackground_.progressCenter;
-  // Load a single file.
-  await test.setupAndWaitUntilReady();
-
-  // Add lots of messages.
-  for (let i = 0; i < 100; i++) {
-    const item = progressCenter.createItem('id' + i, 'msg ' + i);
-    items.push(item);
-    center.updateItem(item);
-  }
-  // Wait for notification expand icon.
-  await test.waitForElement(visibleClosed);
-
-  // Click open icon, ensure progress center is open.
-  assertTrue(test.fakeMouseClick(openIcon));
-  await test.waitForElement(visibleOpen);
-
-  // Ensure progress center is scrollable.
-  const footer = document.querySelector(navListFooter);
-  assertTrue(footer.scrollHeight > footer.clientHeight);
-
-  // Clear items.
-  items.forEach((item) => {
-    item.state = ProgressItemState.COMPLETED;
-    center.updateItem(item);
-  });
-  done();
-};
diff --git a/ui/file_manager/integration_tests/file_manager/transfer.js b/ui/file_manager/integration_tests/file_manager/transfer.js
index a6b16b4..2540f652 100644
--- a/ui/file_manager/integration_tests/file_manager/transfer.js
+++ b/ui/file_manager/integration_tests/file_manager/transfer.js
@@ -487,9 +487,11 @@
     destination: TRANSFER_LOCATIONS.downloads,
     isMove: true,
   }));
-  chrome.test.assertEq(
-      '',
-      (await remoteCall.waitForElement(appId, '.progress-frame label')).text);
+
+  // Check: No feedback panel items.
+  const panelItems = await remoteCall.callRemoteTestUtil(
+      'deepQueryAllElements', appId, [['#progress-panel', '#panel']]);
+  chrome.test.assertEq(0, panelItems.length);
 };
 
 /**
diff --git a/ui/gfx/mac/scoped_cocoa_disable_screen_updates.mm b/ui/gfx/mac/scoped_cocoa_disable_screen_updates.mm
index 981a6eff..b31792b 100644
--- a/ui/gfx/mac/scoped_cocoa_disable_screen_updates.mm
+++ b/ui/gfx/mac/scoped_cocoa_disable_screen_updates.mm
@@ -6,27 +6,14 @@
 
 #import <Cocoa/Cocoa.h>
 
-#include "base/mac/mac_util.h"
-
 namespace gfx {
 
 ScopedCocoaDisableScreenUpdates::ScopedCocoaDisableScreenUpdates() {
-  if (base::mac::IsAtLeastOS10_11()) {
-    // Beginning with OS X 10.11, [NSAnimationContext beginGrouping] is the
-    // preferred way of disabling screen updates. Use of
-    // NSDisableScreenUpdates() is discouraged.
-    [NSAnimationContext beginGrouping];
-  } else {
-    NSDisableScreenUpdates();
-  }
+  [NSAnimationContext beginGrouping];
 }
 
 ScopedCocoaDisableScreenUpdates::~ScopedCocoaDisableScreenUpdates() {
-  if (base::mac::IsAtLeastOS10_11()) {
-    [NSAnimationContext endGrouping];
-  } else {
-    NSEnableScreenUpdates();
-  }
+  [NSAnimationContext endGrouping];
 }
 
 }  // namespace gfx
diff --git a/ui/gfx/x/BUILD.gn b/ui/gfx/x/BUILD.gn
index e64338d..f71409b 100644
--- a/ui/gfx/x/BUILD.gn
+++ b/ui/gfx/x/BUILD.gn
@@ -38,6 +38,15 @@
   ]
 }
 
+generate_library_loader("xlib_xcb_loader") {
+  name = "XlibXcbLoader"
+  output_h = "xlib_xcb_loader.h"
+  output_cc = "xlib_xcb_loader.cc"
+  header = "\"ui/gfx/x/xlib_xcb.h\""
+
+  functions = [ "XGetXCBConnection" ]
+}
+
 action("gen_xprotos") {
   visibility = [ ":xprotos" ]
   script = "gen_xproto.py"
@@ -100,6 +109,7 @@
   deps = [
     ":gen_xprotos",
     ":xlib_loader",
+    ":xlib_xcb_loader",
     "//base",
     "//base:i18n",
     "//ui/events/platform",
diff --git a/ui/gfx/x/xlib_support.cc b/ui/gfx/x/xlib_support.cc
index 37817ee..90bb7f0 100644
--- a/ui/gfx/x/xlib_support.cc
+++ b/ui/gfx/x/xlib_support.cc
@@ -9,6 +9,7 @@
 #include "base/logging.h"
 #include "base/no_destructor.h"
 #include "library_loaders/xlib_loader.h"
+#include "library_loaders/xlib_xcb_loader.h"
 
 namespace x11 {
 
@@ -24,6 +25,11 @@
   return xlib_loader.get();
 }
 
+XlibXcbLoader* GetXlibXcbLoader() {
+  static base::NoDestructor<XlibXcbLoader> xlib_xcb_loader;
+  return xlib_xcb_loader.get();
+}
+
 }  // namespace
 
 DISABLE_CFI_ICALL
@@ -34,6 +40,9 @@
 
   CHECK(xlib_loader->Load("libX11.so.6"));
 
+  auto* xlib_xcb_loader = GetXlibXcbLoader();
+  CHECK(xlib_xcb_loader->Load("libX11-xcb.so.1"));
+
   CHECK(xlib_loader->XInitThreads());
 
   // The default Xlib error handler calls exit(1), which we don't want.  This
@@ -103,4 +112,9 @@
   return *this;
 }
 
+DISABLE_CFI_ICALL
+struct xcb_connection_t* XlibDisplayWrapper::GetXcbConnection() {
+  return GetXlibXcbLoader()->XGetXCBConnection(display_);
+}
+
 }  // namespace x11
diff --git a/ui/gfx/x/xlib_support.h b/ui/gfx/x/xlib_support.h
index 312430e..26accef 100644
--- a/ui/gfx/x/xlib_support.h
+++ b/ui/gfx/x/xlib_support.h
@@ -11,6 +11,7 @@
 #include "base/component_export.h"
 
 struct _XDisplay;
+struct xcb_connection_t;
 
 namespace x11 {
 
@@ -60,6 +61,8 @@
   }
   operator struct _XDisplay *() { return display_; }
 
+  struct xcb_connection_t* GetXcbConnection();
+
   XlibDisplayWrapper(XlibDisplayWrapper&& other);
   XlibDisplayWrapper& operator=(XlibDisplayWrapper&& other);
 
diff --git a/ui/gfx/x/xlib_xcb.h b/ui/gfx/x/xlib_xcb.h
new file mode 100644
index 0000000..73d5649
--- /dev/null
+++ b/ui/gfx/x/xlib_xcb.h
@@ -0,0 +1,12 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_GFX_X_XLIB_XCB_H_
+#define UI_GFX_X_XLIB_XCB_H_
+
+extern "C" {
+struct xcb_connection_t* XGetXCBConnection(struct _XDisplay*);
+}
+
+#endif  // UI_GFX_X_XLIB_XCB_H_
diff --git a/ui/webui/resources/cr_elements/cr_toast/cr_toast.js b/ui/webui/resources/cr_elements/cr_toast/cr_toast.js
index 97b4d55..8470e0e9b 100644
--- a/ui/webui/resources/cr_elements/cr_toast/cr_toast.js
+++ b/ui/webui/resources/cr_elements/cr_toast/cr_toast.js
@@ -38,7 +38,7 @@
 
     if (this.open && this.duration !== 0) {
       this.hideTimeoutId_ = window.setTimeout(() => {
-        this._setOpen(false);
+        this.hide();
       }, this.duration);
     }
   },
@@ -59,6 +59,10 @@
     // the same as a previous toast.
     this.removeAttribute('role');
 
+    // Reset the aria-hidden attribute as screen readers need to access the
+    // contents of an opened toast.
+    this.removeAttribute('aria-hidden');
+
     this._setOpen(true);
     this.setAttribute('role', 'alert');
 
@@ -67,8 +71,12 @@
     }
   },
 
-  /** Hides the toast. */
+  /**
+   * Hides the toast and ensures that screen readers cannot its contents while
+   * hidden.
+   */
   hide() {
+    this.setAttribute('aria-hidden', 'true');
     this._setOpen(false);
   },
 });
diff --git a/url/mojom/BUILD.gn b/url/mojom/BUILD.gn
index 364d81b..a05533a 100644
--- a/url/mojom/BUILD.gn
+++ b/url/mojom/BUILD.gn
@@ -84,6 +84,8 @@
       traits_public_deps = [ "//url" ]
     },
   ]
+
+  webui_module_path = "chrome://resources/mojo/url/mojom"
 }
 
 mojom("test_url_mojom_gurl") {
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NavigationTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NavigationTest.java
index 81dc1e7..c483b2e0 100644
--- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NavigationTest.java
+++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NavigationTest.java
@@ -777,7 +777,7 @@
 
     @Test
     @SmallTest
-    @MinWebLayerVersion(89)
+    @MinWebLayerVersion(88)
     public void testCantUsePerNavigationAndDesktopMode() throws Exception {
         TestWebServer testServer = TestWebServer.start();
         InstrumentationActivity activity = mActivityTestRule.launchShellWithUrl(null);
@@ -791,7 +791,7 @@
 
     @Test
     @SmallTest
-    @MinWebLayerVersion(89)
+    @MinWebLayerVersion(88)
     public void testDesktopMode() throws Exception {
         TestWebServer testServer = TestWebServer.start();
         InstrumentationActivity activity = mActivityTestRule.launchShellWithUrl("about:blank");
@@ -804,7 +804,7 @@
 
     @Test
     @SmallTest
-    @MinWebLayerVersion(89)
+    @MinWebLayerVersion(88)
     public void testDesktopModeSticks() throws Exception {
         TestWebServer testServer = TestWebServer.start();
         InstrumentationActivity activity = mActivityTestRule.launchShellWithUrl("about:blank");
@@ -819,7 +819,7 @@
 
     @Test
     @SmallTest
-    @MinWebLayerVersion(89)
+    @MinWebLayerVersion(88)
     public void testDesktopModeGetter() throws Exception {
         TestWebServer testServer = TestWebServer.start();
         InstrumentationActivity activity = mActivityTestRule.launchShellWithUrl(null);
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/ResourceUtil.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/ResourceUtil.java
index a74c25b..159f76d 100644
--- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/ResourceUtil.java
+++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/ResourceUtil.java
@@ -10,7 +10,7 @@
  * Util class for dealing with resources.
  */
 public class ResourceUtil {
-    public static final int REQUIRED_PACKAGE_IDENTIFIER = 12;
+    public static final int REQUIRED_PACKAGE_IDENTIFIER = 36;
 
     private ResourceUtil() {}
 
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/UrlBarControllerImpl.java b/weblayer/browser/java/org/chromium/weblayer_private/UrlBarControllerImpl.java
index 3c500e2..7500f3e4 100644
--- a/weblayer/browser/java/org/chromium/weblayer_private/UrlBarControllerImpl.java
+++ b/weblayer/browser/java/org/chromium/weblayer_private/UrlBarControllerImpl.java
@@ -278,8 +278,6 @@
             return SecurityStatusIcon.getSecurityIconResource(
                     UrlBarControllerImplJni.get().getConnectionSecurityLevel(
                             mNativeUrlBarController),
-                    UrlBarControllerImplJni.get().shouldShowDangerTriangleForWarningLevel(
-                            mNativeUrlBarController),
                     mBrowserImpl.isWindowOnSmallDevice(),
                     /* skipIconForNeutralState= */ true);
         }
@@ -292,6 +290,5 @@
         String getUrlForDisplay(long nativeUrlBarControllerImpl);
         String getPublisherUrl(long nativeUrlBarControllerImpl);
         int getConnectionSecurityLevel(long nativeUrlBarControllerImpl);
-        boolean shouldShowDangerTriangleForWarningLevel(long nativeUrlBarControllerImpl);
     }
 }
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/WebLayerImpl.java b/weblayer/browser/java/org/chromium/weblayer_private/WebLayerImpl.java
index 7e012363..5ee73de 100644
--- a/weblayer/browser/java/org/chromium/weblayer_private/WebLayerImpl.java
+++ b/weblayer/browser/java/org/chromium/weblayer_private/WebLayerImpl.java
@@ -118,7 +118,7 @@
     // The required package ID for WebLayer when loaded as a shared library, hardcoded in the
     // resources. If this value changes make sure to change _SHARED_LIBRARY_HARDCODED_ID in
     // //build/android/gyp/util/protoresources.py.
-    private static final int REQUIRED_PACKAGE_IDENTIFIER = 12;
+    private static final int REQUIRED_PACKAGE_IDENTIFIER = 36;
 
     private final ProfileManager mProfileManager = new ProfileManager();
 
@@ -669,6 +669,10 @@
 
     /** Forces adding entries to the package identifiers array until we hit the required ID. */
     private static void forceAddAssetPaths(Context remoteContext, int packageId) {
+        if (packageId > REQUIRED_PACKAGE_IDENTIFIER) {
+            throw new AndroidRuntimeException(
+                    "WebLayer package ID too large, aborting: " + packageId);
+        }
         try {
             Method addAssetPath = AssetManager.class.getMethod("addAssetPath", String.class);
             String path = remoteContext.getApplicationInfo().sourceDir;
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/interfaces/ITab.aidl b/weblayer/browser/java/org/chromium/weblayer_private/interfaces/ITab.aidl
index 1bee5ef..faead03 100644
--- a/weblayer/browser/java/org/chromium/weblayer_private/interfaces/ITab.aidl
+++ b/weblayer/browser/java/org/chromium/weblayer_private/interfaces/ITab.aidl
@@ -79,8 +79,6 @@
   // Added in 88
   void setFloatingActionModeOverride(in int actionModeItemTypes) = 27;
   boolean willAutomaticallyReloadAfterCrash() = 28;
-
-  // Added in 89
   void setDesktopUserAgentEnabled(in boolean enable) = 29;
   boolean isDesktopUserAgentEnabled() = 30;
 }
diff --git a/weblayer/browser/url_bar/url_bar_controller_impl.cc b/weblayer/browser/url_bar/url_bar_controller_impl.cc
index a6ad125..81ae2d8 100644
--- a/weblayer/browser/url_bar/url_bar_controller_impl.cc
+++ b/weblayer/browser/url_bar/url_bar_controller_impl.cc
@@ -81,11 +81,6 @@
 jint UrlBarControllerImpl::GetConnectionSecurityLevel(JNIEnv* env) {
   return GetConnectionSecurityLevel();
 }
-
-jboolean UrlBarControllerImpl::ShouldShowDangerTriangleForWarningLevel(
-    JNIEnv* env) {
-  return ShouldShowDangerTriangleForWarningLevel();
-}
 #endif
 
 base::string16 UrlBarControllerImpl::GetUrlForDisplay() {
@@ -104,10 +99,6 @@
       *state, /* used_policy_installed_certificate= */ false);
 }
 
-bool UrlBarControllerImpl::ShouldShowDangerTriangleForWarningLevel() {
-  return security_state::ShouldShowDangerTriangleForWarningLevel();
-}
-
 bool UrlBarControllerImpl::GetURL(GURL* url) const {
   auto* active_web_contents = GetActiveWebContents();
   if (!active_web_contents)
diff --git a/weblayer/browser/url_bar/url_bar_controller_impl.h b/weblayer/browser/url_bar/url_bar_controller_impl.h
index c973d0d..a9ca78225 100644
--- a/weblayer/browser/url_bar/url_bar_controller_impl.h
+++ b/weblayer/browser/url_bar/url_bar_controller_impl.h
@@ -35,13 +35,11 @@
   base::android::ScopedJavaLocalRef<jstring> GetUrlForDisplay(JNIEnv* env);
   base::android::ScopedJavaLocalRef<jstring> GetPublisherUrl(JNIEnv* env);
   jint GetConnectionSecurityLevel(JNIEnv* env);
-  jboolean ShouldShowDangerTriangleForWarningLevel(JNIEnv* env);
 #endif
 
   // UrlBarController:
   base::string16 GetUrlForDisplay() override;
   security_state::SecurityLevel GetConnectionSecurityLevel() override;
-  bool ShouldShowDangerTriangleForWarningLevel() override;
 
   // LocationBarModelDelegate:
   bool GetURL(GURL* url) const override;
diff --git a/weblayer/public/java/org/chromium/weblayer/Tab.java b/weblayer/public/java/org/chromium/weblayer/Tab.java
index ca30011..75c865f 100644
--- a/weblayer/public/java/org/chromium/weblayer/Tab.java
+++ b/weblayer/public/java/org/chromium/weblayer/Tab.java
@@ -796,10 +796,10 @@
      * back/forward navigations. The tab will be reloaded with the new user agent.
      * @param enable if true requests desktop site, otherwise mobile site.
      *
-     * @since 89
+     * @since 88
      */
     public void setDesktopUserAgentEnabled(boolean enable) {
-        if (WebLayer.getSupportedMajorVersionInternal() < 89) {
+        if (WebLayer.getSupportedMajorVersionInternal() < 88) {
             throw new UnsupportedOperationException();
         }
         try {
@@ -812,10 +812,10 @@
     /**
      * Returns true if the currently loaded page used a desktop user agent.
      *
-     * @since 89
+     * @since 88
      */
     public boolean isDesktopUserAgentEnabled() {
-        if (WebLayer.getSupportedMajorVersionInternal() < 89) {
+        if (WebLayer.getSupportedMajorVersionInternal() < 88) {
             throw new UnsupportedOperationException();
         }
         try {
diff --git a/weblayer/public/url_bar_controller.h b/weblayer/public/url_bar_controller.h
index 68564d1..eb3cdda 100644
--- a/weblayer/public/url_bar_controller.h
+++ b/weblayer/public/url_bar_controller.h
@@ -19,7 +19,6 @@
   virtual ~UrlBarController() {}
   virtual base::string16 GetUrlForDisplay() = 0;
   virtual security_state::SecurityLevel GetConnectionSecurityLevel() = 0;
-  virtual bool ShouldShowDangerTriangleForWarningLevel() = 0;
 };
 
 }  // namespace weblayer