diff --git a/DEPS b/DEPS
index db62c6c..f6fc11fc 100644
--- a/DEPS
+++ b/DEPS
@@ -133,11 +133,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': 'b75be23bc485b3f87c7a2d3574ad5ec57c09ad51',
+  'skia_revision': '62b501499a648a495c2c3a4a0d500639777b2bca',
   # 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': 'ba0df1167f22ea47aff1aef9cc9ebc44320fbe8b',
+  'v8_revision': 'ea50a032a6e5e9c796e408bf2dafc14b767d9896',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -145,11 +145,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': 'fc0be0494ee791c1fa914dcd260e1d64c4b726e5',
+  'angle_revision': '3089f92e8a772ec675ea8f70ec1abca91b6b79ae',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
-  'swiftshader_revision': '390d846c3e6c44c5e78e936c07902b2c6b1665cf',
+  'swiftshader_revision': 'ac3a4a49bde9fdf764d4c4db659ad6b6ebd81da2',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
@@ -200,7 +200,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': 'b931deacdf624e10e33f8789de28f05e3ac56438',
+  'catapult_revision': '5a34ef7bdaf7e88601764c191f6ea7002b99a805',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -276,7 +276,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'quiche_revision': '6cf4d2ab35b79479428d43a65b5211c2814d8747',
+  'quiche_revision': '82d12d19ed7a93a1fe491c25e6e78ae289d45b9c',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ios_webkit
   # and whatever else without interference from each other.
@@ -806,7 +806,7 @@
 
   # Build tools for Chrome OS. Note: This depends on third_party/pyelftools.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'db2f00ebdbd640cccdf8ddf91b9995c009cfdc70',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '61aa9d9fcdcc2022297f828c06402127dc309ed3',
       'condition': 'checkout_linux',
   },
 
@@ -831,7 +831,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '867e3c9511394f5bb2f51f09278e5ccc773adc36',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '020b429fbf42915482a97b437a67b6e8398ca9fa',
 
   'src/third_party/devtools-node-modules':
     Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'),
@@ -1184,7 +1184,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' +  '4ff1283572dfd0d120ebd63eebe1189b442db23b',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' +  '3cefa2e3358b3fc2b75d97ee435025633bb8fc45',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + 'ac0d98b5cee6c024b0cffeb4f8f45b6fc5ccdb78',
@@ -1355,7 +1355,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '6f0b34abee8dba611c253738d955c59f703c147a',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '2bb3e4315d8732b612dcac5f42b34c3f4261ef08',
+    Var('webrtc_git') + '/src.git' + '@' + 'a0421d3d0cd7fac9e178900cbd59f5a2006615a2',
 
   'src/third_party/xdg-utils': {
       'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d',
@@ -1396,7 +1396,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@754d7b73cd0385866900e072289aa6d6ffd17e13',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@37691666204f287346e6a6dc50e4182b29940c39',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/browser/aw_web_contents_delegate.cc b/android_webview/browser/aw_web_contents_delegate.cc
index 67de4ea..36fbb09b 100644
--- a/android_webview/browser/aw_web_contents_delegate.cc
+++ b/android_webview/browser/aw_web_contents_delegate.cc
@@ -30,7 +30,7 @@
 #include "content/public/browser/render_widget_host.h"
 #include "content/public/browser/web_contents.h"
 #include "jni/AwWebContentsDelegate_jni.h"
-#include "net/base/escape.h"
+#include "net/base/filename_util.h"
 #include "third_party/blink/public/common/mediastream/media_stream_request.h"
 
 using base::android::AttachCurrentThread;
@@ -356,13 +356,13 @@
     GURL url(file_path_str[i]);
     if (!url.is_valid())
       continue;
-    base::FilePath path(
-        url.SchemeIsFile()
-            ? net::UnescapeURLComponent(
-                  url.path(), net::UnescapeRule::SPACES |
-                                  net::UnescapeRule::
-                                      URL_SPECIAL_CHARS_EXCEPT_PATH_SEPARATORS)
-            : file_path_str[i]);
+    base::FilePath path;
+    if (url.SchemeIsFile()) {
+      if (!net::FileURLToFilePath(url, &path))
+        continue;
+    } else {
+      path = base::FilePath(file_path_str[i]);
+    }
     auto file_info = blink::mojom::NativeFileInfo::New();
     file_info->file_path = path;
     if (!display_name_str[i].empty())
diff --git a/android_webview/browser/renderer_host/auto_login_parser.cc b/android_webview/browser/renderer_host/auto_login_parser.cc
index 2dcd715..3d613e4 100644
--- a/android_webview/browser/renderer_host/auto_login_parser.cc
+++ b/android_webview/browser/renderer_host/auto_login_parser.cc
@@ -54,10 +54,8 @@
        ++it) {
     const std::string& key = it->first;
     const std::string& value = it->second;
-    std::string unescaped_value(net::UnescapeURLComponent(
-        value,
-        net::UnescapeRule::PATH_SEPARATORS |
-            net::UnescapeRule::URL_SPECIAL_CHARS_EXCEPT_PATH_SEPARATORS));
+    std::string unescaped_value;
+    net::UnescapeBinaryURLComponent(value, &unescaped_value);
     if (key == "realm") {
       if (!MatchRealm(unescaped_value, realm_restriction))
         return false;
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContentsClientBridge.java b/android_webview/java/src/org/chromium/android_webview/AwContentsClientBridge.java
index 7564020..adfa29c 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwContentsClientBridge.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwContentsClientBridge.java
@@ -280,7 +280,7 @@
             String url, boolean isMainFrame, boolean hasUserGesture, boolean isRendererInitiated,
             String method, String[] requestHeaderNames, String[] requestHeaderValues,
             // WebResourceError
-            int errorCode, String description, boolean safebrowsingHit) {
+            @NetError int errorCode, String description, boolean safebrowsingHit) {
         AwContentsClient.AwWebResourceRequest request = new AwContentsClient.AwWebResourceRequest(
                 url, isMainFrame, hasUserGesture, method, requestHeaderNames, requestHeaderValues);
         AwContentsClient.AwWebResourceError error = new AwContentsClient.AwWebResourceError();
diff --git a/android_webview/java/src/org/chromium/android_webview/AwWebContentsObserver.java b/android_webview/java/src/org/chromium/android_webview/AwWebContentsObserver.java
index 2c41a03..5870cf4 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwWebContentsObserver.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwWebContentsObserver.java
@@ -70,7 +70,7 @@
 
     @Override
     public void didFailLoad(
-            boolean isMainFrame, int errorCode, String description, String failingUrl) {
+            boolean isMainFrame, @NetError int errorCode, String description, String failingUrl) {
         AwContentsClient client = mAwContentsClient.get();
         if (client == null) return;
         String unreachableWebDataUrl = AwContentsStatics.getUnreachableWebDataUrl();
diff --git a/android_webview/java/src/org/chromium/android_webview/ErrorCodeConversionHelper.java b/android_webview/java/src/org/chromium/android_webview/ErrorCodeConversionHelper.java
index 87c9ebe..e086b65 100644
--- a/android_webview/java/src/org/chromium/android_webview/ErrorCodeConversionHelper.java
+++ b/android_webview/java/src/org/chromium/android_webview/ErrorCodeConversionHelper.java
@@ -48,7 +48,7 @@
     // Request was identified as a bad url by safebrowsing.
     public static final int ERROR_UNSAFE_RESOURCE = WebViewClient.ERROR_UNSAFE_RESOURCE;
 
-    static int convertErrorCode(int netError) {
+    static int convertErrorCode(@NetError int netError) {
         // Note: many NetError.Error constants don't have an obvious mapping.
         // These will be handled by the default case, ERROR_UNKNOWN.
         switch (netError) {
diff --git a/android_webview/java/src/org/chromium/android_webview/SslUtil.java b/android_webview/java/src/org/chromium/android_webview/SslUtil.java
index 7355cbd2..d90270bd 100644
--- a/android_webview/java/src/org/chromium/android_webview/SslUtil.java
+++ b/android_webview/java/src/org/chromium/android_webview/SslUtil.java
@@ -22,7 +22,8 @@
     /**
      * Creates an SslError object from a chromium net error code.
      */
-    public static SslError sslErrorFromNetErrorCode(int error, SslCertificate cert, String url) {
+    public static SslError sslErrorFromNetErrorCode(
+            @NetError int error, SslCertificate cert, String url) {
         assert (error >= NetError.ERR_CERT_END && error <= NetError.ERR_CERT_COMMON_NAME_INVALID);
         switch(error) {
             case NetError.ERR_CERT_COMMON_NAME_INVALID:
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 733ab4e..f03ec4e 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -1322,6 +1322,7 @@
     "//ash/assistant/ui",
     "//ash/assistant/ui:constants",
     "//ash/assistant/util",
+    "//ash/autotest",
     "//ash/components/cursor",
     "//ash/components/fast_ink",
     "//ash/components/shortcut_viewer/public/mojom",
@@ -1461,6 +1462,7 @@
   ]
 
   allow_circular_includes_from = [
+    "//ash/autotest",
     "//components/exo",
     "//components/exo/wayland",
   ]
diff --git a/ash/autotest/BUILD.gn b/ash/autotest/BUILD.gn
new file mode 100644
index 0000000..25d4d7d
--- /dev/null
+++ b/ash/autotest/BUILD.gn
@@ -0,0 +1,19 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# Only include files that are needed for JS autotest / integration tests.
+
+assert(is_chromeos)
+
+source_set("autotest") {
+  sources = [
+    "shelf_integration_test_api.cc",
+    "shelf_integration_test_api.h",
+  ]
+
+  deps = [
+    "//ash/public/cpp",
+    "//base",
+  ]
+}
diff --git a/ash/autotest/README.md b/ash/autotest/README.md
new file mode 100644
index 0000000..110c07e
--- /dev/null
+++ b/ash/autotest/README.md
@@ -0,0 +1,6 @@
+Autotest
+--------
+This directory contains files that are needed for JS autotest APIs, and/or any
+other integration tests.
+These files are part of release builds, but the API / Mojo service is only
+enabled if the "--use-test-config" switch is passed to Chrome.
diff --git a/ash/autotest/shelf_integration_test_api.cc b/ash/autotest/shelf_integration_test_api.cc
new file mode 100644
index 0000000..bf0057a
--- /dev/null
+++ b/ash/autotest/shelf_integration_test_api.cc
@@ -0,0 +1,72 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/autotest/shelf_integration_test_api.h"
+
+#include <memory>
+#include <utility>
+
+#include "ash/root_window_controller.h"
+#include "ash/shelf/shelf.h"
+#include "ash/shell.h"
+#include "mojo/public/cpp/bindings/strong_binding.h"
+
+namespace ash {
+
+namespace {
+
+// Returns the Shelf instance for the display with the given |display_id|.
+Shelf* GetShelfForDisplay(int64_t display_id) {
+  // The controller may be null for invalid ids or for displays being removed.
+  RootWindowController* root_window_controller =
+      Shell::GetRootWindowControllerWithDisplayId(display_id);
+  return root_window_controller ? root_window_controller->shelf() : nullptr;
+}
+}  // namespace
+
+ShelfIntegrationTestApi::ShelfIntegrationTestApi() = default;
+ShelfIntegrationTestApi::~ShelfIntegrationTestApi() = default;
+
+// static
+void ShelfIntegrationTestApi::BindRequest(
+    mojom::ShelfIntegrationTestApiRequest request) {
+  mojo::MakeStrongBinding(std::make_unique<ShelfIntegrationTestApi>(),
+                          std::move(request));
+}
+
+void ShelfIntegrationTestApi::GetAutoHideBehavior(
+    int64_t display_id,
+    GetAutoHideBehaviorCallback callback) {
+  Shelf* shelf = GetShelfForDisplay(display_id);
+  DCHECK(shelf);
+  std::move(callback).Run(shelf->auto_hide_behavior());
+}
+
+void ShelfIntegrationTestApi::SetAutoHideBehavior(
+    int64_t display_id,
+    ShelfAutoHideBehavior behavior,
+    SetAutoHideBehaviorCallback callback) {
+  Shelf* shelf = GetShelfForDisplay(display_id);
+  DCHECK(shelf);
+  shelf->SetAutoHideBehavior(behavior);
+  std::move(callback).Run();
+}
+
+void ShelfIntegrationTestApi::GetAlignment(int64_t display_id,
+                                           GetAlignmentCallback callback) {
+  Shelf* shelf = GetShelfForDisplay(display_id);
+  DCHECK(shelf);
+  std::move(callback).Run(shelf->alignment());
+}
+
+void ShelfIntegrationTestApi::SetAlignment(int64_t display_id,
+                                           ShelfAlignment alignment,
+                                           SetAlignmentCallback callback) {
+  Shelf* shelf = GetShelfForDisplay(display_id);
+  DCHECK(shelf);
+  shelf->SetAlignment(alignment);
+  std::move(callback).Run();
+}
+
+}  // namespace ash
diff --git a/ash/autotest/shelf_integration_test_api.h b/ash/autotest/shelf_integration_test_api.h
new file mode 100644
index 0000000..07bef13
--- /dev/null
+++ b/ash/autotest/shelf_integration_test_api.h
@@ -0,0 +1,42 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_AUTOTEST_SHELF_INTEGRATION_TEST_API_H_
+#define ASH_AUTOTEST_SHELF_INTEGRATION_TEST_API_H_
+
+#include "ash/ash_export.h"
+#include "ash/public/interfaces/shelf_integration_test_api.mojom.h"
+#include "base/macros.h"
+
+namespace ash {
+
+// Allows tests to access private state of the shelf.
+class ASH_EXPORT ShelfIntegrationTestApi
+    : public mojom::ShelfIntegrationTestApi {
+ public:
+  // Binds the mojom::ShelfIntegrationTestApiRequest interface request to this
+  // object.
+  static void BindRequest(mojom::ShelfIntegrationTestApiRequest request);
+
+  ShelfIntegrationTestApi();
+  ~ShelfIntegrationTestApi() override;
+
+  // mojom::ShelfIntegrationTestApi:
+  void GetAutoHideBehavior(int64_t display_id,
+                           GetAutoHideBehaviorCallback callback) override;
+  void SetAutoHideBehavior(int64_t display_id,
+                           ShelfAutoHideBehavior behavior,
+                           SetAutoHideBehaviorCallback callback) override;
+  void GetAlignment(int64_t display_id, GetAlignmentCallback callback) override;
+  void SetAlignment(int64_t display_id,
+                    ShelfAlignment behavior,
+                    SetAlignmentCallback callback) override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ShelfIntegrationTestApi);
+};
+
+}  // namespace ash
+
+#endif  // ASH_AUTOTEST_SHELF_INTEGRATION_TEST_API_H_
diff --git a/ash/login/login_screen_test_api.cc b/ash/login/login_screen_test_api.cc
index 27229acb..b2018b1f 100644
--- a/ash/login/login_screen_test_api.cc
+++ b/ash/login/login_screen_test_api.cc
@@ -213,6 +213,12 @@
   std::move(callback).Run(view && view->SimulateAddUserButtonForTesting());
 }
 
+void LoginScreenTestApi::ClickGuestButton(ClickGuestButtonCallback callback) {
+  LoginShelfView* view = GetLoginShelfView();
+
+  std::move(callback).Run(view && view->SimulateGuestButtonForTesting());
+}
+
 void LoginScreenTestApi::WaitForUiUpdate(int64_t previous_update_count,
                                          WaitForUiUpdateCallback callback) {
   LoginShelfView* view = GetLoginShelfView();
diff --git a/ash/login/login_screen_test_api.h b/ash/login/login_screen_test_api.h
index 88fdfe9..249141d 100644
--- a/ash/login/login_screen_test_api.h
+++ b/ash/login/login_screen_test_api.h
@@ -37,6 +37,7 @@
   void LaunchApp(const std::string& app_id,
                  LaunchAppCallback callback) override;
   void ClickAddUserButton(ClickAddUserButtonCallback callback) override;
+  void ClickGuestButton(ClickGuestButtonCallback callback) override;
   // This blocks until UI update number becomes greater than the
   // |previous_update_count|.  Where |previous_update_count| presumably is
   // coming from GetUiUpdateCount().  This way test remembers the "current" UI
diff --git a/ash/mojo_interface_factory.cc b/ash/mojo_interface_factory.cc
index f113ad3b..1add1f15 100644
--- a/ash/mojo_interface_factory.cc
+++ b/ash/mojo_interface_factory.cc
@@ -15,6 +15,7 @@
 #include "ash/assistant/assistant_notification_controller.h"
 #include "ash/assistant/assistant_screen_context_controller.h"
 #include "ash/assistant/assistant_setup_controller.h"
+#include "ash/autotest/shelf_integration_test_api.h"
 #include "ash/cast_config_controller.h"
 #include "ash/custom_tab/arc_custom_tab_controller.h"
 #include "ash/display/ash_display_controller.h"
@@ -51,9 +52,11 @@
 #include "ash/wm/splitview/split_view_controller.h"
 #include "ash/wm/tablet_mode/tablet_mode_controller.h"
 #include "base/bind.h"
+#include "base/command_line.h"
 #include "base/lazy_instance.h"
 #include "base/single_thread_task_runner.h"
 #include "chromeos/constants/chromeos_switches.h"
+#include "services/ws/common/switches.h"
 #include "ui/keyboard/keyboard_controller.h"
 
 namespace ash {
@@ -235,6 +238,11 @@
   Shell::Get()->shelf_controller()->BindRequest(std::move(request));
 }
 
+void BindShelfIntegrationTestApiRequestOnMainThread(
+    mojom::ShelfIntegrationTestApiRequest request) {
+  ShelfIntegrationTestApi::BindRequest(std::move(request));
+}
+
 void BindShutdownControllerRequestOnMainThread(
     mojom::ShutdownControllerRequest request) {
   Shell::Get()->shutdown_controller()->BindRequest(std::move(request));
@@ -404,6 +412,13 @@
   registry->AddInterface(base::BindRepeating(&BindSplitViewRequestOnMainThread),
                          main_thread_task_runner);
 
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+          ws::switches::kUseTestConfig)) {
+    registry->AddInterface(
+        base::BindRepeating(&BindShelfIntegrationTestApiRequestOnMainThread),
+        main_thread_task_runner);
+  }
+
   // Inject additional optional interfaces.
   if (g_register_interfaces_callback.Get()) {
     std::move(g_register_interfaces_callback.Get())
diff --git a/ash/public/cpp/manifest.cc b/ash/public/cpp/manifest.cc
index 902003e..8e0d3ade 100644
--- a/ash/public/cpp/manifest.cc
+++ b/ash/public/cpp/manifest.cc
@@ -34,6 +34,7 @@
 #include "ash/public/interfaces/process_creation_time_recorder.mojom.h"
 #include "ash/public/interfaces/session_controller.mojom.h"
 #include "ash/public/interfaces/shelf.mojom.h"
+#include "ash/public/interfaces/shelf_integration_test_api.mojom.h"
 #include "ash/public/interfaces/shutdown.mojom.h"
 #include "ash/public/interfaces/split_view.mojom.h"
 #include "ash/public/interfaces/system_tray.mojom.h"
@@ -105,6 +106,8 @@
           .ExposeCapability("display", service_manager::Manifest::InterfaceList<
                                            mojom::AshDisplayController,
                                            mojom::DisplayOutputProtection>())
+          .ExposeCapability("test", service_manager::Manifest::InterfaceList<
+                                        mojom::ShelfIntegrationTestApi>())
           .RequireCapability("*", "accessibility")
           .RequireCapability("*", "app")
           .RequireCapability(prefs::mojom::kLocalStateServiceName,
diff --git a/ash/public/cpp/shelf_integration_test_api_struct_mojom_traits.h b/ash/public/cpp/shelf_integration_test_api_struct_mojom_traits.h
new file mode 100644
index 0000000..b045ad4b
--- /dev/null
+++ b/ash/public/cpp/shelf_integration_test_api_struct_mojom_traits.h
@@ -0,0 +1,88 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_PUBLIC_CPP_SHELF_INTEGRATION_TEST_API_STRUCT_MOJOM_TRAITS_H_
+#define ASH_PUBLIC_CPP_SHELF_INTEGRATION_TEST_API_STRUCT_MOJOM_TRAITS_H_
+
+#include "ash/public/interfaces/shelf_integration_test_api.mojom-shared.h"
+
+namespace mojo {
+template <>
+struct EnumTraits<ash::mojom::ShelfAutoHideBehavior,
+                  ash::ShelfAutoHideBehavior> {
+  static ash::mojom::ShelfAutoHideBehavior ToMojom(
+      ash::ShelfAutoHideBehavior input) {
+    switch (input) {
+      case ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS:
+        return ash::mojom::ShelfAutoHideBehavior::
+            SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS;
+      case ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER:
+        return ash::mojom::ShelfAutoHideBehavior::
+            SHELF_AUTO_HIDE_BEHAVIOR_NEVER;
+      case ash::SHELF_AUTO_HIDE_ALWAYS_HIDDEN:
+        return ash::mojom::ShelfAutoHideBehavior::SHELF_AUTO_HIDE_ALWAYS_HIDDEN;
+    }
+    NOTREACHED();
+    return ash::mojom::ShelfAutoHideBehavior::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS;
+  }
+
+  static bool FromMojom(ash::mojom::ShelfAutoHideBehavior input,
+                        ash::ShelfAutoHideBehavior* out) {
+    switch (input) {
+      case ash::mojom::ShelfAutoHideBehavior::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS:
+        *out = ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS;
+        return true;
+      case ash::mojom::ShelfAutoHideBehavior::SHELF_AUTO_HIDE_BEHAVIOR_NEVER:
+        *out = ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER;
+        return true;
+      case ash::mojom::ShelfAutoHideBehavior::SHELF_AUTO_HIDE_ALWAYS_HIDDEN:
+        *out = ash::SHELF_AUTO_HIDE_ALWAYS_HIDDEN;
+        return true;
+    }
+    NOTREACHED();
+    return false;
+  }
+};
+
+template <>
+struct EnumTraits<ash::mojom::ShelfAlignment, ash::ShelfAlignment> {
+  static ash::mojom::ShelfAlignment ToMojom(ash::ShelfAlignment input) {
+    switch (input) {
+      case ash::SHELF_ALIGNMENT_BOTTOM:
+        return ash::mojom::ShelfAlignment::SHELF_ALIGNMENT_BOTTOM;
+      case ash::SHELF_ALIGNMENT_LEFT:
+        return ash::mojom::ShelfAlignment::SHELF_ALIGNMENT_LEFT;
+      case ash::SHELF_ALIGNMENT_RIGHT:
+        return ash::mojom::ShelfAlignment::SHELF_ALIGNMENT_RIGHT;
+      case ash::SHELF_ALIGNMENT_BOTTOM_LOCKED:
+        return ash::mojom::ShelfAlignment::SHELF_ALIGNMENT_BOTTOM_LOCKED;
+    }
+    NOTREACHED();
+    return ash::mojom::ShelfAlignment::SHELF_ALIGNMENT_BOTTOM;
+  }
+
+  static bool FromMojom(ash::mojom::ShelfAlignment input,
+                        ash::ShelfAlignment* out) {
+    switch (input) {
+      case ash::mojom::ShelfAlignment::SHELF_ALIGNMENT_BOTTOM:
+        *out = ash::SHELF_ALIGNMENT_BOTTOM;
+        return true;
+      case ash::mojom::ShelfAlignment::SHELF_ALIGNMENT_LEFT:
+        *out = ash::SHELF_ALIGNMENT_LEFT;
+        return true;
+      case ash::mojom::ShelfAlignment::SHELF_ALIGNMENT_RIGHT:
+        *out = ash::SHELF_ALIGNMENT_RIGHT;
+        return true;
+      case ash::mojom::ShelfAlignment::SHELF_ALIGNMENT_BOTTOM_LOCKED:
+        *out = ash::SHELF_ALIGNMENT_BOTTOM_LOCKED;
+        return true;
+    }
+    NOTREACHED();
+    return false;
+  }
+};
+
+}  // namespace mojo
+
+#endif  // ASH_PUBLIC_CPP_SHELF_INTEGRATION_TEST_API_STRUCT_MOJOM_TRAITS_H_
diff --git a/ash/public/cpp/shelf_struct_mojom_traits.h b/ash/public/cpp/shelf_struct_mojom_traits.h
index 4760c56..093f9e8 100644
--- a/ash/public/cpp/shelf_struct_mojom_traits.h
+++ b/ash/public/cpp/shelf_struct_mojom_traits.h
@@ -189,43 +189,6 @@
 };
 
 template <>
-struct EnumTraits<ash::mojom::ShelfAutoHideBehavior,
-                  ash::ShelfAutoHideBehavior> {
-  static ash::mojom::ShelfAutoHideBehavior ToMojom(
-      ash::ShelfAutoHideBehavior input) {
-    switch (input) {
-      case ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS:
-        return ash::mojom::ShelfAutoHideBehavior::
-            SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS;
-      case ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER:
-        return ash::mojom::ShelfAutoHideBehavior::
-            SHELF_AUTO_HIDE_BEHAVIOR_NEVER;
-      case ash::SHELF_AUTO_HIDE_ALWAYS_HIDDEN:
-        return ash::mojom::ShelfAutoHideBehavior::SHELF_AUTO_HIDE_ALWAYS_HIDDEN;
-    }
-    NOTREACHED();
-    return ash::mojom::ShelfAutoHideBehavior::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS;
-  }
-
-  static bool FromMojom(ash::mojom::ShelfAutoHideBehavior input,
-                        ash::ShelfAutoHideBehavior* out) {
-    switch (input) {
-      case ash::mojom::ShelfAutoHideBehavior::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS:
-        *out = ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS;
-        return true;
-      case ash::mojom::ShelfAutoHideBehavior::SHELF_AUTO_HIDE_BEHAVIOR_NEVER:
-        *out = ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER;
-        return true;
-      case ash::mojom::ShelfAutoHideBehavior::SHELF_AUTO_HIDE_ALWAYS_HIDDEN:
-        *out = ash::SHELF_AUTO_HIDE_ALWAYS_HIDDEN;
-        return true;
-    }
-    NOTREACHED();
-    return false;
-  }
-};
-
-template <>
 struct ASH_PUBLIC_EXPORT
     StructTraits<ash::mojom::ShelfIDDataView, ash::ShelfID> {
   static const std::string& app_id(const ash::ShelfID& i) { return i.app_id; }
diff --git a/ash/public/interfaces/BUILD.gn b/ash/public/interfaces/BUILD.gn
index 9ed9614..608f881 100644
--- a/ash/public/interfaces/BUILD.gn
+++ b/ash/public/interfaces/BUILD.gn
@@ -57,6 +57,7 @@
     "process_creation_time_recorder.mojom",
     "session_controller.mojom",
     "shelf.mojom",
+    "shelf_integration_test_api.mojom",
     "shutdown.mojom",
     "split_view.mojom",
     "system_tray.mojom",
diff --git a/ash/public/interfaces/login_screen_test_api.test-mojom b/ash/public/interfaces/login_screen_test_api.test-mojom
index 9bd2fb2c..eeab1ae1 100644
--- a/ash/public/interfaces/login_screen_test_api.test-mojom
+++ b/ash/public/interfaces/login_screen_test_api.test-mojom
@@ -43,6 +43,10 @@
   // Returns true if request was successful.
   ClickAddUserButton() => (bool success);
 
+  // Simulate click on the guest login button.
+  // Returns whether the request was succesful.
+  ClickGuestButton() => (bool success);
+
   // Blocks until UI update counter is greated than |previous_update_count|.
   // Returns true on success, false on error.
   WaitForUiUpdate(int64 previous_update_count) => (bool success);
diff --git a/ash/public/interfaces/shelf.mojom b/ash/public/interfaces/shelf.mojom
index 9ca03f8..b048e03 100644
--- a/ash/public/interfaces/shelf.mojom
+++ b/ash/public/interfaces/shelf.mojom
@@ -9,13 +9,6 @@
 import "ui/events/mojo/event.mojom";
 import "ui/gfx/image/mojo/image.mojom";
 
-// These values match ash::ShelfAutoHideBehavior.
-enum ShelfAutoHideBehavior {
-  SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS,  // Always auto-hide.
-  SHELF_AUTO_HIDE_BEHAVIOR_NEVER,   // Never auto-hide.
-  SHELF_AUTO_HIDE_ALWAYS_HIDDEN,    // Always hide.
-};
-
 // The actions that may be performed when a shelf item is selected.
 // These values match ash::ShelfAction.
 enum ShelfAction {
@@ -82,17 +75,6 @@
   UpdateShelfItem(ShelfItem item);
   // Sets the |delegate| for the item with |id|.
   SetShelfItemDelegate(ShelfID id, ShelfItemDelegate delegate);
-  // Returns the auto hide behavior. For testing only.
-  // |display_id| represents the display that contains the shelf. |display_id|
-  // must be valid.
-  GetAutoHideBehaviorForTesting(int64 display_id)
-                                => (ShelfAutoHideBehavior behavior);
-  // Sets the auto hide behavior. For testing only.
-  // |display_id| represents the display that contains the shelf. |display_id|
-  // must be valid.
-  // |behavior| is the new behavior.
-  SetAutoHideBehaviorForTesting(int64 display_id,
-                                ShelfAutoHideBehavior behavior) => ();
 };
 
 // A Shelf observer, used to persist profile settings and cache a ShelfModel.
diff --git a/ash/public/interfaces/shelf.typemap b/ash/public/interfaces/shelf.typemap
index fd6161b..e25b71e 100644
--- a/ash/public/interfaces/shelf.typemap
+++ b/ash/public/interfaces/shelf.typemap
@@ -17,8 +17,6 @@
 ]
 type_mappings = [
   "ash.mojom.ShelfAction=ash::ShelfAction",
-  "ash.mojom.ShelfAlignment=ash::ShelfAlignment",
-  "ash.mojom.ShelfAutoHideBehavior=ash::ShelfAutoHideBehavior",
   "ash.mojom.ShelfID=ash::ShelfID",
   "ash.mojom.ShelfItem=ash::ShelfItem",
   "ash.mojom.ShelfItemStatus=ash::ShelfItemStatus",
diff --git a/ash/public/interfaces/shelf_integration_test_api.mojom b/ash/public/interfaces/shelf_integration_test_api.mojom
new file mode 100644
index 0000000..43bf312
--- /dev/null
+++ b/ash/public/interfaces/shelf_integration_test_api.mojom
@@ -0,0 +1,50 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module ash.mojom;
+
+// These values match ash::ShelfAutoHideBehavior.
+enum ShelfAutoHideBehavior {
+  SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS,  // Always auto-hide.
+  SHELF_AUTO_HIDE_BEHAVIOR_NEVER,   // Never auto-hide.
+  SHELF_AUTO_HIDE_ALWAYS_HIDDEN,    // Always hide.
+};
+
+// These values match ash::ShelfAlignment.
+enum ShelfAlignment {
+  SHELF_ALIGNMENT_BOTTOM,         // Bottom alignment.
+  SHELF_ALIGNMENT_LEFT,           // Left alignment.
+  SHELF_ALIGNMENT_RIGHT,          // Right alignment.
+  SHELF_ALIGNMENT_BOTTOM_LOCKED,  // Bottom alignment, set temporarily and not
+                                  // saved to preferences.
+};
+
+// Test interface used to interact with the Shelf from integration tests.
+// Note this interface applies the shelf properties from the call
+// arguments and might be lost if tests do something that triggers
+// applying shelf properties from prefs, such as switching user,
+// entering/exiting tablet mode, changing display config, etc.
+interface ShelfIntegrationTestApi {
+  // Returns the auto hide behavior.
+  // |display_id| represents the display that contains the shelf. |display_id|
+  // must be valid.
+  GetAutoHideBehavior(int64 display_id) => (ShelfAutoHideBehavior behavior);
+
+  // Sets the auto hide behavior.
+  // |display_id| represents the display that contains the shelf. |display_id|
+  // must be valid.
+  // |behavior| is the new behavior.
+  SetAutoHideBehavior(int64 display_id, ShelfAutoHideBehavior behavior) => ();
+
+  // Sets the alignment.
+  // |display_id| represents the display that contains the shelf. |display_id|
+  // must be valid.
+  // |alignment| is the new alignment.
+  SetAlignment(int64 display_id, ShelfAlignment alignment) => ();
+
+  // Returns the alignment.
+  // |display_id| represents the display that contains the shelf. |display_id|
+  // must be valid.
+  GetAlignment(int64 display_id) => (ShelfAlignment alignment);
+};
diff --git a/ash/public/interfaces/shelf_integration_test_api.typemap b/ash/public/interfaces/shelf_integration_test_api.typemap
new file mode 100644
index 0000000..b0af960
--- /dev/null
+++ b/ash/public/interfaces/shelf_integration_test_api.typemap
@@ -0,0 +1,13 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+mojom = "//ash/public/interfaces/shelf_integration_test_api.mojom"
+public_headers = [ "//ash/public/cpp/shelf_types.h" ]
+traits_headers =
+    [ "//ash/public/cpp/shelf_integration_test_api_struct_mojom_traits.h" ]
+
+type_mappings = [
+  "ash.mojom.ShelfAlignment=ash::ShelfAlignment",
+  "ash.mojom.ShelfAutoHideBehavior=ash::ShelfAutoHideBehavior",
+]
diff --git a/ash/public/interfaces/typemaps.gni b/ash/public/interfaces/typemaps.gni
index b02bb8a..548ac84 100644
--- a/ash/public/interfaces/typemaps.gni
+++ b/ash/public/interfaces/typemaps.gni
@@ -7,6 +7,7 @@
   "//ash/public/interfaces/menu.typemap",
   "//ash/public/interfaces/session_controller.typemap",
   "//ash/public/interfaces/shelf.typemap",
+  "//ash/public/interfaces/shelf_integration_test_api.typemap",
   "//ash/public/interfaces/user_info.typemap",
   "//ash/public/interfaces/wallpaper.typemap",
 ]
diff --git a/ash/shelf/login_shelf_view.cc b/ash/shelf/login_shelf_view.cc
index 810561c..c3332b4 100644
--- a/ash/shelf/login_shelf_view.cc
+++ b/ash/shelf/login_shelf_view.cc
@@ -532,6 +532,15 @@
   return true;
 }
 
+bool LoginShelfView::SimulateGuestButtonForTesting() {
+  views::View* guest_login_button = GetViewByID(kBrowseAsGuest);
+  if (!guest_login_button->enabled())
+    return false;
+
+  Shell::Get()->login_screen_controller()->LoginAsGuest();
+  return true;
+}
+
 void LoginShelfView::InstallTestUiUpdateDelegate(
     std::unique_ptr<TestUiUpdateDelegate> delegate) {
   DCHECK(!test_ui_update_delegate_.get());
diff --git a/ash/shelf/login_shelf_view.h b/ash/shelf/login_shelf_view.h
index 716f81b4..c48a073 100644
--- a/ash/shelf/login_shelf_view.h
+++ b/ash/shelf/login_shelf_view.h
@@ -118,6 +118,7 @@
   // clickable).
   bool LaunchAppForTesting(const std::string& app_id);
   bool SimulateAddUserButtonForTesting();
+  bool SimulateGuestButtonForTesting();
 
   // Adds test delegate. Delegate will become owned by LoginShelfView.
   void InstallTestUiUpdateDelegate(
diff --git a/ash/shelf/shelf_controller.cc b/ash/shelf/shelf_controller.cc
index 8b4360b..a6326d4 100644
--- a/ash/shelf/shelf_controller.cc
+++ b/ash/shelf/shelf_controller.cc
@@ -266,24 +266,6 @@
     model_.SetShelfItemDelegate(id, nullptr);
 }
 
-void ShelfController::GetAutoHideBehaviorForTesting(
-    int64_t display_id,
-    GetAutoHideBehaviorForTestingCallback callback) {
-  Shelf* shelf = GetShelfForDisplay(display_id);
-  DCHECK(shelf);
-  std::move(callback).Run(shelf->auto_hide_behavior());
-}
-
-void ShelfController::SetAutoHideBehaviorForTesting(
-    int64_t display_id,
-    ShelfAutoHideBehavior behavior,
-    SetAutoHideBehaviorForTestingCallback callback) {
-  Shelf* shelf = GetShelfForDisplay(display_id);
-  DCHECK(shelf);
-  shelf->SetAutoHideBehavior(behavior);
-  std::move(callback).Run();
-}
-
 void ShelfController::ShelfItemAdded(int index) {
   if (applying_remote_shelf_model_changes_)
     return;
diff --git a/ash/shelf/shelf_controller.h b/ash/shelf/shelf_controller.h
index 4afe6b1..7413a325 100644
--- a/ash/shelf/shelf_controller.h
+++ b/ash/shelf/shelf_controller.h
@@ -62,14 +62,6 @@
   void UpdateShelfItem(const ShelfItem& item) override;
   void SetShelfItemDelegate(const ShelfID& id,
                             mojom::ShelfItemDelegatePtr delegate) override;
-  void GetAutoHideBehaviorForTesting(
-      int64_t display_id,
-      GetAutoHideBehaviorForTestingCallback callback) override;
-  void SetAutoHideBehaviorForTesting(
-      int64_t display_id,
-      ShelfAutoHideBehavior behavior,
-      SetAutoHideBehaviorForTestingCallback callback) override;
-
   // ShelfModelObserver:
   void ShelfItemAdded(int index) override;
   void ShelfItemRemoved(int index, const ShelfItem& old_item) override;
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 535677d..631f415c 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -2273,6 +2273,19 @@
   }
 }
 
+source_set("base_stack_sampling_profiler_test_util") {
+  testonly = true
+  sources = [
+    "profiler/stack_sampling_profiler_test_util.cc",
+    "profiler/stack_sampling_profiler_test_util.h",
+  ]
+  deps = [
+    ":base",
+    "//base/test:test_support",
+    "//testing/gtest",
+  ]
+}
+
 bundle_data("base_unittests_bundle_data") {
   testonly = true
   sources = [
@@ -2730,6 +2743,7 @@
 
   deps = [
     ":base",
+    ":base_stack_sampling_profiler_test_util",
     ":base_unittests_tasktraits",
     ":i18n",
     ":sanitizer_buildflags",
diff --git a/base/android/java/src/org/chromium/base/FileUtils.java b/base/android/java/src/org/chromium/base/FileUtils.java
index 1858b220..5ceded4 100644
--- a/base/android/java/src/org/chromium/base/FileUtils.java
+++ b/base/android/java/src/org/chromium/base/FileUtils.java
@@ -5,10 +5,15 @@
 package org.chromium.base;
 
 import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
 import android.net.Uri;
+import android.os.ParcelFileDescriptor;
+import android.support.annotation.Nullable;
 
 import java.io.BufferedOutputStream;
 import java.io.File;
+import java.io.FileDescriptor;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -152,4 +157,30 @@
         if (index == -1) return "";
         return file.substring(index + 1).toLowerCase(Locale.US);
     }
+
+    /** Queries and decodes bitmap from content provider. */
+    @Nullable
+    public static Bitmap queryBitmapFromContentProvider(Context context, Uri uri) {
+        try (ParcelFileDescriptor parcelFileDescriptor =
+                        context.getContentResolver().openFileDescriptor(uri, "r")) {
+            if (parcelFileDescriptor == null) {
+                Log.w(TAG, "Null ParcelFileDescriptor from uri " + uri);
+                return null;
+            }
+            FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
+            if (fileDescriptor == null) {
+                Log.w(TAG, "Null FileDescriptor from uri " + uri);
+                return null;
+            }
+            Bitmap bitmap = BitmapFactory.decodeFileDescriptor(fileDescriptor);
+            if (bitmap == null) {
+                Log.w(TAG, "Failed to decode image from uri " + uri);
+                return null;
+            }
+            return bitmap;
+        } catch (IOException e) {
+            Log.w(TAG, "IO exception when reading uri " + uri);
+        }
+        return null;
+    }
 }
diff --git a/base/profiler/stack_sampling_profiler_test_util.cc b/base/profiler/stack_sampling_profiler_test_util.cc
new file mode 100644
index 0000000..d0fbaf7
--- /dev/null
+++ b/base/profiler/stack_sampling_profiler_test_util.cc
@@ -0,0 +1,240 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/profiler/stack_sampling_profiler_test_util.h"
+
+#include "base/callback.h"
+#include "base/compiler_specific.h"
+#include "base/location.h"
+#include "base/profiler/stack_sampling_profiler.h"
+#include "base/strings/stringprintf.h"
+#include "base/test/bind_test_util.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace base {
+
+namespace {
+
+// A profile builder for test use that expects to receive exactly one sample.
+class TestProfileBuilder : public ProfileBuilder {
+ public:
+  // The callback is passed the last sample recorded.
+  using CompletedCallback = OnceCallback<void(std::vector<Frame>)>;
+
+  TestProfileBuilder(ModuleCache* module_cache, CompletedCallback callback)
+      : module_cache_(module_cache), callback_(std::move(callback)) {}
+
+  ~TestProfileBuilder() override = default;
+
+  TestProfileBuilder(const TestProfileBuilder&) = delete;
+  TestProfileBuilder& operator=(const TestProfileBuilder&) = delete;
+
+  // ProfileBuilder:
+  ModuleCache* GetModuleCache() override { return module_cache_; }
+  void RecordMetadata() override {}
+
+  void OnSampleCompleted(std::vector<Frame> sample) override {
+    EXPECT_TRUE(sample_.empty());
+    sample_ = std::move(sample);
+  }
+
+  void OnProfileCompleted(TimeDelta profile_duration,
+                          TimeDelta sampling_period) override {
+    EXPECT_FALSE(sample_.empty());
+    std::move(callback_).Run(std::move(sample_));
+  }
+
+ private:
+  ModuleCache* const module_cache_;
+  CompletedCallback callback_;
+  std::vector<Frame> sample_;
+};
+
+}  // namespace
+
+TargetThread::TargetThread(const Closure& to_run) : to_run_(to_run) {}
+
+TargetThread::~TargetThread() = default;
+
+void TargetThread::ThreadMain() {
+  id_ = PlatformThread::CurrentId();
+  to_run_.Run();
+}
+
+UnwindScenario::UnwindScenario(const SetupFunction& setup_function)
+    : setup_function_(setup_function) {}
+
+UnwindScenario::~UnwindScenario() = default;
+
+FunctionAddressRange UnwindScenario::GetWaitForSampleAddressRange() const {
+  return WaitForSample(nullptr);
+}
+
+FunctionAddressRange UnwindScenario::GetSetupFunctionAddressRange() const {
+  return setup_function_.Run(Closure());
+}
+
+FunctionAddressRange UnwindScenario::GetOuterFunctionAddressRange() const {
+  return InvokeSetupFunction(SetupFunction(), nullptr);
+}
+
+void UnwindScenario::Execute(SampleEvents* events) {
+  InvokeSetupFunction(setup_function_, events);
+}
+
+// static
+// Disable inlining for this function so that it gets its own stack frame.
+NOINLINE FunctionAddressRange
+UnwindScenario::InvokeSetupFunction(const SetupFunction& setup_function,
+                                    SampleEvents* events) {
+  const void* start_program_counter = GetProgramCounter();
+
+  if (!setup_function.is_null()) {
+    const auto wait_for_sample_closure =
+        BindLambdaForTesting([&]() { UnwindScenario::WaitForSample(events); });
+    setup_function.Run(wait_for_sample_closure);
+  }
+
+  // Volatile to prevent a tail call to GetProgramCounter().
+  const void* volatile end_program_counter = GetProgramCounter();
+  return {start_program_counter, end_program_counter};
+}
+
+// static
+// Disable inlining for this function so that it gets its own stack frame.
+NOINLINE FunctionAddressRange
+UnwindScenario::WaitForSample(SampleEvents* events) {
+  const void* start_program_counter = GetProgramCounter();
+
+  if (events) {
+    events->ready_for_sample.Signal();
+    events->sample_finished.Wait();
+  }
+
+  // Volatile to prevent a tail call to GetProgramCounter().
+  const void* volatile end_program_counter = GetProgramCounter();
+  return {start_program_counter, end_program_counter};
+}
+
+// Disable inlining for this function so that it gets its own stack frame.
+NOINLINE FunctionAddressRange
+CallWithPlainFunction(const Closure& wait_for_sample) {
+  const void* start_program_counter = GetProgramCounter();
+
+  if (!wait_for_sample.is_null())
+    wait_for_sample.Run();
+
+  // Volatile to prevent a tail call to GetProgramCounter().
+  const void* volatile end_program_counter = GetProgramCounter();
+  return {start_program_counter, end_program_counter};
+}
+
+void WithTargetThread(UnwindScenario* scenario,
+                      ProfileCallback profile_callback) {
+  UnwindScenario::SampleEvents events;
+  TargetThread target_thread(
+      BindLambdaForTesting([&]() { scenario->Execute(&events); }));
+
+  PlatformThreadHandle target_thread_handle;
+  EXPECT_TRUE(PlatformThread::Create(0, &target_thread, &target_thread_handle));
+
+  events.ready_for_sample.Wait();
+
+  std::move(profile_callback).Run(target_thread.id());
+
+  events.sample_finished.Signal();
+
+  PlatformThread::Join(target_thread_handle);
+}
+
+std::vector<Frame> SampleScenario(UnwindScenario* scenario,
+                                  ModuleCache* module_cache) {
+  StackSamplingProfiler::SamplingParams params;
+  params.sampling_interval = TimeDelta::FromMilliseconds(0);
+  params.samples_per_profile = 1;
+
+  std::vector<Frame> sample;
+  WithTargetThread(
+      scenario, BindLambdaForTesting([&](PlatformThreadId target_thread_id) {
+        WaitableEvent sampling_thread_completed(
+            WaitableEvent::ResetPolicy::MANUAL,
+            WaitableEvent::InitialState::NOT_SIGNALED);
+        StackSamplingProfiler profiler(
+            target_thread_id, params,
+            std::make_unique<TestProfileBuilder>(
+                module_cache,
+                BindLambdaForTesting([&sample, &sampling_thread_completed](
+                                         std::vector<Frame> result_sample) {
+                  sample = std::move(result_sample);
+                  sampling_thread_completed.Signal();
+                })));
+        profiler.Start();
+        sampling_thread_completed.Wait();
+      }));
+
+  return sample;
+}
+
+std::string FormatSampleForDiagnosticOutput(const std::vector<Frame>& sample) {
+  std::string output;
+  for (const auto& frame : sample) {
+    output += StringPrintf(
+        "0x%p %s\n", reinterpret_cast<const void*>(frame.instruction_pointer),
+        frame.module ? frame.module->GetDebugBasename().AsUTF8Unsafe().c_str()
+                     : "null module");
+  }
+  return output;
+}
+
+void ExpectStackContains(const std::vector<Frame>& stack,
+                         const std::vector<FunctionAddressRange>& functions) {
+  auto frame_it = stack.begin();
+  auto function_it = functions.begin();
+  for (; frame_it != stack.end() && function_it != functions.end();
+       ++frame_it) {
+    if (frame_it->instruction_pointer >=
+            reinterpret_cast<uintptr_t>(function_it->start) &&
+        frame_it->instruction_pointer <=
+            reinterpret_cast<uintptr_t>(function_it->end)) {
+      ++function_it;
+    }
+  }
+
+  EXPECT_EQ(function_it, functions.end())
+      << "Function in position " << function_it - functions.begin() << " at "
+      << function_it->start << " was not found in stack "
+      << "(or did not appear in the expected order):\n"
+      << FormatSampleForDiagnosticOutput(stack);
+}
+
+void ExpectStackDoesNotContain(
+    const std::vector<Frame>& stack,
+    const std::vector<FunctionAddressRange>& functions) {
+  struct FunctionAddressRangeCompare {
+    bool operator()(const FunctionAddressRange& a,
+                    const FunctionAddressRange& b) const {
+      return std::make_pair(a.start, a.end) < std::make_pair(b.start, b.end);
+    }
+  };
+
+  std::set<FunctionAddressRange, FunctionAddressRangeCompare> seen_functions;
+  for (const auto frame : stack) {
+    for (const auto function : functions) {
+      if (frame.instruction_pointer >=
+              reinterpret_cast<uintptr_t>(function.start) &&
+          frame.instruction_pointer <=
+              reinterpret_cast<uintptr_t>(function.end)) {
+        seen_functions.insert(function);
+      }
+    }
+  }
+
+  for (const auto function : seen_functions) {
+    ADD_FAILURE() << "Function at " << function.start
+                  << " was unexpectedly found in stack:\n"
+                  << FormatSampleForDiagnosticOutput(stack);
+  }
+}
+
+}  // namespace base
diff --git a/base/profiler/stack_sampling_profiler_test_util.h b/base/profiler/stack_sampling_profiler_test_util.h
new file mode 100644
index 0000000..b9c0a41
--- /dev/null
+++ b/base/profiler/stack_sampling_profiler_test_util.h
@@ -0,0 +1,119 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_PROFILER_STACK_SAMPLING_PROFILER_TEST_UTIL_H_
+#define BASE_PROFILER_STACK_SAMPLING_PROFILER_TEST_UTIL_H_
+
+#include <vector>
+
+#include "base/callback.h"
+#include "base/profiler/frame.h"
+#include "base/synchronization/waitable_event.h"
+#include "base/threading/platform_thread.h"
+
+namespace base {
+
+// A thread to target for profiling that will run the supplied closure.
+class TargetThread : public PlatformThread::Delegate {
+ public:
+  TargetThread(const Closure& to_run);
+  ~TargetThread() override;
+
+  // PlatformThread::Delegate:
+  void ThreadMain() override;
+
+  PlatformThreadId id() const { return id_; }
+
+ private:
+  PlatformThreadId id_ = 0;
+  Closure to_run_;
+
+  DISALLOW_COPY_AND_ASSIGN(TargetThread);
+};
+
+// Addresses near the start and end of a function.
+struct FunctionAddressRange {
+  const void* start;
+  const void* end;
+};
+
+// Represents a stack unwind scenario to be sampled by the
+// StackSamplingProfiler.
+class UnwindScenario {
+ public:
+  // A callback provided by the caller that sets up the unwind scenario, then
+  // calls into the passed closure to wait for a sample to be taken. Returns the
+  // address range of the function that sets up the unwind scenario. The passed
+  // closure will be null when invoked solely to obtain the address range.
+  using SetupFunction = RepeatingCallback<FunctionAddressRange(const Closure&)>;
+
+  // Events to coordinate the sampling.
+  struct SampleEvents {
+    WaitableEvent ready_for_sample;
+    WaitableEvent sample_finished;
+  };
+
+  explicit UnwindScenario(const SetupFunction& setup_function);
+  ~UnwindScenario();
+
+  UnwindScenario(const UnwindScenario&) = delete;
+  UnwindScenario& operator=(const UnwindScenario&) = delete;
+
+  // The address range of the innermost function that waits for the sample.
+  FunctionAddressRange GetWaitForSampleAddressRange() const;
+
+  // The address range of the provided setup function.
+  FunctionAddressRange GetSetupFunctionAddressRange() const;
+
+  // The address range of the outer function that indirectly invokes the setup
+  // function.
+  FunctionAddressRange GetOuterFunctionAddressRange() const;
+
+  // Executes the scenario.
+  void Execute(SampleEvents* events);
+
+ private:
+  static FunctionAddressRange InvokeSetupFunction(
+      const SetupFunction& setup_function,
+      SampleEvents* events);
+
+  static FunctionAddressRange WaitForSample(SampleEvents* events);
+
+  const SetupFunction setup_function_;
+};
+
+// UnwindScenario setup function that calls into |wait_for_sample| without doing
+// any special unwinding setup, to exercise the "normal" unwind scenario.
+FunctionAddressRange CallWithPlainFunction(const Closure& wait_for_sample);
+
+// The callback to perform profiling on the provided thread.
+using ProfileCallback = OnceCallback<void(PlatformThreadId)>;
+
+// Executes |profile_callback| while running |scenario| on the target
+// thread. Performs all necessary target thread startup and shutdown work before
+// and afterward.
+void WithTargetThread(UnwindScenario* scenario,
+                      ProfileCallback profile_callback);
+
+// Returns the sample seen when taking one sample of |scenario|.
+std::vector<Frame> SampleScenario(UnwindScenario* scenario,
+                                  ModuleCache* module_cache);
+
+// Formats a sample into a string that can be output for test diagnostics.
+std::string FormatSampleForDiagnosticOutput(const std::vector<Frame>& sample);
+
+// Expects that the stack contains the functions with the specified address
+// ranges, in the specified order.
+void ExpectStackContains(const std::vector<Frame>& stack,
+                         const std::vector<FunctionAddressRange>& functions);
+
+// Expects that the stack does not contain the functions with the specified
+// address ranges.
+void ExpectStackDoesNotContain(
+    const std::vector<Frame>& stack,
+    const std::vector<FunctionAddressRange>& functions);
+
+}  // namespace base
+
+#endif  // BASE_PROFILER_STACK_SAMPLING_PROFILER_TEST_UTIL_H_
diff --git a/base/profiler/stack_sampling_profiler_unittest.cc b/base/profiler/stack_sampling_profiler_unittest.cc
index d030e438..fd94290 100644
--- a/base/profiler/stack_sampling_profiler_unittest.cc
+++ b/base/profiler/stack_sampling_profiler_unittest.cc
@@ -16,22 +16,22 @@
 #include "base/callback.h"
 #include "base/compiler_specific.h"
 #include "base/files/file_util.h"
+#include "base/location.h"
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/native_library.h"
 #include "base/path_service.h"
 #include "base/profiler/stack_sampler.h"
 #include "base/profiler/stack_sampling_profiler.h"
+#include "base/profiler/stack_sampling_profiler_test_util.h"
 #include "base/profiler/unwinder.h"
 #include "base/run_loop.h"
 #include "base/scoped_native_library.h"
 #include "base/stl_util.h"
-#include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/synchronization/lock.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/test/bind_test_util.h"
-#include "base/threading/platform_thread.h"
 #include "base/threading/simple_thread.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
@@ -51,10 +51,6 @@
 #define STACK_SAMPLING_PROFILER_SUPPORTED 1
 #endif
 
-#if defined(OS_WIN)
-#pragma intrinsic(_ReturnAddress)
-#endif
-
 namespace base {
 
 #if defined(STACK_SAMPLING_PROFILER_SUPPORTED)
@@ -68,152 +64,6 @@
 
 namespace {
 
-// Addresses near the start and end of a function.
-struct FunctionAddressRange {
-  const void* start;
-  const void* end;
-};
-
-// Disable inlining for this function so that it gets its own stack frame.
-NOINLINE const void* GetProgramCounter() {
-  // Saving to a volatile prevents clang from assuming it can reuse the return
-  // value across multiple calls to GetProgramCounter().
-#if defined(OS_WIN)
-  const void* volatile program_counter = _ReturnAddress();
-#else
-  const void* volatile program_counter = __builtin_return_address(0);
-#endif
-  return program_counter;
-}
-
-// Represents a stack unwind scenario to be sampled by the
-// StackSamplingProfiler.
-class UnwindScenario {
- public:
-  // A callback provided by the caller that sets up the unwind scenario, then
-  // calls into the passed closure to wait for a sample to be taken. Returns the
-  // address range of the function that sets up the unwind scenario. The passed
-  // closure will be null when invoked solely to obtain the address range.
-  using SetupFunction = RepeatingCallback<FunctionAddressRange(const Closure&)>;
-
-  // Events to coordinate the sampling.
-  struct SampleEvents {
-    WaitableEvent ready_for_sample;
-    WaitableEvent sample_finished;
-  };
-
-  explicit UnwindScenario(const SetupFunction& setup_function)
-      : setup_function_(setup_function) {}
-
-  UnwindScenario(const UnwindScenario&) = delete;
-  UnwindScenario& operator=(const UnwindScenario&) = delete;
-
-  FunctionAddressRange GetWaitForSampleAddressRange() const;
-  FunctionAddressRange GetSetupFunctionAddressRange() const;
-  FunctionAddressRange GetOuterFunctionAddressRange() const;
-
-  void Execute(SampleEvents* events);
-
- private:
-  static FunctionAddressRange InvokeSetupFunction(
-      const SetupFunction& setup_function,
-      SampleEvents* events);
-
-  static FunctionAddressRange WaitForSample(SampleEvents* events);
-
-  const SetupFunction setup_function_;
-};
-
-FunctionAddressRange UnwindScenario::GetWaitForSampleAddressRange() const {
-  return WaitForSample(nullptr);
-}
-
-FunctionAddressRange UnwindScenario::GetSetupFunctionAddressRange() const {
-  return setup_function_.Run(Closure());
-}
-
-FunctionAddressRange UnwindScenario::GetOuterFunctionAddressRange() const {
-  return InvokeSetupFunction(SetupFunction(), nullptr);
-}
-
-void UnwindScenario::Execute(SampleEvents* events) {
-  InvokeSetupFunction(setup_function_, events);
-}
-
-// static
-// Disable inlining for this function so that it gets its own stack frame.
-NOINLINE FunctionAddressRange
-UnwindScenario::InvokeSetupFunction(const SetupFunction& setup_function,
-                                    SampleEvents* events) {
-  const void* start_program_counter = GetProgramCounter();
-
-  if (!setup_function.is_null()) {
-    const auto wait_for_sample_closure =
-        BindLambdaForTesting([&]() { UnwindScenario::WaitForSample(events); });
-    setup_function.Run(wait_for_sample_closure);
-  }
-
-  // Volatile to prevent a tail call to GetProgramCounter().
-  const void* volatile end_program_counter = GetProgramCounter();
-  return {start_program_counter, end_program_counter};
-}
-
-// static
-// Disable inlining for this function so that it gets its own stack frame.
-NOINLINE FunctionAddressRange
-UnwindScenario::WaitForSample(SampleEvents* events) {
-  const void* start_program_counter = GetProgramCounter();
-
-  if (events) {
-    events->ready_for_sample.Signal();
-    events->sample_finished.Wait();
-  }
-
-  // Volatile to prevent a tail call to GetProgramCounter().
-  const void* volatile end_program_counter = GetProgramCounter();
-  return {start_program_counter, end_program_counter};
-}
-
-// A thread to target for profiling, whose stack is guaranteed to contain
-// SignalAndWaitUntilSignaled() when coordinated with the main thread.
-class TargetThread : public PlatformThread::Delegate {
- public:
-  TargetThread(const Closure& to_run);
-
-  // PlatformThread::Delegate:
-  void ThreadMain() override;
-
-  PlatformThreadId id() const { return id_; }
-
- private:
-  PlatformThreadId id_ = 0;
-  Closure to_run_;
-
-  DISALLOW_COPY_AND_ASSIGN(TargetThread);
-};
-
-TargetThread::TargetThread(const Closure& to_run) : to_run_(to_run) {}
-
-void TargetThread::ThreadMain() {
-  id_ = PlatformThread::CurrentId();
-  to_run_.Run();
-}
-
-// Calls into |wait_for_sample| without doing any special unwinding setup, to
-// test the "normal" unwind scenario.
-// Disable inlining for this function so that it gets its own stack frame.
-NOINLINE FunctionAddressRange
-CallWithPlainFunction(const Closure& wait_for_sample) {
-  const void* start_program_counter = GetProgramCounter();
-
-  if (!wait_for_sample.is_null())
-    wait_for_sample.Run();
-
-  // Volatile to prevent a tail call to GetProgramCounter().
-  const void* volatile end_program_counter = GetProgramCounter();
-  return {start_program_counter, end_program_counter};
-}
-
 // Calls into |wait_for_sample| after using alloca(), to test unwinding with a
 // frame pointer.
 // Disable inlining for this function so that it gets its own stack frame.
@@ -274,72 +124,6 @@
   return {start_program_counter, end_program_counter};
 }
 
-// Formats a sample into a string that can be output for test diagnostics.
-std::string FormatSampleForDiagnosticOutput(const std::vector<Frame>& sample) {
-  std::string output;
-  for (const auto& frame : sample) {
-    output += StringPrintf(
-        "0x%p %s\n", reinterpret_cast<const void*>(frame.instruction_pointer),
-        frame.module ? frame.module->GetDebugBasename().AsUTF8Unsafe().c_str()
-                     : "null module");
-  }
-  return output;
-}
-
-// Expects that the stack contains the functions with the specified address
-// ranges, in the specified order.
-void ExpectStackContains(const std::vector<Frame>& stack,
-                         const std::vector<FunctionAddressRange>& functions) {
-  auto frame_it = stack.begin();
-  auto function_it = functions.begin();
-  for (; frame_it != stack.end() && function_it != functions.end();
-       ++frame_it) {
-    if (frame_it->instruction_pointer >=
-            reinterpret_cast<uintptr_t>(function_it->start) &&
-        frame_it->instruction_pointer <=
-            reinterpret_cast<uintptr_t>(function_it->end)) {
-      ++function_it;
-    }
-  }
-
-  EXPECT_EQ(function_it, functions.end())
-      << "Function in position " << function_it - functions.begin() << " at "
-      << function_it->start << " was not found in stack "
-      << "(or did not appear in the expected order):\n"
-      << FormatSampleForDiagnosticOutput(stack);
-}
-
-// Expects that the stack does not contain the functions with the specified
-// address ranges.
-void ExpectStackDoesNotContain(
-    const std::vector<Frame>& stack,
-    const std::vector<FunctionAddressRange>& functions) {
-  struct FunctionAddressRangeCompare {
-    bool operator()(const FunctionAddressRange& a,
-                    const FunctionAddressRange& b) const {
-      return std::make_pair(a.start, a.end) < std::make_pair(b.start, b.end);
-    }
-  };
-
-  std::set<FunctionAddressRange, FunctionAddressRangeCompare> seen_functions;
-  for (const auto frame : stack) {
-    for (const auto function : functions) {
-      if (frame.instruction_pointer >=
-              reinterpret_cast<uintptr_t>(function.start) &&
-          frame.instruction_pointer <=
-              reinterpret_cast<uintptr_t>(function.end)) {
-        seen_functions.insert(function);
-      }
-    }
-  }
-
-  for (const auto function : seen_functions) {
-    ADD_FAILURE() << "Function at " << function.start
-                  << " was unexpectedly found in stack:\n"
-                  << FormatSampleForDiagnosticOutput(stack);
-  }
-}
-
 // Profile consists of a set of samples and other sampling information.
 struct Profile {
   Profile() = default;
@@ -480,65 +264,11 @@
 #endif
 }
 
-// The callback to perform profiling on the provided thread.
-using ProfileCallback = OnceCallback<void(PlatformThreadId)>;
-
-// Executes |profile_callback| while running |scenario| on the target
-// thread. Performs all necessary target thread startup and shutdown work before
-// and afterward.
-void WithTargetThread(UnwindScenario* scenario,
-                      ProfileCallback profile_callback) {
-  UnwindScenario::SampleEvents events;
-  TargetThread target_thread(
-      BindLambdaForTesting([&]() { scenario->Execute(&events); }));
-
-  PlatformThreadHandle target_thread_handle;
-  EXPECT_TRUE(PlatformThread::Create(0, &target_thread, &target_thread_handle));
-
-  events.ready_for_sample.Wait();
-
-  std::move(profile_callback).Run(target_thread.id());
-
-  events.sample_finished.Signal();
-
-  PlatformThread::Join(target_thread_handle);
-}
-
 void WithTargetThread(ProfileCallback profile_callback) {
   UnwindScenario scenario(BindRepeating(&CallWithPlainFunction));
   WithTargetThread(&scenario, std::move(profile_callback));
 }
 
-// Returns the sample seen when taking one sample of |scenario|.
-std::vector<Frame> SampleScenario(UnwindScenario* scenario,
-                                  ModuleCache* module_cache) {
-  SamplingParams params;
-  params.sampling_interval = TimeDelta::FromMilliseconds(0);
-  params.samples_per_profile = 1;
-
-  Profile profile;
-  WithTargetThread(
-      scenario, BindLambdaForTesting([&](PlatformThreadId target_thread_id) {
-        WaitableEvent sampling_thread_completed(
-            WaitableEvent::ResetPolicy::MANUAL,
-            WaitableEvent::InitialState::NOT_SIGNALED);
-        StackSamplingProfiler profiler(
-            target_thread_id, params,
-            std::make_unique<TestProfileBuilder>(
-                module_cache,
-                BindLambdaForTesting([&profile, &sampling_thread_completed](
-                                         Profile result_profile) {
-                  profile = std::move(result_profile);
-                  sampling_thread_completed.Signal();
-                })));
-        profiler.Start();
-        sampling_thread_completed.Wait();
-      }));
-
-  CHECK_EQ(1u, profile.samples.size());
-  return profile.samples[0];
-}
-
 struct TestProfilerInfo {
   TestProfilerInfo(PlatformThreadId thread_id,
                    const SamplingParams& params,
diff --git a/build/config/fuchsia/testing_sandbox_policy b/build/config/fuchsia/testing_sandbox_policy
index 322af440..aa45137 100644
--- a/build/config/fuchsia/testing_sandbox_policy
+++ b/build/config/fuchsia/testing_sandbox_policy
@@ -15,6 +15,7 @@
       "fuchsia.sys.Environment",
       "fuchsia.sys.Launcher",
       "fuchsia.sys.Loader",
+      "fuchsia.sysmem.Allocator",
       "fuchsia.ui.input.ImeService",
       "fuchsia.ui.input.ImeVisibilityService",
       "fuchsia.ui.policy.Presenter",
diff --git a/chrome/BUILD.gn b/chrome/BUILD.gn
index b51701c..5c1f067 100644
--- a/chrome/BUILD.gn
+++ b/chrome/BUILD.gn
@@ -1459,7 +1459,6 @@
 
 group("child_dependencies") {
   public_deps = [
-    "//chrome/browser/devtools",
     "//chrome/child",
     "//chrome/common",
     "//chrome/gpu",
@@ -1481,6 +1480,14 @@
   if (enable_gwp_asan_malloc) {
     public_deps += [ "//components/gwp_asan/client" ]
   }
+
+  if (!is_component_build) {
+    assert_no_deps = [
+      # Browser code should not be used in child processes. In component builds,
+      # this is OK because all of content is linked into one library.
+      "//content/browser",
+    ]
+  }
 }
 
 if (is_win) {
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index 6917ac9a..c2ad824 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -1658,6 +1658,7 @@
   "java/src/org/chromium/chrome/browser/webapps/ChromeWebApkHost.java",
   "java/src/org/chromium/chrome/browser/webapps/ChromeWebApkHostSignature.java",
   "java/src/org/chromium/chrome/browser/webapps/GooglePlayWebApkInstallDelegate.java",
+  "java/src/org/chromium/chrome/browser/webapps/ProvidedByWebApkSplashDelegate.java",
   "java/src/org/chromium/chrome/browser/webapps/SameActivityWebappSplashDelegate.java",
   "java/src/org/chromium/chrome/browser/metrics/SameActivityWebappUmaCache.java",
   "java/src/org/chromium/chrome/browser/webapps/SameTaskWebApkActivity.java",
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java
index a777fa501..6f2063e4 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java
@@ -8,7 +8,6 @@
 import android.support.annotation.Nullable;
 import android.view.View;
 
-import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.chrome.browser.UrlConstants;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver;
@@ -163,7 +162,6 @@
 
     private View.OnClickListener getCollapseButtonClickListener() {
         return view -> {
-            RecordUserAction.record("TabGroup.DialogMinimizedFromGrid");
             mModel.set(TabGridSheetProperties.IS_DIALOG_VISIBLE, false);
         };
     }
@@ -179,8 +177,6 @@
             mTabCreatorManager.getTabCreator(currentTab.isIncognito())
                     .createNewTab(new LoadUrlParams(UrlConstants.NTP_URL),
                             TabLaunchType.FROM_CHROME_UI, parentTabToAttach);
-            RecordUserAction.record(
-                    "MobileNewTabOpened." + TabGridDialogCoordinator.COMPONENT_NAME);
         };
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsClientFileProcessor.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsClientFileProcessor.java
index 81a966c..c22ff34c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsClientFileProcessor.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsClientFileProcessor.java
@@ -8,20 +8,16 @@
 
 import android.content.Context;
 import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
 import android.net.Uri;
 import android.os.Bundle;
-import android.os.ParcelFileDescriptor;
 import android.support.annotation.WorkerThread;
 import android.support.customtabs.CustomTabsService;
 import android.support.customtabs.CustomTabsSessionToken;
 
+import org.chromium.base.FileUtils;
 import org.chromium.base.Log;
 import org.chromium.chrome.browser.browserservices.trustedwebactivityui.splashscreen.SplashImageHolder;
 
-import java.io.FileDescriptor;
-import java.io.IOException;
-
 import javax.inject.Inject;
 import javax.inject.Named;
 import javax.inject.Singleton;
@@ -67,29 +63,12 @@
     }
 
     private boolean receiveTwaSplashImage(CustomTabsSessionToken sessionToken, Uri uri) {
-        try(ParcelFileDescriptor parcelFileDescriptor =
-                mContext.getContentResolver().openFileDescriptor(uri, "r")) {
-            if (parcelFileDescriptor == null) {
-                Log.w(TAG, "Null ParcelFileDescriptor from uri " + uri);
-                return false;
-            }
-            FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
-            if (fileDescriptor == null) {
-                Log.w(TAG, "Null FileDescriptor from uri " + uri);
-                return false;
-            }
-            Bitmap bitmap = BitmapFactory.decodeFileDescriptor(fileDescriptor);
-            if (bitmap == null) {
-                Log.w(TAG, "Failed to decode image from uri " + uri);
-                return false;
-            }
-            mTwaSplashImageHolder.get().putImage(sessionToken, bitmap);
-            mTwaSplashImageHolderCreated = true;
-            return true;
-        } catch (IOException e) {
-            Log.w(TAG, "IO exception when reading uri " + uri);
-            return false;
-        }
+        Bitmap bitmap = FileUtils.queryBitmapFromContentProvider(mContext, uri);
+        if (bitmap == null) return false;
+
+        mTwaSplashImageHolder.get().putImage(sessionToken, bitmap);
+        mTwaSplashImageHolderCreated = true;
+        return true;
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dynamicmodule/DynamicModuleNavigationEventObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dynamicmodule/DynamicModuleNavigationEventObserver.java
index 4a7c1fc..ecaf288 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dynamicmodule/DynamicModuleNavigationEventObserver.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dynamicmodule/DynamicModuleNavigationEventObserver.java
@@ -23,6 +23,7 @@
 import org.chromium.chrome.browser.tabmodel.TabSelectionType;
 import org.chromium.components.security_state.ConnectionSecurityLevel;
 import org.chromium.content_public.browser.NavigationEntry;
+import org.chromium.net.NetError;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -31,9 +32,6 @@
  * An observer for firing navigation events to the CCT dynamic module.
  */
 public class DynamicModuleNavigationEventObserver extends EmptyTabObserver {
-    // An operation was aborted (due to user action). Should match the value in net_error_list.h.
-    private static final int NET_ERROR_ABORTED = -3;
-
     @VisibleForTesting
     public static final String URL_KEY = "urlInfo";
 
@@ -106,8 +104,9 @@
     }
 
     @Override
-    public void onPageLoadFailed(Tab tab, int errorCode) {
-        int navigationEvent = errorCode == NET_ERROR_ABORTED ? CustomTabsCallback.NAVIGATION_ABORTED
+    public void onPageLoadFailed(Tab tab, @NetError int errorCode) {
+        int navigationEvent = errorCode == NetError.ERR_ABORTED
+                ? CustomTabsCallback.NAVIGATION_ABORTED
                 : CustomTabsCallback.NAVIGATION_FAILED;
         notifyOnNavigationEvent(navigationEvent, getExtrasBundleForNavigationEvent(tab));
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/DownloadProgressInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/DownloadProgressInfoBar.java
index a1196ca..84daf15d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/DownloadProgressInfoBar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/DownloadProgressInfoBar.java
@@ -132,7 +132,7 @@
             return;
         }
 
-        mAnimatedDrawable = AnimatedVectorDrawableCompat.create(getContext(), mInfo.icon);
+        mAnimatedDrawable = AnimatedVectorDrawableCompat.create(layout.getContext(), mInfo.icon);
         mAnimatedDrawable.registerAnimationCallback(new Animatable2Compat.AnimationCallback() {
             @Override
             public void onAnimationEnd(Drawable drawable) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessor.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessor.java
index 96e81476..67730e2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessor.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessor.java
@@ -118,7 +118,8 @@
             suggestionIcon = SuggestionIcon.GLOBE;
             if (suggestion.isStarred()) {
                 suggestionIcon = SuggestionIcon.BOOKMARK;
-            } else if (suggestionType == OmniboxSuggestionType.HISTORY_URL) {
+            } else if (!mEnableSuggestionFavicons
+                    && suggestionType == OmniboxSuggestionType.HISTORY_URL) {
                 suggestionIcon = SuggestionIcon.HISTORY;
             }
             boolean urlHighlighted = false;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java
index 3534ea7..382f6aa 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java
@@ -14,6 +14,7 @@
 import org.chromium.content_public.browser.NavigationHandle;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.content_public.common.BrowserControlsState;
+import org.chromium.net.NetError;
 
 /**
  * An implementation of the {@link TabObserver} which has empty implementations of all methods.
@@ -50,7 +51,7 @@
     public void onPageLoadFinished(Tab tab, String url) {}
 
     @Override
-    public void onPageLoadFailed(Tab tab, int errorCode) { }
+    public void onPageLoadFailed(Tab tab, @NetError int errorCode) {}
 
     @Override
     public void onRestoreStarted(Tab tab) {}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUma.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUma.java
index d2f546c..72e2cea 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUma.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUma.java
@@ -148,8 +148,8 @@
      * @param perceivedTime The perceived time taken to perform the tab restore.
      * @param errorCode The error code, on failure (as denoted by the |succeeded| parameter).
      */
-    private void recordTabRestoreResult(boolean succeeded, long time, long perceivedTime,
-            int errorCode) {
+    private void recordTabRestoreResult(
+            boolean succeeded, long time, long perceivedTime, @NetError int errorCode) {
         if (succeeded) {
             RecordHistogram.recordEnumeratedHistogram(
                     "Tab.RestoreResult", TAB_RESTORE_RESULT_SUCCESS, TAB_RESTORE_RESULT_COUNT);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController.java
index 3310a28..b8af033 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController.java
@@ -12,6 +12,7 @@
 import org.chromium.base.Callback;
 import org.chromium.base.task.PostTask;
 import org.chromium.chrome.R;
+import org.chromium.chrome.browser.ActivityTabProvider.ActivityTabTabObserver;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.appmenu.AppMenuHandler;
@@ -22,7 +23,6 @@
 import org.chromium.chrome.browser.ntp.NewTabPage;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.tab.Tab;
-import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabObserver;
 import org.chromium.chrome.browser.util.FeatureUtilities;
 import org.chromium.chrome.browser.widget.ViewHighlighter;
 import org.chromium.chrome.browser.widget.textbubble.TextBubble;
@@ -38,7 +38,7 @@
  *     to be able to split up the build target for toolbar which can be a base construct.
  */
 public class ToolbarButtonInProductHelpController implements Destroyable {
-    private final TabModelSelectorTabObserver mPageLoadObserver;
+    private final ActivityTabTabObserver mPageLoadObserver;
     private final ChromeActivity mActivity;
 
     /**
@@ -55,8 +55,7 @@
 
     private ToolbarButtonInProductHelpController(final ChromeActivity activity) {
         mActivity = activity;
-        // TODO(jinsukkim): Consider switching to ActivityTabProvider and its TabObserver.
-        mPageLoadObserver = new TabModelSelectorTabObserver(activity.getTabModelSelector()) {
+        mPageLoadObserver = new ActivityTabTabObserver(activity.getActivityTabProvider()) {
             /**
              * Stores total data saved at the start of a page load. Used to calculate delta at the
              * end of page load, which is just an estimate of the data saved for the current page
@@ -65,31 +64,26 @@
              * user at a time (i.e. not since the user started using Chrome).
              */
             private long mDataSavedOnStartPageLoad;
-            private Tab mPageLoadTab;
 
             @Override
             public void onPageLoadStarted(Tab tab, String url) {
-                if (tab != activity.getActivityTabProvider().get()) return;
                 mDataSavedOnStartPageLoad = DataReductionProxySettings.getInstance()
                                                     .getContentLengthSavedInHistorySummary();
-                mPageLoadTab = tab;
             }
 
             @Override
             public void onPageLoadFinished(Tab tab, String url) {
-                if (mPageLoadTab != tab) return;
                 long dataSaved = DataReductionProxySettings.getInstance()
                                          .getContentLengthSavedInHistorySummary()
                         - mDataSavedOnStartPageLoad;
                 Tracker tracker = TrackerFactory.getTrackerForProfile(Profile.getLastUsedProfile());
                 if (dataSaved > 0L) tracker.notifyEvent(EventConstants.DATA_SAVED_ON_PAGE_LOAD);
                 if (tab.isPreview()) tracker.notifyEvent(EventConstants.PREVIEWS_PAGE_LOADED);
-                if (tab == activity.getActivityTabProvider().get() && tab.isUserInteractable()) {
+                if (tab.isUserInteractable()) {
                     maybeShowDataSaverDetail(activity);
-                    maybeShowDataSaverMilestonePromo(activity);
-                    maybeShowPreviewVerboseStatus(activity);
+                    if (dataSaved > 0L) maybeShowDataSaverMilestonePromo(activity);
+                    if (tab.isPreview()) maybeShowPreviewVerboseStatus(activity);
                 }
-                mPageLoadTab = null;
             }
         };
     }
@@ -136,8 +130,6 @@
 
     // Attempts to show an IPH text bubble for page in preview mode.
     private static void maybeShowPreviewVerboseStatus(ChromeActivity activity) {
-        if (!activity.getActivityTabProvider().get().isPreview()) return;
-
         final View anchorView = activity.getToolbarManager().getSecurityIconView();
         if (anchorView == null) return;
 
@@ -292,9 +284,10 @@
 
     private static boolean canShowNTPButtonIPH(ChromeActivity activity) {
         View homeButton = activity.findViewById(R.id.home_button);
+        Tab tab = activity.getActivityTabProvider().get();
         return FeatureUtilities.isNewTabPageButtonEnabled()
-                && !activity.getCurrentTabModel().isIncognito() && activity.getActivityTab() != null
-                && !NewTabPage.isNTPUrl(activity.getActivityTab().getUrl()) && homeButton != null
+                && !activity.getCurrentTabModel().isIncognito() && tab != null
+                && !NewTabPage.isNTPUrl(tab.getUrl()) && homeButton != null
                 && homeButton.getVisibility() == View.VISIBLE;
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/UsageStatsService.java b/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/UsageStatsService.java
index 8e98f70..741f03ad 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/UsageStatsService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/UsageStatsService.java
@@ -60,6 +60,9 @@
         mTokenTracker = new TokenTracker(mBridge);
         mPageViewObservers = new ArrayList<>();
 
+        mSuspensionTracker.getAllSuspendedWebsites().then(
+                (suspendedSites) -> { notifyObserversOfSuspensions(suspendedSites, true); });
+
         mOptInState = getOptInState();
         mClient = AppHooks.get().createDigitalWellbeingClient();
     }
@@ -146,14 +149,7 @@
      */
     public Promise<Void> setWebsitesSuspendedAsync(List<String> fqdns, boolean suspended) {
         ThreadUtils.assertOnUiThread();
-        for (WeakReference<PageViewObserver> observerRef : mPageViewObservers) {
-            PageViewObserver observer = observerRef.get();
-            if (observer != null) {
-                for (String fqdn : fqdns) {
-                    observer.notifySiteSuspensionChanged(fqdn, suspended);
-                }
-            }
-        }
+        notifyObserversOfSuspensions(fqdns, suspended);
 
         return mSuspensionTracker.setWebsitesSuspended(fqdns, suspended);
     }
@@ -218,4 +214,15 @@
     public List<String> getAllSuspendedWebsites() {
         return new ArrayList<>();
     }
+
+    private void notifyObserversOfSuspensions(List<String> fqdns, boolean suspended) {
+        for (WeakReference<PageViewObserver> observerRef : mPageViewObservers) {
+            PageViewObserver observer = observerRef.get();
+            if (observer != null) {
+                for (String fqdn : fqdns) {
+                    observer.notifySiteSuspensionChanged(fqdn, suspended);
+                }
+            }
+        }
+    }
 }
\ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/ProvidedByWebApkSplashDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/ProvidedByWebApkSplashDelegate.java
new file mode 100644
index 0000000..507a32a
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/ProvidedByWebApkSplashDelegate.java
@@ -0,0 +1,72 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.webapps;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.net.Uri;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+
+import org.chromium.base.ApiCompatibilityUtils;
+import org.chromium.base.ContextUtils;
+import org.chromium.base.FileUtils;
+import org.chromium.base.StrictModeContext;
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.util.ColorUtils;
+import org.chromium.webapk.lib.common.WebApkCommonUtils;
+
+/** Delegate which uses splash screen screenshot from the WebAPK's content provider. */
+public class ProvidedByWebApkSplashDelegate implements SplashDelegate {
+    private ViewGroup mParentView;
+    private ImageView mSplashView;
+
+    @Override
+    public void showSplash(ViewGroup parentView, WebappInfo webappInfo) {
+        mParentView = parentView;
+
+        Context appContext = ContextUtils.getApplicationContext();
+        mSplashView = new ImageView(appContext);
+        int backgroundColor =
+                ColorUtils.getOpaqueColor(webappInfo.backgroundColor(ApiCompatibilityUtils.getColor(
+                        appContext.getResources(), R.color.webapp_default_bg)));
+        mSplashView.setBackgroundColor(backgroundColor);
+
+        Bitmap splashBitmap = null;
+        try (StrictModeContext smc = StrictModeContext.allowDiskReads()) {
+            splashBitmap = FileUtils.queryBitmapFromContentProvider(appContext,
+                    Uri.parse(WebApkCommonUtils.generateSplashContentProviderUri(
+                            webappInfo.webApkPackageName())));
+        }
+        if (splashBitmap != null) {
+            mSplashView.setScaleType(ImageView.ScaleType.FIT_CENTER);
+            mSplashView.setImageBitmap(splashBitmap);
+        }
+
+        parentView.addView(mSplashView);
+    }
+
+    @Override
+    public void hideSplash(Tab tab, Runnable finishedHidingCallback) {
+        // TODO(pkotwicz) implement.
+    }
+
+    @Override
+    public boolean isSplashVisible() {
+        return true;
+    }
+
+    @Override
+    public View getSplashViewIfChildOf(ViewGroup parent) {
+        return (mParentView == parent) ? mSplashView : null;
+    }
+
+    @Override
+    public boolean shouldWaitForSubsequentPageLoadToHideSplash() {
+        return false;
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/SameActivityWebappSplashDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/SameActivityWebappSplashDelegate.java
index 0d0acf89..5c6b49c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/SameActivityWebappSplashDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/SameActivityWebappSplashDelegate.java
@@ -165,7 +165,7 @@
     }
 
     @Override
-    public ViewGroup getSplashViewIfChildOf(ViewGroup parent) {
+    public View getSplashViewIfChildOf(ViewGroup parent) {
         return (mParentView == parent) ? mSplashScreen : null;
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/SplashController.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/SplashController.java
index e6300ba..a8568266 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/SplashController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/SplashController.java
@@ -6,6 +6,7 @@
 
 import android.os.SystemClock;
 import android.support.annotation.IntDef;
+import android.view.View;
 import android.view.ViewGroup;
 
 import org.chromium.base.ObserverList;
@@ -72,7 +73,7 @@
      * splashscreen on top.
      */
     public void setViewHierarchyBelowSplashscreen(ViewGroup viewHierarchy) {
-        ViewGroup splashView = mDelegate.getSplashViewIfChildOf(mParentView);
+        View splashView = mDelegate.getSplashViewIfChildOf(mParentView);
         WarmupManager.transferViewHeirarchy(viewHierarchy, mParentView);
         if (splashView != null) {
             mParentView.bringChildToFront(splashView);
@@ -80,7 +81,7 @@
     }
 
     @VisibleForTesting
-    ViewGroup getSplashScreenForTests() {
+    View getSplashScreenForTests() {
         if (mDelegate == null) return null;
         return mDelegate.getSplashViewIfChildOf(mParentView);
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/SplashDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/SplashDelegate.java
index cc98721..fbd9505 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/SplashDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/SplashDelegate.java
@@ -4,6 +4,7 @@
 
 package org.chromium.chrome.browser.webapps;
 
+import android.view.View;
 import android.view.ViewGroup;
 
 import org.chromium.chrome.browser.tab.Tab;
@@ -20,10 +21,10 @@
     boolean isSplashVisible();
 
     /**
-     * Returns the {@link ViewGroup} containing the splash screen if it is a direct child of
+     * Returns the {@link View} containing the splash screen if it is a direct child of
      * the passed-in view.
      */
-    ViewGroup getSplashViewIfChildOf(ViewGroup parent);
+    View getSplashViewIfChildOf(ViewGroup parent);
 
     /** Returns whether to wait for a subsequent page load to hide the splash screen. */
     boolean shouldWaitForSubsequentPageLoadToHideSplash();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkInfo.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkInfo.java
index 10ded2da..cd953f56 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkInfo.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkInfo.java
@@ -7,6 +7,7 @@
 import android.content.Intent;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
+import android.content.pm.ProviderInfo;
 import android.content.pm.ResolveInfo;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
@@ -26,6 +27,7 @@
 import org.chromium.chrome.browser.ShortcutSource;
 import org.chromium.chrome.browser.util.IntentUtils;
 import org.chromium.content_public.common.ScreenOrientationValues;
+import org.chromium.webapk.lib.common.WebApkCommonUtils;
 import org.chromium.webapk.lib.common.WebApkConstants;
 import org.chromium.webapk.lib.common.WebApkMetaDataKeys;
 import org.chromium.webapk.lib.common.WebApkMetaDataUtils;
@@ -181,12 +183,23 @@
                 }
             }
         }
-        boolean isSplashProvidedByWebApk = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
-                && IntentUtils.safeGetBooleanExtra(
-                        intent, WebApkConstants.EXTRA_SPLASH_PROVIDED_BY_WEBAPK, false);
+        boolean canUseSplashFromContentProvider = IntentUtils.safeGetBooleanExtra(
+                intent, WebApkConstants.EXTRA_SPLASH_PROVIDED_BY_WEBAPK, false);
 
-        return create(webApkPackageName, url, source, forceNavigation, isSplashProvidedByWebApk,
-                shareData);
+        return create(webApkPackageName, url, source, forceNavigation,
+                canUseSplashFromContentProvider, shareData);
+    }
+
+    /**
+     * Returns whether the WebAPK has a content provider which provides an image to use for the
+     * splash screen.
+     */
+    private static boolean hasContentProviderForSplash(String webApkPackageName) {
+        PackageManager packageManager = ContextUtils.getApplicationContext().getPackageManager();
+        ProviderInfo providerInfo = packageManager.resolveContentProvider(
+                WebApkCommonUtils.generateSplashContentProviderAuthority(webApkPackageName), 0);
+        return (providerInfo != null
+                && TextUtils.equals(providerInfo.packageName, webApkPackageName));
     }
 
     private static @WebApkDistributor int getDistributor(Bundle bundle, String packageName) {
@@ -214,13 +227,12 @@
      * @param source Source that the WebAPK was launched from.
      * @param forceNavigation Whether the WebAPK should navigate to {@link url} if it is already
      *                        running.
-     * @param isSplashProvidedByWebApk Whether the WebAPK provides a splash screen activity which
-     *                                 should be launched to hide the web contents while the page is
-     *                                 loading.
+     * @param canUseSplashFromContentProvider Whether the WebAPK's content provider can be
+     *                                        queried for a screenshot of the splash screen.
      * @param shareData Shared information from the share intent.
      */
     public static WebApkInfo create(String webApkPackageName, String url, int source,
-            boolean forceNavigation, boolean isSplashProvidedByWebApk, ShareData shareData) {
+            boolean forceNavigation, boolean canUseSplashFromContentProvider, ShareData shareData) {
         // Unlike non-WebAPK web apps, WebAPK ids are predictable. A malicious actor may send an
         // intent with a valid start URL and arbitrary other data. Only use the start URL, the
         // package name and the ShortcutSource from the launch intent and extract the remaining data
@@ -282,6 +294,10 @@
         Bitmap splashIcon = decodeBitmapFromDrawable(res, splashIconId);
         ShareTarget shareTarget = extractAndMergeShareTargets(webApkPackageName);
 
+        boolean isSplashProvidedByWebApk =
+                (canUseSplashFromContentProvider && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
+                        && hasContentProviderForSplash(webApkPackageName));
+
         return create(WebApkConstants.WEBAPK_ID_PREFIX + webApkPackageName, url, scope,
                 new Icon(primaryIcon), new Icon(badgeIcon), new Icon(splashIcon), name, shortName,
                 displayMode, orientation, source, themeColor, backgroundColor, webApkPackageName,
@@ -318,9 +334,9 @@
      * @param shareTarget              Data about WebAPK's share intent handlers.
      * @param forceNavigation          Whether the WebAPK should navigate to {@link url} if the
      *                                 WebAPK is already open.
-     * @param isSplashProvidedByWebApk Whether the WebAPK provides a splash screen activity which
-     *                                 should be launched to hide the web contents while the page is
-     *                                 loading.
+     * @param isSplashProvidedByWebApk Whether the WebAPK (1) launches an internal activity to
+     *                                 display the splash screen and (2) has a content provider
+     *                                 which provides a screenshot of the splash screen.
      * @param shareData                Shared information from the share intent.
      */
     public static WebApkInfo create(String id, String url, String scope, Icon primaryIcon,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkSplashNetworkErrorObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkSplashNetworkErrorObserver.java
index 335d8b8..47f3f7d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkSplashNetworkErrorObserver.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkSplashNetworkErrorObserver.java
@@ -21,9 +21,6 @@
  * start URL.
  */
 public class WebApkSplashNetworkErrorObserver extends EmptyTabObserver {
-    // No error.
-    public static final int ERROR_OK = 0;
-
     private Activity mActivity;
     private WebApkOfflineDialog mOfflineDialog;
     private String mWebApkName;
@@ -47,7 +44,7 @@
         if (!navigation.isInMainFrame()) return;
 
         switch (navigation.errorCode()) {
-            case ERROR_OK:
+            case NetError.OK:
                 if (mOfflineDialog != null) {
                     mOfflineDialog.cancel();
                     mOfflineDialog = null;
@@ -74,7 +71,7 @@
         mAllowReloads = false;
     }
 
-    private void onNetworkError(final Tab tab, int errorCode) {
+    private void onNetworkError(final Tab tab, @NetError int errorCode) {
         // Do not show the network error dialog more than once (e.g. if the user backed out of
         // the dialog).
         if (mDidShowNetworkErrorDialog) return;
@@ -100,7 +97,7 @@
     }
 
     /** Generates network error dialog message for the given error code. */
-    private String generateNetworkErrorWebApkDialogMessage(int errorCode) {
+    private String generateNetworkErrorWebApkDialogMessage(@NetError int errorCode) {
         Context context = ContextUtils.getApplicationContext();
         switch (errorCode) {
             case NetError.ERR_INTERNET_DISCONNECTED:
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java
index 5b55ad9..cb87a24 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java
@@ -854,7 +854,7 @@
     }
 
     @VisibleForTesting
-    ViewGroup getSplashScreenForTests() {
+    View getSplashScreenForTests() {
         return mSplashController.getSplashScreenForTests();
     }
 
@@ -889,8 +889,11 @@
     protected void showSplash() {
         try (TraceEvent te = TraceEvent.scoped("WebappActivity.showSplash")) {
             ViewGroup contentView = (ViewGroup) findViewById(android.R.id.content);
-            SplashDelegate delegate = new SameActivityWebappSplashDelegate(
-                    this, getLifecycleDispatcher(), mTabObserverRegistrar);
+            SplashDelegate delegate = mWebappInfo.isSplashProvidedByWebApk()
+                    ? new ProvidedByWebApkSplashDelegate()
+                    : new SameActivityWebappSplashDelegate(
+                            this, getLifecycleDispatcher(), mTabObserverRegistrar);
+
             mSplashController.showSplash(delegate, contentView, mWebappInfo);
         }
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappInfo.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappInfo.java
index 5224351..9f829f9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappInfo.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappInfo.java
@@ -380,9 +380,8 @@
     }
 
     /**
-     * Returns whether the WebappInfo is for a WebAPK and the WebAPK provides a splash screen
-     * activity that should be launched on top of the web contents in order to hide the web
-     * contents while the page is loading.
+     * Returns Whether the WebAPK (1) launches an internal activity to display the splash screen
+     * and (2) has a content provider which provides a screenshot of the splash screen.
      */
     public boolean isSplashProvidedByWebApk() {
         return false;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java
index f52121f..c4632d4 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java
@@ -188,10 +188,9 @@
         // WebappActivity is launched without going through WebappLauncherActivity first.
         WebappActivity.addWebappInfo(webappInfo.id(), webappInfo);
 
-        Intent[] launchIntents =
-                createIntentsToLaunchForWebapp(intent, webappInfo, createTimestamp);
-        launchingActivity.startActivities(launchIntents);
-        if (IntentUtils.isIntentForNewTaskOrNewDocument(launchIntents[0])) {
+        Intent launchIntent = createIntentToLaunchForWebapp(intent, webappInfo, createTimestamp);
+        IntentUtils.safeStartActivity(launchingActivity, launchIntent);
+        if (IntentUtils.isIntentForNewTaskOrNewDocument(launchIntent)) {
             ApiCompatibilityUtils.finishAndRemoveTask(launchingActivity);
         } else {
             launchingActivity.finish();
@@ -326,11 +325,8 @@
         }
     }
 
-    /**
-     * Returns intents to launch for the web app. The output array should be sorted in the order
-     * that the intents should be dispatched with the intent to be dispatched first at index 0.
-     */
-    private static Intent[] createIntentsToLaunchForWebapp(
+    /** Returns intent to launch for the web app. */
+    private static Intent createIntentToLaunchForWebapp(
             Intent intent, @NonNull WebappInfo webappInfo, long createTimestamp) {
         String launchActivityClassName = selectWebappActivitySubclass(webappInfo);
 
@@ -338,29 +334,19 @@
         // crbug.com/702998.
         finishIfReusingActivity(launchActivityClassName, webappInfo.id());
 
-        Intent showSplashIntent = null;
-        if (webappInfo.isSplashProvidedByWebApk()) {
-            showSplashIntent = new Intent(WebApkConstants.ACTION_SHOW_SPLASH);
-            showSplashIntent.setPackage(webappInfo.webApkPackageName());
-            showSplashIntent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
-        }
-
-        Intent webappActivityLaunchIntent = new Intent();
-        webappActivityLaunchIntent.setClassName(
-                ContextUtils.getApplicationContext(), launchActivityClassName);
-        webappInfo.setWebappIntentExtras(webappActivityLaunchIntent);
-        webappActivityLaunchIntent.setAction(Intent.ACTION_VIEW);
+        Intent launchIntent = new Intent();
+        launchIntent.setClassName(ContextUtils.getApplicationContext(), launchActivityClassName);
+        webappInfo.setWebappIntentExtras(launchIntent);
+        launchIntent.setAction(Intent.ACTION_VIEW);
 
         // On L+, firing intents with the exact same data should relaunch a particular
         // Activity.
-        webappActivityLaunchIntent.setData(
-                Uri.parse(WebappActivity.WEBAPP_SCHEME + "://" + webappInfo.id()));
+        launchIntent.setData(Uri.parse(WebappActivity.WEBAPP_SCHEME + "://" + webappInfo.id()));
 
-        IntentHandler.addTimestampToIntent(webappActivityLaunchIntent, createTimestamp);
+        IntentHandler.addTimestampToIntent(launchIntent, createTimestamp);
         // Pass through WebAPK shell launch timestamp to the new intent.
         long shellLaunchTimestamp = IntentHandler.getWebApkShellLaunchTimestampFromIntent(intent);
-        IntentHandler.addShellLaunchTimestampToIntent(
-                webappActivityLaunchIntent, shellLaunchTimestamp);
+        IntentHandler.addShellLaunchTimestampToIntent(launchIntent, shellLaunchTimestamp);
 
         // Setting FLAG_ACTIVITY_CLEAR_TOP handles 2 edge cases:
         // - If a legacy PWA is launching from a notification, we want to ensure that the URL being
@@ -373,17 +359,15 @@
         // CustomTabActivity activity and go back to the WebAPK activity. It is intentional that
         // Custom Tab will not be reachable with a back button.
         if (webappInfo.isSplashProvidedByWebApk()) {
-            webappActivityLaunchIntent.setFlags(
+            launchIntent.setFlags(
                     Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NO_ANIMATION);
         } else {
-            webappActivityLaunchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+            launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                     | ApiCompatibilityUtils.getActivityNewDocumentFlag()
                     | Intent.FLAG_ACTIVITY_CLEAR_TOP);
         }
 
-        return (showSplashIntent == null)
-                ? new Intent[] {webappActivityLaunchIntent}
-                : new Intent[] {webappActivityLaunchIntent, showSplashIntent};
+        return launchIntent;
     }
 
     /** Tries to create WebappInfo/WebApkInfo for the intent. */
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ItemChooserDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ItemChooserDialogTest.java
index 3b091d6d..f5063d9 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ItemChooserDialogTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ItemChooserDialogTest.java
@@ -23,6 +23,7 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
 import org.chromium.chrome.test.ChromeActivityTestRule;
@@ -472,6 +473,7 @@
 
     @Test
     @LargeTest
+    @DisabledTest(message = "crbug.com/958558")
     public void testSimpleItemSelection() {
         Dialog dialog = mChooserDialog.getDialogForTesting();
         Assert.assertTrue(dialog.isShowing());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappActivityTestRule.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappActivityTestRule.java
index 28a183e..dce4a9d8 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappActivityTestRule.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappActivityTestRule.java
@@ -10,6 +10,7 @@
 import android.net.Uri;
 import android.support.customtabs.TrustedWebUtils;
 import android.support.test.InstrumentationRegistry;
+import android.view.View;
 import android.view.ViewGroup;
 
 import org.junit.Assert;
@@ -221,18 +222,24 @@
                 // we are waiting for WebappActivity#getActivityTab() to be non-null because we want
                 // to ensure that native has been loaded.
                 // We also wait till the splash screen has finished initializing.
-                ViewGroup splashScreen = getActivity().getSplashScreenForTests();
-                return getActivity().getActivityTab() != null && splashScreen != null
-                        && splashScreen.getChildCount() > 0;
+                if (getActivity().getActivityTab() == null) return false;
+
+                View splashScreen = getActivity().getSplashScreenForTests();
+                if (splashScreen == null) return false;
+
+                return (!(splashScreen instanceof ViewGroup)
+                        || ((ViewGroup) splashScreen).getChildCount() > 0);
             }
         }, STARTUP_TIMEOUT, CriteriaHelper.DEFAULT_POLLING_INTERVAL);
 
         InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-        ViewGroup splashScreen = getActivity().getSplashScreenForTests();
+        View splashScreen = getActivity().getSplashScreenForTests();
         if (splashScreen == null) {
             Assert.fail("No splash screen available.");
         }
-        return splashScreen;
+        // TODO(pkotwicz): Change return type in order to accommodate new-style WebAPKs.
+        // (crbug.com/958288)
+        return (splashScreen instanceof ViewGroup) ? (ViewGroup) splashScreen : null;
     }
 
     /**
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt
index 4db5b6f..f4a6d896 100644
--- a/chrome/android/profiles/newest.txt
+++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-76.0.3781.0_rc-r1-merged.afdo.bz2
\ No newline at end of file
+chromeos-chrome-amd64-76.0.3782.0_rc-r1-merged.afdo.bz2
\ No newline at end of file
diff --git a/chrome/android/webapk/libs/common/src/org/chromium/webapk/lib/common/WebApkCommonUtils.java b/chrome/android/webapk/libs/common/src/org/chromium/webapk/lib/common/WebApkCommonUtils.java
index 20397322..6043a80 100644
--- a/chrome/android/webapk/libs/common/src/org/chromium/webapk/lib/common/WebApkCommonUtils.java
+++ b/chrome/android/webapk/libs/common/src/org/chromium/webapk/lib/common/WebApkCommonUtils.java
@@ -14,4 +14,21 @@
     public static String getRuntimeDexName(int version) {
         return "webapk" + version + ".dex";
     }
+
+    /**
+     * Returns authority of the content provider which provides the splash screen for the given
+     * WebAPK.
+     */
+    public static String generateSplashContentProviderAuthority(String webApkPackageName) {
+        return webApkPackageName + ".SplashContentProvider";
+    }
+
+    /**
+     * Returns the URI of the content provider which provides the splash screen for the given
+     * WebAPK.
+     */
+    public static String generateSplashContentProviderUri(String webApkPackageName) {
+        return "content://" + generateSplashContentProviderAuthority(webApkPackageName)
+                + "/cached_splash_image";
+    }
 }
diff --git a/chrome/android/webapk/libs/common/src/org/chromium/webapk/lib/common/WebApkConstants.java b/chrome/android/webapk/libs/common/src/org/chromium/webapk/lib/common/WebApkConstants.java
index 65a3ac3..037a9b0 100644
--- a/chrome/android/webapk/libs/common/src/org/chromium/webapk/lib/common/WebApkConstants.java
+++ b/chrome/android/webapk/libs/common/src/org/chromium/webapk/lib/common/WebApkConstants.java
@@ -41,11 +41,4 @@
 
     /** Name of the shared preferences file. */
     public static final String PREF_PACKAGE = "org.chromium.webapk.shell_apk";
-
-    /**
-     * Action used by host browser to launch splash screen activity to hide web contents while the
-     * page is loading.
-     */
-    public static final String ACTION_SHOW_SPLASH =
-            "org.chromium.webapk.shell_apk.ACTION_SHOW_SPLASH";
 }
diff --git a/chrome/android/webapk/shell_apk/AndroidManifest.xml b/chrome/android/webapk/shell_apk/AndroidManifest.xml
index 076d97fa..b280718 100644
--- a/chrome/android/webapk/shell_apk/AndroidManifest.xml
+++ b/chrome/android/webapk/shell_apk/AndroidManifest.xml
@@ -50,7 +50,7 @@
 
         [[#use_new_splash]]
         <activity android:name="org.chromium.webapk.shell_apk.h2o.H2OOpaqueMainActivity"
-                  android:theme="@style/EarlySplashTheme"
+                  android:theme="@style/SplashTheme"
                   android:relinquishTaskIdentity="true"
                   android:excludeFromRecents="true"
                   android:enabled="false"
@@ -61,18 +61,12 @@
             </intent-filter>
         </activity>
         <activity android:name="org.chromium.webapk.shell_apk.h2o.SplashActivity"
-                  android:theme="@style/EarlySplashTheme"
-                  android:launchMode="singleTask"
-                  android:configChanges="orientation">
+                  android:theme="@style/SplashTheme"
+                  android:launchMode="singleTask">
         </activity>
-        <activity android:name="org.chromium.webapk.shell_apk.h2o.OverlaySplashActivity"
-                  android:theme="@style/OverlaySplashTheme"
-                  android:exported="true">
-          <intent-filter>
-            <action android:name="org.chromium.webapk.shell_apk.ACTION_SHOW_SPLASH"></action>
-            <category android:name="android.intent.category.DEFAULT" />
-          </intent-filter>
-        </activity>
+        <provider android:name="org.chromium.webapk.shell_apk.h2o.SplashContentProvider"
+                  android:authorities="{{manifest_package}}.SplashContentProvider"
+                  android:exported="true" />
         [[/use_new_splash]]
         <activity android:name="org.chromium.webapk.shell_apk.[[#use_new_splash]]h2o.H2O[[/use_new_splash]]MainActivity"
                   android:theme="@android:style/Theme.Translucent.NoTitleBar"
diff --git a/chrome/android/webapk/shell_apk/BUILD.gn b/chrome/android/webapk/shell_apk/BUILD.gn
index 848fe00..58194d4 100644
--- a/chrome/android/webapk/shell_apk/BUILD.gn
+++ b/chrome/android/webapk/shell_apk/BUILD.gn
@@ -61,8 +61,9 @@
         "src/org/chromium/webapk/shell_apk/h2o/H2OMainActivity.java",
         "src/org/chromium/webapk/shell_apk/h2o/H2OOpaqueMainActivity.java",
         "src/org/chromium/webapk/shell_apk/h2o/H2OTransparentLauncherActivity.java",
-        "src/org/chromium/webapk/shell_apk/h2o/OverlaySplashActivity.java",
         "src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java",
+        "src/org/chromium/webapk/shell_apk/h2o/SplashContentProvider.java",
+        "src/org/chromium/webapk/shell_apk/h2o/SplashUtils.java",
       ]
       deps += [ "//chrome/android/webapk/libs/common:splash_java" ]
     }
@@ -306,10 +307,12 @@
 
 android_library("shell_apk_javatests") {
   testonly = true
-  java_files =
-      [ "javatests/src/org/chromium/webapk/shell_apk/DexLoaderTest.java" ]
+  java_files = [
+    "javatests/src/org/chromium/webapk/shell_apk/DexLoaderTest.java",
+    "javatests/src/org/chromium/webapk/shell_apk/h2o/SplashUtilsTest.java",
+  ]
   deps = [
-    ":webapk_generated_webapk_java",
+    ":new_splash_webapk_generated_webapk_java",
     "//base:base_java",
     "//base:base_java_test_support",
     "//chrome/android/webapk/libs/common:common_java",
diff --git a/chrome/android/webapk/shell_apk/current_version/current_version.gni b/chrome/android/webapk/shell_apk/current_version/current_version.gni
index 9d55305..cb0ba68 100644
--- a/chrome/android/webapk/shell_apk/current_version/current_version.gni
+++ b/chrome/android/webapk/shell_apk/current_version/current_version.gni
@@ -12,4 +12,4 @@
 # //chrome/android/webapk/shell_apk:webapk is changed. This includes
 # Java files, Android resource files and AndroidManifest.xml. Does not affect
 # Chrome.apk
-current_shell_apk_version = 87
+current_shell_apk_version = 88
diff --git a/chrome/android/webapk/shell_apk/javatests/src/org/chromium/webapk/shell_apk/h2o/SplashUtilsTest.java b/chrome/android/webapk/shell_apk/javatests/src/org/chromium/webapk/shell_apk/h2o/SplashUtilsTest.java
new file mode 100644
index 0000000..9b79553
--- /dev/null
+++ b/chrome/android/webapk/shell_apk/javatests/src/org/chromium/webapk/shell_apk/h2o/SplashUtilsTest.java
@@ -0,0 +1,58 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.webapk.shell_apk.h2o;
+
+import android.graphics.Bitmap;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.test.BaseJUnit4ClassRunner;
+
+/** Tests for {@link SplashUtils} */
+@RunWith(BaseJUnit4ClassRunner.class)
+public class SplashUtilsTest {
+    /**
+     * Tests that {@link SplashUtils#createAndImmediatelyScreenshotSplashView{}} returns a non-blank
+     * bitmap.
+     */
+    @Test
+    @SmallTest
+    public void testCreateAndImmediatelyScreenshotSplashView() {
+        // Request large splash screen so that icon does not take up all of the space.
+        final int requestedSplashWidth = 1000;
+        final int requestedSplashHeight = 1000;
+        Bitmap screenshot = SplashUtils.createAndImmediatelyScreenshotSplashView(
+                InstrumentationRegistry.getTargetContext(), requestedSplashWidth,
+                requestedSplashHeight, 1024 * 1024 * 4 /* maxSizeBytes */);
+        Assert.assertNotNull(screenshot);
+        Assert.assertEquals(requestedSplashWidth, screenshot.getWidth());
+        Assert.assertEquals(requestedSplashHeight, screenshot.getHeight());
+
+        // Check that the screenshot is non-blank.
+        Assert.assertTrue(!allPixelsHaveSameColor(screenshot));
+    }
+
+    private boolean allPixelsHaveSameColor(Bitmap bitmap) {
+        int width = bitmap.getWidth();
+        int height = bitmap.getHeight();
+        if (width == 0 || height == 0) return true;
+
+        int[] pixels = new int[width * height];
+        try {
+            bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
+        } catch (Exception e) {
+            Assert.fail();
+        }
+        int firstColor = pixels[0];
+        for (int i = 1; i < pixels.length; ++i) {
+            if (pixels[i] != firstColor) return false;
+        }
+        return true;
+    }
+}
diff --git a/chrome/android/webapk/shell_apk/res_h2o/values-v17/styles.xml b/chrome/android/webapk/shell_apk/res_h2o/values-v17/styles.xml
index d99aaaf..cf80bab7 100644
--- a/chrome/android/webapk/shell_apk/res_h2o/values-v17/styles.xml
+++ b/chrome/android/webapk/shell_apk/res_h2o/values-v17/styles.xml
@@ -9,16 +9,4 @@
     <item name="android:windowNoTitle">true</item>
     <item name="android:windowBackground">@color/background_color</item>
   </style>
-
-  <!-- Must not be translucent so that background color is shown right when the
-       WebAPK is launched. -->
-  <style name="EarlySplashTheme" parent="SplashTheme">
-    <item name="android:windowIsTranslucent">false</item>
-  </style>
-
-  <!-- Must be translucent so that host browser loads page while splash screen
-       is up. -->
-  <style name="OverlaySplashTheme" parent="SplashTheme">
-    <item name="android:windowIsTranslucent">true</item>
-  </style>
 </resources>
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkSharedPreferences.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkSharedPreferences.java
index 0ef7f74..6d41de04 100644
--- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkSharedPreferences.java
+++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkSharedPreferences.java
@@ -31,6 +31,12 @@
     public static final String PREF_REQUEST_HOST_BROWSER_RELAUNCH_TIMESTAMP =
             "org.chromium.webapk.shell_apk.request_host_browser_relaunch_timestamp";
 
+    /** Width of splash screen during previous WebAPK launch. */
+    public static final String PREF_SPLASH_WIDTH = "org.chromium.webapk.shell_apk.splash_width";
+
+    /** Height of splash screen during previous WebAPK launch. */
+    public static final String PREF_SPLASH_HEIGHT = "org.chromium.webapk.shell_apk.splash_height";
+
     public static SharedPreferences getPrefs(Context context) {
         return context.getSharedPreferences(PREF_PACKAGE, Context.MODE_PRIVATE);
     }
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/OverlaySplashActivity.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/OverlaySplashActivity.java
deleted file mode 100644
index 4959c858..0000000
--- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/OverlaySplashActivity.java
+++ /dev/null
@@ -1,54 +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.
-
-package org.chromium.webapk.shell_apk.h2o;
-
-import android.app.Activity;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.Color;
-import android.os.Bundle;
-import android.widget.FrameLayout;
-
-import org.chromium.webapk.lib.common.WebApkMetaDataKeys;
-import org.chromium.webapk.lib.common.WebApkMetaDataUtils;
-import org.chromium.webapk.lib.common.splash.SplashLayout;
-import org.chromium.webapk.shell_apk.R;
-import org.chromium.webapk.shell_apk.WebApkUtils;
-
-/**
- * Splash screen activity which is launched on top of host browser and stays
- * up till the host browser draws a non empty frame.
- */
-public class OverlaySplashActivity extends Activity {
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        showSplashScreen();
-    }
-
-    // TODO(pkotwicz): Make SplashActivity and OverlaySplashActivity share code.
-    private void showSplashScreen() {
-        Bundle metadata = WebApkUtils.readMetaData(this);
-        Resources resources = getResources();
-
-        Bitmap icon = WebApkUtils.decodeBitmapFromDrawable(resources, R.drawable.splash_icon);
-        @SplashLayout.IconClassification
-        int iconClassification = SplashLayout.classifyIcon(resources, icon, false);
-
-        FrameLayout layout = new FrameLayout(this);
-        setContentView(layout);
-
-        int backgroundColor = WebApkUtils.getColor(resources, R.color.background_color);
-        SplashLayout.createLayout(this, layout, icon, false /* isIconAdaptive */,
-                iconClassification, resources.getString(R.string.name),
-                WebApkUtils.shouldUseLightForegroundOnBackground(backgroundColor));
-
-        int themeColor = (int) WebApkMetaDataUtils.getLongFromMetaData(
-                metadata, WebApkMetaDataKeys.THEME_COLOR, Color.BLACK);
-        WebApkUtils.setStatusBarColor(
-                getWindow(), WebApkUtils.getDarkenedColorForStatusBar(themeColor));
-    }
-}
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java
index 6db22a1..bdd873f 100644
--- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java
+++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java
@@ -9,26 +9,36 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
-import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.Color;
 import android.os.Bundle;
 import android.os.SystemClock;
-import android.widget.FrameLayout;
+import android.view.View;
+import android.view.ViewTreeObserver;
 
 import org.chromium.webapk.lib.common.WebApkMetaDataKeys;
 import org.chromium.webapk.lib.common.WebApkMetaDataUtils;
-import org.chromium.webapk.lib.common.splash.SplashLayout;
 import org.chromium.webapk.shell_apk.HostBrowserLauncher;
 import org.chromium.webapk.shell_apk.HostBrowserLauncherParams;
 import org.chromium.webapk.shell_apk.LaunchHostBrowserSelector;
-import org.chromium.webapk.shell_apk.R;
 import org.chromium.webapk.shell_apk.WebApkUtils;
 
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
 /** Displays splash screen. */
 public class SplashActivity extends Activity {
     private static final String SAVED_INSTANCE_STATE_WAS_BROWSER_LAUNCHED = "wasBrowserLaunched";
 
+    /** Whether {@link mSplashView} was laid out. */
+    private boolean mSplashViewLaidOut;
+
+    /** Task to screenshot and encode splash. */
+    @SuppressWarnings("NoAndroidAsyncTaskCheck")
+    private android.os.AsyncTask mScreenshotSplashTask;
+
+    private View mSplashView;
+    private HostBrowserLauncherParams mParams;
     private boolean mWasBrowserLaunched;
     private boolean mFinishOnResume;
 
@@ -73,6 +83,16 @@
     }
 
     @Override
+    public void onDestroy() {
+        SplashContentProvider.clearCache();
+        if (mScreenshotSplashTask != null) {
+            mScreenshotSplashTask.cancel(false);
+            mScreenshotSplashTask = null;
+        }
+        super.onDestroy();
+    }
+
+    @Override
     public void onSaveInstanceState(Bundle outState) {
         outState.putBoolean(SAVED_INSTANCE_STATE_WAS_BROWSER_LAUNCHED, mWasBrowserLaunched);
     }
@@ -98,20 +118,6 @@
 
     private void showSplashScreen() {
         Bundle metadata = WebApkUtils.readMetaData(this);
-        Resources resources = getResources();
-
-        Bitmap icon = WebApkUtils.decodeBitmapFromDrawable(resources, R.drawable.splash_icon);
-        @SplashLayout.IconClassification
-        int iconClassification = SplashLayout.classifyIcon(resources, icon, false);
-
-        FrameLayout layout = new FrameLayout(this);
-        setContentView(layout);
-
-        int backgroundColor = WebApkUtils.getColor(resources, R.color.background_color);
-        SplashLayout.createLayout(this, layout, icon, false /* isIconAdaptive */,
-                iconClassification, resources.getString(R.string.name),
-                WebApkUtils.shouldUseLightForegroundOnBackground(backgroundColor));
-
         int themeColor = (int) WebApkMetaDataUtils.getLongFromMetaData(
                 metadata, WebApkMetaDataKeys.THEME_COLOR, Color.BLACK);
         WebApkUtils.setStatusBarColor(
@@ -121,6 +127,20 @@
         if (orientation != ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) {
             setRequestedOrientation(orientation);
         }
+
+        mSplashView = SplashUtils.createSplashView(this);
+        mSplashView.getViewTreeObserver().addOnGlobalLayoutListener(
+                new ViewTreeObserver.OnGlobalLayoutListener() {
+                    @Override
+                    public void onGlobalLayout() {
+                        if (mSplashView.getWidth() == 0 || mSplashView.getHeight() == 0) return;
+
+                        mSplashView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
+                        mSplashViewLaidOut = true;
+                        maybeScreenshotSplash();
+                    }
+                });
+        setContentView(mSplashView);
     }
 
     /** Called once the host browser has been selected. */
@@ -141,7 +161,67 @@
             return;
         }
 
+        mParams = params;
+        maybeScreenshotSplash();
+    }
+
+    /**
+     * Screenshots {@link mSplashView} if:
+     * - host browser was selected
+     * AND
+     * - splash view was laid out
+     */
+    private void maybeScreenshotSplash() {
+        if (mParams == null || !mSplashViewLaidOut) return;
+
+        screenshotAndEncodeSplashInBackground();
+    }
+
+    /**
+     * Launches the host browser on top of {@link SplashActivity}.
+     * @param splashPngEncoded PNG-encoded screenshot of {@link mSplashView}.
+     */
+    private void launch(byte[] splashPngEncoded) {
+        SplashContentProvider.cache(
+                this, splashPngEncoded, mSplashView.getWidth(), mSplashView.getHeight());
         mWasBrowserLaunched = true;
-        H2OLauncher.launch(this, params);
+        H2OLauncher.launch(this, mParams);
+        mParams = null;
+    }
+
+    /**
+     * Screenshots and PNG-encodes {@link mSplashView} on a background thread.
+     */
+    @SuppressWarnings("NoAndroidAsyncTaskCheck")
+    private void screenshotAndEncodeSplashInBackground() {
+        final Bitmap bitmap = SplashUtils.screenshotView(
+                mSplashView, SplashContentProvider.MAX_TRANSFER_SIZE_BYTES);
+        if (bitmap == null) {
+            launch(null);
+            return;
+        }
+
+        mScreenshotSplashTask =
+                new android.os
+                        .AsyncTask<Void, Void, byte[]>() {
+                            @Override
+                            protected byte[] doInBackground(Void... args) {
+                                try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
+                                    bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
+                                    return out.toByteArray();
+                                } catch (IOException e) {
+                                }
+                                return null;
+                            }
+
+                            @Override
+                            protected void onPostExecute(byte[] splashPngEncoded) {
+                                mScreenshotSplashTask = null;
+                                launch(splashPngEncoded);
+                            }
+
+                            // Do nothing if task was cancelled.
+                        }
+                        .executeOnExecutor(android.os.AsyncTask.THREAD_POOL_EXECUTOR);
     }
 }
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashContentProvider.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashContentProvider.java
new file mode 100644
index 0000000..1700de3a
--- /dev/null
+++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashContentProvider.java
@@ -0,0 +1,175 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.webapk.shell_apk.h2o;
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.ParcelFileDescriptor;
+
+import org.chromium.webapk.lib.common.WebApkCommonUtils;
+import org.chromium.webapk.shell_apk.WebApkSharedPreferences;
+
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+import java.util.concurrent.atomic.AtomicReference;
+
+/** ContentProvider for screenshot of splash screen. */
+public class SplashContentProvider
+        extends ContentProvider implements ContentProvider.PipeDataWriter<Void> {
+    /** Holds value which gets cleared after {@link ExpiringData#CLEAR_DATA_INTERVAL_MS}.  */
+    private static class ExpiringData {
+        /** Time in milliseconds after constructing the object to clear the cached data. */
+        private static final int CLEAR_CACHED_DATA_INTERVAL_MS = 10000;
+
+        private byte[] mCachedData;
+        private Handler mHandler;
+
+        public ExpiringData(byte[] cachedData, Runnable expiryTask) {
+            mCachedData = cachedData;
+            mHandler = new Handler();
+            mHandler.postDelayed(expiryTask, CLEAR_CACHED_DATA_INTERVAL_MS);
+        }
+
+        public byte[] getCachedData() {
+            return mCachedData;
+        }
+
+        public void removeCallbacks() {
+            mHandler.removeCallbacksAndMessages(null);
+        }
+    }
+
+    /**
+     * Maximum size in bytes of screenshot to transfer to browser. The screenshot should be
+     * downsampled to fit. Capping the maximum size of the screenshot decreases bitmap encoding
+     * time and image transfer time.
+     */
+    public static final int MAX_TRANSFER_SIZE_BYTES = 1024 * 1024 * 4;
+
+    /** Mime type of transferred screenshot. */
+    private static final String SPLASH_MIME_TYPE = "image/png";
+
+    private static AtomicReference<ExpiringData> sCachedSplashPngBytes = new AtomicReference<>();
+
+    /** The URI handled by this content provider. */
+    private String mContentProviderUri;
+
+    /**
+     * Temporarily caches the passed-in splash screen screenshot. To preserve memory, the cached
+     * data is cleared after a delay.
+     */
+    public static void cache(
+            Context context, byte[] splashPngBytes, int splashWidth, int splashHeight) {
+        SharedPreferences.Editor editor = WebApkSharedPreferences.getPrefs(context).edit();
+        editor.putInt(WebApkSharedPreferences.PREF_SPLASH_WIDTH, splashWidth);
+        editor.putInt(WebApkSharedPreferences.PREF_SPLASH_HEIGHT, splashHeight);
+        editor.apply();
+
+        getAndSetCachedData(splashPngBytes);
+    }
+
+    public static void clearCache() {
+        getAndSetCachedData(null);
+    }
+
+    /**
+     * Sets the cached splash screen screenshot and returns the old one.
+     * Thread safety: Can be called from any thread.
+     */
+    private static byte[] getAndSetCachedData(byte[] newSplashPngBytes) {
+        ExpiringData newData = null;
+        if (newSplashPngBytes != null) {
+            newData = new ExpiringData(newSplashPngBytes, SplashContentProvider::clearCache);
+        }
+        ExpiringData oldCachedData = sCachedSplashPngBytes.getAndSet(newData);
+        if (oldCachedData == null) return null;
+
+        oldCachedData.removeCallbacks();
+        return oldCachedData.getCachedData();
+    }
+
+    @Override
+    public boolean onCreate() {
+        mContentProviderUri =
+                WebApkCommonUtils.generateSplashContentProviderUri(getContext().getPackageName());
+        return true;
+    }
+
+    @Override
+    public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
+        if (uri != null && uri.toString().equals(mContentProviderUri)) {
+            return openPipeHelper(null, null, null, null, this);
+        }
+        return null;
+    }
+
+    @Override
+    public void writeDataToPipe(
+            ParcelFileDescriptor output, Uri uri, String mimeType, Bundle opts, Void unused) {
+        try (OutputStream out = new FileOutputStream(output.getFileDescriptor())) {
+            byte[] cachedSplashPngBytes = getAndSetCachedData(null);
+            if (cachedSplashPngBytes != null) {
+                out.write(cachedSplashPngBytes);
+            } else {
+                // One way that this case gets hit is when the WebAPK is brought to the foreground
+                // via Android Recents after the Android OOM killer has killed the host browser but
+                // not SplashActivity.
+                Bitmap splashScreenshot = recreateAndScreenshotSplash();
+                if (splashScreenshot != null) {
+                    splashScreenshot.compress(Bitmap.CompressFormat.PNG, 100, out);
+                }
+            }
+            out.flush();
+        } catch (Exception e) {
+        }
+    }
+
+    @Override
+    public String getType(Uri uri) {
+        if (uri != null && uri.toString().equals(mContentProviderUri)) {
+            return SPLASH_MIME_TYPE;
+        }
+        return null;
+    }
+
+    @Override
+    public int update(Uri uri, ContentValues values, String where, String[] whereArgs) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public int delete(Uri uri, String selection, String[] selectionArgs) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public Uri insert(Uri uri, ContentValues values) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+            String sortOrder) {
+        throw new UnsupportedOperationException();
+    }
+
+    /** Builds splashscreen at size that it was last displayed and screenshots it. */
+    private Bitmap recreateAndScreenshotSplash() {
+        Context context = getContext().getApplicationContext();
+        SharedPreferences prefs = WebApkSharedPreferences.getPrefs(context);
+        int splashWidth = prefs.getInt(WebApkSharedPreferences.PREF_SPLASH_WIDTH, -1);
+        int splashHeight = prefs.getInt(WebApkSharedPreferences.PREF_SPLASH_HEIGHT, -1);
+        return SplashUtils.createAndImmediatelyScreenshotSplashView(
+                context, splashWidth, splashHeight, MAX_TRANSFER_SIZE_BYTES);
+    }
+}
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashUtils.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashUtils.java
new file mode 100644
index 0000000..06716b3
--- /dev/null
+++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashUtils.java
@@ -0,0 +1,73 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.webapk.shell_apk.h2o;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Matrix;
+import android.view.View;
+import android.widget.FrameLayout;
+
+import org.chromium.webapk.lib.common.splash.SplashLayout;
+import org.chromium.webapk.shell_apk.R;
+import org.chromium.webapk.shell_apk.WebApkUtils;
+
+/** Contains splash screen related utility methods. */
+public class SplashUtils {
+    /** Creates view with splash screen. */
+    public static View createSplashView(Context context) {
+        Resources resources = context.getResources();
+        Bitmap icon = WebApkUtils.decodeBitmapFromDrawable(resources, R.drawable.splash_icon);
+        @SplashLayout.IconClassification
+        int iconClassification = SplashLayout.classifyIcon(resources, icon, false);
+        int backgroundColor = WebApkUtils.getColor(resources, R.color.background_color);
+
+        FrameLayout layout = new FrameLayout(context);
+        SplashLayout.createLayout(context, layout, icon, false /* isIconAdaptive */,
+                iconClassification, resources.getString(R.string.name),
+                WebApkUtils.shouldUseLightForegroundOnBackground(backgroundColor));
+        return layout;
+    }
+
+    /**
+     * Returns bitmap with screenshot of passed-in view. Downsamples screenshot so that it is
+     * no more than {@maxSizeInBytes}.
+     */
+    public static Bitmap screenshotView(View view, int maxSizeBytes) {
+        // Implementation copied from Android shared element code -
+        // TransitionUtils#createViewBitmap().
+
+        int bitmapWidth = view.getWidth();
+        int bitmapHeight = view.getHeight();
+        if (bitmapWidth == 0 || bitmapHeight == 0) return null;
+
+        float scale = Math.min(1f, ((float) maxSizeBytes) / (4 * bitmapWidth * bitmapHeight));
+        bitmapWidth = Math.round(bitmapWidth * scale);
+        bitmapHeight = Math.round(bitmapHeight * scale);
+
+        Matrix matrix = new Matrix();
+        matrix.postScale(scale, scale);
+
+        Bitmap bitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888);
+        Canvas canvas = new Canvas(bitmap);
+        canvas.concat(matrix);
+        view.draw(canvas);
+        return bitmap;
+    }
+
+    /** Creates splash view with the passed-in dimensions and screenshots it. */
+    public static Bitmap createAndImmediatelyScreenshotSplashView(
+            Context context, int splashWidth, int splashHeight, int maxSizeBytes) {
+        if (splashWidth <= 0 || splashHeight <= 0) return null;
+
+        View splashView = createSplashView(context);
+        splashView.measure(View.MeasureSpec.makeMeasureSpec(splashWidth, View.MeasureSpec.EXACTLY),
+                View.MeasureSpec.makeMeasureSpec(splashHeight, View.MeasureSpec.EXACTLY));
+        splashView.layout(0, 0, splashWidth, splashHeight);
+        return screenshotView(splashView, maxSizeBytes);
+    }
+}
diff --git a/chrome/android/webapk/test/BUILD.gn b/chrome/android/webapk/test/BUILD.gn
index a50cfc1..4cea7cd 100644
--- a/chrome/android/webapk/test/BUILD.gn
+++ b/chrome/android/webapk/test/BUILD.gn
@@ -10,6 +10,7 @@
   testonly = true
   java_files = [ "src/org/chromium/webapk/test/WebApkTestHelper.java" ]
   deps = [
+    "//chrome/android/webapk/libs/common:common_java",
     "//third_party/mockito:mockito_java",
     "//third_party/robolectric:robolectric_all_java",
   ]
diff --git a/chrome/android/webapk/test/DEPS b/chrome/android/webapk/test/DEPS
new file mode 100644
index 0000000..a8953d02
--- /dev/null
+++ b/chrome/android/webapk/test/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+chrome/android/webapk/libs/common",
+]
diff --git a/chrome/android/webapk/test/src/org/chromium/webapk/test/WebApkTestHelper.java b/chrome/android/webapk/test/src/org/chromium/webapk/test/WebApkTestHelper.java
index 21c697f..48e00f2 100644
--- a/chrome/android/webapk/test/src/org/chromium/webapk/test/WebApkTestHelper.java
+++ b/chrome/android/webapk/test/src/org/chromium/webapk/test/WebApkTestHelper.java
@@ -8,6 +8,7 @@
 import android.content.pm.ActivityInfo;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
+import android.content.pm.ProviderInfo;
 import android.content.pm.ResolveInfo;
 import android.content.res.Resources;
 import android.os.Bundle;
@@ -17,6 +18,8 @@
 import org.robolectric.Shadows;
 import org.robolectric.shadows.ShadowPackageManager;
 
+import org.chromium.webapk.lib.common.WebApkCommonUtils;
+
 import java.net.URISyntaxException;
 
 /**
@@ -87,21 +90,25 @@
         ShadowPackageManager.resources.put(packageName, res);
     }
 
-    private static PackageInfo newPackageInfo(String packageName, Bundle metaData,
+    private static PackageInfo newPackageInfo(String webApkPackageName, Bundle metaData,
             String[] shareTargetActivityClassNames, Bundle[] shareTargetMetaData) {
         ApplicationInfo applicationInfo = new ApplicationInfo();
         applicationInfo.metaData = metaData;
         PackageInfo packageInfo = new PackageInfo();
-        packageInfo.packageName = packageName;
+        packageInfo.packageName = webApkPackageName;
         packageInfo.applicationInfo = applicationInfo;
 
         if (shareTargetMetaData != null) {
             packageInfo.activities = new ActivityInfo[shareTargetMetaData.length];
             for (int i = 0; i < shareTargetMetaData.length; ++i) {
-                packageInfo.activities[i] = newActivityInfo(
-                        packageName, shareTargetActivityClassNames[i], shareTargetMetaData[i]);
+                packageInfo.activities[i] = newActivityInfo(webApkPackageName,
+                        shareTargetActivityClassNames[i], shareTargetMetaData[i]);
             }
         }
+
+        packageInfo.providers =
+                new ProviderInfo[] {newSplashContentProviderInfo(webApkPackageName)};
+
         return packageInfo;
     }
 
@@ -121,4 +128,12 @@
         activityInfo.metaData = metaData;
         return activityInfo;
     }
+
+    private static ProviderInfo newSplashContentProviderInfo(String webApkPackageName) {
+        ProviderInfo providerInfo = new ProviderInfo();
+        providerInfo.authority =
+                WebApkCommonUtils.generateSplashContentProviderAuthority(webApkPackageName);
+        providerInfo.packageName = webApkPackageName;
+        return providerInfo;
+    }
 }
diff --git a/chrome/app/chrome_content_browser_overlay_manifest.cc b/chrome/app/chrome_content_browser_overlay_manifest.cc
index ed1c9a10..0d61110 100644
--- a/chrome/app/chrome_content_browser_overlay_manifest.cc
+++ b/chrome/app/chrome_content_browser_overlay_manifest.cc
@@ -144,6 +144,7 @@
                                 safe_browsing::mojom::SafeBrowsing>())
             .RequireCapability("apps", "app_service")
             .RequireCapability("ash", "system_ui")
+            // Used by ShelfTestApi and ShelfIntegrationTestApi
             .RequireCapability("ash", "test")
             .RequireCapability("ash", "display")
             // Only used in the classic Ash case
diff --git a/chrome/app/chrome_main_delegate.cc b/chrome/app/chrome_main_delegate.cc
index 887c8fd..ee7eadb 100644
--- a/chrome/app/chrome_main_delegate.cc
+++ b/chrome/app/chrome_main_delegate.cc
@@ -521,7 +521,8 @@
 
 #if defined(OS_CHROMEOS)
   // The feature list depends on BrowserPolicyConnectorChromeOS which depends
-  // on DBus, so initialize it here.
+  // on DBus, so initialize it here. Some D-Bus clients may depend on feature
+  // list, so initialize them separately later at the end of this function.
   chromeos::InitializeDBus();
 #endif
 
@@ -536,6 +537,11 @@
       LoadLocalState(chrome_feature_list_creator, is_running_tests);
   chrome_feature_list_creator->SetApplicationLocale(actual_locale);
   chrome_feature_list_creator->OverrideCachedUIStrings();
+
+#if defined(OS_CHROMEOS)
+  // Initialize D-Bus clients that depend on feature list.
+  chromeos::InitializeFeatureListDependentDBus();
+#endif
 }
 
 bool ChromeMainDelegate::ShouldCreateFeatureList() {
diff --git a/chrome/app/chrome_packaged_service_manifests.cc b/chrome/app/chrome_packaged_service_manifests.cc
index 4586233..b483065 100644
--- a/chrome/app/chrome_packaged_service_manifests.cc
+++ b/chrome/app/chrome_packaged_service_manifests.cc
@@ -120,6 +120,7 @@
                                    InstanceSharingPolicy::kSingleton)
                            .Build())
           .RequireCapability("network", "network_service")
+          .RequireCapability("device", "device:wake_lock")
           .Build()};
   return *manifest;
 }
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index fcea933..7a37d87 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -1078,14 +1078,13 @@
     "performance_manager/decorators/page_almost_idle_decorator.h",
     "performance_manager/graph/frame_node_impl.cc",
     "performance_manager/graph/frame_node_impl.h",
-    "performance_manager/graph/graph.cc",
-    "performance_manager/graph/graph.h",
+    "performance_manager/graph/graph_impl.cc",
+    "performance_manager/graph/graph_impl.h",
     "performance_manager/graph/node_attached_data.cc",
     "performance_manager/graph/node_attached_data.h",
     "performance_manager/graph/node_attached_data_impl.h",
     "performance_manager/graph/node_base.cc",
     "performance_manager/graph/node_base.h",
-    "performance_manager/graph/node_type.h",
     "performance_manager/graph/page_node_impl.cc",
     "performance_manager/graph/page_node_impl.h",
     "performance_manager/graph/process_node_impl.cc",
@@ -1106,6 +1105,7 @@
     "performance_manager/performance_manager_clock.h",
     "performance_manager/performance_manager_tab_helper.cc",
     "performance_manager/performance_manager_tab_helper.h",
+    "performance_manager/public/graph/node_type.h",
     "performance_manager/render_process_user_data.cc",
     "performance_manager/render_process_user_data.h",
     "performance_manager/web_contents_proxy.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index e727a763..78854ed 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -3916,6 +3916,11 @@
          autofill::features::kAutofillUseMobileLabelDisambiguation)},
 #endif  // defined(OS_ANDROID)
 
+    {"autofill-prune-suggestions",
+     flag_descriptions::kAutofillPruneSuggestionsName,
+     flag_descriptions::kAutofillPruneSuggestionsDescription, kOsAll,
+     FEATURE_VALUE_TYPE(autofill::features::kAutofillPruneSuggestions)},
+
     // NOTE: Adding a new flag requires adding a corresponding entry to enum
     // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag
     // Histograms" in tools/metrics/histograms/README.md (run the
diff --git a/chrome/browser/android/download/download_manager_service.cc b/chrome/browser/android/download/download_manager_service.cc
index 7fab0bf4..4567806 100644
--- a/chrome/browser/android/download/download_manager_service.cc
+++ b/chrome/browser/android/download/download_manager_service.cc
@@ -33,6 +33,7 @@
 #include "components/download/public/common/download_item_impl.h"
 #include "components/download/public/common/download_url_loader_factory_getter_impl.h"
 #include "components/download/public/common/simple_download_manager_coordinator.h"
+#include "components/download/public/common/url_download_handler_factory.h"
 #include "components/download/public/task/task_manager_impl.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/download_item_utils.h"
@@ -248,6 +249,9 @@
     content::BrowserContext* context) {
   if (in_progress_manager_) {
     DCHECK(!context->IsOffTheRecord());
+    // We are no longer interested in listening to |in_progress_manager_|,
+    // remove this object from being the delegate.
+    in_progress_manager_->SetDelegate(nullptr);
     // Set |is_pending_downloads_loaded_| to false so that we need to wait for
     // download history to initialize before performing new download actions.
     is_pending_downloads_loaded_ = false;
@@ -693,7 +697,7 @@
   base::FilePath data_dir;
   base::android::GetDataDirectory(&data_dir);
   in_progress_manager_ = std::make_unique<download::InProgressDownloadManager>(
-      nullptr, data_dir.Append(chrome::kInitialProfile),
+      this, data_dir.Append(chrome::kInitialProfile),
       base::BindRepeating(&IgnoreOriginSecurityCheck),
       base::BindRepeating(&content::DownloadRequestUtils::IsURLSafe));
   content::GetNetworkServiceFromConnector(service_binding_.GetConnector());
@@ -704,7 +708,6 @@
           factory->Clone()));
   in_progress_manager_->set_download_start_observer(
       DownloadControllerBase::Get());
-  in_progress_manager_->SetDelegate(this);
 }
 
 void DownloadManagerService::OnPendingDownloadsLoaded() {
@@ -752,12 +755,17 @@
 }
 
 void DownloadManagerService::OnDownloadsInitialized() {
-  // We are no longer interested in listening to |in_progress_manager_|, remove
-  // this object from being the delegate.
-  in_progress_manager_->SetDelegate(nullptr);
   OnPendingDownloadsLoaded();
 }
 
+std::unique_ptr<service_manager::Connector>
+DownloadManagerService::GetServiceConnector() {
+  service_manager::Connector* connector = service_binding_.GetConnector();
+  if (connector)
+    return connector->Clone();  // Clone for use on a different thread.
+  return nullptr;
+}
+
 content::DownloadManager* DownloadManagerService::GetDownloadManager(
     bool is_off_the_record) {
   Profile* profile = ProfileManager::GetActiveUserProfile();
diff --git a/chrome/browser/android/download/download_manager_service.h b/chrome/browser/android/download/download_manager_service.h
index 9bb8fca..547fd5b 100644
--- a/chrome/browser/android/download/download_manager_service.h
+++ b/chrome/browser/android/download/download_manager_service.h
@@ -239,6 +239,7 @@
 
   // download::InProgressDownloadManager::Delegate implementations.
   void OnDownloadsInitialized() override;
+  std::unique_ptr<service_manager::Connector> GetServiceConnector() override;
 
   typedef base::Callback<void(bool)> ResumeCallback;
   void set_resume_callback_for_testing(const ResumeCallback& resume_cb) {
diff --git a/chrome/browser/android/vr/gvr_input_delegate.cc b/chrome/browser/android/vr/gvr_input_delegate.cc
index 29a5f66..f340891 100644
--- a/chrome/browser/android/vr/gvr_input_delegate.cc
+++ b/chrome/browser/android/vr/gvr_input_delegate.cc
@@ -6,6 +6,8 @@
 
 #include <utility>
 
+#include "base/strings/string16.h"
+#include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/android/vr/gl_browser_interface.h"
 #include "chrome/browser/android/vr/vr_controller.h"
 #include "chrome/browser/vr/input_event.h"
@@ -16,8 +18,61 @@
 
 namespace {
 constexpr gfx::Vector3dF kForwardVector = {0.0f, 0.0f, -1.0f};
+
+// TODO(https://crbug.com/957806): Copies of this function live in device/vr and
+// device/gamepad, which will be consolidated. Is there a way to also remove
+// this duplicate even though this is in under chrome/browser instead of device?
+void CopyToUString(const base::string16& src,
+                   device::UChar* dest,
+                   size_t dest_length) {
+  static_assert(sizeof(base::string16::value_type) == sizeof(device::UChar),
+                "Mismatched string16/UChar size.");
+
+  const size_t copy_char_count = std::min(src.size(), dest_length - 1);
+  src.copy(dest, copy_char_count);
+  std::fill(dest + copy_char_count, dest + dest_length, 0);
 }
 
+device::Gamepad CreateGamepad(const device::GvrGamepadData& data) {
+  device::Gamepad gamepad;
+
+  // Unless the controller state is updated on a different thread,
+  // data.connected should always be true when this function is called by
+  // GvrInputDelegate::GetInputSourceState.
+  gamepad.connected = data.connected;
+
+  gamepad.timestamp = data.timestamp;
+
+  // TODO(https://crbug.com/942201): Get correct ID string once WebXR spec issue
+  // #550 (https://github.com/immersive-web/webxr/issues/550) is resolved.
+  CopyToUString(base::UTF8ToUTF16("unknown"), gamepad.id,
+                base::size(gamepad.id));
+
+  gamepad.hand = data.right_handed ? device::GamepadHand::kRight
+                                   : device::GamepadHand::kLeft;
+
+  bool pressed = data.controller_button_pressed;
+  bool touched = data.is_touching;
+  double value = pressed ? 1.0 : 0.0;
+  gamepad.buttons[gamepad.buttons_length++] =
+      device::GamepadButton(pressed, touched, value);
+
+  if (touched) {
+    // data.touch_pos values are clamped to [0.0, 1.0], so normalize them to
+    // [-1.0, 1.0]
+    gamepad.axes[0] = (data.touch_pos.x() * 2.0) - 1.0;
+    gamepad.axes[1] = (data.touch_pos.y() * 2.0) - 1.0;
+  } else {
+    gamepad.axes[0] = 0.0;
+    gamepad.axes[1] = 0.0;
+  }
+
+  gamepad.axes_length = 2;
+
+  return gamepad;
+}
+}  // namespace
+
 namespace vr {
 
 GvrInputDelegate::GvrInputDelegate(gvr::GvrApi* gvr_api,
@@ -147,6 +202,9 @@
     gfx::Transform pointer;
     controller_->GetRelativePointerTransform(&pointer);
     state->description->pointer_offset = pointer;
+
+    // This Gamepad data is used to expose touchpad position to WebXR.
+    state->gamepad = CreateGamepad(controller_->GetGamepadData());
   }
 
   return state;
diff --git a/chrome/browser/chromeos/dbus/dbus_helper.cc b/chrome/browser/chromeos/dbus/dbus_helper.cc
index 2ba9eb7..e51a78d 100644
--- a/chrome/browser/chromeos/dbus/dbus_helper.cc
+++ b/chrome/browser/chromeos/dbus/dbus_helper.cc
@@ -58,7 +58,6 @@
   InitializeDBusClient<ArcCameraClient>(bus);
   InitializeDBusClient<AuthPolicyClient>(bus);
   InitializeDBusClient<BiodClient>(bus);  // For device::Fingerprint.
-  InitializeDBusClient<bluez::BluezDBusManager>(bus);
   InitializeDBusClient<CrasAudioClient>(bus);
   InitializeDBusClient<CryptohomeClient>(bus);
   InitializeDBusClient<CupsProxyClient>(bus);
@@ -78,7 +77,17 @@
   InstallAttributes::Initialize();
 }
 
+void InitializeFeatureListDependentDBus() {
+  dbus::Bus* bus = DBusThreadManager::Get()->GetSystemBus();
+  InitializeDBusClient<bluez::BluezDBusManager>(bus);
+}
+
 void ShutdownDBus() {
+  // Feature list-dependent D-Bus clients are shut down first because we try to.
+  // shut down in reverse order of initialization (in case of dependencies).
+  bluez::BluezDBusManager::Shutdown();
+
+  // Other D-Bus clients are shut down, also in reverse order of initialization.
   UpstartClient::Shutdown();
   SystemClockClient::Shutdown();
   SessionManagerClient::Shutdown();
@@ -90,7 +99,6 @@
   CupsProxyClient::Shutdown();
   CryptohomeClient::Shutdown();
   CrasAudioClient::Shutdown();
-  bluez::BluezDBusManager::Shutdown();
   BiodClient::Shutdown();
   AuthPolicyClient::Shutdown();
   ArcCameraClient::Shutdown();
diff --git a/chrome/browser/chromeos/dbus/dbus_helper.h b/chrome/browser/chromeos/dbus/dbus_helper.h
index 232c56a0..4388177 100644
--- a/chrome/browser/chromeos/dbus/dbus_helper.h
+++ b/chrome/browser/chromeos/dbus/dbus_helper.h
@@ -10,6 +10,10 @@
 // Initializes the DBus thread manager and chrome DBus services.
 void InitializeDBus();
 
+// D-Bus clients may depend on feature list. This initializes only those clients
+// and must be called after feature list initialization.
+void InitializeFeatureListDependentDBus();
+
 // Shuts down the DBus thread manager and chrome DBus services.
 void ShutdownDBus();
 
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
index 9b8d9ea0..8c7035d 100644
--- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
+++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
@@ -1181,7 +1181,8 @@
 void AutotestPrivateGetPrinterListFunction::RespondWithTimeoutError() {
   if (did_respond())
     return;
-  Respond(Error("Timeout occured before Enterprise printers were initialized"));
+  Respond(
+      Error("Timeout occurred before Enterprise printers were initialized"));
 }
 
 void AutotestPrivateGetPrinterListFunction::RespondWithSuccess() {
@@ -1668,16 +1669,16 @@
 
   service_manager::Connector* connector =
       content::ServiceManagerConnection::GetForProcess()->GetConnector();
-  connector->BindInterface(ash::mojom::kServiceName, &shelf_controller_);
+  connector->BindInterface(ash::mojom::kServiceName, &shelf_test_api_);
 
   int64_t display_id;
   if (!base::StringToInt64(params->display_id, &display_id)) {
-    return RespondNow(
-        Error("Invalid display_id. Expected string with numbers only. got %s",
-              params->display_id));
+    return RespondNow(Error(base::StrCat(
+        {"Invalid display_id; expected string with numbers only, got ",
+         params->display_id})));
   }
 
-  shelf_controller_->GetAutoHideBehaviorForTesting(
+  shelf_test_api_->GetAutoHideBehavior(
       display_id,
       base::BindOnce(&AutotestPrivateGetShelfAutoHideBehaviorFunction::
                          OnGetShelfAutoHideBehaviorCompleted,
@@ -1723,7 +1724,7 @@
 
   service_manager::Connector* connector =
       content::ServiceManagerConnection::GetForProcess()->GetConnector();
-  connector->BindInterface(ash::mojom::kServiceName, &shelf_controller_);
+  connector->BindInterface(ash::mojom::kServiceName, &shelf_test_api_);
 
   ash::ShelfAutoHideBehavior behavior;
   if (params->behavior == "always") {
@@ -1733,18 +1734,18 @@
   } else if (params->behavior == "hidden") {
     behavior = ash::ShelfAutoHideBehavior::SHELF_AUTO_HIDE_ALWAYS_HIDDEN;
   } else {
-    return RespondNow(Error(
-        "Invalid argument: '%s'. Expected: 'always', 'never' or 'hidden'.",
-        params->behavior));
+    return RespondNow(Error(base::StrCat(
+        {"Invalid behavior; expected 'always', 'never' or 'hidden', got ",
+         params->behavior})));
   }
   int64_t display_id;
   if (!base::StringToInt64(params->display_id, &display_id)) {
-    return RespondNow(
-        Error("Invalid display_id. Expected string with numbers only. got %s",
-              params->display_id));
+    return RespondNow(Error(base::StrCat(
+        {"Invalid display_id; expected string with numbers only, got ",
+         params->display_id})));
   }
 
-  shelf_controller_->SetAutoHideBehaviorForTesting(
+  shelf_test_api_->SetAutoHideBehavior(
       display_id, behavior,
       base::BindOnce(&AutotestPrivateSetShelfAutoHideBehaviorFunction::
                          OnSetShelfAutoHideBehaviorCompleted,
@@ -1758,6 +1759,128 @@
 }
 
 ///////////////////////////////////////////////////////////////////////////////
+// AutotestPrivateGetShelfAlignmentFunction
+///////////////////////////////////////////////////////////////////////////////
+
+AutotestPrivateGetShelfAlignmentFunction::
+    AutotestPrivateGetShelfAlignmentFunction() = default;
+
+AutotestPrivateGetShelfAlignmentFunction::
+    ~AutotestPrivateGetShelfAlignmentFunction() = default;
+
+ExtensionFunction::ResponseAction
+AutotestPrivateGetShelfAlignmentFunction::Run() {
+  DVLOG(1) << "AutotestPrivateGetShelfAlignmentFunction";
+
+  std::unique_ptr<api::autotest_private::GetShelfAlignment::Params> params(
+      api::autotest_private::GetShelfAlignment::Params::Create(*args_));
+  EXTENSION_FUNCTION_VALIDATE(params);
+
+  service_manager::Connector* connector =
+      content::ServiceManagerConnection::GetForProcess()->GetConnector();
+  connector->BindInterface(ash::mojom::kServiceName, &shelf_test_api_);
+
+  int64_t display_id;
+  if (!base::StringToInt64(params->display_id, &display_id)) {
+    return RespondNow(Error(base::StrCat(
+        {"Invalid display_id; expected string with numbers only, got ",
+         params->display_id})));
+  }
+
+  shelf_test_api_->GetAlignment(
+      display_id, base::BindOnce(&AutotestPrivateGetShelfAlignmentFunction::
+                                     OnGetShelfAlignmentCompleted,
+                                 this));
+  return RespondLater();
+}
+
+void AutotestPrivateGetShelfAlignmentFunction::OnGetShelfAlignmentCompleted(
+    ash::ShelfAlignment alignment) {
+  api::autotest_private::ShelfAlignmentType alignment_type;
+  switch (alignment) {
+    case ash::ShelfAlignment::SHELF_ALIGNMENT_BOTTOM:
+      alignment_type = api::autotest_private::ShelfAlignmentType::
+          SHELF_ALIGNMENT_TYPE_BOTTOM;
+      break;
+    case ash::ShelfAlignment::SHELF_ALIGNMENT_LEFT:
+      alignment_type =
+          api::autotest_private::ShelfAlignmentType::SHELF_ALIGNMENT_TYPE_LEFT;
+      break;
+    case ash::ShelfAlignment::SHELF_ALIGNMENT_RIGHT:
+      alignment_type =
+          api::autotest_private::ShelfAlignmentType::SHELF_ALIGNMENT_TYPE_RIGHT;
+      break;
+    case ash::ShelfAlignment::SHELF_ALIGNMENT_BOTTOM_LOCKED:
+      alignment_type = api::autotest_private::ShelfAlignmentType::
+          SHELF_ALIGNMENT_TYPE_BOTTOMLOCKED;
+      break;
+  }
+  Respond(OneArgument(std::make_unique<base::Value>(
+      api::autotest_private::ToString(alignment_type))));
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// AutotestPrivateSetShelfAlignmentFunction
+///////////////////////////////////////////////////////////////////////////////
+
+AutotestPrivateSetShelfAlignmentFunction::
+    AutotestPrivateSetShelfAlignmentFunction() = default;
+
+AutotestPrivateSetShelfAlignmentFunction::
+    ~AutotestPrivateSetShelfAlignmentFunction() = default;
+
+ExtensionFunction::ResponseAction
+AutotestPrivateSetShelfAlignmentFunction::Run() {
+  DVLOG(1) << "AutotestPrivateSetShelfAlignmentFunction";
+
+  std::unique_ptr<api::autotest_private::SetShelfAlignment::Params> params(
+      api::autotest_private::SetShelfAlignment::Params::Create(*args_));
+  EXTENSION_FUNCTION_VALIDATE(params);
+
+  service_manager::Connector* connector =
+      content::ServiceManagerConnection::GetForProcess()->GetConnector();
+  connector->BindInterface(ash::mojom::kServiceName, &shelf_test_api_);
+
+  ash::ShelfAlignment alignment;
+  switch (params->alignment) {
+    case api::autotest_private::ShelfAlignmentType::SHELF_ALIGNMENT_TYPE_BOTTOM:
+      alignment = ash::ShelfAlignment::SHELF_ALIGNMENT_BOTTOM;
+      break;
+    case api::autotest_private::ShelfAlignmentType::SHELF_ALIGNMENT_TYPE_LEFT:
+      alignment = ash::ShelfAlignment::SHELF_ALIGNMENT_LEFT;
+      break;
+    case api::autotest_private::ShelfAlignmentType::SHELF_ALIGNMENT_TYPE_RIGHT:
+      alignment = ash::ShelfAlignment::SHELF_ALIGNMENT_RIGHT;
+      break;
+    case api::autotest_private::ShelfAlignmentType::
+        SHELF_ALIGNMENT_TYPE_BOTTOMLOCKED:
+      alignment = ash::ShelfAlignment::SHELF_ALIGNMENT_BOTTOM_LOCKED;
+      break;
+    case api::autotest_private::ShelfAlignmentType::SHELF_ALIGNMENT_TYPE_NONE:
+      return RespondNow(
+          Error("Unsupported None alignment; expected 'Bottom', 'Left', "
+                "'Right' or 'BottomLocked'"));
+  }
+  int64_t display_id;
+  if (!base::StringToInt64(params->display_id, &display_id)) {
+    return RespondNow(Error(base::StrCat(
+        {"Invalid display_id; expected string with numbers only, got ",
+         params->display_id})));
+  }
+
+  shelf_test_api_->SetAlignment(
+      display_id, alignment,
+      base::BindOnce(&AutotestPrivateSetShelfAlignmentFunction::
+                         OnSetShelfAlignmentCompleted,
+                     this));
+  return RespondLater();
+}
+
+void AutotestPrivateSetShelfAlignmentFunction::OnSetShelfAlignmentCompleted() {
+  Respond(NoArguments());
+}
+
+///////////////////////////////////////////////////////////////////////////////
 // AutotestPrivateShowVirtualKeyboardIfEnabledFunction
 ///////////////////////////////////////////////////////////////////////////////
 
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h
index 1626d5fb..f95a886 100644
--- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h
+++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h
@@ -11,8 +11,9 @@
 
 #include "ash/public/cpp/assistant/assistant_state_proxy.h"
 #include "ash/public/cpp/assistant/default_voice_interaction_observer.h"
+#include "ash/public/cpp/shelf_types.h"
 #include "ash/public/interfaces/ash_message_center_controller.mojom.h"
-#include "ash/public/interfaces/shelf.mojom.h"
+#include "ash/public/interfaces/shelf_integration_test_api.mojom.h"
 #include "base/compiler_specific.h"
 #include "base/timer/timer.h"
 #include "chrome/browser/chromeos/printing/cups_printers_manager.h"
@@ -658,7 +659,7 @@
   ~AutotestPrivateGetShelfAutoHideBehaviorFunction() override;
   ResponseAction Run() override;
 
-  ash::mojom::ShelfControllerPtr shelf_controller_;
+  ash::mojom::ShelfIntegrationTestApiPtr shelf_test_api_;
 };
 
 // Sets shelf autohide behavior.
@@ -674,7 +675,39 @@
   ~AutotestPrivateSetShelfAutoHideBehaviorFunction() override;
   ResponseAction Run() override;
 
-  ash::mojom::ShelfControllerPtr shelf_controller_;
+  ash::mojom::ShelfIntegrationTestApiPtr shelf_test_api_;
+};
+
+// Returns the shelf alignment.
+class AutotestPrivateGetShelfAlignmentFunction
+    : public UIThreadExtensionFunction {
+ public:
+  AutotestPrivateGetShelfAlignmentFunction();
+  DECLARE_EXTENSION_FUNCTION("autotestPrivate.getShelfAlignment",
+                             AUTOTESTPRIVATE_GETSHELFALIGNMENT)
+
+ private:
+  void OnGetShelfAlignmentCompleted(ash::ShelfAlignment alignment);
+  ~AutotestPrivateGetShelfAlignmentFunction() override;
+  ResponseAction Run() override;
+
+  ash::mojom::ShelfIntegrationTestApiPtr shelf_test_api_;
+};
+
+// Sets shelf alignment.
+class AutotestPrivateSetShelfAlignmentFunction
+    : public UIThreadExtensionFunction {
+ public:
+  AutotestPrivateSetShelfAlignmentFunction();
+  DECLARE_EXTENSION_FUNCTION("autotestPrivate.setShelfAlignment",
+                             AUTOTESTPRIVATE_SETSHELFALIGNMENT)
+
+ private:
+  void OnSetShelfAlignmentCompleted();
+  ~AutotestPrivateSetShelfAlignmentFunction() override;
+  ResponseAction Run() override;
+
+  ash::mojom::ShelfIntegrationTestApiPtr shelf_test_api_;
 };
 
 class AutotestPrivateShowVirtualKeyboardIfEnabledFunction
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_apitest.cc b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_apitest.cc
index f80de06..d47be4e 100644
--- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_apitest.cc
+++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_apitest.cc
@@ -15,6 +15,7 @@
 #include "components/arc/session/connection_holder.h"
 #include "components/arc/test/connection_holder_util.h"
 #include "components/arc/test/fake_app_instance.h"
+#include "services/ws/common/switches.h"
 
 namespace extensions {
 
@@ -27,6 +28,8 @@
     ExtensionApiTest::SetUpCommandLine(command_line);
     // Make ARC enabled for tests.
     arc::SetArcAvailableCommandLineForTesting(command_line);
+    // Enable certain Mojo services like ShelfIntegrationTestApi.
+    command_line->AppendSwitch(ws::switches::kUseTestConfig);
   }
 
   void SetUpInProcessBrowserTestFixture() override {
diff --git a/chrome/browser/chromeos/login/auto_launched_kiosk_browsertest.cc b/chrome/browser/chromeos/login/auto_launched_kiosk_browsertest.cc
index 5d65bba3..65265be 100644
--- a/chrome/browser/chromeos/login/auto_launched_kiosk_browsertest.cc
+++ b/chrome/browser/chromeos/login/auto_launched_kiosk_browsertest.cc
@@ -179,8 +179,7 @@
 
     SessionManagerClient::InitializeFakeInMemory();
 
-    FakeSessionManagerClient::Get()->set_supports_restart_to_apply_user_flags(
-        true);
+    FakeSessionManagerClient::Get()->set_supports_browser_restart(true);
     FakeSessionManagerClient::Get()->set_device_policy(
         device_policy_helper_.device_policy()->GetBlob());
     FakeSessionManagerClient::Get()->set_device_local_account_policy(
diff --git a/chrome/browser/chromeos/login/chrome_restart_request.cc b/chrome/browser/chromeos/login/chrome_restart_request.cc
index 19725f94..5db8229 100644
--- a/chrome/browser/chromeos/login/chrome_restart_request.cc
+++ b/chrome/browser/chromeos/login/chrome_restart_request.cc
@@ -348,7 +348,7 @@
   }
   restart_requested = true;
 
-  if (!base::SysInfo::IsRunningOnChromeOS()) {
+  if (!SessionManagerClient::Get()->SupportsBrowserRestart()) {
     // Do nothing when running as test on bots or a dev box.
     const base::CommandLine* current_command_line =
         base::CommandLine::ForCurrentProcess();
diff --git a/chrome/browser/chromeos/login/demo_mode/demo_setup_browsertest.cc b/chrome/browser/chromeos/login/demo_mode/demo_setup_browsertest.cc
index cece5ff..2b85b51 100644
--- a/chrome/browser/chromeos/login/demo_mode/demo_setup_browsertest.cc
+++ b/chrome/browser/chromeos/login/demo_mode/demo_setup_browsertest.cc
@@ -107,25 +107,21 @@
 
 // Returns query to access the content of the given OOBE |screen| or empty
 // string if the |screen| is not a part of Demo Mode setup flow.
-std::string ScreenToContentQuery(OobeScreen screen) {
-  switch (screen) {
-    case OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES:
-      return "$('demo-preferences-content')";
-    case OobeScreen::SCREEN_OOBE_NETWORK:
-      return "$('oobe-network-md')";
-    case OobeScreen::SCREEN_OOBE_EULA:
-      return "$('oobe-eula-md')";
-    case OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE:
-      return "$('arc-tos-root')";
-    case OobeScreen::SCREEN_OOBE_UPDATE:
-      return "$('oobe-update-md')";
-    case OobeScreen::SCREEN_OOBE_DEMO_SETUP:
-      return "$('demo-setup-content')";
-    default: {
-      NOTREACHED() << "This OOBE screen is not a part of Demo Mode setup flow";
-      return std::string();
-    }
-  }
+std::string ScreenToContentQuery(OobeScreenId screen) {
+  if (screen == OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES)
+    return "$('demo-preferences-content')";
+  if (screen == OobeScreen::SCREEN_OOBE_NETWORK)
+    return "$('oobe-network-md')";
+  if (screen == OobeScreen::SCREEN_OOBE_EULA)
+    return "$('oobe-eula-md')";
+  if (screen == OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE)
+    return "$('arc-tos-root')";
+  if (screen == OobeScreen::SCREEN_OOBE_UPDATE)
+    return "$('oobe-update-md')";
+  if (screen == OobeScreen::SCREEN_OOBE_DEMO_SETUP)
+    return "$('demo-setup-content')";
+  NOTREACHED() << "This OOBE screen is not a part of Demo Mode setup flow";
+  return std::string();
 }
 
 // Waits for js condition to be fulfilled.
@@ -159,8 +155,8 @@
     DisconnectAllNetworks();
   }
 
-  bool IsScreenShown(OobeScreen screen) {
-    const std::string screen_name = GetOobeScreenName(screen);
+  bool IsScreenShown(OobeScreenId screen) {
+    const std::string screen_name = screen.name;
     const std::string query = base::StrCat(
         {"!!document.querySelector('#", screen_name,
          "') && !document.querySelector('#", screen_name, "').hidden"});
@@ -174,7 +170,7 @@
   // TODO(michaelpg): Replace this with IsScreenDialogElementVisible, which is
   // more robust because it checks whether the element is actually rendered.
   // Do this after a branch in case it introduces flakiness.
-  bool IsScreenDialogElementShown(OobeScreen screen,
+  bool IsScreenDialogElementShown(OobeScreenId screen,
                                   DemoSetupDialog dialog,
                                   const std::string& element_selector) {
     const std::string element = base::StrCat(
@@ -185,7 +181,7 @@
     return test::OobeJS().GetBool(query);
   }
 
-  bool IsScreenDialogElementVisible(OobeScreen screen,
+  bool IsScreenDialogElementVisible(OobeScreenId screen,
                                     DemoSetupDialog dialog,
                                     const std::string& element_selector) {
     const std::string element = base::StrCat(
@@ -196,7 +192,7 @@
     return test::OobeJS().GetBool(query);
   }
 
-  bool IsScreenDialogElementEnabled(OobeScreen screen,
+  bool IsScreenDialogElementEnabled(OobeScreenId screen,
                                     DemoSetupDialog dialog,
                                     const std::string& element_selector) {
     const std::string element = base::StrCat(
@@ -269,7 +265,7 @@
 
   // Simulates |button| click on a specified OOBE |screen|. Can be used for
   // screens that consists of one oobe-dialog element.
-  void ClickOobeButton(OobeScreen screen,
+  void ClickOobeButton(OobeScreenId screen,
                        OobeButton button,
                        JSExecution execution) {
     ClickOobeButtonWithSelector(screen, ButtonToTag(button), execution);
@@ -277,7 +273,7 @@
 
   // Simulates click on a button with |button_selector| on specified OOBE
   // |screen|. Can be used for screens that consists of one oobe-dialog element.
-  void ClickOobeButtonWithSelector(OobeScreen screen,
+  void ClickOobeButtonWithSelector(OobeScreenId screen,
                                    const std::string& button_selector,
                                    JSExecution execution) {
     const std::string query = base::StrCat(
@@ -297,7 +293,7 @@
 
   // Simulates |button| click on a |dialog| of the specified OOBE |screen|.
   // Can be used for screens that consists of multiple oobe-dialog elements.
-  void ClickScreenDialogButton(OobeScreen screen,
+  void ClickScreenDialogButton(OobeScreenId screen,
                                DemoSetupDialog dialog,
                                OobeButton button,
                                JSExecution execution) {
@@ -308,7 +304,7 @@
   // Simulates click on a button with |button_selector| on a |dialog| of the
   // specified OOBE |screen|. Can be used for screens that consist of multiple
   // oobe-dialog elements.
-  void ClickScreenDialogButtonWithSelector(OobeScreen screen,
+  void ClickScreenDialogButtonWithSelector(OobeScreenId screen,
                                            DemoSetupDialog dialog,
                                            const std::string& button_selector,
                                            JSExecution execution) {
@@ -359,14 +355,14 @@
                         DemoSetupDialog::kError);
   }
 
-  void WaitForScreenDialog(OobeScreen screen, DemoSetupDialog dialog) {
+  void WaitForScreenDialog(OobeScreenId screen, DemoSetupDialog dialog) {
     const std::string query =
         base::StrCat({"!", ScreenToContentQuery(screen), ".$['",
                       DialogToStringId(dialog), "'].hidden"});
     WaitForJsCondition(query);
   }
 
-  void SkipToScreen(OobeScreen screen) {
+  void SkipToScreen(OobeScreenId screen) {
     auto* const wizard_controller = WizardController::default_controller();
     wizard_controller->SimulateDemoModeSetupForTesting();
     wizard_controller->AdvanceToScreen(screen);
diff --git a/chrome/browser/chromeos/login/enrollment/auto_enrollment_check_screen_view.h b/chrome/browser/chromeos/login/enrollment/auto_enrollment_check_screen_view.h
index 72b475e1..8436f61 100644
--- a/chrome/browser/chromeos/login/enrollment/auto_enrollment_check_screen_view.h
+++ b/chrome/browser/chromeos/login/enrollment/auto_enrollment_check_screen_view.h
@@ -23,7 +23,7 @@
     virtual void OnViewDestroyed(AutoEnrollmentCheckScreenView* view) = 0;
   };
 
-  constexpr static OobeScreen kScreenId =
+  constexpr static StaticOobeScreenId kScreenId =
       OobeScreen::SCREEN_AUTO_ENROLLMENT_CHECK;
 
   virtual ~AutoEnrollmentCheckScreenView() {}
diff --git a/chrome/browser/chromeos/login/enrollment/enrollment_screen_view.h b/chrome/browser/chromeos/login/enrollment/enrollment_screen_view.h
index d0ce52a9..aa26eb1 100644
--- a/chrome/browser/chromeos/login/enrollment/enrollment_screen_view.h
+++ b/chrome/browser/chromeos/login/enrollment/enrollment_screen_view.h
@@ -47,7 +47,8 @@
                                            const std::string& location) = 0;
   };
 
-  constexpr static OobeScreen kScreenId = OobeScreen::SCREEN_OOBE_ENROLLMENT;
+  constexpr static StaticOobeScreenId kScreenId =
+      OobeScreen::SCREEN_OOBE_ENROLLMENT;
 
   virtual ~EnrollmentScreenView() {}
 
diff --git a/chrome/browser/chromeos/login/enrollment/hands_off_enrollment_browsertest.cc b/chrome/browser/chromeos/login/enrollment/hands_off_enrollment_browsertest.cc
index 05457cf..29d9200 100644
--- a/chrome/browser/chromeos/login/enrollment/hands_off_enrollment_browsertest.cc
+++ b/chrome/browser/chromeos/login/enrollment/hands_off_enrollment_browsertest.cc
@@ -157,7 +157,7 @@
   base::RunLoop().RunUntilIdle();
 
   EXPECT_EQ(
-      OobeScreen::SCREEN_OOBE_ENROLLMENT,
+      OobeScreen::SCREEN_OOBE_ENROLLMENT.AsId(),
       WizardController::default_controller()->current_screen()->screen_id());
   EXPECT_FALSE(ExistingUserController::current_controller());
   EXPECT_FALSE(StartupUtils::IsOobeCompleted());
diff --git a/chrome/browser/chromeos/login/existing_user_controller_browsertest.cc b/chrome/browser/chromeos/login/existing_user_controller_browsertest.cc
index b534ea4..2a4a5ba 100644
--- a/chrome/browser/chromeos/login/existing_user_controller_browsertest.cc
+++ b/chrome/browser/chromeos/login/existing_user_controller_browsertest.cc
@@ -261,7 +261,7 @@
   session_manager_test_api.InjectStubUserContext(user_context);
   EXPECT_CALL(*mock_login_display_, SetUIEnabled(true)).Times(1);
   EXPECT_CALL(*mock_login_display_host_,
-              StartWizard(OobeScreen::SCREEN_TERMS_OF_SERVICE))
+              StartWizard(OobeScreenId(OobeScreen::SCREEN_TERMS_OF_SERVICE)))
       .Times(0);
 
   content::WindowedNotificationObserver profile_prepared_observer(
@@ -427,7 +427,7 @@
     // There may be in-session oobe or an initial login screen created from
     // --login-manager.
     EXPECT_CALL(*mock_login_display_host_,
-                StartWizard(OobeScreen::SCREEN_TERMS_OF_SERVICE))
+                StartWizard(OobeScreen::SCREEN_TERMS_OF_SERVICE.AsId()))
         .Times(AnyNumber());
     EXPECT_CALL(*mock_login_display_, SetUIEnabled(false)).Times(AnyNumber());
     EXPECT_CALL(*mock_login_display_, SetUIEnabled(true)).Times(AnyNumber());
diff --git a/chrome/browser/chromeos/login/guest_login_browsertest.cc b/chrome/browser/chromeos/login/guest_login_browsertest.cc
new file mode 100644
index 0000000..35e79fae
--- /dev/null
+++ b/chrome/browser/chromeos/login/guest_login_browsertest.cc
@@ -0,0 +1,93 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/login/mixin_based_in_process_browser_test.h"
+#include "chrome/browser/chromeos/login/test/login_manager_mixin.h"
+#include "chrome/browser/chromeos/login/test/login_screen_tester.h"
+#include "chromeos/dbus/session_manager/fake_session_manager_client.h"
+#include "components/user_manager/user_manager.h"
+
+namespace chromeos {
+
+// Tests guest user log in.
+class GuestLoginTest : public MixinBasedInProcessBrowserTest {
+ public:
+  GuestLoginTest() { login_manager_.set_session_restore_enabled(); }
+  ~GuestLoginTest() override = default;
+
+  // Test overrides can implement this to add login policy switches to login
+  // screen command line.
+  virtual void SetDefaultLoginSwitches() {}
+
+  // MixinBaseInProcessBrowserTest:
+  void SetUp() override {
+    SetDefaultLoginSwitches();
+    MixinBasedInProcessBrowserTest::SetUp();
+  }
+
+  void SetUpOnMainThread() override {
+    FakeSessionManagerClient::Get()->set_supports_browser_restart(true);
+    MixinBasedInProcessBrowserTest::SetUpOnMainThread();
+  }
+
+ protected:
+  LoginManagerMixin login_manager_{&mixin_host_, {}};
+};
+
+class GuestLoginWithLoginSwitchesTest : public GuestLoginTest {
+ public:
+  GuestLoginWithLoginSwitchesTest() = default;
+  ~GuestLoginWithLoginSwitchesTest() override = default;
+
+  // GuestLoginTest:
+  void SetDefaultLoginSwitches() override {
+    login_manager_.SetDefaultLoginSwitches(
+        {std::make_pair("test_switch_1", ""),
+         std::make_pair("test_switch_2", "test_switch_2_value")});
+  }
+};
+
+IN_PROC_BROWSER_TEST_F(GuestLoginTest, PRE_Login) {
+  base::RunLoop restart_job_waiter;
+  FakeSessionManagerClient::Get()->set_restart_job_callback(
+      restart_job_waiter.QuitClosure());
+
+  ASSERT_TRUE(test::LoginScreenTester().ClickGuestButton());
+
+  restart_job_waiter.Run();
+  EXPECT_TRUE(FakeSessionManagerClient::Get()->restart_job_argv().has_value());
+}
+
+IN_PROC_BROWSER_TEST_F(GuestLoginTest, Login) {
+  login_manager_.WaitForActiveSession();
+
+  user_manager::UserManager* user_manager = user_manager::UserManager::Get();
+  EXPECT_TRUE(user_manager->IsLoggedInAsGuest());
+}
+
+IN_PROC_BROWSER_TEST_F(GuestLoginWithLoginSwitchesTest, PRE_Login) {
+  base::RunLoop restart_job_waiter;
+  FakeSessionManagerClient::Get()->set_restart_job_callback(
+      restart_job_waiter.QuitClosure());
+
+  ASSERT_TRUE(test::LoginScreenTester().ClickGuestButton());
+
+  restart_job_waiter.Run();
+  EXPECT_TRUE(FakeSessionManagerClient::Get()->restart_job_argv().has_value());
+}
+
+// Verifies that login policy flags do not spill over to the guest session.
+IN_PROC_BROWSER_TEST_F(GuestLoginWithLoginSwitchesTest, Login) {
+  login_manager_.WaitForActiveSession();
+
+  user_manager::UserManager* user_manager = user_manager::UserManager::Get();
+  EXPECT_TRUE(user_manager->IsLoggedInAsGuest());
+
+  EXPECT_FALSE(
+      base::CommandLine::ForCurrentProcess()->HasSwitch("test_switch_1"));
+  EXPECT_FALSE(
+      base::CommandLine::ForCurrentProcess()->HasSwitch("test_switch_2"));
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/login_wizard.h b/chrome/browser/chromeos/login/login_wizard.h
index c439078b..f7e7e18 100644
--- a/chrome/browser/chromeos/login/login_wizard.h
+++ b/chrome/browser/chromeos/login/login_wizard.h
@@ -12,7 +12,7 @@
 namespace chromeos {
 
 // Shows the Chrome OS out-of-box / login UI.
-void ShowLoginWizard(OobeScreen start_screen);
+void ShowLoginWizard(OobeScreenId start_screen);
 
 }  // namespace chromeos
 
diff --git a/chrome/browser/chromeos/login/oobe_screen.cc b/chrome/browser/chromeos/login/oobe_screen.cc
index 60e0753..d6c7989 100644
--- a/chrome/browser/chromeos/login/oobe_screen.cc
+++ b/chrome/browser/chromeos/login/oobe_screen.cc
@@ -4,84 +4,80 @@
 
 #include "chrome/browser/chromeos/login/oobe_screen.h"
 
-#include <vector>
-
-#include "base/command_line.h"
-#include "base/logging.h"
-#include "base/stl_util.h"
-#include "base/strings/string_split.h"
-#include "chromeos/constants/chromeos_switches.h"
+#include <ostream>
 
 namespace chromeos {
-namespace {
 
-// These get mapped by the Screen enum ordinal values, so this has to be defined
-// in the same order as the Screen enum.
-const char* kScreenNames[] = {
-    "hid-detection",                   // SCREEN_OOBE_HID_DETECTION
-    "connect",                         // SCREEN_OOBE_WELCOME
-    "network-selection",               // SCREEN_OOBE_NETWORK
-    "eula",                            // SCREEN_OOBE_EULA
-    "update",                          // SCREEN_OOBE_UPDATE
-    "debugging",                       // SCREEN_OOBE_ENABLE_DEBUGGING
-    "oauth-enrollment",                // SCREEN_OOBE_ENROLLMENT
-    "reset",                           // SCREEN_OOBE_RESET
-    "gaia-signin",                     // SCREEN_GAIA_SIGNIN
-    "account-picker",                  // SCREEN_ACCOUNT_PICKER
-    "autolaunch",                      // SCREEN_KIOSK_AUTOLAUNCH
-    "kiosk-enable",                    // SCREEN_KIOSK_ENABLE
-    "error-message",                   // SCREEN_ERROR_MESSAGE
-    "tpm-error-message",               // SCREEN_TPM_ERROR
-    "password-changed",                // SCREEN_PASSWORD_CHANGED
-    "supervised-user-creation",        // SCREEN_CREATE_SUPERVISED_USER_FLOW
-    "terms-of-service",                // SCREEN_TERMS_OF_SERVICE
-    "arc-tos",                         // SCREEN_ARC_TERMS_OF_SERVICE
-    "wrong-hwid",                      // SCREEN_WRONG_HWID
-    "auto-enrollment-check",           // SCREEN_AUTO_ENROLLMENT_CHECK
-    "app-launch-splash",               // SCREEN_APP_LAUNCH_SPLASH
-    "arc-kiosk-splash",                // SCREEN_ARC_KIOSK_SPLASH
-    "confirm-password",                // SCREEN_CONFIRM_PASSWORD
-    "fatal-error",                     // SCREEN_FATAL_ERROR
-    "device-disabled",                 // SCREEN_DEVICE_DISABLED
-    "userBoard",                       // SCREEN_USER_SELECTION
-    "ad-password-change",            // SCREEN_ACTIVE_DIRECTORY_PASSWORD_CHANGE
-    "encryption-migration",          // SCREEN_ENCRYPTION_MIGRATION
-    "supervision-transition",        // SCREEN_SUPERVISION_TRANSITION
-    "update-required",               // SCREEN_UPDATE_REQUIRED
-    "assistant-optin-flow",          // SCREEN_ASSISTANT_OPTIN_FLOW
-    "login",                         // SCREEN_SPECIAL_LOGIN
-    "oobe",                          // SCREEN_SPECIAL_OOBE
-    "test:nowindow",                 // SCREEN_TEST_NO_WINDOW
-    "sync-consent",                  // SCREEN_SYNC_CONSENT
-    "fingerprint-setup",             // SCREEN_FINGERPRINT_SETUP
-    "demo-setup",                    // SCREEN_OOBE_DEMO_SETUP
-    "demo-preferences",              // SCREEN_OOBE_DEMO_PREFERENCES
-    "recommend-apps",                // SCREEN_RECOMMEND_APPS
-    "app-downloading",               // SCREEN_APP_DOWNLOADING
-    "discover",                      // SCREEN_DISCOVER
-    "marketing-opt-in",              // SCREEN_MARKETING_OPT_IN
-    "multidevice-setup",             // SCREEN_MULTIDEVICE_SETUP
-    "unknown",                       // SCREEN_UNKNOWN
-};
+OobeScreenId::OobeScreenId(const std::string& name) : name(name) {}
 
-static_assert(static_cast<size_t>(OobeScreen::SCREEN_UNKNOWN) ==
-                  base::size(kScreenNames) - 1,
-              "Missing element in OobeScreen or kScreenNames");
+OobeScreenId::OobeScreenId(const StaticOobeScreenId& id) : name(id.name) {}
 
-}  // namespace
-
-std::string GetOobeScreenName(OobeScreen screen) {
-  DCHECK(screen <= OobeScreen::SCREEN_UNKNOWN);
-  return kScreenNames[static_cast<size_t>(screen)];
+bool OobeScreenId::operator==(const OobeScreenId& rhs) const {
+  return name == rhs.name;
 }
 
-OobeScreen GetOobeScreenFromName(const std::string& name) {
-  for (size_t i = 0; i < base::size(kScreenNames); ++i) {
-    if (name == kScreenNames[i])
-      return static_cast<OobeScreen>(i);
-  }
-
-  return OobeScreen::SCREEN_UNKNOWN;
+bool OobeScreenId::operator!=(const OobeScreenId& rhs) const {
+  return name != rhs.name;
 }
 
+bool OobeScreenId::operator<(const OobeScreenId& rhs) const {
+  return name < rhs.name;
+}
+
+std::ostream& operator<<(std::ostream& stream, const OobeScreenId& id) {
+  return stream << id.name;
+}
+
+OobeScreenId StaticOobeScreenId::AsId() const {
+  return OobeScreenId(name);
+}
+
+// static
+constexpr StaticOobeScreenId OobeScreen::SCREEN_OOBE_HID_DETECTION;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_OOBE_WELCOME;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_OOBE_NETWORK;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_OOBE_EULA;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_OOBE_UPDATE;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_OOBE_ENABLE_DEBUGGING;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_OOBE_ENROLLMENT;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_OOBE_RESET;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_GAIA_SIGNIN;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_ACCOUNT_PICKER;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_KIOSK_AUTOLAUNCH;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_KIOSK_ENABLE;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_ERROR_MESSAGE;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_TPM_ERROR;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_PASSWORD_CHANGED;
+constexpr StaticOobeScreenId
+    OobeScreen::SCREEN_CREATE_SUPERVISED_USER_FLOW_DEPRECATED;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_TERMS_OF_SERVICE;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_WRONG_HWID;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_AUTO_ENROLLMENT_CHECK;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_APP_LAUNCH_SPLASH;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_ARC_KIOSK_SPLASH;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_CONFIRM_PASSWORD;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_FATAL_ERROR;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_DEVICE_DISABLED;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_USER_SELECTION;
+constexpr StaticOobeScreenId
+    OobeScreen::SCREEN_ACTIVE_DIRECTORY_PASSWORD_CHANGE;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_ENCRYPTION_MIGRATION;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_SUPERVISION_TRANSITION;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_UPDATE_REQUIRED;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_ASSISTANT_OPTIN_FLOW;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_SPECIAL_LOGIN;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_SPECIAL_OOBE;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_TEST_NO_WINDOW;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_SYNC_CONSENT;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_FINGERPRINT_SETUP;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_OOBE_DEMO_SETUP;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_RECOMMEND_APPS;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_APP_DOWNLOADING;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_DISCOVER;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_MARKETING_OPT_IN;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_MULTIDEVICE_SETUP;
+constexpr StaticOobeScreenId OobeScreen::SCREEN_UNKNOWN;
+
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/oobe_screen.h b/chrome/browser/chromeos/login/oobe_screen.h
index c2e626f..a3e1caa 100644
--- a/chrome/browser/chromeos/login/oobe_screen.h
+++ b/chrome/browser/chromeos/login/oobe_screen.h
@@ -5,78 +5,107 @@
 #ifndef CHROME_BROWSER_CHROMEOS_LOGIN_OOBE_SCREEN_H_
 #define CHROME_BROWSER_CHROMEOS_LOGIN_OOBE_SCREEN_H_
 
+#include <iosfwd>
 #include <string>
 
 namespace chromeos {
 
-// TODO(jdufault): Rename to LoginScreen or similar since this is not directly
-// tied to Oobe. See crbug.com/678740.
+struct StaticOobeScreenId;
 
-// Different screens in the Oobe. If you update this enum, *make sure* to
-// update kScreenNames in the cc file as well.
-enum class OobeScreen : unsigned int {
-  SCREEN_OOBE_HID_DETECTION = 0,
-  SCREEN_OOBE_WELCOME,
-  SCREEN_OOBE_NETWORK,
-  SCREEN_OOBE_EULA,
-  SCREEN_OOBE_UPDATE,
-  SCREEN_OOBE_ENABLE_DEBUGGING,
-  SCREEN_OOBE_ENROLLMENT,
-  SCREEN_OOBE_RESET,
-  SCREEN_GAIA_SIGNIN,
-  SCREEN_ACCOUNT_PICKER,
-  SCREEN_KIOSK_AUTOLAUNCH,
-  SCREEN_KIOSK_ENABLE,
-  SCREEN_ERROR_MESSAGE,
-  SCREEN_TPM_ERROR,
-  SCREEN_PASSWORD_CHANGED,
-  SCREEN_CREATE_SUPERVISED_USER_FLOW_DEPRECATED,
-  SCREEN_TERMS_OF_SERVICE,
-  SCREEN_ARC_TERMS_OF_SERVICE,
-  SCREEN_WRONG_HWID,
-  SCREEN_AUTO_ENROLLMENT_CHECK,
-  SCREEN_APP_LAUNCH_SPLASH,
-  SCREEN_ARC_KIOSK_SPLASH,
-  SCREEN_CONFIRM_PASSWORD,
-  SCREEN_FATAL_ERROR,
-  SCREEN_DEVICE_DISABLED,
-  SCREEN_USER_SELECTION,
-  SCREEN_ACTIVE_DIRECTORY_PASSWORD_CHANGE,
-  SCREEN_ENCRYPTION_MIGRATION,
-  SCREEN_SUPERVISION_TRANSITION,
-  SCREEN_UPDATE_REQUIRED,
-  SCREEN_ASSISTANT_OPTIN_FLOW,
+// Identifiers an OOBE screen.
+struct OobeScreenId {
+  // Create an identifier from a string.
+  explicit OobeScreenId(const std::string& id);
+  // Create an identifier from a statically created identifier. This is implicit
+  // to make StaticOobeScreenId act more like OobeScreenId.
+  OobeScreenId(const StaticOobeScreenId& id);
 
-  // Special "first screen" that initiates login flow.
-  SCREEN_SPECIAL_LOGIN,
-  // Special "first screen" that initiates full OOBE flow.
-  SCREEN_SPECIAL_OOBE,
-  // Special test value that commands not to create any window yet.
-  SCREEN_TEST_NO_WINDOW,
+  // Name of the screen.
+  std::string name;
 
-  SCREEN_SYNC_CONSENT,
-  SCREEN_FINGERPRINT_SETUP,
-  SCREEN_OOBE_DEMO_SETUP,
-  SCREEN_OOBE_DEMO_PREFERENCES,
-
-  SCREEN_RECOMMEND_APPS,
-  SCREEN_APP_DOWNLOADING,
-  SCREEN_DISCOVER,
-
-  SCREEN_MARKETING_OPT_IN,
-  SCREEN_MULTIDEVICE_SETUP,
-
-  SCREEN_UNKNOWN  // This must always be the last element.
+  bool operator==(const OobeScreenId& rhs) const;
+  bool operator!=(const OobeScreenId& rhs) const;
+  bool operator<(const OobeScreenId& rhs) const;
+  friend std::ostream& operator<<(std::ostream& stream, const OobeScreenId& id);
 };
 
-// Returns the JS name for the given screen.
-std::string GetOobeScreenName(OobeScreen screen);
+// A static identifier. An OOBE screen often statically expresses its ID in
+// code. Chrome-style bans static destructors so use a const char* to point to
+// the data in the binary instead of std::string.
+struct StaticOobeScreenId {
+  const char* name;
 
-// Converts the JS name for the given sreen into a Screen instance.
-OobeScreen GetOobeScreenFromName(const std::string& name);
+  OobeScreenId AsId() const;
+};
 
-// Returns true if a command line argument requests |screen| to always be shown.
-bool ForceShowOobeScreen(OobeScreen screen);
+struct OobeScreen {
+  constexpr static StaticOobeScreenId SCREEN_OOBE_HID_DETECTION{
+      "hid-detection"};
+  constexpr static StaticOobeScreenId SCREEN_OOBE_WELCOME{"connect"};
+  constexpr static StaticOobeScreenId SCREEN_OOBE_NETWORK{"network-selection"};
+  constexpr static StaticOobeScreenId SCREEN_OOBE_EULA{"eula"};
+  constexpr static StaticOobeScreenId SCREEN_OOBE_UPDATE{"update"};
+  constexpr static StaticOobeScreenId SCREEN_OOBE_ENABLE_DEBUGGING{"debugging"};
+  constexpr static StaticOobeScreenId SCREEN_OOBE_ENROLLMENT{
+      "oauth-enrollment"};
+  constexpr static StaticOobeScreenId SCREEN_OOBE_RESET{"reset"};
+  constexpr static StaticOobeScreenId SCREEN_GAIA_SIGNIN{"gaia-signin"};
+  constexpr static StaticOobeScreenId SCREEN_ACCOUNT_PICKER{"account-picker"};
+  constexpr static StaticOobeScreenId SCREEN_KIOSK_AUTOLAUNCH{"autolaunch"};
+  constexpr static StaticOobeScreenId SCREEN_KIOSK_ENABLE{"kiosk-enable"};
+  constexpr static StaticOobeScreenId SCREEN_ERROR_MESSAGE{"error-message"};
+  constexpr static StaticOobeScreenId SCREEN_TPM_ERROR{"tpm-error-message"};
+  constexpr static StaticOobeScreenId SCREEN_PASSWORD_CHANGED{
+      "password-changed"};
+  constexpr static StaticOobeScreenId
+      SCREEN_CREATE_SUPERVISED_USER_FLOW_DEPRECATED{"supervised-user-creation"};
+  constexpr static StaticOobeScreenId SCREEN_TERMS_OF_SERVICE{
+      "terms-of-service"};
+  constexpr static StaticOobeScreenId SCREEN_ARC_TERMS_OF_SERVICE{"arc-tos"};
+  constexpr static StaticOobeScreenId SCREEN_WRONG_HWID{"wrong-hwid"};
+  constexpr static StaticOobeScreenId SCREEN_AUTO_ENROLLMENT_CHECK{
+      "auto-enrollment-check"};
+  constexpr static StaticOobeScreenId SCREEN_APP_LAUNCH_SPLASH{
+      "app-launch-splash"};
+  constexpr static StaticOobeScreenId SCREEN_ARC_KIOSK_SPLASH{
+      "arc-kiosk-splash"};
+  constexpr static StaticOobeScreenId SCREEN_CONFIRM_PASSWORD{
+      "confirm-password"};
+  constexpr static StaticOobeScreenId SCREEN_FATAL_ERROR{"fatal-error"};
+  constexpr static StaticOobeScreenId SCREEN_DEVICE_DISABLED{"device-disabled"};
+  constexpr static StaticOobeScreenId SCREEN_USER_SELECTION{"userBoard"};
+  constexpr static StaticOobeScreenId SCREEN_ACTIVE_DIRECTORY_PASSWORD_CHANGE{
+      "ad-password-change"};
+  constexpr static StaticOobeScreenId SCREEN_ENCRYPTION_MIGRATION{
+      "encryption-migration"};
+  constexpr static StaticOobeScreenId SCREEN_SUPERVISION_TRANSITION{
+      "supervision-transition"};
+  constexpr static StaticOobeScreenId SCREEN_UPDATE_REQUIRED{"update-required"};
+  constexpr static StaticOobeScreenId SCREEN_ASSISTANT_OPTIN_FLOW{
+      "assistant-optin-flow"};
+
+  // Special "first screen" that initiates login flow.
+  constexpr static StaticOobeScreenId SCREEN_SPECIAL_LOGIN{"login"};
+  // Special "first screen" that initiates full OOBE flow.
+  constexpr static StaticOobeScreenId SCREEN_SPECIAL_OOBE{"oobe"};
+  // Special test value that commands not to create any window yet.
+  constexpr static StaticOobeScreenId SCREEN_TEST_NO_WINDOW{"test:nowindow"};
+
+  constexpr static StaticOobeScreenId SCREEN_SYNC_CONSENT{"sync-consent"};
+  constexpr static StaticOobeScreenId SCREEN_FINGERPRINT_SETUP{
+      "fingerprint-setup"};
+  constexpr static StaticOobeScreenId SCREEN_OOBE_DEMO_SETUP{"demo-setup"};
+  constexpr static StaticOobeScreenId SCREEN_OOBE_DEMO_PREFERENCES{
+      "demo-preferences"};
+  constexpr static StaticOobeScreenId SCREEN_RECOMMEND_APPS{"recommend-apps"};
+  constexpr static StaticOobeScreenId SCREEN_APP_DOWNLOADING{"app-downloading"};
+  constexpr static StaticOobeScreenId SCREEN_DISCOVER{"discover"};
+  constexpr static StaticOobeScreenId SCREEN_MARKETING_OPT_IN{
+      "marketing-opt-in"};
+  constexpr static StaticOobeScreenId SCREEN_MULTIDEVICE_SETUP{
+      "multidevice-setup"};
+  constexpr static StaticOobeScreenId SCREEN_UNKNOWN{"unknown"};
+};
 
 }  // namespace chromeos
 
diff --git a/chrome/browser/chromeos/login/screen_manager.cc b/chrome/browser/chromeos/login/screen_manager.cc
index 83d68a0..d5b089ee 100644
--- a/chrome/browser/chromeos/login/screen_manager.cc
+++ b/chrome/browser/chromeos/login/screen_manager.cc
@@ -20,14 +20,13 @@
     screens_[screen->screen_id()] = std::move(screen);
 }
 
-BaseScreen* ScreenManager::GetScreen(OobeScreen screen) {
+BaseScreen* ScreenManager::GetScreen(OobeScreenId screen) {
   auto iter = screens_.find(screen);
-  DCHECK(iter != screens_.end())
-      << "Failed to find screen " << GetOobeScreenName(screen);
+  DCHECK(iter != screens_.end()) << "Failed to find screen " << screen;
   return iter->second.get();
 }
 
-bool ScreenManager::HasScreen(OobeScreen screen) {
+bool ScreenManager::HasScreen(OobeScreenId screen) {
   return screens_.count(screen) > 0;
 }
 
@@ -38,7 +37,7 @@
   screens_[id] = std::move(value);
 }
 
-void ScreenManager::DeleteScreenForTesting(OobeScreen screen) {
+void ScreenManager::DeleteScreenForTesting(OobeScreenId screen) {
   screens_[screen] = nullptr;
 }
 
diff --git a/chrome/browser/chromeos/login/screen_manager.h b/chrome/browser/chromeos/login/screen_manager.h
index 12ce1cf..ba118b6 100644
--- a/chrome/browser/chromeos/login/screen_manager.h
+++ b/chrome/browser/chromeos/login/screen_manager.h
@@ -27,16 +27,16 @@
   void Init(std::vector<std::unique_ptr<BaseScreen>> screens);
 
   // Getter for screen. Does not create the screen.
-  BaseScreen* GetScreen(OobeScreen screen);
+  BaseScreen* GetScreen(OobeScreenId screen);
 
-  bool HasScreen(OobeScreen screen);
+  bool HasScreen(OobeScreenId screen);
 
   void SetScreenForTesting(std::unique_ptr<BaseScreen> value);
-  void DeleteScreenForTesting(OobeScreen screen);
+  void DeleteScreenForTesting(OobeScreenId screen);
 
  private:
   // Created screens.
-  std::map<OobeScreen, std::unique_ptr<BaseScreen>> screens_;
+  std::map<OobeScreenId, std::unique_ptr<BaseScreen>> screens_;
 
   DISALLOW_COPY_AND_ASSIGN(ScreenManager);
 };
diff --git a/chrome/browser/chromeos/login/screens/base_screen.cc b/chrome/browser/chromeos/login/screens/base_screen.cc
index 3d16312..0702eff 100644
--- a/chrome/browser/chromeos/login/screens/base_screen.cc
+++ b/chrome/browser/chromeos/login/screens/base_screen.cc
@@ -8,7 +8,7 @@
 
 namespace chromeos {
 
-BaseScreen::BaseScreen(OobeScreen screen_id) : screen_id_(screen_id) {}
+BaseScreen::BaseScreen(OobeScreenId screen_id) : screen_id_(screen_id) {}
 
 BaseScreen::~BaseScreen() {}
 
diff --git a/chrome/browser/chromeos/login/screens/base_screen.h b/chrome/browser/chromeos/login/screens/base_screen.h
index 8f33713a..976e500 100644
--- a/chrome/browser/chromeos/login/screens/base_screen.h
+++ b/chrome/browser/chromeos/login/screens/base_screen.h
@@ -21,7 +21,7 @@
 // method called just once.
 class BaseScreen {
  public:
-  explicit BaseScreen(OobeScreen screen_id);
+  explicit BaseScreen(OobeScreenId screen_id);
   virtual ~BaseScreen();
 
   // Makes wizard screen visible.
@@ -31,7 +31,7 @@
   virtual void Hide() = 0;
 
   // Returns the identifier of the screen.
-  OobeScreen screen_id() const { return screen_id_; }
+  OobeScreenId screen_id() const { return screen_id_; }
 
   // Called when user action event with |event_id|
   // happened. Notification about this event comes from the JS
@@ -57,7 +57,7 @@
   // to screen only between OnShow / OnHide calls.
   base::Value* configuration_ = nullptr;
 
-  const OobeScreen screen_id_;
+  const OobeScreenId screen_id_;
 
   DISALLOW_COPY_AND_ASSIGN(BaseScreen);
 };
diff --git a/chrome/browser/chromeos/login/screens/error_screen.cc b/chrome/browser/chromeos/login/screens/error_screen.cc
index 0344dfb..bd09953 100644
--- a/chrome/browser/chromeos/login/screens/error_screen.cc
+++ b/chrome/browser/chromeos/login/screens/error_screen.cc
@@ -114,7 +114,7 @@
   return error_state_;
 }
 
-OobeScreen ErrorScreen::GetParentScreen() const {
+OobeScreenId ErrorScreen::GetParentScreen() const {
   return parent_screen_;
 }
 
@@ -143,7 +143,7 @@
   }
 }
 
-void ErrorScreen::SetParentScreen(OobeScreen parent_screen) {
+void ErrorScreen::SetParentScreen(OobeScreenId parent_screen) {
   parent_screen_ = parent_screen;
   // Not really used on JS side yet so no need to propagate to screen context.
 }
diff --git a/chrome/browser/chromeos/login/screens/error_screen.h b/chrome/browser/chromeos/login/screens/error_screen.h
index 6e33e21..38c139c 100644
--- a/chrome/browser/chromeos/login/screens/error_screen.h
+++ b/chrome/browser/chromeos/login/screens/error_screen.h
@@ -63,7 +63,7 @@
   // Returns id of the screen behind error screen ("caller" screen).
   // Returns OobeScreen::SCREEN_UNKNOWN if error screen isn't the current
   // screen.
-  OobeScreen GetParentScreen() const;
+  OobeScreenId GetParentScreen() const;
 
   // Called when we're asked to hide captive portal dialog.
   void HideCaptivePortal();
@@ -82,7 +82,7 @@
 
   // Sets "parent screen" i.e. one that has initiated this network error screen
   // instance.
-  void SetParentScreen(OobeScreen parent_screen);
+  void SetParentScreen(OobeScreenId parent_screen);
 
   // Sets callback that is called on hide.
   void SetHideCallback(const base::Closure& on_hide);
@@ -163,7 +163,7 @@
   NetworkError::UIState ui_state_ = NetworkError::UI_STATE_UNKNOWN;
   NetworkError::ErrorState error_state_ = NetworkError::ERROR_STATE_UNKNOWN;
 
-  OobeScreen parent_screen_ = OobeScreen::SCREEN_UNKNOWN;
+  OobeScreenId parent_screen_ = OobeScreen::SCREEN_UNKNOWN;
 
   // Optional callback that is called when NetworkError screen is hidden.
   std::unique_ptr<base::Closure> on_hide_callback_;
diff --git a/chrome/browser/chromeos/login/screens/mock_error_screen.h b/chrome/browser/chromeos/login/screens/mock_error_screen.h
index d6271de..6537e12 100644
--- a/chrome/browser/chromeos/login/screens/mock_error_screen.h
+++ b/chrome/browser/chromeos/login/screens/mock_error_screen.h
@@ -41,7 +41,7 @@
   MOCK_METHOD0(Hide, void());
   MOCK_METHOD1(MockBind, void(ErrorScreen* screen));
   MOCK_METHOD0(MockUnbind, void());
-  MOCK_METHOD1(ShowOobeScreen, void(OobeScreen screen));
+  MOCK_METHOD1(ShowOobeScreen, void(OobeScreenId screen));
   MOCK_METHOD1(SetErrorStateCode, void(NetworkError::ErrorState error_state));
   MOCK_METHOD1(SetErrorStateNetwork, void(const std::string& network_name));
   MOCK_METHOD1(SetGuestSigninAllowed, void(bool value));
diff --git a/chrome/browser/chromeos/login/screens/update_required_screen.h b/chrome/browser/chromeos/login/screens/update_required_screen.h
index 2d67a34f..8080ecb 100644
--- a/chrome/browser/chromeos/login/screens/update_required_screen.h
+++ b/chrome/browser/chromeos/login/screens/update_required_screen.h
@@ -21,7 +21,8 @@
 // Controller for the update required screen.
 class UpdateRequiredScreen : public BaseScreen {
  public:
-  constexpr static OobeScreen kScreenId = OobeScreen::SCREEN_UPDATE_REQUIRED;
+  constexpr static StaticOobeScreenId kScreenId =
+      OobeScreen::SCREEN_UPDATE_REQUIRED;
 
   explicit UpdateRequiredScreen(UpdateRequiredView* view);
   ~UpdateRequiredScreen() override;
diff --git a/chrome/browser/chromeos/login/screens/update_screen_browsertest.cc b/chrome/browser/chromeos/login/screens/update_screen_browsertest.cc
index 2daf4d5e..0e83351 100644
--- a/chrome/browser/chromeos/login/screens/update_screen_browsertest.cc
+++ b/chrome/browser/chromeos/login/screens/update_screen_browsertest.cc
@@ -442,7 +442,8 @@
   // If the network is a captive portal network, error message is shown with a
   // delay.
   EXPECT_TRUE(update_screen_->GetErrorMessageTimerForTesting()->IsRunning());
-  EXPECT_EQ(OobeScreen::SCREEN_UNKNOWN, error_screen_->GetParentScreen());
+  EXPECT_EQ(OobeScreen::SCREEN_UNKNOWN.AsId(),
+            error_screen_->GetParentScreen());
 
   // If network goes back online, the error message timer should be canceled.
   network_portal_detector_.SimulateDefaultNetworkState(
@@ -488,7 +489,8 @@
   update_screen_->GetErrorMessageTimerForTesting()->FireNow();
   EXPECT_FALSE(update_screen_->GetErrorMessageTimerForTesting()->IsRunning());
 
-  ASSERT_EQ(OobeScreen::SCREEN_OOBE_UPDATE, error_screen_->GetParentScreen());
+  ASSERT_EQ(OobeScreen::SCREEN_OOBE_UPDATE.AsId(),
+            error_screen_->GetParentScreen());
 
   OobeScreenWaiter error_screen_waiter(OobeScreen::SCREEN_ERROR_MESSAGE);
   error_screen_waiter.set_assert_next_screen();
@@ -527,7 +529,8 @@
   network_portal_detector_.SimulateNoNetwork();
 
   EXPECT_FALSE(update_screen_->GetErrorMessageTimerForTesting()->IsRunning());
-  ASSERT_EQ(OobeScreen::SCREEN_OOBE_UPDATE, error_screen_->GetParentScreen());
+  ASSERT_EQ(OobeScreen::SCREEN_OOBE_UPDATE.AsId(),
+            error_screen_->GetParentScreen());
 
   // Second portal detection also returns NULL network and undefined
   // results.  In this case, offline message should be displayed.
@@ -554,7 +557,8 @@
   // Force timer expiration.
   EXPECT_TRUE(update_screen_->GetErrorMessageTimerForTesting()->IsRunning());
   update_screen_->GetErrorMessageTimerForTesting()->FireNow();
-  ASSERT_EQ(OobeScreen::SCREEN_OOBE_UPDATE, error_screen_->GetParentScreen());
+  ASSERT_EQ(OobeScreen::SCREEN_OOBE_UPDATE.AsId(),
+            error_screen_->GetParentScreen());
 
   OobeScreenWaiter error_screen_waiter(OobeScreen::SCREEN_ERROR_MESSAGE);
   error_screen_waiter.set_assert_next_screen();
@@ -564,7 +568,8 @@
       "fake_path", base::DoNothing(), base::DoNothing(),
       false /* check_error_state */, ConnectCallbackMode::ON_COMPLETED);
 
-  ASSERT_EQ(OobeScreen::SCREEN_UNKNOWN, error_screen_->GetParentScreen());
+  ASSERT_EQ(OobeScreen::SCREEN_UNKNOWN.AsId(),
+            error_screen_->GetParentScreen());
 
   OobeScreenWaiter update_screen_waiter(OobeScreen::SCREEN_OOBE_UPDATE);
   update_screen_waiter.set_assert_next_screen();
diff --git a/chrome/browser/chromeos/login/session/user_session_manager.cc b/chrome/browser/chromeos/login/session/user_session_manager.cc
index 38f0461..97d89e418 100644
--- a/chrome/browser/chromeos/login/session/user_session_manager.cc
+++ b/chrome/browser/chromeos/login/session/user_session_manager.cc
@@ -866,7 +866,7 @@
 bool UserSessionManager::RestartToApplyPerSessionFlagsIfNeed(
     Profile* profile,
     bool early_restart) {
-  if (!SessionManagerClient::Get()->SupportsRestartToApplyUserFlags())
+  if (!SessionManagerClient::Get()->SupportsBrowserRestart())
     return false;
 
   if (ProfileHelper::IsSigninProfile(profile) ||
@@ -1620,7 +1620,7 @@
   ScreenTimeControllerFactory::GetForBrowserContext(profile);
 }
 
-void UserSessionManager::ActivateWizard(OobeScreen screen) {
+void UserSessionManager::ActivateWizard(OobeScreenId screen) {
   LoginDisplayHost* host = LoginDisplayHost::default_host();
   CHECK(host);
   host->StartWizard(screen);
diff --git a/chrome/browser/chromeos/login/session/user_session_manager.h b/chrome/browser/chromeos/login/session/user_session_manager.h
index 60d83ce..faf0f2c1 100644
--- a/chrome/browser/chromeos/login/session/user_session_manager.h
+++ b/chrome/browser/chromeos/login/session/user_session_manager.h
@@ -407,7 +407,7 @@
   void InitializeChildUserServices(Profile* profile);
 
   // Starts out-of-box flow with the specified screen.
-  void ActivateWizard(OobeScreen screen);
+  void ActivateWizard(OobeScreenId screen);
 
   // Adds first-time login URLs.
   void InitializeStartUrls() const;
diff --git a/chrome/browser/chromeos/login/test/login_screen_tester.cc b/chrome/browser/chromeos/login/test/login_screen_tester.cc
index 374b08b1..3870235 100644
--- a/chrome/browser/chromeos/login/test/login_screen_tester.cc
+++ b/chrome/browser/chromeos/login/test/login_screen_tester.cc
@@ -69,6 +69,13 @@
   return success;
 }
 
+bool LoginScreenTester::ClickGuestButton() {
+  ash::mojom::LoginScreenTestApiAsyncWaiter login_screen(test_api_.get());
+  bool success;
+  login_screen.ClickGuestButton(&success);
+  return success;
+}
+
 bool LoginScreenTester::WaitForUiUpdate(int64_t previous_update_count) {
   ash::mojom::LoginScreenTestApiAsyncWaiter login_screen(test_api_.get());
   bool success;
diff --git a/chrome/browser/chromeos/login/test/login_screen_tester.h b/chrome/browser/chromeos/login/test/login_screen_tester.h
index 0982e4df..debca3a 100644
--- a/chrome/browser/chromeos/login/test/login_screen_tester.h
+++ b/chrome/browser/chromeos/login/test/login_screen_tester.h
@@ -29,6 +29,7 @@
 
   // Returns true on success (i.e. button is  not disabled).
   bool ClickAddUserButton();
+  bool ClickGuestButton();
 
   // Blocks until LoginShelfView::ui_update_count() is greater then
   // |previous_update_count|. Returns true on success, false on error.
diff --git a/chrome/browser/chromeos/login/test/oobe_screen_exit_waiter.cc b/chrome/browser/chromeos/login/test/oobe_screen_exit_waiter.cc
index c5450a55..665faa6 100644
--- a/chrome/browser/chromeos/login/test/oobe_screen_exit_waiter.cc
+++ b/chrome/browser/chromeos/login/test/oobe_screen_exit_waiter.cc
@@ -10,7 +10,7 @@
 
 namespace chromeos {
 
-OobeScreenExitWaiter::OobeScreenExitWaiter(OobeScreen target_screen)
+OobeScreenExitWaiter::OobeScreenExitWaiter(OobeScreenId target_screen)
     : target_screen_(target_screen) {}
 
 OobeScreenExitWaiter::~OobeScreenExitWaiter() = default;
@@ -37,8 +37,8 @@
   oobe_ui_observer_.RemoveAll();
 }
 
-void OobeScreenExitWaiter::OnCurrentScreenChanged(OobeScreen current_screen,
-                                                  OobeScreen new_screen) {
+void OobeScreenExitWaiter::OnCurrentScreenChanged(OobeScreenId current_screen,
+                                                  OobeScreenId new_screen) {
   DCHECK_NE(state_, State::IDLE);
   if (new_screen != target_screen_)
     EndWait();
diff --git a/chrome/browser/chromeos/login/test/oobe_screen_exit_waiter.h b/chrome/browser/chromeos/login/test/oobe_screen_exit_waiter.h
index 5df7c7bf..ce9aaf7 100644
--- a/chrome/browser/chromeos/login/test/oobe_screen_exit_waiter.h
+++ b/chrome/browser/chromeos/login/test/oobe_screen_exit_waiter.h
@@ -24,12 +24,12 @@
 class OobeScreenExitWaiter : public OobeUI::Observer,
                              public test::TestConditionWaiter {
  public:
-  explicit OobeScreenExitWaiter(OobeScreen target_screen);
+  explicit OobeScreenExitWaiter(OobeScreenId target_screen);
   ~OobeScreenExitWaiter() override;
 
   // OobeUI::Observer implementation:
-  void OnCurrentScreenChanged(OobeScreen current_screen,
-                              OobeScreen new_screen) override;
+  void OnCurrentScreenChanged(OobeScreenId current_screen,
+                              OobeScreenId new_screen) override;
   void OnDestroyingOobeUI() override;
 
   // TestConditionWaiter;
@@ -41,7 +41,7 @@
   OobeUI* GetOobeUI();
   void EndWait();
 
-  const OobeScreen target_screen_;
+  const OobeScreenId target_screen_;
 
   State state_ = State::IDLE;
 
diff --git a/chrome/browser/chromeos/login/test/oobe_screen_waiter.cc b/chrome/browser/chromeos/login/test/oobe_screen_waiter.cc
index 72ab872..6f7c21a 100644
--- a/chrome/browser/chromeos/login/test/oobe_screen_waiter.cc
+++ b/chrome/browser/chromeos/login/test/oobe_screen_waiter.cc
@@ -10,7 +10,7 @@
 
 namespace chromeos {
 
-OobeScreenWaiter::OobeScreenWaiter(OobeScreen target_screen)
+OobeScreenWaiter::OobeScreenWaiter(OobeScreenId target_screen)
     : target_screen_(target_screen) {}
 
 OobeScreenWaiter::~OobeScreenWaiter() = default;
@@ -40,24 +40,22 @@
     EXPECT_EQ(target_screen_, GetOobeUI()->current_screen());
 }
 
-void OobeScreenWaiter::OnCurrentScreenChanged(OobeScreen current_screen,
-                                              OobeScreen new_screen) {
+void OobeScreenWaiter::OnCurrentScreenChanged(OobeScreenId current_screen,
+                                              OobeScreenId new_screen) {
   DCHECK_NE(state_, State::IDLE);
 
   if (state_ != State::WAITING_FOR_SCREEN) {
     if (assert_last_screen_ && new_screen != target_screen_) {
       ADD_FAILURE() << "Screen changed from the target screen "
-                    << static_cast<int>(current_screen) << " -> "
-                    << static_cast<int>(new_screen);
+                    << current_screen.name << " -> " << new_screen.name;
       EndWait();
     }
     return;
   }
 
   if (assert_next_screen_ && new_screen != target_screen_) {
-    ADD_FAILURE() << "Untarget screen change to "
-                  << static_cast<int>(new_screen) << " while waiting for "
-                  << static_cast<int>(target_screen_);
+    ADD_FAILURE() << "Untarget screen change to " << new_screen.name
+                  << " while waiting for " << target_screen_.name;
     EndWait();
     return;
   }
diff --git a/chrome/browser/chromeos/login/test/oobe_screen_waiter.h b/chrome/browser/chromeos/login/test/oobe_screen_waiter.h
index 80c52fe..3dedcd2 100644
--- a/chrome/browser/chromeos/login/test/oobe_screen_waiter.h
+++ b/chrome/browser/chromeos/login/test/oobe_screen_waiter.h
@@ -23,15 +23,15 @@
 class OobeScreenWaiter : public OobeUI::Observer,
                          public test::TestConditionWaiter {
  public:
-  explicit OobeScreenWaiter(OobeScreen target_screen);
+  explicit OobeScreenWaiter(OobeScreenId target_screen);
   ~OobeScreenWaiter() override;
 
   void set_no_assert_last_screen() { assert_last_screen_ = false; }
   void set_assert_next_screen() { assert_next_screen_ = true; }
 
   // OobeUI::Observer implementation:
-  void OnCurrentScreenChanged(OobeScreen current_screen,
-                              OobeScreen new_screen) override;
+  void OnCurrentScreenChanged(OobeScreenId current_screen,
+                              OobeScreenId new_screen) override;
   void OnDestroyingOobeUI() override;
 
   // TestConditionWaiter;
@@ -43,7 +43,7 @@
   OobeUI* GetOobeUI();
   void EndWait();
 
-  const OobeScreen target_screen_;
+  const OobeScreenId target_screen_;
 
   State state_ = State::IDLE;
 
diff --git a/chrome/browser/chromeos/login/test/session_flags_manager.cc b/chrome/browser/chromeos/login/test/session_flags_manager.cc
index fc801c0e..20563c43 100644
--- a/chrome/browser/chromeos/login/test/session_flags_manager.cc
+++ b/chrome/browser/chromeos/login/test/session_flags_manager.cc
@@ -15,11 +15,14 @@
 #include "base/json/json_file_value_serializer.h"
 #include "base/logging.h"
 #include "base/path_service.h"
+#include "base/stl_util.h"
+#include "base/strings/stringprintf.h"
 #include "base/values.h"
 #include "chrome/common/chrome_paths.h"
 #include "chromeos/constants/chromeos_switches.h"
 #include "chromeos/cryptohome/cryptohome_parameters.h"
 #include "chromeos/dbus/session_manager/fake_session_manager_client.h"
+#include "components/user_manager/user_names.h"
 #include "third_party/cros_system_api/switches/chrome_switches.h"
 
 namespace chromeos {
@@ -30,6 +33,7 @@
 // Keys for values in dictionary used to preserve session manager state.
 constexpr char kUserIdKey[] = "active_user_id";
 constexpr char kUserHashKey[] = "active_user_hash";
+constexpr char kRestartJobKey[] = "restart_job";
 constexpr char kUserFlagsKey[] = "user_flags";
 constexpr char kFlagNameKey[] = "name";
 constexpr char kFlagValueKey[] = "value";
@@ -67,10 +71,22 @@
 
 void SessionFlagsManager::AppendSwitchesToCommandLine(
     base::CommandLine* command_line) {
-  if (mode_ == Mode::LOGIN_SCREEN || user_id_.empty()) {
+  if (restart_job_.has_value()) {
+    DCHECK_EQ(mode_, Mode::LOGIN_SCREEN_WITH_SESSION_RESTORE);
+    for (const auto& item : *restart_job_) {
+      // Do not override flags added to test command line by default.
+      if (command_line->HasSwitch(item.first))
+        continue;
+      command_line->AppendSwitchASCII(item.first, item.second);
+    }
+  }
+
+  if (mode_ == Mode::LOGIN_SCREEN ||
+      (user_id_.empty() && !restart_job_.has_value())) {
     command_line->AppendSwitch(switches::kLoginManager);
     command_line->AppendSwitch(switches::kForceLoginManagerInTests);
-  } else {
+    command_line->AppendSwitchASCII(switches::kLoginProfile, "user");
+  } else if (!user_id_.empty()) {
     DCHECK_EQ(mode_, Mode::LOGIN_SCREEN_WITH_SESSION_RESTORE);
     command_line->AppendSwitchASCII(switches::kLoginUser, user_id_);
     command_line->AppendSwitchASCII(switches::kLoginProfile, user_hash_);
@@ -109,21 +125,35 @@
 
   DCHECK(value->is_dict());
   const std::string* user_id = value->FindStringKey(kUserIdKey);
-  if (!user_id || user_id->empty())
-    return;
+  if (user_id && !user_id->empty()) {
+    user_id_ = *user_id;
+  }
 
-  user_id_ = *user_id;
-  user_hash_ = *value->FindStringKey(kUserHashKey);
+  const std::string* user_hash = value->FindStringKey(kUserHashKey);
+  if (user_hash && !user_hash->empty()) {
+    user_hash_ = *user_hash;
+  }
 
   base::Value* user_flags = value->FindListKey(kUserFlagsKey);
-  if (!user_flags)
-    return;
+  if (user_flags) {
+    user_flags_ = std::vector<Switch>();
+    for (const base::Value& flag : user_flags->GetList()) {
+      DCHECK(flag.is_dict());
+      user_flags_->emplace_back(
+          std::make_pair(*flag.FindStringKey(kFlagNameKey),
+                         *flag.FindStringKey(kFlagValueKey)));
+    }
+  }
 
-  user_flags_ = std::vector<Switch>();
-  for (const base::Value& flag : user_flags->GetList()) {
-    DCHECK(flag.is_dict());
-    user_flags_->emplace_back(std::make_pair(
-        *flag.FindStringKey(kFlagNameKey), *flag.FindStringKey(kFlagValueKey)));
+  base::Value* restart_job = value->FindListKey(kRestartJobKey);
+  if (restart_job) {
+    restart_job_ = std::vector<Switch>();
+    for (const base::Value& job_switch : restart_job->GetList()) {
+      DCHECK(job_switch.is_dict());
+      restart_job_->emplace_back(
+          std::make_pair(*job_switch.FindStringKey(kFlagNameKey),
+                         *job_switch.FindStringKey(kFlagValueKey)));
+    }
   }
 }
 
@@ -132,50 +162,85 @@
       FakeSessionManagerClient::Get()->user_sessions();
   const bool session_active =
       !sessions.empty() && !FakeSessionManagerClient::Get()->session_stopped();
-
+  const bool has_restart_job =
+      FakeSessionManagerClient::Get()->restart_job_argv().has_value();
   // If a user session is not active, clear the backing file so default flags
   // are used next time.
-  if (!session_active) {
+  if (!session_active && !has_restart_job) {
     base::DeleteFile(backing_file_, false /*recursive*/);
     return;
   }
 
-  // Currently, only support single user sessions.
-  DCHECK_EQ(1u, sessions.size());
-  const auto& session = sessions.begin();
+  std::string user_id;
+  std::string user_profile;
+  if (has_restart_job) {
+    // Set guest user ID, so it can be used to retrieve user flags.
+    // Restart job is only used for guest login, and the command line it sets
+    // up is expected to already contain switches::kLoginUser and
+    // switches::kLoginProfile. There is a DCHECK below to ensure that restart
+    // job sets these flags to expected guest user values.
+    user_id = user_manager::kGuestUserName;
+  } else {
+    // Currently, only support single user sessions.
+    DCHECK_EQ(1u, sessions.size());
+    user_id = sessions.begin()->first;
+    user_profile = sessions.begin()->second;
+  }
 
   base::Value cached_state(base::Value::Type::DICTIONARY);
-  cached_state.SetKey(kUserIdKey, base::Value(session->first));
-  cached_state.SetKey(kUserHashKey, base::Value(session->second));
+
+  // Restart job command line should already contain login user and profile
+  // switches, no reason to store it separately.
+  if (!has_restart_job && !user_id.empty()) {
+    DCHECK(!user_profile.empty());
+    cached_state.SetKey(kUserIdKey, base::Value(user_id));
+    cached_state.SetKey(kUserHashKey, base::Value(user_profile));
+  }
 
   std::vector<Switch> user_flag_args;
   std::vector<std::string> raw_flags;
   const bool has_user_flags = FakeSessionManagerClient::Get()->GetFlagsForUser(
       cryptohome::CreateAccountIdentifierFromIdentification(
-          cryptohome::Identification::FromString(session->first)),
+          cryptohome::Identification::FromString(user_id)),
       &raw_flags);
   if (has_user_flags) {
     std::vector<std::string> argv = {"" /* Empty program */};
     argv.insert(argv.end(), raw_flags.begin(), raw_flags.end());
+    cached_state.SetKey(kUserFlagsKey, GetSwitchesValueFromArgv(argv));
+  }
 
-    // Parse flag name-value pairs using command line initialization.
-    base::CommandLine cmd_line(base::CommandLine::NO_PROGRAM);
-    cmd_line.InitFromArgv(argv);
+  if (has_restart_job) {
+    const std::vector<std::string>& argv =
+        FakeSessionManagerClient::Get()->restart_job_argv().value();
+    DCHECK(base::ContainsValue(
+        argv, base::StringPrintf("--%s=%s", switches::kLoginUser,
+                                 user_manager::kGuestUserName)));
+    DCHECK(base::ContainsValue(
+        argv, base::StringPrintf("--%s=%s", switches::kLoginProfile, "user")));
 
-    base::Value flag_list(base::Value::Type::LIST);
-    for (const auto& flag : cmd_line.GetSwitches()) {
-      base::Value flag_value(base::Value::Type::DICTIONARY);
-      flag_value.SetKey(kFlagNameKey, base::Value(flag.first));
-      flag_value.SetKey(kFlagValueKey, base::Value(flag.second));
-
-      flag_list.GetList().emplace_back(std::move(flag_value));
-    }
-    cached_state.SetKey(kUserFlagsKey, std::move(flag_list));
+    cached_state.SetKey(kRestartJobKey, GetSwitchesValueFromArgv(argv));
   }
 
   JSONFileValueSerializer serializer(backing_file_);
   serializer.Serialize(cached_state);
 }
 
+base::Value SessionFlagsManager::GetSwitchesValueFromArgv(
+    const std::vector<std::string>& argv) {
+  // Parse flag name-value pairs using command line initialization.
+  base::CommandLine cmd_line(base::CommandLine::NO_PROGRAM);
+  cmd_line.InitFromArgv(argv);
+
+  base::Value flag_list(base::Value::Type::LIST);
+  for (const auto& flag : cmd_line.GetSwitches()) {
+    base::Value flag_value(base::Value::Type::DICTIONARY);
+    flag_value.SetKey(kFlagNameKey, base::Value(flag.first));
+    flag_value.SetKey(kFlagValueKey, base::Value(flag.second));
+
+    flag_list.GetList().emplace_back(std::move(flag_value));
+  }
+  return flag_list;
+}
+
 }  // namespace test
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/test/session_flags_manager.h b/chrome/browser/chromeos/login/test/session_flags_manager.h
index ef316660..27a9680 100644
--- a/chrome/browser/chromeos/login/test/session_flags_manager.h
+++ b/chrome/browser/chromeos/login/test/session_flags_manager.h
@@ -14,7 +14,8 @@
 
 namespace base {
 class CommandLine;
-}
+class Value;
+}  // namespace base
 
 namespace chromeos {
 namespace test {
@@ -26,7 +27,8 @@
 // runs. If a user session was active in the previous run, this will set up
 // command line to restore session for that user, which can be useful for
 // testing chrome restart to apply per-session flags, or session restore on
-// crash.
+// crash. Additionally, it respects restart job arguments if one was requested
+// (restart job is used to restart session as guest user).
 class SessionFlagsManager {
  public:
   // Pair of switch name and value. The value can be empty.
@@ -43,7 +45,8 @@
   // the test command line. The file will contain session information saved
   // during the previous (PRE_) browser test step. The information includes:
   // *   the active user information
-  // *   the active user's per-session flags.
+  // *   the active user's per-session flags
+  // *   restart job flags, if restart job was requested.
   //
   // If the backing file is not found, or empty, command line will be
   // set up with login manager flags so test starts on the login screen.
@@ -79,6 +82,7 @@
 
   void LoadStateFromBackingFile();
   void StoreStateToBackingFile();
+  base::Value GetSwitchesValueFromArgv(const std::vector<std::string>& argv);
 
   // The mode this manager is running in.
   Mode mode_ = Mode::LOGIN_SCREEN;
@@ -96,6 +100,9 @@
   std::string user_hash_;
   base::Optional<std::vector<Switch>> user_flags_;
 
+  // List of switches passed as a restart job arguments.
+  base::Optional<std::vector<Switch>> restart_job_;
+
   // If |session_restore_enabled_| is set, the path to the file where session
   // state is saved.
   base::FilePath backing_file_;
diff --git a/chrome/browser/chromeos/login/test/wizard_in_process_browser_test.cc b/chrome/browser/chromeos/login/test/wizard_in_process_browser_test.cc
new file mode 100644
index 0000000..62f6945
--- /dev/null
+++ b/chrome/browser/chromeos/login/test/wizard_in_process_browser_test.cc
@@ -0,0 +1,61 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/login/test/wizard_in_process_browser_test.h"
+
+#include "base/command_line.h"
+#include "base/location.h"
+#include "base/message_loop/message_loop.h"
+#include "base/run_loop.h"
+#include "base/single_thread_task_runner.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "chrome/browser/chrome_notification_types.h"
+#include "chrome/browser/chromeos/login/login_wizard.h"
+#include "chrome/browser/chromeos/login/ui/login_display_host.h"
+#include "chrome/browser/chromeos/login/wizard_controller.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/common/chrome_switches.h"
+#include "chromeos/constants/chromeos_switches.h"
+#include "content/public/browser/notification_service.h"
+
+namespace chromeos {
+
+WizardInProcessBrowserTest::WizardInProcessBrowserTest(OobeScreenId screen)
+    : screen_(screen) {}
+
+void WizardInProcessBrowserTest::SetUp() {
+  WizardController::SetZeroDelays();
+  InProcessBrowserTest::SetUp();
+}
+
+void WizardInProcessBrowserTest::SetUpCommandLine(
+    base::CommandLine* command_line) {
+  command_line->AppendSwitch(::switches::kNoStartupWindow);
+  command_line->AppendSwitch(switches::kLoginManager);
+}
+
+void WizardInProcessBrowserTest::SetUpOnMainThread() {
+  SetUpWizard();
+  if (screen_ != OobeScreen::SCREEN_UNKNOWN) {
+    ShowLoginWizard(screen_);
+    host_ = LoginDisplayHost::default_host();
+  }
+}
+
+void WizardInProcessBrowserTest::TearDownOnMainThread() {
+  ASSERT_TRUE(base::MessageLoopCurrentForUI::IsSet());
+
+  if (!host_)
+    return;
+
+  // LoginDisplayHost owns controllers and all windows. It needs to be destroyed
+  // here because the derived tests have clean-up code assuming LoginDisplayHost
+  // is gone.
+  base::RunLoop run_loop;
+  host_->Finalize(run_loop.QuitClosure());
+  run_loop.Run();
+  host_ = nullptr;
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/ui/fake_login_display_host.cc b/chrome/browser/chromeos/login/ui/fake_login_display_host.cc
index 04001877..be8e47a 100644
--- a/chrome/browser/chromeos/login/ui/fake_login_display_host.cc
+++ b/chrome/browser/chromeos/login/ui/fake_login_display_host.cc
@@ -11,7 +11,7 @@
 
 class FakeLoginDisplayHost::FakeBaseScreen : public chromeos::BaseScreen {
  public:
-  explicit FakeBaseScreen(chromeos::OobeScreen screen_id)
+  explicit FakeBaseScreen(chromeos::OobeScreenId screen_id)
       : BaseScreen(screen_id) {}
 
   ~FakeBaseScreen() override = default;
@@ -59,7 +59,7 @@
 
 void FakeLoginDisplayHost::SetStatusAreaVisible(bool visible) {}
 
-void FakeLoginDisplayHost::StartWizard(OobeScreen first_screen) {
+void FakeLoginDisplayHost::StartWizard(OobeScreenId first_screen) {
   wizard_controller_ = std::make_unique<WizardController>();
 
   fake_screen_ = std::make_unique<FakeBaseScreen>(first_screen);
diff --git a/chrome/browser/chromeos/login/ui/fake_login_display_host.h b/chrome/browser/chromeos/login/ui/fake_login_display_host.h
index 2e06c28..916d9a42 100644
--- a/chrome/browser/chromeos/login/ui/fake_login_display_host.h
+++ b/chrome/browser/chromeos/login/ui/fake_login_display_host.h
@@ -32,7 +32,7 @@
   void BeforeSessionStart() override;
   void Finalize(base::OnceClosure) override;
   void SetStatusAreaVisible(bool visible) override;
-  void StartWizard(chromeos::OobeScreen first_screen) override;
+  void StartWizard(chromeos::OobeScreenId first_screen) override;
   WizardController* GetWizardController() override;
   AppLaunchController* GetAppLaunchController() override;
   void StartUserAdding(base::OnceClosure completion_callback) override;
diff --git a/chrome/browser/chromeos/login/ui/login_display_host.h b/chrome/browser/chromeos/login/ui/login_display_host.h
index 6d91e9eb..4acb3660 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host.h
+++ b/chrome/browser/chromeos/login/ui/login_display_host.h
@@ -90,7 +90,7 @@
   // Starts out-of-box-experience flow or shows other screen handled by
   // Wizard controller i.e. camera, recovery.
   // One could specify start screen with |first_screen|.
-  virtual void StartWizard(OobeScreen first_screen) = 0;
+  virtual void StartWizard(OobeScreenId first_screen) = 0;
 
   // Returns current WizardController, if it exists.
   // Result should not be stored.
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc b/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc
index bfb739a2..018c0e8b 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc
+++ b/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc
@@ -154,7 +154,7 @@
   NOTIMPLEMENTED();
 }
 
-void LoginDisplayHostMojo::StartWizard(OobeScreen first_screen) {
+void LoginDisplayHostMojo::StartWizard(OobeScreenId first_screen) {
   DCHECK(GetOobeUI());
 
   wizard_controller_ = std::make_unique<WizardController>();
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_mojo.h b/chrome/browser/chromeos/login/ui/login_display_host_mojo.h
index a8626ea..149e616 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host_mojo.h
+++ b/chrome/browser/chromeos/login/ui/login_display_host_mojo.h
@@ -69,7 +69,7 @@
   WebUILoginView* GetWebUILoginView() const override;
   void OnFinalize() override;
   void SetStatusAreaVisible(bool visible) override;
-  void StartWizard(OobeScreen first_screen) override;
+  void StartWizard(OobeScreenId first_screen) override;
   WizardController* GetWizardController() override;
   void OnStartUserAdding() override;
   void CancelUserAdding() override;
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_webui.cc b/chrome/browser/chromeos/login/ui/login_display_host_webui.cc
index f9e8397..f6efa6e 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host_webui.cc
+++ b/chrome/browser/chromeos/login/ui/login_display_host_webui.cc
@@ -170,7 +170,7 @@
 }
 
 // Returns true if signin (not oobe) should be displayed.
-bool ShouldShowSigninScreen(chromeos::OobeScreen first_screen) {
+bool ShouldShowSigninScreen(chromeos::OobeScreenId first_screen) {
   return (first_screen == chromeos::OobeScreen::SCREEN_UNKNOWN &&
           IsOobeComplete()) ||
          first_screen == chromeos::OobeScreen::SCREEN_SPECIAL_LOGIN;
@@ -181,7 +181,7 @@
 // OnLanguageSwitchedCallback()
 // (if locale was updated).
 void ShowLoginWizardFinish(
-    chromeos::OobeScreen first_screen,
+    chromeos::OobeScreenId first_screen,
     const chromeos::StartupCustomizationDocument* startup_manifest) {
   TRACE_EVENT0("chromeos", "ShowLoginWizard::ShowLoginWizardFinish");
 
@@ -229,11 +229,11 @@
 
 struct ShowLoginWizardSwitchLanguageCallbackData {
   explicit ShowLoginWizardSwitchLanguageCallbackData(
-      chromeos::OobeScreen first_screen,
+      chromeos::OobeScreenId first_screen,
       const chromeos::StartupCustomizationDocument* startup_manifest)
       : first_screen(first_screen), startup_manifest(startup_manifest) {}
 
-  const chromeos::OobeScreen first_screen;
+  const chromeos::OobeScreenId first_screen;
   const chromeos::StartupCustomizationDocument* const startup_manifest;
 
   // lock UI while resource bundle is being reloaded.
@@ -532,7 +532,7 @@
   StartWizard(first_screen_);
 }
 
-void LoginDisplayHostWebUI::StartWizard(OobeScreen first_screen) {
+void LoginDisplayHostWebUI::StartWizard(OobeScreenId first_screen) {
   if (!StartupUtils::IsOobeCompleted()) {
     CHECK(OobeConfiguration::Get());
     if (waiting_for_configuration_)
@@ -564,8 +564,7 @@
   if (!login_window_)
     LoadURL(GURL(kOobeURL));
 
-  DVLOG(1) << "Starting wizard, first_screen: "
-           << GetOobeScreenName(first_screen);
+  DVLOG(1) << "Starting wizard, first_screen: " << first_screen;
   // Create and show the wizard.
   wizard_controller_ = std::make_unique<WizardController>();
 
@@ -1157,11 +1156,11 @@
 
 // Declared in login_wizard.h so that others don't need to depend on our .h.
 // TODO(nkostylev): Split this into a smaller functions.
-void ShowLoginWizard(OobeScreen first_screen) {
+void ShowLoginWizard(OobeScreenId first_screen) {
   if (browser_shutdown::IsTryingToQuit())
     return;
 
-  VLOG(1) << "Showing OOBE screen: " << GetOobeScreenName(first_screen);
+  VLOG(1) << "Showing OOBE screen: " << first_screen;
 
   input_method::InputMethodManager* manager =
       input_method::InputMethodManager::Get();
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_webui.h b/chrome/browser/chromeos/login/ui/login_display_host_webui.h
index 186c5f67..93c460a8 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host_webui.h
+++ b/chrome/browser/chromeos/login/ui/login_display_host_webui.h
@@ -67,7 +67,7 @@
   WebUILoginView* GetWebUILoginView() const override;
   void OnFinalize() override;
   void SetStatusAreaVisible(bool visible) override;
-  void StartWizard(OobeScreen first_screen) override;
+  void StartWizard(OobeScreenId first_screen) override;
   WizardController* GetWizardController() override;
   void OnStartUserAdding() override;
   void CancelUserAdding() override;
@@ -248,7 +248,7 @@
   RestorePath restore_path_ = RESTORE_UNKNOWN;
 
   // Stored parameters for StartWizard, required to restore in case of crash.
-  OobeScreen first_screen_;
+  OobeScreenId first_screen_ = OobeScreen::SCREEN_UNKNOWN;
 
   // A focus ring controller to draw focus ring around view for keyboard
   // driven oobe.
diff --git a/chrome/browser/chromeos/login/ui/mock_login_display_host.h b/chrome/browser/chromeos/login/ui/mock_login_display_host.h
index 580ae8c..67edff2 100644
--- a/chrome/browser/chromeos/login/ui/mock_login_display_host.h
+++ b/chrome/browser/chromeos/login/ui/mock_login_display_host.h
@@ -34,7 +34,7 @@
   }
 
   MOCK_METHOD1(SetStatusAreaVisible, void(bool));
-  MOCK_METHOD1(StartWizard, void(OobeScreen));
+  MOCK_METHOD1(StartWizard, void(OobeScreenId));
   MOCK_METHOD0(GetWizardController, WizardController*(void));
   MOCK_METHOD0(GetAppLaunchController, AppLaunchController*(void));
 
diff --git a/chrome/browser/chromeos/login/ui/views/user_board_view.h b/chrome/browser/chromeos/login/ui/views/user_board_view.h
index bc13243..3fc8dfe 100644
--- a/chrome/browser/chromeos/login/ui/views/user_board_view.h
+++ b/chrome/browser/chromeos/login/ui/views/user_board_view.h
@@ -27,7 +27,8 @@
 // or Views one.
 class UserBoardView {
  public:
-  constexpr static OobeScreen kScreenId = OobeScreen::SCREEN_USER_SELECTION;
+  constexpr static StaticOobeScreenId kScreenId =
+      OobeScreen::SCREEN_USER_SELECTION;
 
   virtual ~UserBoardView() {}
 
diff --git a/chrome/browser/chromeos/login/wizard_controller.cc b/chrome/browser/chromeos/login/wizard_controller.cc
index 33498ff..42887e9 100644
--- a/chrome/browser/chromeos/login/wizard_controller.cc
+++ b/chrome/browser/chromeos/login/wizard_controller.cc
@@ -166,7 +166,7 @@
 const unsigned int kResolveTimeZoneTimeoutSeconds = 60;
 
 // Stores the list of all screens that should be shown when resuming OOBE.
-const chromeos::OobeScreen kResumableScreens[] = {
+const chromeos::StaticOobeScreenId kResumableScreens[] = {
     chromeos::OobeScreen::SCREEN_OOBE_WELCOME,
     chromeos::OobeScreen::SCREEN_OOBE_NETWORK,
     chromeos::OobeScreen::SCREEN_OOBE_UPDATE,
@@ -194,7 +194,7 @@
              ash::switches::kAshEnableTabletMode);
 }
 
-bool IsResumableScreen(chromeos::OobeScreen screen) {
+bool IsResumableScreen(chromeos::OobeScreenId screen) {
   for (const auto& resumable_screen : kResumableScreens) {
     if (screen == resumable_screen)
       return true;
@@ -203,7 +203,7 @@
 }
 
 struct Entry {
-  chromeos::OobeScreen screen;
+  chromeos::StaticOobeScreenId screen;
   const char* uma_name;
 };
 
@@ -217,13 +217,13 @@
      "supervised-user-creation-flow"},
     {chromeos::OobeScreen::SCREEN_TERMS_OF_SERVICE, "tos"}};
 
-void RecordUMAHistogramForOOBEStepCompletionTime(chromeos::OobeScreen screen,
+void RecordUMAHistogramForOOBEStepCompletionTime(chromeos::OobeScreenId screen,
                                                  base::TimeDelta step_time) {
   // Fetch screen name; make sure to use initial UMA name if the name has
   // changed.
-  std::string screen_name = chromeos::GetOobeScreenName(screen);
+  std::string screen_name = screen.name;
   for (const auto& entry : kLegacyUmaOobeScreenNames) {
-    if (entry.screen == screen) {
+    if (entry.screen.AsId() == screen) {
       screen_name = entry.uma_name;
       break;
     }
@@ -329,11 +329,10 @@
   screen_manager_.reset();
 }
 
-void WizardController::Init(OobeScreen first_screen) {
+void WizardController::Init(OobeScreenId first_screen) {
   screen_manager_->Init(CreateScreens());
 
-  VLOG(1) << "Starting OOBE wizard with screen: "
-          << GetOobeScreenName(first_screen);
+  VLOG(1) << "Starting OOBE wizard with screen: " << first_screen;
   first_screen_ = first_screen;
 
   bool oobe_complete = StartupUtils::IsOobeCompleted();
@@ -378,7 +377,7 @@
   if (is_out_of_box_ && !screen_pref.empty() &&
       (first_screen == OobeScreen::SCREEN_UNKNOWN ||
        first_screen == OobeScreen::SCREEN_TEST_NO_WINDOW)) {
-    first_screen_ = GetOobeScreenFromName(screen_pref);
+    first_screen_ = OobeScreenId(screen_pref);
   }
 
   AdvanceToScreen(first_screen_);
@@ -396,7 +395,7 @@
   return GetOobeUI()->GetErrorScreen();
 }
 
-BaseScreen* WizardController::GetScreen(OobeScreen screen) {
+BaseScreen* WizardController::GetScreen(OobeScreenId screen) {
   if (screen == OobeScreen::SCREEN_ERROR_MESSAGE)
     return GetErrorScreen();
   return screen_manager_->GetScreen(screen);
@@ -711,11 +710,10 @@
   skip_update_enroll_after_eula_ = true;
 }
 
-void WizardController::OnScreenExit(OobeScreen screen, int exit_code) {
+void WizardController::OnScreenExit(OobeScreenId screen, int exit_code) {
   DCHECK(current_screen_->screen_id() == screen);
 
-  VLOG(1) << "Wizard screen " << GetOobeScreenName(screen)
-          << " exited with code: " << exit_code;
+  VLOG(1) << "Wizard screen " << screen << " exited with code: " << exit_code;
 
   if (IsOOBEStepToTrack(screen)) {
     RecordUMAHistogramForOOBEStepCompletionTime(
@@ -1297,8 +1295,7 @@
   // First remember how far have we reached so that we can resume if needed.
   if (is_out_of_box_ && !demo_setup_controller_ &&
       IsResumableScreen(current_screen_->screen_id())) {
-    StartupUtils::SaveOobePendingScreen(
-        GetOobeScreenName(current_screen_->screen_id()));
+    StartupUtils::SaveOobePendingScreen(current_screen_->screen_id().name);
   }
 
   smooth_show_timer_.Stop();
@@ -1310,8 +1307,7 @@
 
 void WizardController::SetCurrentScreenSmooth(BaseScreen* new_current,
                                               bool use_smoothing) {
-  VLOG(1) << "SetCurrentScreenSmooth: "
-          << GetOobeScreenName(new_current->screen_id());
+  VLOG(1) << "SetCurrentScreenSmooth: " << new_current->screen_id();
   if (current_screen_ == new_current || new_current == nullptr ||
       GetOobeUI() == nullptr) {
     return;
@@ -1324,7 +1320,7 @@
     current_screen_->SetConfiguration(nullptr);
   }
 
-  const OobeScreen screen = new_current->screen_id();
+  const OobeScreenId screen = new_current->screen_id();
   if (IsOOBEStepToTrack(screen))
     screen_show_times_[screen] = base::Time::Now();
 
@@ -1340,7 +1336,8 @@
   }
 }
 
-void WizardController::UpdateStatusAreaVisibilityForScreen(OobeScreen screen) {
+void WizardController::UpdateStatusAreaVisibilityForScreen(
+    OobeScreenId screen) {
   if (screen == OobeScreen::SCREEN_OOBE_WELCOME) {
     // Hide the status area initially; it only appears after OOBE first animates
     // in. Keep it visible if the user goes back to the existing welcome screen.
@@ -1393,7 +1390,7 @@
   }
 }
 
-void WizardController::AdvanceToScreen(OobeScreen screen) {
+void WizardController::AdvanceToScreen(OobeScreenId screen) {
   if (screen == OobeScreen::SCREEN_OOBE_WELCOME) {
     ShowWelcomeScreen();
   } else if (screen == OobeScreen::SCREEN_OOBE_NETWORK) {
@@ -1563,7 +1560,7 @@
 }
 
 // static
-bool WizardController::IsOOBEStepToTrack(OobeScreen screen_id) {
+bool WizardController::IsOOBEStepToTrack(OobeScreenId screen_id) {
   return (screen_id == OobeScreen::SCREEN_OOBE_HID_DETECTION ||
           screen_id == OobeScreen::SCREEN_OOBE_WELCOME ||
           screen_id == OobeScreen::SCREEN_OOBE_UPDATE ||
@@ -1578,7 +1575,7 @@
   if (!default_controller() || !default_controller()->current_screen())
     return;
 
-  const OobeScreen current_screen_id =
+  const OobeScreenId current_screen_id =
       default_controller()->current_screen()->screen_id();
   if (current_screen_id == OobeScreen::SCREEN_TERMS_OF_SERVICE ||
       current_screen_id == OobeScreen::SCREEN_SYNC_CONSENT ||
@@ -1589,7 +1586,7 @@
     default_controller()->OnOobeFlowFinished();
   } else {
     LOG(WARNING) << "SkipPostLoginScreensForTesting(): Ignore screen "
-                 << static_cast<int>(current_screen_id);
+                 << current_screen_id.name;
   }
 }
 
diff --git a/chrome/browser/chromeos/login/wizard_controller.h b/chrome/browser/chromeos/login/wizard_controller.h
index db4f6f5..d347889 100644
--- a/chrome/browser/chromeos/login/wizard_controller.h
+++ b/chrome/browser/chromeos/login/wizard_controller.h
@@ -78,7 +78,7 @@
   static bool IsZeroDelayEnabled();
 
   // Checks whether screen show time should be tracked with UMA.
-  static bool IsOOBEStepToTrack(OobeScreen screen_id);
+  static bool IsOOBEStepToTrack(OobeScreenId screen_id);
 
   // Skips any screens that may normally be shown after login (registration,
   // Terms of Service, user image selection).
@@ -96,10 +96,10 @@
 
   // Shows the first screen defined by |first_screen| or by default if the
   // parameter is empty.
-  void Init(OobeScreen first_screen);
+  void Init(OobeScreenId first_screen);
 
   // Advances to screen defined by |screen| and shows it.
-  void AdvanceToScreen(OobeScreen screen);
+  void AdvanceToScreen(OobeScreenId screen);
 
   // Starts Demo Mode setup flow. The flow starts from network screen and reuses
   // some of regular OOBE screens. It consists of the following screens:
@@ -138,7 +138,7 @@
   bool login_screen_started() const { return login_screen_started_; }
 
   // Returns a given screen. Creates it lazily.
-  BaseScreen* GetScreen(OobeScreen screen);
+  BaseScreen* GetScreen(OobeScreenId screen);
 
   // Returns the current ScreenManager instance.
   ScreenManager* screen_manager() const { return screen_manager_.get(); }
@@ -191,7 +191,7 @@
 
   // Shared actions to be performed on a screen exit.
   // |exit_code| is the screen specific exit code reported by the screen.
-  void OnScreenExit(OobeScreen screen, int exit_code);
+  void OnScreenExit(OobeScreenId screen, int exit_code);
 
   // Exit handlers:
   void OnWrongHWIDScreenExit();
@@ -273,7 +273,7 @@
   void SetCurrentScreenSmooth(BaseScreen* screen, bool use_smoothing);
 
   // Update the status area visibility for |screen|.
-  void UpdateStatusAreaVisibilityForScreen(OobeScreen screen);
+  void UpdateStatusAreaVisibilityForScreen(OobeScreenId screen);
 
   // Launched kiosk app configured for auto-launch.
   void AutoLaunchKioskApp();
@@ -288,7 +288,7 @@
     local_state_for_testing_ = local_state;
   }
 
-  OobeScreen first_screen() const { return first_screen_; }
+  OobeScreenId first_screen() const { return first_screen_; }
 
   // Called when network is UP.
   void StartTimezoneResolve();
@@ -320,7 +320,7 @@
   void StartEnrollmentScreen(bool force_interactive);
 
   void OnConfigurationLoaded(
-      OobeScreen first_screen,
+      OobeScreenId first_screen,
       std::unique_ptr<base::DictionaryValue> configuration);
 
   // Returns auto enrollment controller (lazily initializes one if it doesn't
@@ -349,7 +349,7 @@
   bool is_out_of_box_ = false;
 
   // Value of the screen name that WizardController was started with.
-  OobeScreen first_screen_;
+  OobeScreenId first_screen_ = OobeScreen::SCREEN_UNKNOWN;
 
   base::OneShotTimer smooth_show_timer_;
 
@@ -410,7 +410,7 @@
   std::unique_ptr<DemoSetupController> demo_setup_controller_;
 
   // Maps screen names to last time of their shows.
-  std::map<OobeScreen, base::Time> screen_show_times_;
+  std::map<OobeScreenId, base::Time> screen_show_times_;
 
   // Tests check result of timezone resolve.
   bool timezone_resolved_ = false;
diff --git a/chrome/browser/chromeos/login/wizard_controller_browsertest.cc b/chrome/browser/chromeos/login/wizard_controller_browsertest.cc
index 991bc79c..01b68cf 100644
--- a/chrome/browser/chromeos/login/wizard_controller_browsertest.cc
+++ b/chrome/browser/chromeos/login/wizard_controller_browsertest.cc
@@ -411,7 +411,7 @@
     return result;
   }
 
-  void CheckCurrentScreen(OobeScreen screen) {
+  void CheckCurrentScreen(OobeScreenId screen) {
     EXPECT_EQ(WizardController::default_controller()->GetScreen(screen),
               WizardController::default_controller()->current_screen());
   }
@@ -1281,7 +1281,7 @@
   // The error screen shows up if device state could not be retrieved.
   EXPECT_FALSE(StartupUtils::IsOobeCompleted());
   CheckCurrentScreen(OobeScreen::SCREEN_AUTO_ENROLLMENT_CHECK);
-  EXPECT_EQ(OobeScreen::SCREEN_AUTO_ENROLLMENT_CHECK,
+  EXPECT_EQ(OobeScreen::SCREEN_AUTO_ENROLLMENT_CHECK.AsId(),
             GetErrorScreen()->GetParentScreen());
   base::DictionaryValue device_state;
   device_state.SetString(policy::kDeviceStateMode,
@@ -1383,7 +1383,7 @@
   // The error screen shows up if there's no auto-enrollment decision.
   EXPECT_FALSE(StartupUtils::IsOobeCompleted());
   CheckCurrentScreen(OobeScreen::SCREEN_AUTO_ENROLLMENT_CHECK);
-  EXPECT_EQ(OobeScreen::SCREEN_AUTO_ENROLLMENT_CHECK,
+  EXPECT_EQ(OobeScreen::SCREEN_AUTO_ENROLLMENT_CHECK.AsId(),
             GetErrorScreen()->GetParentScreen());
 
   WaitUntilJSIsReady();
@@ -1492,7 +1492,7 @@
     // The error screen shows up.
     EXPECT_FALSE(StartupUtils::IsOobeCompleted());
     CheckCurrentScreen(OobeScreen::SCREEN_AUTO_ENROLLMENT_CHECK);
-    EXPECT_EQ(OobeScreen::SCREEN_AUTO_ENROLLMENT_CHECK,
+    EXPECT_EQ(OobeScreen::SCREEN_AUTO_ENROLLMENT_CHECK.AsId(),
               GetErrorScreen()->GetParentScreen());
 
     WaitUntilJSIsReady();
@@ -1628,7 +1628,7 @@
 
   // The error screen shows up if there's no auto-enrollment decision.
   EXPECT_FALSE(StartupUtils::IsOobeCompleted());
-  EXPECT_EQ(OobeScreen::SCREEN_AUTO_ENROLLMENT_CHECK,
+  EXPECT_EQ(OobeScreen::SCREEN_AUTO_ENROLLMENT_CHECK.AsId(),
             GetErrorScreen()->GetParentScreen());
   base::DictionaryValue device_state;
   device_state.SetString(policy::kDeviceStateMode,
@@ -1712,7 +1712,7 @@
 
   // The error screen shows up if there's no auto-enrollment decision.
   EXPECT_FALSE(StartupUtils::IsOobeCompleted());
-  EXPECT_EQ(OobeScreen::SCREEN_AUTO_ENROLLMENT_CHECK,
+  EXPECT_EQ(OobeScreen::SCREEN_AUTO_ENROLLMENT_CHECK.AsId(),
             GetErrorScreen()->GetParentScreen());
 
   WaitUntilJSIsReady();
@@ -2311,7 +2311,7 @@
   }
 
   template <class T>
-  void SkipToScreen(OobeScreen screen, T* screen_mock) {
+  void SkipToScreen(OobeScreenId screen, T* screen_mock) {
     EXPECT_CALL(*screen_mock, Show()).Times(1);
     auto* const wizard_controller = WizardController::default_controller();
     wizard_controller->SimulateDemoModeSetupForTesting();
@@ -2698,7 +2698,7 @@
 
   // The error screen shows up if device state could not be retrieved.
   CheckCurrentScreen(OobeScreen::SCREEN_AUTO_ENROLLMENT_CHECK);
-  EXPECT_EQ(OobeScreen::SCREEN_AUTO_ENROLLMENT_CHECK,
+  EXPECT_EQ(OobeScreen::SCREEN_AUTO_ENROLLMENT_CHECK.AsId(),
             GetErrorScreen()->GetParentScreen());
   base::DictionaryValue device_state;
   device_state.SetString(policy::kDeviceStateMode,
@@ -2752,7 +2752,7 @@
                                 base::Unretained(wizard_controller))));
   }
 
-  OobeScreen GetFirstScreen() {
+  OobeScreenId GetFirstScreen() {
     return WizardController::default_controller()->first_screen();
   }
 
@@ -2792,7 +2792,7 @@
 
 IN_PROC_BROWSER_TEST_F(WizardControllerOobeResumeTest,
                        ControlFlowResumeInterruptedOobe) {
-  EXPECT_EQ(OobeScreen::SCREEN_OOBE_ENROLLMENT, GetFirstScreen());
+  EXPECT_EQ(OobeScreen::SCREEN_OOBE_ENROLLMENT.AsId(), GetFirstScreen());
 }
 
 class WizardControllerCellularFirstTest : public WizardControllerFlowTest {
diff --git a/chrome/browser/chromeos/policy/device_local_account_browsertest.cc b/chrome/browser/chromeos/policy/device_local_account_browsertest.cc
index 2c2ed7b..5170431 100644
--- a/chrome/browser/chromeos/policy/device_local_account_browsertest.cc
+++ b/chrome/browser/chromeos/policy/device_local_account_browsertest.cc
@@ -2182,7 +2182,7 @@
         chromeos::WizardController::default_controller();
   ASSERT_TRUE(wizard_controller);
   ASSERT_TRUE(wizard_controller->current_screen());
-  EXPECT_EQ(chromeos::OobeScreen::SCREEN_TERMS_OF_SERVICE,
+  EXPECT_EQ(chromeos::OobeScreen::SCREEN_TERMS_OF_SERVICE.AsId(),
             wizard_controller->current_screen()->screen_id());
 
   // Wait for the Terms of Service to finish downloading.
@@ -2638,7 +2638,7 @@
         chromeos::WizardController::default_controller();
   ASSERT_TRUE(wizard_controller);
   ASSERT_TRUE(wizard_controller->current_screen());
-  EXPECT_EQ(chromeos::OobeScreen::SCREEN_TERMS_OF_SERVICE,
+  EXPECT_EQ(chromeos::OobeScreen::SCREEN_TERMS_OF_SERVICE.AsId(),
             wizard_controller->current_screen()->screen_id());
 
   // Wait for the Terms of Service to finish downloading, then get the status of
@@ -2784,7 +2784,7 @@
       chromeos::WizardController::default_controller();
   ASSERT_TRUE(wizard_controller);
   ASSERT_TRUE(wizard_controller->current_screen());
-  EXPECT_EQ(chromeos::OobeScreen::SCREEN_TERMS_OF_SERVICE,
+  EXPECT_EQ(chromeos::OobeScreen::SCREEN_TERMS_OF_SERVICE.AsId(),
             wizard_controller->current_screen()->screen_id());
 
   // Click the back button.
diff --git a/chrome/browser/chromeos/policy/site_isolation_flag_handling_browsertest.cc b/chrome/browser/chromeos/policy/site_isolation_flag_handling_browsertest.cc
index 4460fff..80ad0b0 100644
--- a/chrome/browser/chromeos/policy/site_isolation_flag_handling_browsertest.cc
+++ b/chrome/browser/chromeos/policy/site_isolation_flag_handling_browsertest.cc
@@ -306,8 +306,7 @@
     // Note that AttemptRestart() is mocked out in UserSessionManager through
     // |SetAttemptRestartClosureInTests| (set up in SetUpOnMainThread).
     SessionManagerClient::InitializeFake();
-    FakeSessionManagerClient::Get()->set_supports_restart_to_apply_user_flags(
-        true);
+    FakeSessionManagerClient::Get()->set_supports_browser_restart(true);
   }
 
   void SetUpOnMainThread() override {
diff --git a/chrome/browser/chromeos/system/device_disabling_browsertest.cc b/chrome/browser/chromeos/system/device_disabling_browsertest.cc
index 5934ad7..ef2a4db 100644
--- a/chrome/browser/chromeos/system/device_disabling_browsertest.cc
+++ b/chrome/browser/chromeos/system/device_disabling_browsertest.cc
@@ -196,7 +196,7 @@
 
   // Verify that the login screen was not shown and the device disabled screen
   // is still being shown instead.
-  EXPECT_EQ(GetOobeScreenName(OobeScreen::SCREEN_DEVICE_DISABLED),
+  EXPECT_EQ(OobeScreen::SCREEN_DEVICE_DISABLED.name,
             GetCurrentScreenName(web_contents));
 
   // Disconnect from the fake Ethernet network.
@@ -219,7 +219,7 @@
 
   // Verify that the offline error screen was not shown and the device disabled
   // screen is still being shown instead.
-  EXPECT_EQ(GetOobeScreenName(OobeScreen::SCREEN_DEVICE_DISABLED),
+  EXPECT_EQ(OobeScreen::SCREEN_DEVICE_DISABLED.name,
             GetCurrentScreenName(web_contents));
 }
 
diff --git a/chrome/browser/download/download_browsertest.cc b/chrome/browser/download/download_browsertest.cc
index 382c1c5..e10c172 100644
--- a/chrome/browser/download/download_browsertest.cc
+++ b/chrome/browser/download/download_browsertest.cc
@@ -105,6 +105,7 @@
 #include "content/public/common/content_features.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/common/context_menu_params.h"
+#include "content/public/common/service_manager_connection.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/download_test_observer.h"
 #include "content/public/test/slow_download_http_response.h"
@@ -121,6 +122,10 @@
 #include "net/test/embedded_test_server/http_response.h"
 #include "net/test/url_request/url_request_mock_http_job.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
+#include "services/device/public/mojom/constants.mojom.h"
+#include "services/device/public/mojom/wake_lock.mojom.h"
+#include "services/device/public/mojom/wake_lock_provider.mojom.h"
+#include "services/service_manager/public/cpp/connector.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/page_transition_types.h"
@@ -1195,6 +1200,40 @@
   std::unique_ptr<TestSafeBrowsingServiceFactory> test_safe_browsing_factory_;
 };
 
+class DownloadWakeLockTest : public DownloadTest {
+ public:
+  DownloadWakeLockTest() = default;
+
+  void Initialize() {
+    auto* connection = content::ServiceManagerConnection::GetForProcess();
+    auto* connector = connection->GetConnector();
+    connector_ = connector->Clone();
+    connector_->BindInterface(device::mojom::kServiceName,
+                              &wake_lock_provider_);
+  }
+
+  // Returns the number of active wake locks of type |type|.
+  int GetActiveWakeLocks(device::mojom::WakeLockType type) {
+    base::RunLoop run_loop;
+    int result_count = 0;
+    wake_lock_provider_->GetActiveWakeLocksForTests(
+        type,
+        base::BindOnce(
+            [](base::RunLoop* run_loop, int* result_count, int32_t count) {
+              *result_count = count;
+              run_loop->Quit();
+            },
+            &run_loop, &result_count));
+    run_loop.Run();
+    return result_count;
+  }
+
+ protected:
+  device::mojom::WakeLockProviderPtr wake_lock_provider_;
+  std::unique_ptr<service_manager::Connector> connector_;
+  DISALLOW_COPY_AND_ASSIGN(DownloadWakeLockTest);
+};
+
 }  // namespace
 
 // NOTES:
@@ -3707,6 +3746,20 @@
   ASSERT_TRUE(origin_three.ShutdownAndWaitUntilComplete());
 }
 
+IN_PROC_BROWSER_TEST_F(DownloadWakeLockTest, WakeLockAcquireAndCancel) {
+  Initialize();
+  EXPECT_EQ(0, GetActiveWakeLocks(
+                   device::mojom::WakeLockType::kPreventAppSuspension));
+  DownloadItem* download_item = CreateSlowTestDownload();
+  ASSERT_TRUE(download_item);
+  EXPECT_EQ(1, GetActiveWakeLocks(
+                   device::mojom::WakeLockType::kPreventAppSuspension));
+  download_item->Cancel(true);
+  EXPECT_EQ(DownloadItem::CANCELLED, download_item->GetState());
+  EXPECT_EQ(0, GetActiveWakeLocks(
+                   device::mojom::WakeLockType::kPreventAppSuspension));
+}
+
 #if defined(FULL_SAFE_BROWSING)
 
 namespace {
diff --git a/chrome/browser/extensions/BUILD.gn b/chrome/browser/extensions/BUILD.gn
index 135cf585..be0a75a4 100644
--- a/chrome/browser/extensions/BUILD.gn
+++ b/chrome/browser/extensions/BUILD.gn
@@ -364,6 +364,7 @@
     "api/storage/syncable_settings_storage.h",
     "api/streams_private/streams_private_api.cc",
     "api/streams_private/streams_private_api.h",
+    "api/system_indicator/system_indicator_api.cc",
     "api/system_indicator/system_indicator_api.h",
     "api/system_indicator/system_indicator_manager.cc",
     "api/system_indicator/system_indicator_manager.h",
diff --git a/chrome/browser/extensions/api/content_settings/content_settings_service.cc b/chrome/browser/extensions/api/content_settings/content_settings_service.cc
index 6fd03e56..66c59d56 100644
--- a/chrome/browser/extensions/api/content_settings/content_settings_service.cc
+++ b/chrome/browser/extensions/api/content_settings/content_settings_service.cc
@@ -12,7 +12,8 @@
 namespace extensions {
 
 ContentSettingsService::ContentSettingsService(content::BrowserContext* context)
-    : content_settings_store_(new ContentSettingsStore()) {}
+    : content_settings_store_(new ContentSettingsStore()),
+      scoped_observer_(this) {}
 
 ContentSettingsService::~ContentSettingsService() {}
 
@@ -69,14 +70,13 @@
   content_settings_store_->SetExtensionState(extension_id, state);
 }
 
+void ContentSettingsService::OnExtensionPrefsWillBeDestroyed(
+    ExtensionPrefs* prefs) {
+  scoped_observer_.Remove(prefs);
+}
+
 void ContentSettingsService::OnExtensionPrefsAvailable(ExtensionPrefs* prefs) {
-  // TODO(nigeltao): Use a ScopedObserver (as a member field, not a local
-  // variable).
-  //
-  // As is, this is a leak: an AddObserver call that has no matching
-  // RemoveObserver call. This leak will become a dangling pointer when this
-  // ContentSettingsService object is destroyed.
-  prefs->AddObserver(this);
+  scoped_observer_.Add(prefs);
 }
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/content_settings/content_settings_service.h b/chrome/browser/extensions/api/content_settings/content_settings_service.h
index da4404d..4887f5e 100644
--- a/chrome/browser/extensions/api/content_settings/content_settings_service.h
+++ b/chrome/browser/extensions/api/content_settings/content_settings_service.h
@@ -7,6 +7,7 @@
 
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
+#include "base/scoped_observer.h"
 #include "chrome/browser/extensions/api/content_settings/content_settings_store.h"
 #include "extensions/browser/browser_context_keyed_api_factory.h"
 #include "extensions/browser/extension_prefs_observer.h"
@@ -45,6 +46,7 @@
   void OnExtensionPrefsDeleted(const std::string& extension_id) override;
   void OnExtensionStateChanged(const std::string& extension_id,
                                bool state) override;
+  void OnExtensionPrefsWillBeDestroyed(ExtensionPrefs* prefs) override;
 
   // EarlyExtensionPrefsObserver implementation.
   void OnExtensionPrefsAvailable(ExtensionPrefs* prefs) override;
@@ -57,6 +59,7 @@
   static const char* service_name() { return "ContentSettingsService"; }
 
   scoped_refptr<ContentSettingsStore> content_settings_store_;
+  ScopedObserver<ExtensionPrefs, ExtensionPrefsObserver> scoped_observer_;
 
   DISALLOW_COPY_AND_ASSIGN(ContentSettingsService);
 };
diff --git a/chrome/browser/extensions/api/declarative_content/declarative_content_apitest.cc b/chrome/browser/extensions/api/declarative_content/declarative_content_apitest.cc
index a1578d2a..c033a98 100644
--- a/chrome/browser/extensions/api/declarative_content/declarative_content_apitest.cc
+++ b/chrome/browser/extensions/api/declarative_content/declarative_content_apitest.cc
@@ -458,8 +458,6 @@
       case ActionInfo::TYPE_PAGE:
         action_key = R"("page_action": {},)";
         break;
-      case ActionInfo::TYPE_SYSTEM_INDICATOR:
-        NOTREACHED();
     }
   }
 
diff --git a/chrome/browser/extensions/api/extension_action/extension_action_api.cc b/chrome/browser/extensions/api/extension_action/extension_action_api.cc
index 268894c..f01a0e9 100644
--- a/chrome/browser/extensions/api/extension_action/extension_action_api.cc
+++ b/chrome/browser/extensions/api/extension_action/extension_action_api.cc
@@ -209,10 +209,6 @@
       histogram_value = events::PAGE_ACTION_ON_CLICKED;
       event_name = "pageAction.onClicked";
       break;
-    case ActionInfo::TYPE_SYSTEM_INDICATOR:
-      // The System Indicator handles its own clicks.
-      NOTREACHED();
-      break;
   }
 
   if (event_name) {
@@ -295,15 +291,7 @@
 ExtensionFunction::ResponseAction ExtensionActionFunction::Run() {
   ExtensionActionManager* manager =
       ExtensionActionManager::Get(browser_context());
-  if (base::StartsWith(name(), "systemIndicator.",
-                       base::CompareCase::INSENSITIVE_ASCII)) {
-    extension_action_ = manager->GetSystemIndicator(*extension());
-  } else {
-    extension_action_ = manager->GetBrowserAction(*extension());
-    if (!extension_action_) {
-      extension_action_ = manager->GetPageAction(*extension());
-    }
-  }
+  extension_action_ = manager->GetExtensionAction(*extension());
   if (!extension_action_) {
     // TODO(kalman): ideally the browserAction/pageAction APIs wouldn't event
     // exist for extensions that don't have one declared. This should come as
@@ -322,11 +310,9 @@
     if (!contents_)
       return RespondNow(Error(kNoTabError, base::NumberToString(tab_id_)));
   } else {
-    // Only browser actions and system indicators have a default tabId.
-    ActionInfo::Type action_type = extension_action_->action_type();
-    EXTENSION_FUNCTION_VALIDATE(
-        action_type == ActionInfo::TYPE_BROWSER ||
-        action_type == ActionInfo::TYPE_SYSTEM_INDICATOR);
+    // Only browser actions have a default tabId.
+    EXTENSION_FUNCTION_VALIDATE(extension_action_->action_type() ==
+                                ActionInfo::TYPE_BROWSER);
   }
   return RunExtensionAction();
 }
diff --git a/chrome/browser/extensions/api/preference/preference_api_prefs_unittest.cc b/chrome/browser/extensions/api/preference/preference_api_prefs_unittest.cc
index 54ad94c2..621171c 100644
--- a/chrome/browser/extensions/api/preference/preference_api_prefs_unittest.cc
+++ b/chrome/browser/extensions/api/preference/preference_api_prefs_unittest.cc
@@ -103,7 +103,7 @@
     : PrefsPrepopulatedTestBase(),
       content_settings_(ContentSettingsService::Get(&profile_)),
       test_preference_api_(&prefs_, content_settings_) {
-  prefs_.prefs()->AddObserver(content_settings_);
+  content_settings_->OnExtensionPrefsAvailable(prefs_.prefs());
 }
 
 ExtensionControlledPrefsTest::~ExtensionControlledPrefsTest() {
diff --git a/chrome/browser/extensions/api/system_indicator/system_indicator_api.cc b/chrome/browser/extensions/api/system_indicator/system_indicator_api.cc
new file mode 100644
index 0000000..14407bcd
--- /dev/null
+++ b/chrome/browser/extensions/api/system_indicator/system_indicator_api.cc
@@ -0,0 +1,80 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/extensions/api/system_indicator/system_indicator_api.h"
+
+#include "base/no_destructor.h"
+#include "chrome/browser/extensions/api/system_indicator/system_indicator_manager.h"
+#include "chrome/browser/extensions/api/system_indicator/system_indicator_manager_factory.h"
+#include "chrome/browser/extensions/extension_action.h"
+#include "chrome/common/extensions/api/system_indicator/system_indicator_handler.h"
+#include "ui/gfx/image/image.h"
+#include "ui/gfx/image/image_skia.h"
+
+namespace extensions {
+
+namespace {
+
+// Returns true if the extension has a system indicator.
+bool HasSystemIndicator(const Extension& extension) {
+  return SystemIndicatorHandler::GetSystemIndicatorIcon(extension) != nullptr;
+}
+
+}  // namespace
+
+ExtensionFunction::ResponseAction SystemIndicatorSetIconFunction::Run() {
+  EXTENSION_FUNCTION_VALIDATE(extension());
+  EXTENSION_FUNCTION_VALIDATE(HasSystemIndicator(*extension()));
+
+  EXTENSION_FUNCTION_VALIDATE(args_->GetList().size() == 1);
+  EXTENSION_FUNCTION_VALIDATE(args_->GetList()[0].is_dict());
+
+  const base::Value& set_icon_details = args_->GetList()[0];
+
+  // NOTE: For historical reasons, this code is primarily taken from
+  // ExtensionActionSetIconFunction.
+  // setIcon can take a variant argument: either a dictionary of canvas
+  // ImageData, or an icon index.
+  if (const base::Value* canvas_set = set_icon_details.FindKeyOfType(
+          "imageData", base::Value::Type::DICTIONARY)) {
+    gfx::ImageSkia icon;
+    EXTENSION_FUNCTION_VALIDATE(ExtensionAction::ParseIconFromCanvasDictionary(
+        static_cast<const base::DictionaryValue&>(*canvas_set), &icon));
+
+    if (icon.isNull())
+      return RespondNow(Error("Icon invalid."));
+
+    SystemIndicatorManagerFactory::GetForContext(browser_context())
+        ->SetSystemIndicatorDynamicIcon(*extension(), gfx::Image(icon));
+  } else if (set_icon_details.FindKeyOfType("iconIndex",
+                                            base::Value::Type::INTEGER)) {
+    // Obsolete argument: ignore it.
+    // TODO(devlin): Do we need this here? Does any systemIndicator extension
+    // use it?
+  } else {
+    EXTENSION_FUNCTION_VALIDATE(false);
+  }
+
+  return RespondNow(NoArguments());
+}
+
+ExtensionFunction::ResponseAction SystemIndicatorEnableFunction::Run() {
+  EXTENSION_FUNCTION_VALIDATE(extension());
+  EXTENSION_FUNCTION_VALIDATE(HasSystemIndicator(*extension()));
+
+  SystemIndicatorManagerFactory::GetForContext(browser_context())
+      ->SetSystemIndicatorEnabled(*extension(), true);
+  return RespondNow(NoArguments());
+}
+
+ExtensionFunction::ResponseAction SystemIndicatorDisableFunction::Run() {
+  EXTENSION_FUNCTION_VALIDATE(extension());
+  EXTENSION_FUNCTION_VALIDATE(HasSystemIndicator(*extension()));
+
+  SystemIndicatorManagerFactory::GetForContext(browser_context())
+      ->SetSystemIndicatorEnabled(*extension(), false);
+  return RespondNow(NoArguments());
+}
+
+}  // namespace extensions
diff --git a/chrome/browser/extensions/api/system_indicator/system_indicator_api.h b/chrome/browser/extensions/api/system_indicator/system_indicator_api.h
index 318d8eb..b0bd25e 100644
--- a/chrome/browser/extensions/api/system_indicator/system_indicator_api.h
+++ b/chrome/browser/extensions/api/system_indicator/system_indicator_api.h
@@ -5,31 +5,36 @@
 #ifndef CHROME_BROWSER_EXTENSIONS_API_SYSTEM_INDICATOR_SYSTEM_INDICATOR_API_H_
 #define CHROME_BROWSER_EXTENSIONS_API_SYSTEM_INDICATOR_SYSTEM_INDICATOR_API_H_
 
-#include "chrome/browser/extensions/api/extension_action/extension_action_api.h"
 #include "extensions/browser/extension_function.h"
 
 namespace extensions {
 
-class SystemIndicatorSetIconFunction : public ExtensionActionSetIconFunction {
+class SystemIndicatorSetIconFunction : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("systemIndicator.setIcon", SYSTEMINDICATOR_SETICON)
 
+  ResponseAction Run() override;
+
  protected:
   ~SystemIndicatorSetIconFunction() override {}
 };
 
-class SystemIndicatorEnableFunction : public ExtensionActionShowFunction {
+class SystemIndicatorEnableFunction : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("systemIndicator.enable", SYSTEMINDICATOR_ENABLE)
 
+  ResponseAction Run() override;
+
  protected:
   ~SystemIndicatorEnableFunction() override {}
 };
 
-class SystemIndicatorDisableFunction : public ExtensionActionHideFunction {
+class SystemIndicatorDisableFunction : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("systemIndicator.disable", SYSTEMINDICATOR_DISABLE)
 
+  ResponseAction Run() override;
+
  protected:
   ~SystemIndicatorDisableFunction() override {}
 };
diff --git a/chrome/browser/extensions/api/system_indicator/system_indicator_apitest.cc b/chrome/browser/extensions/api/system_indicator/system_indicator_apitest.cc
index 2313974..684c765 100644
--- a/chrome/browser/extensions/api/system_indicator/system_indicator_apitest.cc
+++ b/chrome/browser/extensions/api/system_indicator/system_indicator_apitest.cc
@@ -9,63 +9,63 @@
 #include "chrome/browser/extensions/extension_apitest.h"
 #include "chrome/browser/extensions/lazy_background_page_test_util.h"
 #include "chrome/browser/ui/browser.h"
+#include "components/version_info/channel.h"
 #include "extensions/browser/process_manager.h"
 #include "extensions/common/extension.h"
+#include "extensions/common/features/feature_channel.h"
+#include "extensions/common/manifest_test.h"
 #include "extensions/test/result_catcher.h"
 
 namespace extensions {
 
 class SystemIndicatorApiTest : public ExtensionApiTest {
  public:
+  SystemIndicatorApiTest() : scoped_channel_(version_info::Channel::DEV) {}
+  ~SystemIndicatorApiTest() override = default;
+
   void SetUpOnMainThread() override {
     ExtensionApiTest::SetUpOnMainThread();
     // Set shorter delays to prevent test timeouts in tests that need to wait
     // for the event page to unload.
-    extensions::ProcessManager::SetEventPageIdleTimeForTesting(1);
-    extensions::ProcessManager::SetEventPageSuspendingTimeForTesting(1);
+    ProcessManager::SetEventPageIdleTimeForTesting(1);
+    ProcessManager::SetEventPageSuspendingTimeForTesting(1);
   }
 
-  const extensions::Extension* LoadExtensionAndWait(
-      const std::string& test_name) {
+  const Extension* LoadExtensionAndWait(const std::string& test_name) {
     LazyBackgroundObserver page_complete;
     base::FilePath extdir = test_data_dir_.AppendASCII(test_name);
-    const extensions::Extension* extension = LoadExtension(extdir);
+    const Extension* extension = LoadExtension(extdir);
     if (extension)
       page_complete.Wait();
     return extension;
   }
+
+ private:
+  ScopedCurrentChannel scoped_channel_;
+
+  DISALLOW_COPY_AND_ASSIGN(SystemIndicatorApiTest);
 };
 
-IN_PROC_BROWSER_TEST_F(ExtensionApiTest, SystemIndicator) {
-  // Only run this test on supported platforms.  SystemIndicatorManagerFactory
-  // returns NULL on unsupported platforms.
-  extensions::SystemIndicatorManager* manager =
-      extensions::SystemIndicatorManagerFactory::GetForProfile(profile());
-  if (manager) {
-    ASSERT_TRUE(RunExtensionTest("system_indicator/basics")) << message_;
-  }
+IN_PROC_BROWSER_TEST_F(SystemIndicatorApiTest, SystemIndicator) {
+  ASSERT_TRUE(RunExtensionTest("system_indicator/basics")) << message_;
 }
 
 // Failing on 10.6, flaky elsewhere http://crbug.com/497643
 IN_PROC_BROWSER_TEST_F(SystemIndicatorApiTest, DISABLED_SystemIndicator) {
-  // Only run this test on supported platforms.  SystemIndicatorManagerFactory
-  // returns NULL on unsupported platforms.
-  extensions::SystemIndicatorManager* manager =
-      extensions::SystemIndicatorManagerFactory::GetForProfile(profile());
-  if (manager) {
-    extensions::ResultCatcher catcher;
+  ResultCatcher catcher;
 
-    const extensions::Extension* extension =
-        LoadExtensionAndWait("system_indicator/unloaded");
-    ASSERT_TRUE(extension) << message_;
+  const Extension* extension =
+      LoadExtensionAndWait("system_indicator/unloaded");
+  ASSERT_TRUE(extension) << message_;
 
-    // Lazy Background Page has been shut down.
-    extensions::ProcessManager* pm = extensions::ProcessManager::Get(profile());
-    EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id()));
+  // Lazy Background Page has been shut down.
+  ProcessManager* pm = ProcessManager::Get(profile());
+  EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id()));
 
-    EXPECT_TRUE(manager->SendClickEventToExtensionForTest(extension->id()));
-    EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
-  }
+  SystemIndicatorManager* manager =
+      SystemIndicatorManagerFactory::GetForContext(profile());
+  EXPECT_TRUE(manager->SendClickEventToExtensionForTest(extension->id()));
+  EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
 }
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/system_indicator/system_indicator_manager.cc b/chrome/browser/extensions/api/system_indicator/system_indicator_manager.cc
index baa15574..ee22cb17 100644
--- a/chrome/browser/extensions/api/system_indicator/system_indicator_manager.cc
+++ b/chrome/browser/extensions/api/system_indicator/system_indicator_manager.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "base/stl_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/extensions/extension_action.h"
 #include "chrome/browser/profiles/profile.h"
@@ -13,11 +14,13 @@
 #include "chrome/browser/status_icons/status_icon_observer.h"
 #include "chrome/browser/status_icons/status_tray.h"
 #include "chrome/common/extensions/api/system_indicator.h"
+#include "chrome/common/extensions/api/system_indicator/system_indicator_handler.h"
 #include "content/public/browser/web_contents.h"
 #include "extensions/browser/event_router.h"
+#include "extensions/browser/extension_icon_image.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/common/extension.h"
-#include "ui/gfx/image/image.h"
+#include "extensions/common/extension_icon_set.h"
 
 namespace extensions {
 
@@ -28,57 +31,69 @@
 // and removing the icon from the notification area during construction and
 // destruction.
 class ExtensionIndicatorIcon : public StatusIconObserver,
-                               public ExtensionActionIconFactory::Observer {
+                               public IconImage::Observer {
  public:
   static std::unique_ptr<ExtensionIndicatorIcon> Create(
-      const Extension* extension,
-      ExtensionAction* action,
+      const Extension& extension,
+      const ExtensionIconSet& icon_set,
       Profile* profile,
       StatusTray* status_tray);
   ~ExtensionIndicatorIcon() override;
 
-  // StatusIconObserver implementation.
+  // Sets the dynamic icon for the indicator.
+  void SetDynamicIcon(gfx::Image dynamic_icon);
+
+  // StatusIconObserver:
   void OnStatusIconClicked() override;
 
-  // ExtensionActionIconFactory::Observer implementation.
-  void OnIconUpdated() override;
-
  private:
-  ExtensionIndicatorIcon(const Extension* extension,
-                         ExtensionAction* action,
+  ExtensionIndicatorIcon(const Extension& extension,
+                         const ExtensionIconSet& manifest_icon_set,
                          Profile* profile,
                          StatusTray* status_tray);
 
-  const extensions::Extension* extension_;
+  // IconImage::Observer:
+  void OnExtensionIconImageChanged(IconImage* image) override;
+
+  const Extension* extension_;
   StatusTray* status_tray_;
-  StatusIcon* icon_;
+  StatusIcon* status_icon_;
   Profile* profile_;
-  ExtensionActionIconFactory icon_factory_;
+  IconImage manifest_icon_;
+  gfx::Image dynamic_icon_;
+
+  DISALLOW_COPY_AND_ASSIGN(ExtensionIndicatorIcon);
 };
 
 std::unique_ptr<ExtensionIndicatorIcon> ExtensionIndicatorIcon::Create(
-    const Extension* extension,
-    ExtensionAction* action,
+    const Extension& extension,
+    const ExtensionIconSet& icon_set,
     Profile* profile,
     StatusTray* status_tray) {
-  std::unique_ptr<ExtensionIndicatorIcon> extension_icon(
-      new ExtensionIndicatorIcon(extension, action, profile, status_tray));
+  // Private ctor, so have to use WrapUnique.
+  auto extension_icon = base::WrapUnique(
+      new ExtensionIndicatorIcon(extension, icon_set, profile, status_tray));
 
   // Check if a status icon was successfully created.
-  if (extension_icon->icon_)
+  if (extension_icon->status_icon_)
     return extension_icon;
 
   // We could not create a status icon.
-  return std::unique_ptr<ExtensionIndicatorIcon>();
+  return nullptr;
 }
 
 ExtensionIndicatorIcon::~ExtensionIndicatorIcon() {
-  if (icon_) {
-    icon_->RemoveObserver(this);
-    status_tray_->RemoveStatusIcon(icon_);
+  if (status_icon_) {
+    status_icon_->RemoveObserver(this);
+    status_tray_->RemoveStatusIcon(status_icon_);
   }
 }
 
+void ExtensionIndicatorIcon::SetDynamicIcon(gfx::Image dynamic_icon) {
+  dynamic_icon_ = std::move(dynamic_icon);
+  status_icon_->SetImage(dynamic_icon_.AsImageSkia());
+}
+
 void ExtensionIndicatorIcon::OnStatusIconClicked() {
   std::unique_ptr<base::ListValue> params(
       api::system_indicator::OnClicked::Create());
@@ -90,40 +105,46 @@
   event_router->DispatchEventToExtension(extension_->id(), std::move(event));
 }
 
-void ExtensionIndicatorIcon::OnIconUpdated() {
-  icon_->SetImage(
-      icon_factory_.GetIcon(ExtensionAction::kDefaultTabId).AsImageSkia());
+void ExtensionIndicatorIcon::OnExtensionIconImageChanged(IconImage* image) {
+  if (dynamic_icon_.IsEmpty())  // Don't override a dynamically-set icon.
+    status_icon_->SetImage(manifest_icon_.image().AsImageSkia());
 }
 
-ExtensionIndicatorIcon::ExtensionIndicatorIcon(const Extension* extension,
-                                               ExtensionAction* action,
-                                               Profile* profile,
-                                               StatusTray* status_tray)
-    : extension_(extension),
+ExtensionIndicatorIcon::ExtensionIndicatorIcon(
+    const Extension& extension,
+    const ExtensionIconSet& manifest_icon_set,
+    Profile* profile,
+    StatusTray* status_tray)
+    : extension_(&extension),
       status_tray_(status_tray),
-      icon_(NULL),
+      status_icon_(nullptr),
       profile_(profile),
-      icon_factory_(profile, extension, action, this) {
+      manifest_icon_(profile,
+                     &extension,
+                     manifest_icon_set,
+                     ExtensionAction::ActionIconSize(),
+                     ExtensionAction::FallbackIcon().AsImageSkia(),
+                     this) {
   // Get the icon image and tool tip for the status icon. The extension name is
   // used as the tool tip.
-  gfx::ImageSkia icon_image =
-      icon_factory_.GetIcon(ExtensionAction::kDefaultTabId).AsImageSkia();
+  gfx::ImageSkia icon_skia = manifest_icon_.image().AsImageSkia();
   base::string16 tool_tip = base::UTF8ToUTF16(extension_->name());
 
-  icon_ = status_tray_->CreateStatusIcon(
-      StatusTray::OTHER_ICON, icon_image, tool_tip);
-  if (icon_)
-    icon_->AddObserver(this);
+  status_icon_ = status_tray_->CreateStatusIcon(StatusTray::OTHER_ICON,
+                                                icon_skia, tool_tip);
+  if (status_icon_)
+    status_icon_->AddObserver(this);
 }
 
+SystemIndicatorManager::SystemIndicator::SystemIndicator() {}
+SystemIndicatorManager::SystemIndicator::~SystemIndicator() = default;
+
 SystemIndicatorManager::SystemIndicatorManager(Profile* profile,
                                                StatusTray* status_tray)
     : profile_(profile),
       status_tray_(status_tray),
-      extension_action_observer_(this),
       extension_registry_observer_(this) {
   extension_registry_observer_.Add(ExtensionRegistry::Get(profile_));
-  extension_action_observer_.Add(ExtensionActionAPI::Get(profile_));
 }
 
 SystemIndicatorManager::~SystemIndicatorManager() {
@@ -134,64 +155,73 @@
   DCHECK(thread_checker_.CalledOnValidThread());
 }
 
+void SystemIndicatorManager::SetSystemIndicatorDynamicIcon(
+    const Extension& extension,
+    gfx::Image icon) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  DCHECK(base::ContainsKey(system_indicators_, extension.id()));
+  auto& indicator = system_indicators_[extension.id()];
+  indicator.dynamic_icon = icon;
+  if (indicator.system_tray_indicator)
+    indicator.system_tray_indicator->SetDynamicIcon(std::move(icon));
+}
+
+void SystemIndicatorManager::SetSystemIndicatorEnabled(
+    const Extension& extension,
+    bool is_enabled) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  DCHECK(base::ContainsKey(system_indicators_, extension.id()));
+  auto& indicator = system_indicators_[extension.id()];
+  bool is_already_enabled = !!indicator.system_tray_indicator;
+  if (is_already_enabled == is_enabled)
+    return;
+
+  if (is_enabled) {
+    indicator.system_tray_indicator = ExtensionIndicatorIcon::Create(
+        extension, indicator.manifest_icon_set, profile_, status_tray_);
+    // Note: The system tray indicator creation can fail.
+    if (indicator.system_tray_indicator && !indicator.dynamic_icon.IsEmpty()) {
+      indicator.system_tray_indicator->SetDynamicIcon(indicator.dynamic_icon);
+    }
+  } else {
+    indicator.system_tray_indicator.reset();
+  }
+}
+
+void SystemIndicatorManager::OnExtensionLoaded(
+    content::BrowserContext* browser_context,
+    const Extension* extension) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  DCHECK(!base::ContainsKey(system_indicators_, extension->id()));
+  const ExtensionIconSet* indicator_icon =
+      SystemIndicatorHandler::GetSystemIndicatorIcon(*extension);
+  if (!indicator_icon)
+    return;
+
+  auto& indicator = system_indicators_[extension->id()];
+  indicator.manifest_icon_set = *indicator_icon;
+}
+
 void SystemIndicatorManager::OnExtensionUnloaded(
     content::BrowserContext* browser_context,
     const Extension* extension,
     UnloadedExtensionReason reason) {
-  RemoveIndicator(extension->id());
-}
-
-void SystemIndicatorManager::OnExtensionActionUpdated(
-    ExtensionAction* extension_action,
-    content::WebContents* web_contents,
-    content::BrowserContext* browser_context) {
   DCHECK(thread_checker_.CalledOnValidThread());
-  if (profile_->GetOriginalProfile() != browser_context ||
-      extension_action->action_type() != ActionInfo::TYPE_SYSTEM_INDICATOR)
-    return;
-
-  std::string extension_id = extension_action->extension_id();
-  if (extension_action->GetIsVisible(ExtensionAction::kDefaultTabId)) {
-    CreateOrUpdateIndicator(
-        ExtensionRegistry::Get(profile_)->enabled_extensions().GetByID(
-            extension_id),
-        extension_action);
-  } else {
-    RemoveIndicator(extension_id);
-  }
+  system_indicators_.erase(extension->id());
 }
 
 bool SystemIndicatorManager::SendClickEventToExtensionForTest(
-    const std::string& extension_id) {
+    const ExtensionId& extension_id) {
+  DCHECK(thread_checker_.CalledOnValidThread());
   auto it = system_indicators_.find(extension_id);
 
-  if (it == system_indicators_.end())
+  if (it == system_indicators_.end() ||
+      it->second.system_tray_indicator == nullptr) {
     return false;
-
-  it->second->OnStatusIconClicked();
-  return true;
-}
-
-void SystemIndicatorManager::CreateOrUpdateIndicator(
-    const Extension* extension,
-    ExtensionAction* extension_action) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  auto it = system_indicators_.find(extension->id());
-  if (it != system_indicators_.end()) {
-    it->second->OnIconUpdated();
-    return;
   }
 
-  std::unique_ptr<ExtensionIndicatorIcon> extension_icon =
-      ExtensionIndicatorIcon::Create(extension, extension_action, profile_,
-                                     status_tray_);
-  if (extension_icon)
-    system_indicators_[extension->id()] = std::move(extension_icon);
-}
-
-void SystemIndicatorManager::RemoveIndicator(const std::string& extension_id) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  system_indicators_.erase(extension_id);
+  it->second.system_tray_indicator->OnStatusIconClicked();
+  return true;
 }
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/system_indicator/system_indicator_manager.h b/chrome/browser/extensions/api/system_indicator/system_indicator_manager.h
index a16d5f37f..35cefbe 100644
--- a/chrome/browser/extensions/api/system_indicator/system_indicator_manager.h
+++ b/chrome/browser/extensions/api/system_indicator/system_indicator_manager.h
@@ -12,12 +12,12 @@
 #include "base/macros.h"
 #include "base/scoped_observer.h"
 #include "base/threading/thread_checker.h"
-#include "chrome/browser/extensions/api/extension_action/extension_action_api.h"
-#include "chrome/browser/extensions/extension_action_icon_factory.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "extensions/browser/extension_registry_observer.h"
+#include "extensions/common/extension_icon_set.h"
+#include "extensions/common/extension_id.h"
+#include "ui/gfx/image/image.h"
 
-class ExtensionAction;
 class Profile;
 class StatusTray;
 
@@ -31,54 +31,60 @@
 // that are currently visible in the UI.  Use SystemIndicatorManagerFactory to
 // create a SystemIndicatorManager object.
 class SystemIndicatorManager : public ExtensionRegistryObserver,
-                               public ExtensionActionAPI::Observer,
                                public KeyedService {
  public:
   SystemIndicatorManager(Profile* profile, StatusTray* status_tray);
   ~SystemIndicatorManager() override;
 
+  // Sets the icon of the system indicator for the given |extension| to
+  // |icon|.
+  void SetSystemIndicatorDynamicIcon(const Extension& extension,
+                                     gfx::Image icon);
+
+  // Sets whether the system indicator for the given |extension| is enabled.
+  void SetSystemIndicatorEnabled(const Extension& extension, bool is_enabled);
+
   // KeyedService implementation.
   void Shutdown() override;
 
  private:
   FRIEND_TEST_ALL_PREFIXES(SystemIndicatorApiTest, SystemIndicator);
 
-  // ExtensionRegistryObserver implementation.
+  // A structure representing the system indicator for an extension.
+  struct SystemIndicator {
+    SystemIndicator();
+    ~SystemIndicator();
+
+    // A dynamically-set icon (through systemIndicator.setIcon()). Takes
+    // precedence over the |default_icon|.
+    gfx::Image dynamic_icon;
+    // The default system indicator icon specified in the manifest.
+    ExtensionIconSet manifest_icon_set;
+    // The system tray indicator. This is only non-null if the system indicator
+    // is enabled.
+    std::unique_ptr<ExtensionIndicatorIcon> system_tray_indicator;
+
+    DISALLOW_COPY_AND_ASSIGN(SystemIndicator);
+  };
+
+  // ExtensionRegistryObserver:
+  void OnExtensionLoaded(content::BrowserContext* browser_context,
+                         const Extension* extension) override;
   void OnExtensionUnloaded(content::BrowserContext* browser_context,
                            const Extension* extension,
                            UnloadedExtensionReason reason) override;
 
-  // ExtensionActionAPI::Observer implementation.
-  void OnExtensionActionUpdated(
-      ExtensionAction* extension_action,
-      content::WebContents* web_contents,
-      content::BrowserContext* browser_context) override;
-
   // Causes a call to OnStatusIconClicked for the specified extension_id.
   // Returns false if no ExtensionIndicatorIcon is found for the extension.
   bool SendClickEventToExtensionForTest(const std::string& extension_id);
 
-  // Causes an indicator to be shown for the given extension_action.  Creates
-  // the indicator if necessary.
-  void CreateOrUpdateIndicator(
-      const Extension* extension,
-      ExtensionAction* extension_action);
-
-  // Causes the indicator for the given extension to be hidden.
-  void RemoveIndicator(const std::string& extension_id);
-
-  using SystemIndicatorMap =
-      std::map<const std::string, std::unique_ptr<ExtensionIndicatorIcon>>;
+  using SystemIndicatorMap = std::map<ExtensionId, SystemIndicator>;
 
   Profile* profile_;
   StatusTray* status_tray_;
   SystemIndicatorMap system_indicators_;
   base::ThreadChecker thread_checker_;
 
-  ScopedObserver<ExtensionActionAPI, ExtensionActionAPI::Observer>
-      extension_action_observer_;
-
-  // Listen to extension unloaded notifications.
   ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
       extension_registry_observer_;
 
diff --git a/chrome/browser/extensions/api/system_indicator/system_indicator_manager_factory.cc b/chrome/browser/extensions/api/system_indicator/system_indicator_manager_factory.cc
index 8aef0625..f28a58d 100644
--- a/chrome/browser/extensions/api/system_indicator/system_indicator_manager_factory.cc
+++ b/chrome/browser/extensions/api/system_indicator/system_indicator_manager_factory.cc
@@ -5,7 +5,6 @@
 #include "chrome/browser/extensions/api/system_indicator/system_indicator_manager_factory.h"
 
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/extensions/api/extension_action/extension_action_api.h"
 #include "chrome/browser/extensions/api/system_indicator/system_indicator_manager.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
@@ -15,10 +14,10 @@
 namespace extensions {
 
 // static
-SystemIndicatorManager* SystemIndicatorManagerFactory::GetForProfile(
-    Profile* profile) {
+SystemIndicatorManager* SystemIndicatorManagerFactory::GetForContext(
+    content::BrowserContext* context) {
   return static_cast<SystemIndicatorManager*>(
-      GetInstance()->GetServiceForBrowserContext(profile, true));
+      GetInstance()->GetServiceForBrowserContext(context, true));
 }
 
 // static
@@ -31,7 +30,6 @@
         "SystemIndicatorManager",
         BrowserContextDependencyManager::GetInstance()) {
   DependsOn(ExtensionsBrowserClient::Get()->GetExtensionSystemFactory());
-  DependsOn(ExtensionActionAPI::GetFactoryInstance());
 }
 
 SystemIndicatorManagerFactory::~SystemIndicatorManagerFactory() {}
@@ -46,4 +44,11 @@
                                     status_tray);
 }
 
+bool SystemIndicatorManagerFactory::ServiceIsCreatedWithBrowserContext() const {
+  // The SystemIndicatorManager monitors extensions being loaded and unloaded
+  // to check if they have system indicators specified. In order to observe
+  // these, it needs to be created at profile initialization.
+  return true;
+}
+
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/system_indicator/system_indicator_manager_factory.h b/chrome/browser/extensions/api/system_indicator/system_indicator_manager_factory.h
index 3e4e91b3..a2038318 100644
--- a/chrome/browser/extensions/api/system_indicator/system_indicator_manager_factory.h
+++ b/chrome/browser/extensions/api/system_indicator/system_indicator_manager_factory.h
@@ -8,7 +8,9 @@
 #include "base/memory/singleton.h"
 #include "components/keyed_service/content/browser_context_keyed_service_factory.h"
 
-class Profile;
+namespace content {
+class BrowserContext;
+}
 
 namespace extensions {
 class SystemIndicatorManager;
@@ -16,7 +18,8 @@
 // BrowserContextKeyedServiceFactory for each SystemIndicatorManager.
 class SystemIndicatorManagerFactory : public BrowserContextKeyedServiceFactory {
  public:
-  static SystemIndicatorManager* GetForProfile(Profile* profile);
+  static SystemIndicatorManager* GetForContext(
+      content::BrowserContext* context);
 
   static SystemIndicatorManagerFactory* GetInstance();
 
@@ -28,7 +31,8 @@
 
   // BrowserContextKeyedServiceFactory implementation.
   KeyedService* BuildServiceInstanceFor(
-      content::BrowserContext* profile) const override;
+      content::BrowserContext* context) const override;
+  bool ServiceIsCreatedWithBrowserContext() const override;
 };
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/browser_context_keyed_service_factories.cc b/chrome/browser/extensions/browser_context_keyed_service_factories.cc
index 966d4347..1004dec 100644
--- a/chrome/browser/extensions/browser_context_keyed_service_factories.cc
+++ b/chrome/browser/extensions/browser_context_keyed_service_factories.cc
@@ -28,6 +28,7 @@
 #include "chrome/browser/extensions/api/settings_overrides/settings_overrides_api.h"
 #include "chrome/browser/extensions/api/settings_private/settings_private_event_router_factory.h"
 #include "chrome/browser/extensions/api/signed_in_devices/signed_in_devices_manager.h"
+#include "chrome/browser/extensions/api/system_indicator/system_indicator_manager_factory.h"
 #include "chrome/browser/extensions/api/tab_capture/tab_capture_registry.h"
 #include "chrome/browser/extensions/api/tabs/tabs_windows_api.h"
 #include "chrome/browser/extensions/api/web_navigation/web_navigation_api.h"
@@ -118,6 +119,7 @@
 #if BUILDFLAG(ENABLE_SPELLCHECK)
   extensions::SpellcheckAPI::GetFactoryInstance();
 #endif
+  extensions::SystemIndicatorManagerFactory::GetInstance();
   extensions::TabCaptureRegistry::GetFactoryInstance();
   extensions::TabsWindowsAPI::GetFactoryInstance();
   extensions::TtsAPI::GetFactoryInstance();
diff --git a/chrome/browser/extensions/extension_action_manager.cc b/chrome/browser/extensions/extension_action_manager.cc
index 79cf9eb..49843c9 100644
--- a/chrome/browser/extensions/extension_action_manager.cc
+++ b/chrome/browser/extensions/extension_action_manager.cc
@@ -4,10 +4,11 @@
 
 #include "chrome/browser/extensions/extension_action_manager.h"
 
-#include "chrome/browser/extensions/api/system_indicator/system_indicator_manager_factory.h"
+#include "base/memory/singleton.h"
 #include "chrome/browser/extensions/extension_action.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
+#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
 #include "extensions/browser/extension_icon_image.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/extension_system.h"
@@ -81,7 +82,6 @@
     UnloadedExtensionReason reason) {
   page_actions_.erase(extension->id());
   browser_actions_.erase(extension->id());
-  system_indicators_.erase(extension->id());
 }
 
 namespace {
@@ -142,21 +142,6 @@
                            profile_);
 }
 
-ExtensionAction* ExtensionActionManager::GetSystemIndicator(
-    const Extension& extension) const {
-  // If it does not already exist, create the SystemIndicatorManager for the
-  // given profile.  This could return NULL if the system indicator area is
-  // unavailable on the current system.  If so, return NULL to signal that
-  // the system indicator area is unusable.
-  if (!SystemIndicatorManagerFactory::GetForProfile(profile_))
-    return nullptr;
-
-  return GetOrCreateOrNull(&system_indicators_, extension,
-                           ActionInfo::TYPE_SYSTEM_INDICATOR,
-                           ActionInfo::GetSystemIndicatorInfo(&extension),
-                           profile_);
-}
-
 ExtensionAction* ExtensionActionManager::GetExtensionAction(
     const Extension& extension) const {
   ExtensionAction* action = GetBrowserAction(extension);
diff --git a/chrome/browser/extensions/extension_action_manager.h b/chrome/browser/extensions/extension_action_manager.h
index 90096bc..ddc0105 100644
--- a/chrome/browser/extensions/extension_action_manager.h
+++ b/chrome/browser/extensions/extension_action_manager.h
@@ -40,13 +40,10 @@
   // unloaded.
   ExtensionAction* GetPageAction(const Extension& extension) const;
   ExtensionAction* GetBrowserAction(const Extension& extension) const;
-  ExtensionAction* GetSystemIndicator(const Extension& extension) const;
 
   // Returns either the PageAction or BrowserAction for |extension|, or NULL if
   // none exists. Since an extension can only declare one of Browser|PageAction,
   // this is okay to use anywhere you need a generic "ExtensionAction".
-  // Since SystemIndicators are used differently and don't follow this
-  // rule of mutual exclusion, they are not checked or returned.
   ExtensionAction* GetExtensionAction(const Extension& extension) const;
 
  private:
@@ -69,7 +66,6 @@
       std::map<std::string, std::unique_ptr<ExtensionAction>>;
   mutable ExtIdToActionMap page_actions_;
   mutable ExtIdToActionMap browser_actions_;
-  mutable ExtIdToActionMap system_indicators_;
 };
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/installed_loader.cc b/chrome/browser/extensions/installed_loader.cc
index 7edaeb46..3b9f478f 100644
--- a/chrome/browser/extensions/installed_loader.cc
+++ b/chrome/browser/extensions/installed_loader.cc
@@ -24,6 +24,7 @@
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/extensions/chrome_manifest_url_handlers.h"
+#include "chrome/common/extensions/manifest_handlers/settings_overrides_handler.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/common/url_constants.h"
@@ -353,6 +354,9 @@
   int disabled_for_permissions_count = 0;
   int non_webstore_ntp_override_count = 0;
   int ntp_override_count = 0;
+  int homepage_override_count = 0;
+  int search_engine_override_count = 0;
+  int startup_pages_override_count = 0;
   int incognito_allowed_count = 0;
   int incognito_not_allowed_count = 0;
   int file_access_allowed_count = 0;
@@ -437,6 +441,17 @@
       }
     }
 
+    // Histogram for extensions with settings overrides.
+    const SettingsOverrides* settings = SettingsOverrides::Get(extension);
+    if (settings) {
+      if (settings->search_engine)
+        ++search_engine_override_count;
+      if (!settings->startup_pages.empty())
+        ++startup_pages_override_count;
+      if (settings->homepage)
+        ++homepage_override_count;
+    }
+
     // Don't count unpacked extensions anymore, either.
     if (Manifest::IsUnpackedLocation(location))
       continue;
@@ -625,57 +640,63 @@
     }
   }
 
-  UMA_HISTOGRAM_COUNTS_100("Extensions.LoadApp",
-                           app_user_count + app_external_count);
-  UMA_HISTOGRAM_COUNTS_100("Extensions.LoadAppUser", app_user_count);
-  UMA_HISTOGRAM_COUNTS_100("Extensions.LoadAppExternal", app_external_count);
-  UMA_HISTOGRAM_COUNTS_100("Extensions.LoadHostedApp", hosted_app_count);
-  UMA_HISTOGRAM_COUNTS_100("Extensions.LoadPackagedApp",
-                           legacy_packaged_app_count);
-  UMA_HISTOGRAM_COUNTS_100("Extensions.LoadPlatformApp", platform_app_count);
-  UMA_HISTOGRAM_COUNTS_100("Extensions.LoadExtension",
-                           extension_user_count + extension_external_count);
-  UMA_HISTOGRAM_COUNTS_100("Extensions.LoadExtensionUser",
-                           extension_user_count);
-  UMA_HISTOGRAM_COUNTS_100("Extensions.LoadExtensionExternal",
-                           extension_external_count);
-  UMA_HISTOGRAM_COUNTS_100("Extensions.LoadUserScript", user_script_count);
-  UMA_HISTOGRAM_COUNTS_100("Extensions.LoadTheme", theme_count);
+  base::UmaHistogramCounts100("Extensions.LoadApp",
+                              app_user_count + app_external_count);
+  base::UmaHistogramCounts100("Extensions.LoadAppUser", app_user_count);
+  base::UmaHistogramCounts100("Extensions.LoadAppExternal", app_external_count);
+  base::UmaHistogramCounts100("Extensions.LoadHostedApp", hosted_app_count);
+  base::UmaHistogramCounts100("Extensions.LoadPackagedApp",
+                              legacy_packaged_app_count);
+  base::UmaHistogramCounts100("Extensions.LoadPlatformApp", platform_app_count);
+  base::UmaHistogramCounts100("Extensions.LoadExtension",
+                              extension_user_count + extension_external_count);
+  base::UmaHistogramCounts100("Extensions.LoadExtensionUser",
+                              extension_user_count);
+  base::UmaHistogramCounts100("Extensions.LoadExtensionExternal",
+                              extension_external_count);
+  base::UmaHistogramCounts100("Extensions.LoadUserScript", user_script_count);
+  base::UmaHistogramCounts100("Extensions.LoadTheme", theme_count);
   // Histogram name different for legacy reasons.
-  UMA_HISTOGRAM_COUNTS_100("PageActionController.ExtensionsWithPageActions",
-                           page_action_count);
-  UMA_HISTOGRAM_COUNTS_100("Extensions.LoadBrowserAction",
-                           browser_action_count);
-  UMA_HISTOGRAM_COUNTS_100("Extensions.LoadNoExtensionAction",
-                           no_action_count);
-  UMA_HISTOGRAM_COUNTS_100("Extensions.DisabledForPermissions",
-                           disabled_for_permissions_count);
+  base::UmaHistogramCounts100("PageActionController.ExtensionsWithPageActions",
+                              page_action_count);
+  base::UmaHistogramCounts100("Extensions.LoadBrowserAction",
+                              browser_action_count);
+  base::UmaHistogramCounts100("Extensions.LoadNoExtensionAction",
+                              no_action_count);
+  base::UmaHistogramCounts100("Extensions.DisabledForPermissions",
+                              disabled_for_permissions_count);
   // TODO(kelvinjiang): Remove this histogram if it's not used anymore.
-  UMA_HISTOGRAM_COUNTS_100("Extensions.NonWebStoreNewTabPageOverrides",
-                           non_webstore_ntp_override_count);
-  UMA_HISTOGRAM_COUNTS_100("Extensions.NewTabPageOverrides",
-                           ntp_override_count);
+  base::UmaHistogramCounts100("Extensions.NonWebStoreNewTabPageOverrides",
+                              non_webstore_ntp_override_count);
+  base::UmaHistogramCounts100("Extensions.NewTabPageOverrides",
+                              ntp_override_count);
+  base::UmaHistogramCounts100("Extensions.SearchEngineOverrides",
+                              search_engine_override_count);
+  base::UmaHistogramCounts100("Extensions.StartupPagesOverrides",
+                              startup_pages_override_count);
+  base::UmaHistogramCounts100("Extensions.HomepageOverrides",
+                              homepage_override_count);
   if (incognito_allowed_count + incognito_not_allowed_count > 0) {
-    UMA_HISTOGRAM_COUNTS_100("Extensions.IncognitoAllowed",
-                             incognito_allowed_count);
-    UMA_HISTOGRAM_COUNTS_100("Extensions.IncognitoNotAllowed",
-                             incognito_not_allowed_count);
+    base::UmaHistogramCounts100("Extensions.IncognitoAllowed",
+                                incognito_allowed_count);
+    base::UmaHistogramCounts100("Extensions.IncognitoNotAllowed",
+                                incognito_not_allowed_count);
   }
   if (file_access_allowed_count + file_access_not_allowed_count > 0) {
-    UMA_HISTOGRAM_COUNTS_100("Extensions.FileAccessAllowed",
-                             file_access_allowed_count);
-    UMA_HISTOGRAM_COUNTS_100("Extensions.FileAccessNotAllowed",
-                             file_access_not_allowed_count);
+    base::UmaHistogramCounts100("Extensions.FileAccessAllowed",
+                                file_access_allowed_count);
+    base::UmaHistogramCounts100("Extensions.FileAccessNotAllowed",
+                                file_access_not_allowed_count);
   }
-  UMA_HISTOGRAM_COUNTS_100("Extensions.CorruptExtensionTotalDisables",
-                           extension_prefs_->GetCorruptedDisableCount());
-  UMA_HISTOGRAM_COUNTS_100("Extensions.EventlessEventPages",
-                           eventless_event_pages_count);
-  UMA_HISTOGRAM_COUNTS_100("Extensions.LoadOffStoreItems",
-                           off_store_item_count);
-  UMA_HISTOGRAM_COUNTS_100("Extensions.WebRequestBlockingCount",
-                           web_request_blocking_count);
-  UMA_HISTOGRAM_COUNTS_100("Extensions.WebRequestCount", web_request_count);
+  base::UmaHistogramCounts100("Extensions.CorruptExtensionTotalDisables",
+                              extension_prefs_->GetCorruptedDisableCount());
+  base::UmaHistogramCounts100("Extensions.EventlessEventPages",
+                              eventless_event_pages_count);
+  base::UmaHistogramCounts100("Extensions.LoadOffStoreItems",
+                              off_store_item_count);
+  base::UmaHistogramCounts100("Extensions.WebRequestBlockingCount",
+                              web_request_blocking_count);
+  base::UmaHistogramCounts100("Extensions.WebRequestCount", web_request_count);
 }
 
 int InstalledLoader::GetCreationFlags(const ExtensionInfo* info) {
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index c19ce9b..7a2739ae 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -235,6 +235,11 @@
     "expiry_milestone": 74
   },
   {
+    "name": "autofill-prune-suggestions",
+    "owners": ["ftirelo", "tmartino"],
+    "expiry_milestone": 78
+  },
+  {
     "name": "autofill-no-local-save-on-unmask-success",
     "owners": [ "jsaul@google.com" ],
     // Currently unclear if this is launching independently with M75 or
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index e935e0f..badad4b 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -171,6 +171,10 @@
 const char kAutofillProfileServerValidationDescription[] =
     "Allows autofill to use server side validation";
 
+const char kAutofillPruneSuggestionsName[] = "Autofill Prune Suggestions";
+const char kAutofillPruneSuggestionsDescription[] =
+    "Further limits the number of suggestions in the Autofill dropdown.";
+
 const char kAutofillRejectCompanyBirthyearName[] =
     "Autofill Rejects Invalid Company Names";
 const char kAutofillRejectCompanyBirthyearDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 8450a5b7..6d9a075 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -126,6 +126,9 @@
 extern const char kAutofillRejectCompanyBirthyearName[];
 extern const char kAutofillRejectCompanyBirthyearDescription[];
 
+extern const char kAutofillPruneSuggestionsName[];
+extern const char kAutofillPruneSuggestionsDescription[];
+
 extern const char kAutofillRestrictUnownedFieldsToFormlessCheckoutName[];
 extern const char kAutofillRestrictUnownedFieldsToFormlessCheckoutDescription[];
 
diff --git a/chrome/browser/media/router/providers/cast/cast_activity_manager.cc b/chrome/browser/media/router/providers/cast/cast_activity_manager.cc
index bf86504..8322c7d 100644
--- a/chrome/browser/media/router/providers/cast/cast_activity_manager.cc
+++ b/chrome/browser/media/router/providers/cast/cast_activity_manager.cc
@@ -13,18 +13,7 @@
 #include "chrome/browser/media/router/data_decoder_util.h"
 #include "chrome/browser/media/router/providers/cast/cast_activity_record.h"
 #include "chrome/browser/media/router/providers/cast/cast_session_client.h"
-#include "chrome/browser/media/router/providers/cast/cast_session_tracker.h"
-#include "chrome/common/media_router/discovery/media_sink_internal.h"
-#include "chrome/common/media_router/discovery/media_sink_service_base.h"
-#include "chrome/common/media_router/media_route.h"
 #include "chrome/common/media_router/media_source_helper.h"
-#include "chrome/common/media_router/mojo/media_router.mojom.h"
-#include "chrome/common/media_router/providers/cast/cast_media_source.h"
-#include "chrome/common/media_router/route_request_result.h"
-#include "components/cast_channel/cast_message_handler.h"
-#include "components/cast_channel/cast_message_util.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "third_party/blink/public/mojom/presentation/presentation.mojom.h"
 #include "url/origin.h"
 
 using blink::mojom::PresentationConnectionCloseReason;
@@ -116,7 +105,8 @@
         existing_route_id,
         base::BindOnce(
             &CastActivityManager::LaunchSessionAfterTerminatingExisting,
-            GetWeakPtr(), existing_route_id, std::move(params)));
+            weak_ptr_factory_.GetWeakPtr(), existing_route_id,
+            std::move(params)));
   }
 }
 
@@ -144,7 +134,8 @@
   message_handler_->LaunchSession(
       sink.cast_data().cast_channel_id, app_id, launch_timeout,
       base::BindOnce(&CastActivityManager::HandleLaunchSessionResponse,
-                     GetWeakPtr(), route_id, sink, cast_source));
+                     weak_ptr_factory_.GetWeakPtr(), route_id, sink,
+                     cast_source));
 
   mojom::RoutePresentationConnectionPtr presentation_connection;
   const std::string& client_id = cast_source.client_id();
@@ -499,6 +490,14 @@
   }
 }
 
+cast_channel::ResultCallback CastActivityManager::MakeResultCallbackForRoute(
+    const std::string& route_id,
+    mojom::MediaRouteProvider::TerminateRouteCallback callback) {
+  return base::BindOnce(&CastActivityManager::HandleStopSessionResponse,
+                        weak_ptr_factory_.GetWeakPtr(), route_id,
+                        std::move(callback));
+}
+
 void CastActivityManager::AddNonLocalActivityRecord(
     const MediaSinkInternal& sink,
     const CastSession& session) {
@@ -641,10 +640,6 @@
   media_router_->OnIssue(info);
 }
 
-base::WeakPtr<CastActivityManager> CastActivityManager::GetWeakPtr() {
-  return weak_ptr_factory_.GetWeakPtr();
-}
-
 CastActivityManager::DoLaunchSessionParams::DoLaunchSessionParams(
     const MediaRoute& route,
     const CastMediaSource& cast_source,
diff --git a/chrome/browser/media/router/providers/cast/cast_activity_manager.h b/chrome/browser/media/router/providers/cast/cast_activity_manager.h
index a42b6ca..8e885b2 100644
--- a/chrome/browser/media/router/providers/cast/cast_activity_manager.h
+++ b/chrome/browser/media/router/providers/cast/cast_activity_manager.h
@@ -10,7 +10,6 @@
 #include <vector>
 
 #include "base/containers/flat_map.h"
-#include "base/containers/flat_set.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/optional.h"
@@ -20,11 +19,7 @@
 #include "chrome/browser/media/router/providers/cast/cast_session_tracker.h"
 #include "chrome/common/media_router/mojo/media_router.mojom.h"
 #include "chrome/common/media_router/providers/cast/cast_media_source.h"
-#include "chrome/common/media_router/route_request_result.h"
-#include "components/cast_channel/cast_message_handler.h"
-#include "components/cast_channel/cast_message_util.h"
 #include "mojo/public/cpp/bindings/binding.h"
-#include "third_party/blink/public/mojom/presentation/presentation.mojom.h"
 #include "url/origin.h"
 
 namespace cast_channel {
@@ -38,9 +33,19 @@
 class DataDecoder;
 class MediaSinkServiceBase;
 
+// Base class for CastActivityManager including only functionality needed by
+// CastActivityRecord.
+class CastActivityManagerBase {
+ public:
+  virtual cast_channel::ResultCallback MakeResultCallbackForRoute(
+      const std::string& route_id,
+      mojom::MediaRouteProvider::TerminateRouteCallback callback) = 0;
+};
+
 // Handles launching and terminating Cast application on a Cast receiver, and
 // acts as the source of truth for Cast activities and MediaRoutes.
-class CastActivityManager : public cast_channel::CastMessageHandler::Observer,
+class CastActivityManager : public CastActivityManagerBase,
+                            public cast_channel::CastMessageHandler::Observer,
                             public CastSessionTracker::Observer {
  public:
   // |media_sink_service|: Provides Cast MediaSinks.
@@ -103,9 +108,11 @@
                             const base::Value& media_status,
                             base::Optional<int> request_id) override;
 
- private:
-  friend class CastActivityRecord;
+  cast_channel::ResultCallback MakeResultCallbackForRoute(
+      const std::string& route_id,
+      mojom::MediaRouteProvider::TerminateRouteCallback callback) override;
 
+ private:
   using ActivityMap =
       base::flat_map<MediaRoute::Id, std::unique_ptr<CastActivityRecord>>;
 
@@ -199,8 +206,6 @@
   void SendFailedToCastIssue(const MediaSink::Id& sink_id,
                              const MediaRoute::Id& route_id);
 
-  base::WeakPtr<CastActivityManager> GetWeakPtr();
-
   // These methods return |activities_.end()| when nothing is found.
   ActivityMap::iterator FindActivityByChannelId(int channel_id);
   ActivityMap::iterator FindActivityBySink(const MediaSinkInternal& sink);
diff --git a/chrome/browser/media/router/providers/cast/cast_activity_manager_unittest.cc b/chrome/browser/media/router/providers/cast/cast_activity_manager_unittest.cc
index 688bf31..a9810dd 100644
--- a/chrome/browser/media/router/providers/cast/cast_activity_manager_unittest.cc
+++ b/chrome/browser/media/router/providers/cast/cast_activity_manager_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/media/router/providers/cast/cast_activity_manager.h"
 
+#include <memory>
 #include <tuple>
 #include <utility>
 
@@ -12,16 +13,13 @@
 #include "base/task/post_task.h"
 #include "base/test/values_test_util.h"
 #include "chrome/browser/media/router/data_decoder_util.h"
-#include "chrome/browser/media/router/providers/common/buffered_message_sender.h"
 #include "chrome/browser/media/router/test/mock_mojo_media_router.h"
 #include "chrome/browser/media/router/test/test_helper.h"
 #include "chrome/common/media_router/test/test_helper.h"
 #include "components/cast_channel/cast_test_util.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/test/test_browser_thread_bundle.h"
-#include "services/data_decoder/data_decoder_service.h"
 #include "services/data_decoder/public/cpp/testing_json_parser.h"
-#include "services/data_decoder/public/mojom/constants.mojom.h"
 #include "services/service_manager/public/cpp/test/test_connector_factory.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -29,9 +27,7 @@
 using base::test::IsJson;
 using base::test::ParseJsonDeprecated;
 using testing::_;
-using testing::AnyNumber;
 using testing::IsEmpty;
-using testing::Not;
 using testing::Return;
 using testing::WithArg;
 
@@ -116,9 +112,7 @@
     : public testing::TestWithParam<std::pair<bool, const char*>> {
  public:
   CastActivityManagerTest()
-      : data_decoder_service_(connector_factory_.RegisterInstance(
-            data_decoder::mojom::kServiceName)),
-        socket_service_(base::CreateSingleThreadTaskRunnerWithTraits(
+      : socket_service_(base::CreateSingleThreadTaskRunnerWithTraits(
             {content::BrowserThread::UI})),
         message_handler_(&socket_service_) {
     media_sink_service_.AddOrUpdateSink(sink_);
@@ -131,11 +125,11 @@
     router_binding_ = std::make_unique<mojo::Binding<mojom::MediaRouter>>(
         &mock_router_, mojo::MakeRequest(&router_ptr_));
 
-    delete session_tracker_;
-    session_tracker_ = new CastSessionTracker(
-        &media_sink_service_, &message_handler_, socket_service_.task_runner());
+    session_tracker_.reset(
+        new CastSessionTracker(&media_sink_service_, &message_handler_,
+                               socket_service_.task_runner()));
     manager_ = std::make_unique<CastActivityManager>(
-        &media_sink_service_, session_tracker_, &message_handler_,
+        &media_sink_service_, session_tracker_.get(), &message_handler_,
         router_ptr_.get(),
         std::make_unique<DataDecoder>(connector_factory_.GetDefaultConnector()),
         "hash-token");
@@ -333,7 +327,6 @@
   content::TestBrowserThreadBundle thread_bundle_;
   data_decoder::TestingJsonParser::ScopedFactoryOverride parser_override_;
   service_manager::TestConnectorFactory connector_factory_;
-  data_decoder::DataDecoderService data_decoder_service_;
 
   MockMojoMediaRouter mock_router_;
   mojom::MediaRouterPtr router_ptr_;
@@ -352,9 +345,7 @@
   MockCastAppDiscoveryService app_discovery_service_;
   std::unique_ptr<CastActivityManager> manager_;
 
-  // We mus use a raw pointer instead of a smart pointer because
-  // CastSessionTracker's constructor and destructor are private.
-  CastSessionTracker* session_tracker_ = nullptr;
+  std::unique_ptr<CastSessionTracker> session_tracker_;
 
   const url::Origin origin_ = url::Origin::Create(GURL(kOrigin));
 };
diff --git a/chrome/browser/media/router/providers/cast/cast_activity_record.cc b/chrome/browser/media/router/providers/cast/cast_activity_record.cc
index 328b247..ef45f61 100644
--- a/chrome/browser/media/router/providers/cast/cast_activity_record.cc
+++ b/chrome/browser/media/router/providers/cast/cast_activity_record.cc
@@ -25,9 +25,15 @@
     const url::Origin& origin,
     int tab_id) {
   const std::string& client_id = source.client_id();
-  auto client = std::make_unique<CastSessionClient>(client_id, origin, tab_id,
-                                                    source.auto_join_policy(),
-                                                    data_decoder_, this);
+  DCHECK(!base::ContainsKey(connected_clients_, client_id));
+  std::unique_ptr<CastSessionClientBase> client;
+  if (client_factory_) {
+    client = client_factory_->MakeClient(client_id, origin, tab_id);
+  } else {
+    client = std::make_unique<CastSessionClient>(client_id, origin, tab_id,
+                                                 source.auto_join_policy(),
+                                                 data_decoder_, this);
+  }
   auto presentation_connection = client->Init();
   connected_clients_.emplace(client_id, std::move(client));
 
@@ -63,12 +69,12 @@
 
 cast_channel::Result CastActivityRecord::SendAppMessageToReceiver(
     const CastInternalMessage& cast_message) {
-  CastSessionClient* client = GetClient(cast_message.client_id);
+  CastSessionClientBase* client = GetClient(cast_message.client_id());
   const CastSession* session = GetSession();
   if (!session) {
-    if (client && cast_message.sequence_number) {
+    if (client && cast_message.sequence_number()) {
       client->SendErrorCodeToClient(
-          *cast_message.sequence_number,
+          *cast_message.sequence_number(),
           CastInternalMessage::ErrorCode::kSessionError,
           "Invalid session ID: " + session_id_.value_or("<missing>"));
     }
@@ -78,9 +84,9 @@
   const std::string& message_namespace = cast_message.app_message_namespace();
   if (!base::ContainsKey(session->message_namespaces(), message_namespace)) {
     DLOG(ERROR) << "Disallowed message namespace: " << message_namespace;
-    if (client && cast_message.sequence_number) {
+    if (client && cast_message.sequence_number()) {
       client->SendErrorCodeToClient(
-          *cast_message.sequence_number,
+          *cast_message.sequence_number(),
           CastInternalMessage::ErrorCode::kInvalidParameter,
           "Invalid namespace: " + message_namespace);
     }
@@ -90,7 +96,7 @@
       GetCastChannelId(),
       cast_channel::CreateCastMessage(
           message_namespace, cast_message.app_message_body(),
-          cast_message.client_id, session->transport_id()));
+          cast_message.client_id(), session->transport_id()));
 }
 
 base::Optional<int> CastActivityRecord::SendMediaRequestToReceiver(
@@ -100,7 +106,7 @@
     return base::nullopt;
   return message_handler_->SendMediaRequest(
       GetCastChannelId(), cast_message.v2_message_body(),
-      cast_message.client_id, session->transport_id());
+      cast_message.client_id(), session->transport_id());
 }
 
 void CastActivityRecord::SendSetVolumeRequestToReceiver(
@@ -108,7 +114,7 @@
     cast_channel::ResultCallback callback) {
   message_handler_->SendSetVolumeRequest(
       GetCastChannelId(), cast_message.v2_message_body(),
-      cast_message.client_id, std::move(callback));
+      cast_message.client_id(), std::move(callback));
 }
 
 void CastActivityRecord::SendStopSessionMessageToReceiver(
@@ -121,15 +127,14 @@
 
   message_handler_->StopSession(
       sink->cast_data().cast_channel_id, *session_id_, client_id,
-      base::BindOnce(&CastActivityManager::HandleStopSessionResponse,
-                     activity_manager_->GetWeakPtr(), route_.media_route_id(),
-                     std::move(callback)));
+      activity_manager_->MakeResultCallbackForRoute(route_.media_route_id(),
+                                                    std::move(callback)));
 }
 
 void CastActivityRecord::HandleLeaveSession(const std::string& client_id) {
   auto client_it = connected_clients_.find(client_id);
   CHECK(client_it != connected_clients_.end());
-  CastSessionClient& client = *client_it->second;
+  auto& client = *client_it->second;
   std::vector<std::string> leaving_client_ids;
   for (const auto& pair : connected_clients_) {
     if (pair.second->MatchesAutoJoinPolicy(client.origin(), client.tab_id()))
@@ -175,7 +180,7 @@
     cast_channel::CastMessageHandler* message_handler,
     CastSessionTracker* session_tracker,
     DataDecoder* data_decoder,
-    CastActivityManager* owner)
+    CastActivityManagerBase* owner)
     : route_(route),
       app_id_(app_id),
       media_sink_service_(media_sink_service),
@@ -206,4 +211,6 @@
   return sink->cast_data().cast_channel_id;
 }
 
+CastSessionClientFactory* CastActivityRecord::client_factory_ = nullptr;
+
 }  // namespace media_router
diff --git a/chrome/browser/media/router/providers/cast/cast_activity_record.h b/chrome/browser/media/router/providers/cast/cast_activity_record.h
index a06d359..0b0f7f9 100644
--- a/chrome/browser/media/router/providers/cast/cast_activity_record.h
+++ b/chrome/browser/media/router/providers/cast/cast_activity_record.h
@@ -18,10 +18,12 @@
 
 namespace media_router {
 
-class CastActivityManager;
-struct CastInternalMessage;
+class CastActivityManagerBase;
+class CastActivityRecord;
+class CastSessionClientFactory;
+class CastInternalMessage;
 class CastSession;
-class CastSessionClient;
+class CastSessionClientBase;
 class CastSessionTracker;
 class DataDecoder;
 class MediaSinkServiceBase;
@@ -38,7 +40,7 @@
 
   const MediaRoute& route() const { return route_; }
   const std::string& app_id() const { return app_id_; }
-  const base::flat_map<std::string, std::unique_ptr<CastSessionClient>>&
+  const base::flat_map<std::string, std::unique_ptr<CastSessionClientBase>>&
   connected_clients() const {
     return connected_clients_;
   }
@@ -101,9 +103,14 @@
       blink::mojom::PresentationConnectionCloseReason close_reason);
   void TerminatePresentationConnections();
 
+  static void SetClientFactoryForTest(CastSessionClientFactory* factory) {
+    client_factory_ = factory;
+  }
+
  private:
   friend class CastSessionClient;
   friend class CastActivityManager;
+  friend class CastActivityRecordTest;
 
   // Creates a new record owned by |owner|.
   CastActivityRecord(const MediaRoute& route,
@@ -112,19 +119,21 @@
                      cast_channel::CastMessageHandler* message_handler,
                      CastSessionTracker* session_tracker,
                      DataDecoder* data_decoder,
-                     CastActivityManager* owner);
+                     CastActivityManagerBase* owner);
 
   CastSession* GetSession();
   int GetCastChannelId();
 
-  CastSessionClient* GetClient(const std::string& client_id) {
+  CastSessionClientBase* GetClient(const std::string& client_id) {
     auto it = connected_clients_.find(client_id);
     return it == connected_clients_.end() ? nullptr : it->second.get();
   }
 
+  static CastSessionClientFactory* client_factory_;
+
   MediaRoute route_;
   const std::string app_id_;
-  base::flat_map<std::string, std::unique_ptr<CastSessionClient>>
+  base::flat_map<std::string, std::unique_ptr<CastSessionClientBase>>
       connected_clients_;
 
   // Set by CastActivityManager after the session is launched successfully.
@@ -137,7 +146,7 @@
   cast_channel::CastMessageHandler* const message_handler_;
   CastSessionTracker* const session_tracker_;
   DataDecoder* const data_decoder_;
-  CastActivityManager* const activity_manager_;
+  CastActivityManagerBase* const activity_manager_;
 
   DISALLOW_COPY_AND_ASSIGN(CastActivityRecord);
 };
diff --git a/chrome/browser/media/router/providers/cast/cast_activity_record_unittest.cc b/chrome/browser/media/router/providers/cast/cast_activity_record_unittest.cc
new file mode 100644
index 0000000..ee3efb9
--- /dev/null
+++ b/chrome/browser/media/router/providers/cast/cast_activity_record_unittest.cc
@@ -0,0 +1,431 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/media/router/providers/cast/cast_activity_record.h"
+
+#include <memory>
+#include <sstream>
+#include <string>
+#include <tuple>
+#include <utility>
+#include <vector>
+
+#include "base/bind.h"
+#include "base/optional.h"
+#include "base/run_loop.h"
+#include "base/task/post_task.h"
+#include "base/test/bind_test_util.h"
+#include "base/test/mock_callback.h"
+#include "base/test/values_test_util.h"
+#include "base/values.h"
+#include "chrome/browser/media/router/data_decoder_util.h"
+#include "chrome/browser/media/router/providers/cast/cast_activity_manager.h"
+#include "chrome/browser/media/router/providers/cast/cast_session_client.h"
+#include "chrome/browser/media/router/test/test_helper.h"
+#include "chrome/common/media_router/test/test_helper.h"
+#include "components/cast_channel/cast_test_util.h"
+#include "content/public/browser/browser_task_traits.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+#include "services/service_manager/public/cpp/test/test_connector_factory.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using base::test::IsJson;
+using base::test::ParseJson;
+using blink::mojom::PresentationConnectionCloseReason;
+using blink::mojom::PresentationConnectionMessage;
+using blink::mojom::PresentationConnectionMessagePtr;
+using testing::_;
+using testing::Pair;
+using testing::Return;
+using testing::UnorderedElementsAre;
+using testing::WithArg;
+using testing::WithArgs;
+
+namespace media_router {
+
+namespace {
+
+constexpr int kChannelId = 42;
+constexpr char kAppId[] = "theAppId";
+constexpr char kRouteId[] = "theRouteId";
+constexpr char kSinkId[] = "cast:<id42>";
+
+class MockCastSessionClient : public CastSessionClientBase {
+ public:
+  using CastSessionClientBase::CastSessionClientBase;
+
+  MOCK_METHOD0(Init, mojom::RoutePresentationConnectionPtr());
+  MOCK_METHOD1(SendMessageToClient,
+               void(blink::mojom::PresentationConnectionMessagePtr message));
+  MOCK_METHOD2(SendMediaStatusToClient,
+               void(const base::Value& media_status,
+                    base::Optional<int> request_id));
+  MOCK_METHOD1(
+      CloseConnection,
+      void(blink::mojom::PresentationConnectionCloseReason close_reason));
+  MOCK_METHOD0(TerminateConnection, void());
+  MOCK_CONST_METHOD2(MatchesAutoJoinPolicy,
+                     bool(url::Origin origin, int tab_id));
+  MOCK_METHOD3(SendErrorCodeToClient,
+               void(int sequence_number,
+                    CastInternalMessage::ErrorCode error_code,
+                    base::Optional<std::string> description));
+  MOCK_METHOD2(SendErrorToClient, void(int sequence_number, base::Value error));
+  MOCK_METHOD1(OnMessage,
+               void(blink::mojom::PresentationConnectionMessagePtr message));
+  MOCK_METHOD1(DidChangeState,
+               void(blink::mojom::PresentationConnectionState state));
+  MOCK_METHOD1(DidClose,
+               void(blink::mojom::PresentationConnectionCloseReason reason));
+};
+
+using NewClientCallback = base::RepeatingCallback<void(MockCastSessionClient&)>;
+
+class MockCastActivityManager : public CastActivityManagerBase {
+ public:
+  MOCK_METHOD2(MakeResultCallbackForRoute,
+               cast_channel::ResultCallback(
+                   const std::string& route_id,
+                   mojom::MediaRouteProvider::TerminateRouteCallback callback));
+};
+
+}  // namespace
+
+class CastActivityRecordTest : public testing::Test, CastSessionClientFactory {
+ public:
+  CastActivityRecordTest() {}
+
+  ~CastActivityRecordTest() override = default;
+
+  void SetUp() override {
+    media_sink_service_.AddOrUpdateSink(sink_);
+    ASSERT_EQ(kSinkId, sink_.id());
+
+    CastActivityRecord::SetClientFactoryForTest(this);
+
+    session_tracker_.reset(
+        new CastSessionTracker(&media_sink_service_, &message_handler_,
+                               socket_service_.task_runner()));
+
+    MediaRoute route;
+    route.set_media_route_id(kRouteId);
+    route.set_media_sink_id(kSinkId);
+    record_.reset(new CastActivityRecord(
+        route, kAppId, &media_sink_service_, &message_handler_,
+        session_tracker_.get(), data_decoder_.get(), &manager_));
+
+    std::unique_ptr<CastSession> session =
+        CastSession::From(sink_, ParseJson(R"({
+        "applications": [{
+          "appId": "theAppId",
+          "displayName": "App display name",
+          "namespaces": [
+            {"name": "urn:x-cast:com.google.cast.media"},
+            {"name": "urn:x-cast:com.google.foo"}
+          ],
+          "sessionId": "theSessionId",
+          "statusText": "theStatusText",
+          "transportId": "theTransportId"
+        }]
+      })"));
+    ASSERT_EQ("theSessionId", session->session_id());
+    session_ = session.get();
+    session_tracker_->SetSessionForTest(kSinkId, std::move(session));
+  }
+
+  void TearDown() override {
+    RunUntilIdle();
+    CastActivityRecord::SetClientFactoryForTest(nullptr);
+  }
+
+  std::unique_ptr<CastSessionClientBase> MakeClient(
+      const std::string& client_id,
+      const url::Origin& origin,
+      int tab_id) override {
+    auto client =
+        std::make_unique<MockCastSessionClient>(client_id, origin, tab_id);
+    clients_.push_back(client.get());
+    return std::move(client);
+  }
+
+ protected:
+  void SetUpSession() { record_->SetOrUpdateSession(*session_, sink_, ""); }
+
+  // Run any pending events and verify expectations associated with them.
+  void RunUntilIdle() {
+    thread_bundle_.RunUntilIdle();
+    testing::Mock::VerifyAndClearExpectations(&socket_service_);
+    testing::Mock::VerifyAndClearExpectations(&message_handler_);
+    testing::Mock::VerifyAndClearExpectations(&manager_);
+  }
+
+  MediaRoute& route() { return record_->route_; }
+
+  MockCastSessionClient* AddMockClient(const std::string& client_id) {
+    CastMediaSource source("dummySourceId", std::vector<CastAppInfo>());
+    source.set_client_id(client_id);
+    record_->AddClient(source, url::Origin(), tab_id_counter_++);
+    return clients_.back();
+  }
+
+  int tab_id_counter_ = 239;  // Arbitrary number.
+  std::vector<MockCastSessionClient*> clients_;
+
+  // TODO(crbug.com/954797): Factor out members also present in
+  // CastActivityManagerTest.
+  content::TestBrowserThreadBundle thread_bundle_;
+  MediaSinkInternal sink_ = CreateCastSink(kChannelId);
+  service_manager::TestConnectorFactory connector_factory_;
+  cast_channel::MockCastSocketService socket_service_{
+      base::CreateSingleThreadTaskRunnerWithTraits(
+          {content::BrowserThread::UI})};
+  cast_channel::MockCastMessageHandler message_handler_{&socket_service_};
+  std::unique_ptr<DataDecoder> data_decoder_ =
+      std::make_unique<DataDecoder>(connector_factory_.GetDefaultConnector());
+  TestMediaSinkService media_sink_service_;
+  std::unique_ptr<CastSessionTracker> session_tracker_;
+  MockCastActivityManager manager_;
+  CastSession* session_ = nullptr;
+  std::unique_ptr<CastActivityRecord> record_;
+};
+
+TEST_F(CastActivityRecordTest, SendAppMessageToReceiver) {
+  // TODO(crbug.com/954797): Test case where there is no session.
+  // TODO(crbug.com/954797): Test case where message has invalid namespace.
+
+  EXPECT_CALL(message_handler_, SendAppMessage(kChannelId, _))
+      .WillOnce(Return(cast_channel::Result::kFailed))
+      .WillOnce(WithArg<1>([](const cast_channel::CastMessage& cast_message) {
+        EXPECT_EQ("theClientId", cast_message.source_id());
+        EXPECT_EQ("theTransportId", cast_message.destination_id());
+        EXPECT_EQ("urn:x-cast:com.google.foo", cast_message.namespace_());
+        EXPECT_TRUE(cast_message.has_payload_utf8());
+        EXPECT_THAT(cast_message.payload_utf8(), IsJson(R"({"foo": "bar"})"));
+        EXPECT_FALSE(cast_message.has_payload_binary());
+        return cast_channel::Result::kOk;
+      }));
+
+  std::unique_ptr<CastInternalMessage> message =
+      CastInternalMessage::From(ParseJson(R"({
+    "type": "app_message",
+    "clientId": "theClientId",
+    "sequenceNumber": 999,
+    "message": {
+      "namespaceName": "urn:x-cast:com.google.foo",
+      "sessionId": "theSessionId",
+      "message": { "foo": "bar" },
+    },
+  })"));
+
+  SetUpSession();
+  EXPECT_EQ(cast_channel::Result::kFailed,
+            record_->SendAppMessageToReceiver(*message));
+  EXPECT_EQ(cast_channel::Result::kOk,
+            record_->SendAppMessageToReceiver(*message));
+}
+
+TEST_F(CastActivityRecordTest, SendMediaRequestToReceiver) {
+  // TODO(crbug.com/954797): Test case where there is no session.
+
+  const base::Optional<int> request_id = 1234;
+
+  EXPECT_CALL(
+      message_handler_,
+      SendMediaRequest(
+          kChannelId,
+          IsJson(
+              R"({"sessionId": "theSessionId", "type": "theV2MessageType"})"),
+          "theClientId", "theTransportId"))
+      .WillOnce(Return(base::nullopt))
+      .WillOnce(Return(request_id));
+
+  std::unique_ptr<CastInternalMessage> message =
+      CastInternalMessage::From(ParseJson(R"({
+    "type": "v2_message",
+    "clientId": "theClientId",
+    "sequenceNumber": 999,
+    "message": {
+      "type": "theV2MessageType",
+      "sessionId": "theSessionId",
+    },
+  })"));
+
+  SetUpSession();
+  EXPECT_FALSE(record_->SendMediaRequestToReceiver(*message));
+  EXPECT_EQ(request_id, record_->SendMediaRequestToReceiver(*message));
+}
+
+TEST_F(CastActivityRecordTest, SendSetVolumeRequestToReceiver) {
+  // TODO(crbug.com/954797): Test case where no socket is found kChannelId.
+
+  EXPECT_CALL(
+      message_handler_,
+      SendSetVolumeRequest(
+          kChannelId,
+          IsJson(
+              R"({"sessionId": "theSessionId", "type": "theV2MessageType"})"),
+          "theClientId", _))
+      .WillOnce(WithArg<3>([](cast_channel::ResultCallback callback) {
+        std::move(callback).Run(cast_channel::Result::kOk);
+        return cast_channel::Result::kOk;
+      }));
+
+  base::MockCallback<cast_channel::ResultCallback> callback;
+  EXPECT_CALL(callback, Run(cast_channel::Result::kOk));
+
+  std::unique_ptr<CastInternalMessage> message =
+      CastInternalMessage::From(ParseJson(R"({
+    "type": "v2_message",
+    "clientId": "theClientId",
+    "sequenceNumber": 999,
+    "message": {
+      "type": "theV2MessageType",
+      "sessionId": "theSessionId",
+    },
+  })"));
+  record_->SendSetVolumeRequestToReceiver(*message, callback.Get());
+}
+
+TEST_F(CastActivityRecordTest, SendStopSessionMessageToReceiver) {
+  const base::Optional<std::string> client_id("theClientId");
+
+  EXPECT_CALL(message_handler_,
+              StopSession(kChannelId, "theSessionId", client_id, _))
+      .WillOnce(WithArg<3>([](cast_channel::ResultCallback callback) {
+        std::move(callback).Run(cast_channel::Result::kFailed);
+      }));
+
+  EXPECT_CALL(manager_, MakeResultCallbackForRoute(kRouteId, _))
+      .WillOnce(WithArg<1>(
+          [](mojom::MediaRouteProvider::TerminateRouteCallback callback) {
+            return base::BindOnce(
+                [](mojom::MediaRouteProvider::TerminateRouteCallback callback,
+                   cast_channel::Result result) {
+                  EXPECT_EQ(cast_channel::Result::kFailed, result);
+                  std::move(callback).Run(
+                      base::Optional<std::string>("theErrorText"),
+                      RouteRequestResult::INCOGNITO_MISMATCH);
+                },
+                std::move(callback));
+          }));
+
+  base::MockCallback<mojom::MediaRouteProvider::TerminateRouteCallback>
+      callback;
+  EXPECT_CALL(callback, Run(base::Optional<std::string>("theErrorText"),
+                            RouteRequestResult::INCOGNITO_MISMATCH));
+
+  SetUpSession();
+  record_->SendStopSessionMessageToReceiver(client_id, callback.Get());
+}
+
+TEST_F(CastActivityRecordTest, HandleLeaveSession) {
+  SetUpSession();
+  AddMockClient("theClientId");
+  AddMockClient("leaving");
+  AddMockClient("keeping");
+  for (auto* client : clients_) {
+    const bool is_leaving = client->client_id() == "leaving";
+    EXPECT_CALL(*client,
+                CloseConnection(PresentationConnectionCloseReason::CLOSED))
+        .Times(is_leaving ? 1 : 0);
+    EXPECT_CALL(*client, MatchesAutoJoinPolicy)
+        .WillRepeatedly(Return(is_leaving));
+  }
+  record_->HandleLeaveSession("theClientId");
+  EXPECT_THAT(record_->connected_clients(),
+              UnorderedElementsAre(Pair("theClientId", _), Pair("keeping", _)));
+}
+
+TEST_F(CastActivityRecordTest, SendMessageToClient) {
+  SetUpSession();
+
+  // An invalid client ID is ignored.
+  record_->SendMessageToClient("theClientId", nullptr);
+
+  PresentationConnectionMessagePtr message =
+      PresentationConnectionMessage::NewMessage("\"theMessage\"");
+  auto* message_ptr = message.get();
+  auto* client = AddMockClient("theClientId");
+  EXPECT_CALL(*client, SendMessageToClient).WillOnce([=](auto arg) {
+    EXPECT_EQ(message_ptr, arg.get());
+  });
+  record_->SendMessageToClient("theClientId", std::move(message));
+}
+
+TEST_F(CastActivityRecordTest, AddRemoveClient) {
+  // TODO(crbug.com/954797): Check value returned by AddClient().
+
+  // Adding clients works as expected.
+  ASSERT_TRUE(record_->connected_clients().empty());
+  ASSERT_FALSE(route().is_local());
+  AddMockClient("theClientId1");
+  // Check that adding a client causes the route to become local.
+  EXPECT_TRUE(route().is_local());
+  EXPECT_THAT(record_->connected_clients(),
+              UnorderedElementsAre(Pair("theClientId1", _)));
+  AddMockClient("theClientId2");
+  EXPECT_TRUE(route().is_local());
+  EXPECT_THAT(
+      record_->connected_clients(),
+      UnorderedElementsAre(Pair("theClientId1", _), Pair("theClientId2", _)));
+
+  // Removing a non-existant client is a no-op.
+  record_->RemoveClient("noSuchClient");
+  EXPECT_THAT(
+      record_->connected_clients(),
+      UnorderedElementsAre(Pair("theClientId1", _), Pair("theClientId2", _)));
+
+  // Removing clients works as expected.
+  record_->RemoveClient("theClientId1");
+  EXPECT_THAT(record_->connected_clients(),
+              UnorderedElementsAre(Pair("theClientId2", _)));
+  record_->RemoveClient("theClientId2");
+  EXPECT_TRUE(record_->connected_clients().empty());
+}
+
+TEST_F(CastActivityRecordTest, SetOrUpdateSession) {
+  AddMockClient("theClientId1");
+  AddMockClient("theClientId2");
+
+  ASSERT_EQ(base::nullopt, record_->session_id());
+  route().set_description("");
+  for (auto* client : clients_) {
+    EXPECT_CALL(*client, SendMessageToClient).Times(0);
+  }
+  record_->SetOrUpdateSession(*session_, sink_, "");
+  EXPECT_EQ("theStatusText", route().description());
+  EXPECT_EQ("theSessionId", record_->session_id());
+
+  route().set_description("");
+  for (auto* client : clients_) {
+    // TODO(jrw): Check argument of SendMessageToClient.
+    EXPECT_CALL(*client, SendMessageToClient).Times(1);
+  }
+  record_->SetOrUpdateSession(*session_, sink_, "theHashToken");
+  EXPECT_EQ("theStatusText", route().description());
+  EXPECT_EQ("theSessionId", record_->session_id());
+}
+
+TEST_F(CastActivityRecordTest, ClosePresentationConnections) {
+  constexpr auto reason = PresentationConnectionCloseReason::CONNECTION_ERROR;
+
+  AddMockClient("theClientId1");
+  AddMockClient("theClientId2");
+  for (auto* client : clients_) {
+    EXPECT_CALL(*client, CloseConnection(reason));
+  }
+  record_->ClosePresentationConnections(reason);
+}
+
+TEST_F(CastActivityRecordTest, TerminatePresentationConnections) {
+  AddMockClient("theClientId1");
+  AddMockClient("theClientId2");
+  for (auto* client : clients_) {
+    EXPECT_CALL(*client, TerminateConnection());
+  }
+  record_->TerminatePresentationConnections();
+}
+
+}  // namespace media_router
diff --git a/chrome/browser/media/router/providers/cast/cast_internal_message_util.cc b/chrome/browser/media/router/providers/cast/cast_internal_message_util.cc
index d0c9e2fa..4af4556 100644
--- a/chrome/browser/media/router/providers/cast/cast_internal_message_util.cc
+++ b/chrome/browser/media/router/providers/cast/cast_internal_message_util.cc
@@ -325,9 +325,9 @@
     const std::string& session_id,
     const std::string& namespace_or_v2_type,
     base::Value message_body)
-    : type(type),
-      client_id(client_id),
-      sequence_number(sequence_number),
+    : type_(type),
+      client_id_(client_id),
+      sequence_number_(sequence_number),
       session_id_(session_id),
       namespace_or_v2_type_(namespace_or_v2_type),
       message_body_(std::move(message_body)) {}
diff --git a/chrome/browser/media/router/providers/cast/cast_internal_message_util.h b/chrome/browser/media/router/providers/cast/cast_internal_message_util.h
index 73335df..9af4589 100644
--- a/chrome/browser/media/router/providers/cast/cast_internal_message_util.h
+++ b/chrome/browser/media/router/providers/cast/cast_internal_message_util.h
@@ -20,7 +20,8 @@
 
 // Represents a message sent or received by the Cast SDK via a
 // PresentationConnection.
-struct CastInternalMessage {
+class CastInternalMessage {
+ public:
   // TODO(crbug.com/809249): Add other types of messages.
   enum class Type {
     kClientConnect,   // Initial message sent by SDK client to connect to MRP.
@@ -61,12 +62,12 @@
 
   ~CastInternalMessage();
 
-  const Type type;
-  const std::string client_id;
-  const base::Optional<int> sequence_number;
+  Type type() const { return type_; }
+  const std::string& client_id() const { return client_id_; }
+  base::Optional<int> sequence_number() const { return sequence_number_; }
 
   bool has_session_id() const {
-    return type == Type::kAppMessage || type == Type::kV2Message;
+    return type_ == Type::kAppMessage || type_ == Type::kV2Message;
   }
 
   const std::string& session_id() const {
@@ -75,22 +76,22 @@
   }
 
   const std::string& app_message_namespace() const {
-    DCHECK(type == Type::kAppMessage);
+    DCHECK(type_ == Type::kAppMessage);
     return namespace_or_v2_type_;
   }
 
   const std::string& v2_message_type() const {
-    DCHECK(type == Type::kV2Message);
+    DCHECK(type_ == Type::kV2Message);
     return namespace_or_v2_type_;
   }
 
   const base::Value& app_message_body() const {
-    DCHECK(type == Type::kAppMessage);
+    DCHECK(type_ == Type::kAppMessage);
     return message_body_;
   }
 
   const base::Value& v2_message_body() const {
-    DCHECK(type == Type::kV2Message);
+    DCHECK(type_ == Type::kV2Message);
     return message_body_;
   }
 
@@ -102,6 +103,10 @@
                       const std::string& namespace_or_v2_type_,
                       base::Value message_body);
 
+  const Type type_;
+  const std::string client_id_;
+  const base::Optional<int> sequence_number_;
+
   // Set if |type| is |kAppMessage| or |kV2Message|.
   const std::string session_id_;
   const std::string namespace_or_v2_type_;
diff --git a/chrome/browser/media/router/providers/cast/cast_internal_message_util_unittest.cc b/chrome/browser/media/router/providers/cast/cast_internal_message_util_unittest.cc
index 3f1dffa..6e71e96 100644
--- a/chrome/browser/media/router/providers/cast/cast_internal_message_util_unittest.cc
+++ b/chrome/browser/media/router/providers/cast/cast_internal_message_util_unittest.cc
@@ -75,9 +75,9 @@
 
   auto message = CastInternalMessage::From(ParseJson(message_str));
   ASSERT_TRUE(message);
-  EXPECT_EQ(CastInternalMessage::Type::kAppMessage, message->type);
-  EXPECT_EQ("12345", message->client_id);
-  EXPECT_EQ(999, message->sequence_number);
+  EXPECT_EQ(CastInternalMessage::Type::kAppMessage, message->type());
+  EXPECT_EQ("12345", message->client_id());
+  EXPECT_EQ(999, message->sequence_number());
   EXPECT_EQ("urn:x-cast:com.google.foo", message->app_message_namespace());
   EXPECT_EQ("sessionId", message->session_id());
   base::Value message_body(base::Value::Type::DICTIONARY);
@@ -103,9 +103,9 @@
 
   auto message = CastInternalMessage::From(ParseJson(message_str));
   ASSERT_TRUE(message);
-  EXPECT_EQ(CastInternalMessage::Type::kV2Message, message->type);
-  EXPECT_EQ("12345", message->client_id);
-  EXPECT_EQ(999, message->sequence_number);
+  EXPECT_EQ(CastInternalMessage::Type::kV2Message, message->type());
+  EXPECT_EQ("12345", message->client_id());
+  EXPECT_EQ(999, message->sequence_number());
   EXPECT_EQ("sessionId", message->session_id());
   EXPECT_EQ("v2_message_type", message->v2_message_type());
   auto v2_body = ParseJson(R"({
@@ -129,9 +129,9 @@
 
   auto message = CastInternalMessage::From(ParseJson(message_str));
   ASSERT_TRUE(message);
-  EXPECT_EQ(CastInternalMessage::Type::kClientConnect, message->type);
-  EXPECT_EQ("12345", message->client_id);
-  EXPECT_FALSE(message->sequence_number);
+  EXPECT_EQ(CastInternalMessage::Type::kClientConnect, message->type());
+  EXPECT_EQ("12345", message->client_id());
+  EXPECT_FALSE(message->sequence_number());
 
   EXPECT_DCHECK_DEATH(message->session_id());
   EXPECT_DCHECK_DEATH(message->v2_message_type());
diff --git a/chrome/browser/media/router/providers/cast/cast_session_client.cc b/chrome/browser/media/router/providers/cast/cast_session_client.cc
index fd7bea2..9d70a9a 100644
--- a/chrome/browser/media/router/providers/cast/cast_session_client.cc
+++ b/chrome/browser/media/router/providers/cast/cast_session_client.cc
@@ -1,4 +1,4 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
+// Copyright 2019 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -7,7 +7,9 @@
 #include "base/bind.h"
 #include "chrome/browser/media/router/data_decoder_util.h"
 #include "chrome/browser/media/router/providers/cast/cast_activity_record.h"
+#include "chrome/browser/media/router/providers/cast/cast_internal_message_util.h"
 #include "components/cast_channel/enum_table.h"
+#include "mojo/public/cpp/bindings/binding.h"
 
 using blink::mojom::PresentationConnectionCloseReason;
 using blink::mojom::PresentationConnectionMessagePtr;
@@ -27,15 +29,20 @@
 
 }  // namespace
 
+CastSessionClientBase::CastSessionClientBase(const std::string& client_id,
+                                             const url::Origin& origin,
+                                             int tab_id)
+    : client_id_(client_id), origin_(origin), tab_id_(tab_id) {}
+
+CastSessionClientBase::~CastSessionClientBase() = default;
+
 CastSessionClient::CastSessionClient(const std::string& client_id,
                                      const url::Origin& origin,
                                      int tab_id,
                                      AutoJoinPolicy auto_join_policy,
                                      DataDecoder* data_decoder,
                                      CastActivityRecord* activity)
-    : client_id_(client_id),
-      origin_(origin),
-      tab_id_(tab_id),
+    : CastSessionClientBase(client_id, origin, tab_id),
       auto_join_policy_(auto_join_policy),
       data_decoder_(data_decoder),
       activity_(activity),
@@ -76,7 +83,19 @@
   }
 
   SendMessageToClient(
-      CreateV2Message(client_id_, media_status, sequence_number));
+      CreateV2Message(client_id(), media_status, sequence_number));
+}
+
+bool CastSessionClient::MatchesAutoJoinPolicy(url::Origin other_origin,
+                                              int other_tab_id) const {
+  switch (auto_join_policy_) {
+    case AutoJoinPolicy::kPageScoped:
+      return false;
+    case AutoJoinPolicy::kTabAndOriginScoped:
+      return other_origin == origin() && other_tab_id == tab_id();
+    case AutoJoinPolicy::kOriginScoped:
+      return other_origin == origin();
+  }
 }
 
 void CastSessionClient::OnMessage(PresentationConnectionMessagePtr message) {
@@ -96,17 +115,6 @@
   // method once we make sure Blink calls this on navigation and on
   // PresentationConnection::close().
 }
-bool CastSessionClient::MatchesAutoJoinPolicy(url::Origin origin,
-                                              int tab_id) const {
-  switch (auto_join_policy_) {
-    case AutoJoinPolicy::kTabAndOriginScoped:
-      return origin == origin_ && tab_id == tab_id_;
-    case AutoJoinPolicy::kOriginScoped:
-      return origin == origin_;
-    default:
-      return false;
-  }
-}
 
 void CastSessionClient::SendErrorCodeToClient(
     int sequence_number,
@@ -137,9 +145,9 @@
     return;
   }
 
-  if (cast_message->client_id != client_id_) {
-    DLOG(ERROR) << "Client ID mismatch: expected: " << client_id_
-                << ", got: " << cast_message->client_id;
+  if (cast_message->client_id() != client_id()) {
+    DLOG(ERROR) << "Client ID mismatch: expected: " << client_id()
+                << ", got: " << cast_message->client_id();
     return;
   }
 
@@ -151,14 +159,14 @@
     return;
   }
 
-  switch (cast_message->type) {
+  switch (cast_message->type()) {
     case CastInternalMessage::Type::kAppMessage:
       // Send an ACK message back to SDK client to indicate it is handled.
       if (activity_->SendAppMessageToReceiver(*cast_message) ==
           cast_channel::Result::kOk) {
-        DCHECK(cast_message->sequence_number);
+        DCHECK(cast_message->sequence_number());
         SendMessageToClient(CreateAppMessageAck(
-            cast_message->client_id, *cast_message->sequence_number));
+            cast_message->client_id(), *cast_message->sequence_number()));
       }
       break;
 
@@ -168,13 +176,14 @@
 
     case CastInternalMessage::Type::kLeaveSession:
       SendMessageToClient(CreateLeaveSessionAckMessage(
-          client_id_, cast_message->sequence_number));
-      activity_->HandleLeaveSession(client_id_);
+          client_id(), cast_message->sequence_number()));
+      activity_->HandleLeaveSession(client_id());
       break;
 
     default:
+      // TODO(jrw): Log string value of type instead of int value.
       DLOG(ERROR) << "Unhandled message type: "
-                  << static_cast<int>(cast_message->type);
+                  << static_cast<int>(cast_message->type());
   }
 }
 
@@ -188,7 +197,7 @@
     base::Optional<int> request_id =
         activity_->SendMediaRequestToReceiver(cast_message);
     if (request_id) {
-      DCHECK(cast_message.sequence_number);
+      DCHECK(cast_message.sequence_number());
       if (pending_media_requests_.size() >= kMaxPendingMediaRequests) {
         // Delete old pending requests.  Request IDs are generated sequentially,
         // so this should always delete the oldest requests.  Deleting requests
@@ -199,15 +208,15 @@
                                           pending_media_requests_.size() / 2);
       }
       pending_media_requests_.emplace(*request_id,
-                                      *cast_message.sequence_number);
+                                      *cast_message.sequence_number());
     }
   } else if (type == cast_channel::V2MessageType::kSetVolume) {
     DVLOG(2) << "Got volume command from client";
-    DCHECK(cast_message.sequence_number);
+    DCHECK(cast_message.sequence_number());
     activity_->SendSetVolumeRequestToReceiver(
         cast_message, base::BindOnce(&CastSessionClient::SendResultResponse,
                                      weak_ptr_factory_.GetWeakPtr(),
-                                     *cast_message.sequence_number));
+                                     *cast_message.sequence_number()));
   } else if (type == cast_channel::V2MessageType::kStop) {
     // TODO(jrw): implement STOP_SESSION.
     DVLOG(2) << "Ignoring stop-session (" << type_str << ") message";
@@ -221,7 +230,7 @@
   if (result == cast_channel::Result::kOk) {
     // Send an empty message to let the client know the request succeeded.
     SendMessageToClient(
-        CreateV2Message(client_id_, base::Value(), sequence_number));
+        CreateV2Message(client_id(), base::Value(), sequence_number));
   } else {
     // TODO(crbug.com/951089): Send correct error codes.  The original
     // implementation isn't much help here because it sends incorrectly
diff --git a/chrome/browser/media/router/providers/cast/cast_session_client.h b/chrome/browser/media/router/providers/cast/cast_session_client.h
index 7e21fa5..df116c2 100644
--- a/chrome/browser/media/router/providers/cast/cast_session_client.h
+++ b/chrome/browser/media/router/providers/cast/cast_session_client.h
@@ -13,10 +13,12 @@
 #include "base/memory/weak_ptr.h"
 #include "base/optional.h"
 #include "base/values.h"
-#include "chrome/browser/media/router/providers/cast/cast_session_tracker.h"
+#include "chrome/browser/media/router/providers/cast/cast_internal_message_util.h"
 #include "chrome/common/media_router/mojo/media_router.mojom.h"
 #include "chrome/common/media_router/providers/cast/cast_media_source.h"
+#include "components/cast_channel/cast_message_handler.h"
 #include "mojo/public/cpp/bindings/binding.h"
+#include "third_party/blink/public/mojom/presentation/presentation.mojom.h"
 #include "url/origin.h"
 
 namespace media_router {
@@ -24,59 +26,43 @@
 class CastActivityRecord;
 class DataDecoder;
 
-// Represents a Cast SDK client connection to a Cast session. This class
-// contains PresentationConnection Mojo pipes to send and receive messages
-// from/to the corresponding SDK client hosted in a presentation controlling
-// frame in Blink.
-class CastSessionClient : public blink::mojom::PresentationConnection {
+// TODO(jrw): Rename
+//   CastSessionClientBase -> CastSessionClient
+//   CastSessionClient -> CastSessionClientImpl
+// and likewise for CastActivity{Manager,Record}.
+class CastSessionClientBase : public blink::mojom::PresentationConnection {
  public:
-  CastSessionClient(const std::string& client_id,
-                    const url::Origin& origin,
-                    int tab_id,
-                    AutoJoinPolicy auto_join_policy,
-                    DataDecoder* data_decoder,
-                    CastActivityRecord* activity);
-  ~CastSessionClient() override;
+  CastSessionClientBase(const std::string& client_id,
+                        const url::Origin& origin,
+                        int tab_id);
+  ~CastSessionClientBase() override;
 
   const std::string& client_id() const { return client_id_; }
   const base::Optional<std::string>& session_id() const { return session_id_; }
   const url::Origin& origin() const { return origin_; }
-  int tab_id() { return tab_id_; }
+  int tab_id() const { return tab_id_; }
 
   // Initializes the PresentationConnection Mojo message pipes and returns the
   // handles of the two pipes to be held by Blink. Also transitions the
   // connection state to CONNECTED. This method can only be called once, and
   // must be called before |SendMessageToClient()|.
-  mojom::RoutePresentationConnectionPtr Init();
+  virtual mojom::RoutePresentationConnectionPtr Init() = 0;
 
   // Sends |message| to the Cast SDK client in Blink.
-  //
-  // TODO(jrw): Remove redundant "ToClient" in the name of this and other
-  // methods.
-  void SendMessageToClient(
-      blink::mojom::PresentationConnectionMessagePtr message);
+  virtual void SendMessageToClient(
+      blink::mojom::PresentationConnectionMessagePtr message) = 0;
 
   // Sends a media status message to the client.  If |request_id| is given, it
   // is used to look up the sequence number of a previous request, which is
   // included in the outgoing message.
-  void SendMediaStatusToClient(const base::Value& media_status,
-                               base::Optional<int> request_id);
+  virtual void SendMediaStatusToClient(const base::Value& media_status,
+                                       base::Optional<int> request_id) = 0;
 
   // Changes the PresentationConnection state to CLOSED/TERMINATED and resets
   // PresentationConnection message pipes.
-  void CloseConnection(
-      blink::mojom::PresentationConnectionCloseReason close_reason);
-  void TerminateConnection();
-
-  // blink::mojom::PresentationConnection implementation
-  void OnMessage(
-      blink::mojom::PresentationConnectionMessagePtr message) override;
-  // Blink does not initiate state change or close using PresentationConnection.
-  // Instead, |PresentationService::Close/TerminateConnection| is used.
-  void DidChangeState(
-      blink::mojom::PresentationConnectionState state) override {}
-  void DidClose(
-      blink::mojom::PresentationConnectionCloseReason reason) override;
+  virtual void CloseConnection(
+      blink::mojom::PresentationConnectionCloseReason close_reason) = 0;
+  virtual void TerminateConnection() = 0;
 
   // Tests whether the specified origin and tab ID match this session's origin
   // and tab ID to the extent required by this sesssion's auto-join policy.
@@ -90,16 +76,76 @@
   // Alternatively, it might make more sense to record at session creation time
   // whether a particular session was created by an auto-join request, in which
   // case I believe this method would no longer be needed.
-  bool MatchesAutoJoinPolicy(url::Origin origin, int tab_id) const;
+  virtual bool MatchesAutoJoinPolicy(url::Origin origin, int tab_id) const = 0;
 
-  void SendErrorCodeToClient(int sequence_number,
-                             CastInternalMessage::ErrorCode error_code,
-                             base::Optional<std::string> description);
+  virtual void SendErrorCodeToClient(
+      int sequence_number,
+      CastInternalMessage::ErrorCode error_code,
+      base::Optional<std::string> description) = 0;
 
   // NOTE: This is current only called from SendErrorCodeToClient, but based on
   // the old code this method based on, it seems likely it will have other
   // callers once error handling for the Cast MRP is more fleshed out.
-  void SendErrorToClient(int sequence_number, base::Value error);
+  virtual void SendErrorToClient(int sequence_number, base::Value error) = 0;
+
+ private:
+  std::string client_id_;
+  base::Optional<std::string> session_id_;
+
+  // The origin and tab ID parameters originally passed to the CreateRoute
+  // method of the MediaRouteProvider Mojo interface.
+  url::Origin origin_;
+  int tab_id_;
+};
+
+class CastSessionClientFactory {
+ public:
+  virtual std::unique_ptr<CastSessionClientBase> MakeClient(
+      const std::string& client_id,
+      const url::Origin& origin,
+      int tab_id) = 0;
+};
+
+// Represents a Cast SDK client connection to a Cast session. This class
+// contains PresentationConnection Mojo pipes to send and receive messages
+// from/to the corresponding SDK client hosted in a presentation controlling
+// frame in Blink.
+class CastSessionClient : public CastSessionClientBase {
+ public:
+  CastSessionClient(const std::string& client_id,
+                    const url::Origin& origin,
+                    int tab_id,
+                    AutoJoinPolicy auto_join_policy,
+                    DataDecoder* data_decoder,
+                    CastActivityRecord* activity);
+  ~CastSessionClient() override;
+
+  // CastSessionClientBase implementation
+  mojom::RoutePresentationConnectionPtr Init() override;
+  // TODO(jrw): Remove redundant "ToClient" in the name of this and other
+  // methods.
+  void SendMessageToClient(
+      blink::mojom::PresentationConnectionMessagePtr message) override;
+  void SendMediaStatusToClient(const base::Value& media_status,
+                               base::Optional<int> request_id) override;
+  void CloseConnection(
+      blink::mojom::PresentationConnectionCloseReason close_reason) override;
+  void TerminateConnection() override;
+  bool MatchesAutoJoinPolicy(url::Origin origin, int tab_id) const override;
+  void SendErrorCodeToClient(int sequence_number,
+                             CastInternalMessage::ErrorCode error_code,
+                             base::Optional<std::string> description) override;
+  void SendErrorToClient(int sequence_number, base::Value error) override;
+
+  // blink::mojom::PresentationConnection implementation
+  void OnMessage(
+      blink::mojom::PresentationConnectionMessagePtr message) override;
+  // Blink does not initiate state change or close using PresentationConnection.
+  // Instead, |PresentationService::Close/TerminateConnection| is used.
+  void DidChangeState(
+      blink::mojom::PresentationConnectionState state) override {}
+  void DidClose(
+      blink::mojom::PresentationConnectionCloseReason reason) override;
 
  private:
   void HandleParsedClientMessage(std::unique_ptr<base::Value> message);
@@ -112,14 +158,6 @@
   // succeeded or failed.
   void SendResultResponse(int sequence_number, cast_channel::Result result);
 
-  std::string client_id_;
-  base::Optional<std::string> session_id_;
-
-  // The origin and tab ID parameters originally passed to the CreateRoute
-  // method of the MediaRouteProvider Mojo interface.
-  url::Origin origin_;
-  int tab_id_;
-
   const AutoJoinPolicy auto_join_policy_;
 
   DataDecoder* const data_decoder_;
diff --git a/chrome/browser/media/router/providers/cast/cast_session_tracker.cc b/chrome/browser/media/router/providers/cast/cast_session_tracker.cc
index 7b52e0e8..7b10975 100644
--- a/chrome/browser/media/router/providers/cast/cast_session_tracker.cc
+++ b/chrome/browser/media/router/providers/cast/cast_session_tracker.cc
@@ -14,6 +14,8 @@
 
 CastSessionTracker::Observer::~Observer() = default;
 
+CastSessionTracker::~CastSessionTracker() = default;
+
 // static
 CastSessionTracker* CastSessionTracker::GetInstance() {
   if (instance_for_test_)
@@ -66,8 +68,6 @@
                                        base::Unretained(this)));
 }
 
-CastSessionTracker::~CastSessionTracker() = default;
-
 // This method needs to be separate from the constructor because the constructor
 // needs to be called from the UI thread, but observers can only be added in an
 // IO thread.
diff --git a/chrome/browser/media/router/providers/cast/cast_session_tracker.h b/chrome/browser/media/router/providers/cast/cast_session_tracker.h
index bfdeff1c..6b8a76e3 100644
--- a/chrome/browser/media/router/providers/cast/cast_session_tracker.h
+++ b/chrome/browser/media/router/providers/cast/cast_session_tracker.h
@@ -39,6 +39,8 @@
                                       base::Optional<int> request_id) = 0;
   };
 
+  ~CastSessionTracker() override;
+
   // Must be called on UI thread.
   // TODO(https://crbug.com/904016): The UI/IO thread split makes this class
   // confusing to use.  If we can directly access CastMediaSinkServiceImpl
@@ -56,6 +58,7 @@
 
  private:
   friend class CastSessionTrackerTest;
+  friend class CastActivityRecordTest;
   friend class CastActivityManagerTest;
   friend class CastMediaRouteProviderTest;
 
@@ -65,8 +68,6 @@
       cast_channel::CastMessageHandler* message_handler,
       const scoped_refptr<base::SequencedTaskRunner>& task_runner);
 
-  ~CastSessionTracker() override;
-
   void InitOnIoThread();
   void HandleReceiverStatusMessage(const MediaSinkInternal& sink,
                                    const base::Value& message);
@@ -101,6 +102,7 @@
 
   SEQUENCE_CHECKER(sequence_checker_);
   DISALLOW_COPY_AND_ASSIGN(CastSessionTracker);
+  FRIEND_TEST_ALL_PREFIXES(CastActivityRecordTest, SendAppMessageToReceiver);
   FRIEND_TEST_ALL_PREFIXES(CastSessionTrackerTest, RemoveSession);
   FRIEND_TEST_ALL_PREFIXES(CastSessionTrackerTest,
                            HandleMediaStatusMessageBasic);
diff --git a/chrome/browser/metrics/process_memory_metrics_emitter.cc b/chrome/browser/metrics/process_memory_metrics_emitter.cc
index a41b6dd..3071acb 100644
--- a/chrome/browser/metrics/process_memory_metrics_emitter.cc
+++ b/chrome/browser/metrics/process_memory_metrics_emitter.cc
@@ -15,7 +15,7 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/metrics/tab_footprint_aggregator.h"
 #include "chrome/browser/performance_manager/graph/frame_node_impl.h"
-#include "chrome/browser/performance_manager/graph/graph.h"
+#include "chrome/browser/performance_manager/graph/graph_impl.h"
 #include "chrome/browser/performance_manager/graph/page_node_impl.h"
 #include "chrome/browser/performance_manager/graph/process_node_impl.h"
 #include "chrome/browser/performance_manager/performance_manager.h"
@@ -780,7 +780,7 @@
 
 void ProcessMemoryMetricsEmitter::GetProcessToPageInfoMap(
     GetProcessToPageInfoMapCallback callback,
-    performance_manager::Graph* graph) {
+    performance_manager::GraphImpl* graph) {
   std::vector<ProcessInfo> process_infos;
   std::vector<performance_manager::ProcessNodeImpl*> process_nodes =
       graph->GetAllProcessNodes();
diff --git a/chrome/browser/metrics/process_memory_metrics_emitter.h b/chrome/browser/metrics/process_memory_metrics_emitter.h
index b277247..6a22ed6 100644
--- a/chrome/browser/metrics/process_memory_metrics_emitter.h
+++ b/chrome/browser/metrics/process_memory_metrics_emitter.h
@@ -22,7 +22,7 @@
 }
 
 namespace performance_manager {
-class Graph;
+class GraphImpl;
 }
 
 // This class asynchronously fetches memory metrics for each process, and then
@@ -86,7 +86,7 @@
   using GetProcessToPageInfoMapCallback =
       base::OnceCallback<void(std::vector<ProcessInfo>)>;
   static void GetProcessToPageInfoMap(GetProcessToPageInfoMapCallback callback,
-                                      performance_manager::Graph* graph);
+                                      performance_manager::GraphImpl* graph);
 
   // The results of each request are cached. When both requests are finished,
   // the results are collated.
diff --git a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc
index a06d0b11..4a0dc719 100644
--- a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc
+++ b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc
@@ -39,6 +39,7 @@
 #include "services/metrics/public/cpp/ukm_builders.h"
 #include "services/metrics/public/cpp/ukm_source.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/gfx/geometry/size.h"
 #include "url/gurl.h"
 #include "url/url_constants.h"
 
@@ -345,6 +346,9 @@
   // Wait for each frames resource to load so that they will have non-zero
   // bytes.
   waiter->AddMinimumCompleteResourcesExpectation(6);
+  waiter->AddFrameSizeExpectation(gfx::Size(0, 0));
+  waiter->AddFrameSizeExpectation(gfx::Size(10, 1000));
+  waiter->AddFrameSizeExpectation(gfx::Size(100, 100));
   waiter->Wait();
 
   // Navigate away to force the histogram recording.
@@ -376,6 +380,7 @@
   // Wait for each frames resource to load so that they will have non-zero
   // bytes.
   waiter->AddMinimumCompleteResourcesExpectation(4);
+  waiter->AddFrameSizeExpectation(gfx::Size(4, 4));
   waiter->Wait();
 
   // Navigate away to force the histogram recording.
diff --git a/chrome/browser/page_load_metrics/page_load_metrics_test_waiter.cc b/chrome/browser/page_load_metrics/page_load_metrics_test_waiter.cc
index 5a5cac4..9511b628 100644
--- a/chrome/browser/page_load_metrics/page_load_metrics_test_waiter.cc
+++ b/chrome/browser/page_load_metrics/page_load_metrics_test_waiter.cc
@@ -28,6 +28,13 @@
   }
 }
 
+void PageLoadMetricsTestWaiter::AddFrameSizeExpectation(const gfx::Size& size) {
+  // If we have already seen this size, don't add it to the expectations.
+  if (observed_frame_sizes_.find(size) != observed_frame_sizes_.end())
+    return;
+  expected_frame_sizes_.insert(size);
+}
+
 void PageLoadMetricsTestWaiter::AddSubFrameExpectation(TimingField field) {
   CHECK_NE(field, TimingField::kLoadTimingInfo)
       << "LOAD_TIMING_INFO should only be used as a page-level expectation";
@@ -170,6 +177,15 @@
     run_loop_->Quit();
 }
 
+void PageLoadMetricsTestWaiter::FrameSizeChanged(
+    content::RenderFrameHost* render_frame_host,
+    const gfx::Size& frame_size) {
+  observed_frame_sizes_.insert(frame_size);
+  expected_frame_sizes_.erase(frame_size);
+  if (ExpectationsSatisfied() && run_loop_)
+    run_loop_->Quit();
+}
+
 bool PageLoadMetricsTestWaiter::IsPageLevelField(TimingField field) {
   switch (field) {
     case TimingField::kFirstPaint:
@@ -253,7 +269,8 @@
   return subframe_expected_fields_.Empty() && page_expected_fields_.Empty() &&
          ResourceUseExpectationsSatisfied() &&
          WebFeaturesExpectationsSatisfied() &&
-         SubframeNavigationExpectationsSatisfied();
+         SubframeNavigationExpectationsSatisfied() &&
+         expected_frame_sizes_.empty();
 }
 
 PageLoadMetricsTestWaiter::WaiterMetricsObserver::~WaiterMetricsObserver() {}
@@ -302,4 +319,18 @@
     waiter_->OnDidFinishSubFrameNavigation(navigation_handle, extra_info);
 }
 
+void PageLoadMetricsTestWaiter::WaiterMetricsObserver::FrameSizeChanged(
+    content::RenderFrameHost* render_frame_host,
+    const gfx::Size& frame_size) {
+  if (waiter_)
+    waiter_->FrameSizeChanged(render_frame_host, frame_size);
+}
+
+bool PageLoadMetricsTestWaiter::FrameSizeComparator::operator()(
+    const gfx::Size a,
+    const gfx::Size b) const {
+  return a.width() < b.width() ||
+         (a.width() == b.width() && a.height() < b.height());
+}
+
 }  // namespace page_load_metrics
diff --git a/chrome/browser/page_load_metrics/page_load_metrics_test_waiter.h b/chrome/browser/page_load_metrics/page_load_metrics_test_waiter.h
index 92fdb79..c1fc23d28 100644
--- a/chrome/browser/page_load_metrics/page_load_metrics_test_waiter.h
+++ b/chrome/browser/page_load_metrics/page_load_metrics_test_waiter.h
@@ -12,6 +12,7 @@
 #include "chrome/browser/page_load_metrics/metrics_web_contents_observer.h"
 #include "chrome/browser/page_load_metrics/page_load_tracker.h"
 #include "content/public/browser/render_frame_host.h"
+#include "ui/gfx/geometry/size.h"
 
 namespace page_load_metrics {
 
@@ -42,6 +43,10 @@
   // Add a subframe-level expectation.
   void AddSubFrameExpectation(TimingField field);
 
+  // Add a frame size expectation. Expects that at least one frame receives a
+  // size update of |size|.
+  void AddFrameSizeExpectation(const gfx::Size& size);
+
   // Add a single WebFeature expectation.
   void AddWebFeatureExpectation(blink::mojom::WebFeature web_feature);
 
@@ -114,6 +119,8 @@
     void OnDidFinishSubFrameNavigation(
         content::NavigationHandle* navigation_handle,
         const page_load_metrics::PageLoadExtraInfo& extra_info) override;
+    void FrameSizeChanged(content::RenderFrameHost* render_frame_host,
+                          const gfx::Size& frame_size) override;
 
    private:
     const base::WeakPtr<PageLoadMetricsTestWaiter> waiter_;
@@ -150,6 +157,10 @@
     int bitmask_ = 0;
   };
 
+  struct FrameSizeComparator {
+    bool operator()(const gfx::Size a, const gfx::Size b) const;
+  };
+
   static bool IsPageLevelField(TimingField field);
 
   static TimingFieldBitSet GetMatchedBits(
@@ -182,6 +193,9 @@
                                const mojom::PageLoadFeatures& features,
                                const PageLoadExtraInfo& extra_info);
 
+  void FrameSizeChanged(content::RenderFrameHost* render_frame_host,
+                        const gfx::Size& frame_size);
+
   void OnDidFinishSubFrameNavigation(
       content::NavigationHandle* navigation_handle,
       const page_load_metrics::PageLoadExtraInfo& extra_info);
@@ -209,6 +223,9 @@
       observed_web_features_;
   size_t observed_subframe_navigations_ = 0;
 
+  std::set<gfx::Size, FrameSizeComparator> expected_frame_sizes_;
+  std::set<gfx::Size, FrameSizeComparator> observed_frame_sizes_;
+
   int current_complete_resources_ = 0;
   int64_t current_network_bytes_ = 0;
 
diff --git a/chrome/browser/page_load_metrics/page_load_tracker.h b/chrome/browser/page_load_metrics/page_load_tracker.h
index 26ef23e..877a398b 100644
--- a/chrome/browser/page_load_metrics/page_load_tracker.h
+++ b/chrome/browser/page_load_metrics/page_load_tracker.h
@@ -21,6 +21,7 @@
 #include "content/public/browser/web_contents_observer.h"
 #include "services/metrics/public/cpp/ukm_source.h"
 #include "ui/base/page_transition_types.h"
+#include "ui/gfx/geometry/size.h"
 
 class GURL;
 
diff --git a/chrome/browser/performance_manager/decorators/frozen_frame_aggregator.cc b/chrome/browser/performance_manager/decorators/frozen_frame_aggregator.cc
index 311ce43..b8853c2 100644
--- a/chrome/browser/performance_manager/decorators/frozen_frame_aggregator.cc
+++ b/chrome/browser/performance_manager/decorators/frozen_frame_aggregator.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/performance_manager/decorators/frozen_frame_aggregator.h"
 
 #include "chrome/browser/performance_manager/graph/frame_node_impl.h"
+#include "chrome/browser/performance_manager/graph/graph_impl.h"
 #include "chrome/browser/performance_manager/graph/node_attached_data_impl.h"
 #include "chrome/browser/performance_manager/graph/page_node_impl.h"
 #include "chrome/browser/performance_manager/graph/process_node_impl.h"
diff --git a/chrome/browser/performance_manager/decorators/page_almost_idle_decorator.cc b/chrome/browser/performance_manager/decorators/page_almost_idle_decorator.cc
index 741c010..834a2f8 100644
--- a/chrome/browser/performance_manager/decorators/page_almost_idle_decorator.cc
+++ b/chrome/browser/performance_manager/decorators/page_almost_idle_decorator.cc
@@ -6,6 +6,7 @@
 
 #include <algorithm>
 
+#include "chrome/browser/performance_manager/graph/graph_impl.h"
 #include "chrome/browser/performance_manager/graph/node_attached_data_impl.h"
 #include "chrome/browser/performance_manager/performance_manager_clock.h"
 
diff --git a/chrome/browser/performance_manager/graph/README.md b/chrome/browser/performance_manager/graph/README.md
index aa58cf4..f897481 100644
--- a/chrome/browser/performance_manager/graph/README.md
+++ b/chrome/browser/performance_manager/graph/README.md
@@ -8,9 +8,8 @@
 
 # Node Lifetime
 
-With the exception of the system node, which is a singleton, the Graph does not
-own nodes. The user of the graph is responsible for maintaining node ownership.
-Any node that has been added to the graph, must be removed from the graph
-with Graph::RemoveNode before it's deleted.
-All nodes must be removed from the graph before the graph is destroyed.
-
+With the exception of the system node, which is a singleton, the GraphImpl does
+not own nodes. The user of the graph is responsible for maintaining node
+ownership. Any node that has been added to the graph, must be removed from the
+graph with GraphImpl::RemoveNode before it's deleted. All nodes must be removed
+from the graph before the graph is destroyed.
diff --git a/chrome/browser/performance_manager/graph/frame_node_impl.cc b/chrome/browser/performance_manager/graph/frame_node_impl.cc
index 4eea18f..3db2aad 100644
--- a/chrome/browser/performance_manager/graph/frame_node_impl.cc
+++ b/chrome/browser/performance_manager/graph/frame_node_impl.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/performance_manager/graph/frame_node_impl.h"
 
+#include "chrome/browser/performance_manager/graph/graph_impl.h"
 #include "chrome/browser/performance_manager/graph/page_node_impl.h"
 #include "chrome/browser/performance_manager/graph/process_node_impl.h"
 #include "chrome/browser/performance_manager/observers/graph_observer.h"
@@ -11,7 +12,7 @@
 
 namespace performance_manager {
 
-FrameNodeImpl::FrameNodeImpl(Graph* graph,
+FrameNodeImpl::FrameNodeImpl(GraphImpl* graph,
                              ProcessNodeImpl* process_node,
                              PageNodeImpl* page_node,
                              FrameNodeImpl* parent_frame_node,
diff --git a/chrome/browser/performance_manager/graph/frame_node_impl.h b/chrome/browser/performance_manager/graph/frame_node_impl.h
index 5168449..ff3a573 100644
--- a/chrome/browser/performance_manager/graph/frame_node_impl.h
+++ b/chrome/browser/performance_manager/graph/frame_node_impl.h
@@ -52,7 +52,7 @@
   // Construct a frame node associated with a |process_node|, a |page_node| and
   // optionally with a |parent_frame_node|. For the main frame of |page_node|
   // the |parent_frame_node| parameter should be nullptr.
-  FrameNodeImpl(Graph* graph,
+  FrameNodeImpl(GraphImpl* graph,
                 ProcessNodeImpl* process_node,
                 PageNodeImpl* page_node,
                 FrameNodeImpl* parent_frame_node,
diff --git a/chrome/browser/performance_manager/graph/graph.cc b/chrome/browser/performance_manager/graph/graph_impl.cc
similarity index 80%
rename from chrome/browser/performance_manager/graph/graph.cc
rename to chrome/browser/performance_manager/graph/graph_impl.cc
index 6f4207b..7bb9437 100644
--- a/chrome/browser/performance_manager/graph/graph.cc
+++ b/chrome/browser/performance_manager/graph/graph_impl.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/performance_manager/graph/graph.h"
+#include "chrome/browser/performance_manager/graph/graph_impl.h"
 
 #include <utility>
 
@@ -22,11 +22,11 @@
 
 namespace performance_manager {
 
-Graph::Graph() {
+GraphImpl::GraphImpl() {
   DETACH_FROM_SEQUENCE(sequence_checker_);
 }
 
-Graph::~Graph() {
+GraphImpl::~GraphImpl() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   // All observers should have been removed before the graph is deleted.
@@ -43,14 +43,14 @@
   DCHECK(nodes_.empty());
 }
 
-void Graph::RegisterObserver(GraphObserver* observer) {
+void GraphImpl::RegisterObserver(GraphObserver* observer) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   observer->set_node_graph(this);
   observers_.push_back(observer);
   observer->OnRegistered();
 }
 
-void Graph::UnregisterObserver(GraphObserver* observer) {
+void GraphImpl::UnregisterObserver(GraphObserver* observer) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   bool removed = false;
   for (auto it = observers_.begin(); it != observers_.end(); ++it) {
@@ -64,7 +64,7 @@
   DCHECK(removed);
 }
 
-void Graph::OnNodeAdded(NodeBase* node) {
+void GraphImpl::OnNodeAdded(NodeBase* node) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   for (auto* observer : observers_) {
     if (observer->ShouldObserve(node)) {
@@ -74,16 +74,16 @@
   }
 }
 
-void Graph::OnBeforeNodeRemoved(NodeBase* node) {
+void GraphImpl::OnBeforeNodeRemoved(NodeBase* node) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   node->LeaveGraph();
 }
 
-int64_t Graph::GetNextNodeSerializationId() {
+int64_t GraphImpl::GetNextNodeSerializationId() {
   return ++current_node_serialization_id_;
 }
 
-SystemNodeImpl* Graph::FindOrCreateSystemNode() {
+SystemNodeImpl* GraphImpl::FindOrCreateSystemNode() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!system_node_) {
     // Create the singleton system node instance. Ownership is taken by the
@@ -95,13 +95,13 @@
   return system_node_.get();
 }
 
-bool Graph::NodeInGraph(const NodeBase* node) {
+bool GraphImpl::NodeInGraph(const NodeBase* node) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   const auto& it = nodes_.find(const_cast<NodeBase*>(node));
   return it != nodes_.end();
 }
 
-ProcessNodeImpl* Graph::GetProcessNodeByPid(base::ProcessId pid) {
+ProcessNodeImpl* GraphImpl::GetProcessNodeByPid(base::ProcessId pid) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   auto it = processes_by_pid_.find(pid);
   if (it == processes_by_pid_.end())
@@ -110,20 +110,20 @@
   return ProcessNodeImpl::FromNodeBase(it->second);
 }
 
-std::vector<ProcessNodeImpl*> Graph::GetAllProcessNodes() {
+std::vector<ProcessNodeImpl*> GraphImpl::GetAllProcessNodes() {
   return GetAllNodesOfType<ProcessNodeImpl>();
 }
 
-std::vector<FrameNodeImpl*> Graph::GetAllFrameNodes() {
+std::vector<FrameNodeImpl*> GraphImpl::GetAllFrameNodes() {
   return GetAllNodesOfType<FrameNodeImpl>();
 }
 
-std::vector<PageNodeImpl*> Graph::GetAllPageNodes() {
+std::vector<PageNodeImpl*> GraphImpl::GetAllPageNodes() {
   return GetAllNodesOfType<PageNodeImpl>();
 }
 
-size_t Graph::GetNodeAttachedDataCountForTesting(NodeBase* node,
-                                                 const void* key) const {
+size_t GraphImpl::GetNodeAttachedDataCountForTesting(NodeBase* node,
+                                                     const void* key) const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!node && !key)
     return node_attached_data_map_.size();
@@ -140,7 +140,7 @@
   return count;
 }
 
-void Graph::AddNewNode(NodeBase* new_node) {
+void GraphImpl::AddNewNode(NodeBase* new_node) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   auto it = nodes_.insert(new_node);
   DCHECK(it.second);  // Inserted successfully
@@ -150,7 +150,7 @@
   OnNodeAdded(new_node);
 }
 
-void Graph::RemoveNode(NodeBase* node) {
+void GraphImpl::RemoveNode(NodeBase* node) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   OnBeforeNodeRemoved(node);
 
@@ -166,8 +166,8 @@
   DCHECK_EQ(1u, erased);
 }
 
-void Graph::BeforeProcessPidChange(ProcessNodeImpl* process,
-                                   base::ProcessId new_pid) {
+void GraphImpl::BeforeProcessPidChange(ProcessNodeImpl* process,
+                                       base::ProcessId new_pid) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   // On Windows, PIDs are aggressively reused, and because not all process
   // creation/death notifications are synchronized, it's possible for more than
@@ -184,7 +184,7 @@
 }
 
 template <typename NodeType>
-std::vector<NodeType*> Graph::GetAllNodesOfType() {
+std::vector<NodeType*> GraphImpl::GetAllNodesOfType() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   const auto type = NodeType::Type();
   std::vector<NodeType*> ret;
diff --git a/chrome/browser/performance_manager/graph/graph.h b/chrome/browser/performance_manager/graph/graph_impl.h
similarity index 92%
rename from chrome/browser/performance_manager/graph/graph.h
rename to chrome/browser/performance_manager/graph/graph_impl.h
index 02b0d9b3..7717358 100644
--- a/chrome/browser/performance_manager/graph/graph.h
+++ b/chrome/browser/performance_manager/graph/graph_impl.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_PERFORMANCE_MANAGER_GRAPH_GRAPH_H_
-#define CHROME_BROWSER_PERFORMANCE_MANAGER_GRAPH_GRAPH_H_
+#ifndef CHROME_BROWSER_PERFORMANCE_MANAGER_GRAPH_GRAPH_IMPL_H_
+#define CHROME_BROWSER_PERFORMANCE_MANAGER_GRAPH_GRAPH_IMPL_H_
 
 #include <stdint.h>
 
@@ -32,12 +32,12 @@
 // Represents a graph of the nodes representing a single browser. Maintains a
 // set of nodes that can be retrieved in different ways, some indexed. Keeps
 // a list of observers that are notified of node addition and removal.
-class Graph {
+class GraphImpl {
  public:
   using NodeSet = std::unordered_set<NodeBase*>;
 
-  Graph();
-  ~Graph();
+  GraphImpl();
+  ~GraphImpl();
 
   void set_ukm_recorder(ukm::UkmRecorder* ukm_recorder) {
     ukm_recorder_ = ukm_recorder;
@@ -111,9 +111,9 @@
   int64_t current_node_serialization_id_ = 0u;
 
   SEQUENCE_CHECKER(sequence_checker_);
-  DISALLOW_COPY_AND_ASSIGN(Graph);
+  DISALLOW_COPY_AND_ASSIGN(GraphImpl);
 };
 
 }  // namespace performance_manager
 
-#endif  // CHROME_BROWSER_PERFORMANCE_MANAGER_GRAPH_GRAPH_H_
+#endif  // CHROME_BROWSER_PERFORMANCE_MANAGER_GRAPH_GRAPH_IMPL_H_
diff --git a/chrome/browser/performance_manager/graph/graph_unittest.cc b/chrome/browser/performance_manager/graph/graph_impl_unittest.cc
similarity index 91%
rename from chrome/browser/performance_manager/graph/graph_unittest.cc
rename to chrome/browser/performance_manager/graph/graph_impl_unittest.cc
index 6781e58..39d7d1e 100644
--- a/chrome/browser/performance_manager/graph/graph_unittest.cc
+++ b/chrome/browser/performance_manager/graph/graph_impl_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/performance_manager/graph/graph.h"
+#include "chrome/browser/performance_manager/graph/graph_impl.h"
 
 #include "base/process/process.h"
 #include "base/time/time.h"
@@ -15,8 +15,8 @@
 
 namespace performance_manager {
 
-TEST(GraphTest, FindOrCreateSystemNode) {
-  Graph graph;
+TEST(GraphImplTest, FindOrCreateSystemNode) {
+  GraphImpl graph;
 
   SystemNodeImpl* system_node = graph.FindOrCreateSystemNode();
 
@@ -24,8 +24,8 @@
   EXPECT_EQ(system_node, graph.FindOrCreateSystemNode());
 }
 
-TEST(GraphTest, GetProcessNodeByPid) {
-  Graph graph;
+TEST(GraphImplTest, GetProcessNodeByPid) {
+  GraphImpl graph;
 
   TestNodeWrapper<ProcessNodeImpl> process =
       TestNodeWrapper<ProcessNodeImpl>::Create(&graph);
@@ -51,11 +51,11 @@
   EXPECT_EQ(nullptr, graph.GetProcessNodeByPid(self.Pid()));
 }
 
-TEST(GraphTest, PIDReuse) {
+TEST(GraphImplTest, PIDReuse) {
   // This test emulates what happens on Windows under aggressive PID reuse,
   // where a process termination notification can be delayed until after the
   // PID has been reused for a new process.
-  Graph graph;
+  GraphImpl graph;
 
   static base::Process self = base::Process::Current();
 
@@ -81,8 +81,8 @@
   EXPECT_EQ(process2.get(), graph.GetProcessNodeByPid(self.Pid()));
 }
 
-TEST(GraphTest, GetAllCUsByType) {
-  Graph graph;
+TEST(GraphImplTest, GetAllCUsByType) {
+  GraphImpl graph;
   MockMultiplePagesInSingleProcessGraph mock_graph(&graph);
 
   std::vector<ProcessNodeImpl*> processes = graph.GetAllProcessNodes();
@@ -100,8 +100,8 @@
   EXPECT_NE(nullptr, pages[1]);
 }
 
-TEST(GraphTest, SerializationId) {
-  Graph graph;
+TEST(GraphImplTest, SerializationId) {
+  GraphImpl graph;
 
   EXPECT_EQ(0u, NodeBase::GetSerializationId(nullptr));
 
diff --git a/chrome/browser/performance_manager/graph/graph_test_harness.h b/chrome/browser/performance_manager/graph/graph_test_harness.h
index 7cbd322..6a408d14 100644
--- a/chrome/browser/performance_manager/graph/graph_test_harness.h
+++ b/chrome/browser/performance_manager/graph/graph_test_harness.h
@@ -12,7 +12,7 @@
 
 #include "base/test/scoped_task_environment.h"
 #include "chrome/browser/performance_manager/graph/frame_node_impl.h"
-#include "chrome/browser/performance_manager/graph/graph.h"
+#include "chrome/browser/performance_manager/graph/graph_impl.h"
 #include "chrome/browser/performance_manager/graph/node_base.h"
 #include "chrome/browser/performance_manager/graph/page_node_impl.h"
 #include "chrome/browser/performance_manager/graph/process_node_impl.h"
@@ -27,7 +27,7 @@
   struct Factory;
 
   template <typename... Args>
-  static TestNodeWrapper<NodeClass> Create(Graph* graph, Args&&... args);
+  static TestNodeWrapper<NodeClass> Create(GraphImpl* graph, Args&&... args);
 
   TestNodeWrapper() {}
 
@@ -61,7 +61,7 @@
 template <class NodeClass>
 struct TestNodeWrapper<NodeClass>::Factory {
   template <typename... Args>
-  static std::unique_ptr<NodeClass> Create(Graph* graph, Args&&... args) {
+  static std::unique_ptr<NodeClass> Create(GraphImpl* graph, Args&&... args) {
     return std::make_unique<NodeClass>(graph, std::forward<Args>(args)...);
   }
 };
@@ -71,7 +71,7 @@
 template <>
 struct TestNodeWrapper<FrameNodeImpl>::Factory {
   static std::unique_ptr<FrameNodeImpl> Create(
-      Graph* graph,
+      GraphImpl* graph,
       ProcessNodeImpl* process_node,
       PageNodeImpl* page_node,
       FrameNodeImpl* parent_frame_node = nullptr,
@@ -86,7 +86,7 @@
 // static
 template <typename NodeClass>
 template <typename... Args>
-TestNodeWrapper<NodeClass> TestNodeWrapper<NodeClass>::Create(Graph* graph,
+TestNodeWrapper<NodeClass> TestNodeWrapper<NodeClass>::Create(GraphImpl* graph,
                                                               Args&&... args) {
   // Dispatch to a helper so that we can use partial specialization.
   std::unique_ptr<NodeClass> node =
@@ -101,7 +101,7 @@
 template <>
 class TestNodeWrapper<SystemNodeImpl> {
  public:
-  static TestNodeWrapper<SystemNodeImpl> Create(Graph* graph) {
+  static TestNodeWrapper<SystemNodeImpl> Create(GraphImpl* graph) {
     return TestNodeWrapper<SystemNodeImpl>(graph->FindOrCreateSystemNode());
   }
 
@@ -140,11 +140,11 @@
 
  protected:
   base::test::ScopedTaskEnvironment& task_env() { return task_env_; }
-  Graph* graph() { return &graph_; }
+  GraphImpl* graph() { return &graph_; }
 
  private:
   base::test::ScopedTaskEnvironment task_env_;
-  Graph graph_;
+  GraphImpl graph_;
 };
 
 }  // namespace performance_manager
diff --git a/chrome/browser/performance_manager/graph/mock_graphs.cc b/chrome/browser/performance_manager/graph/mock_graphs.cc
index bf5a503..83a6a09 100644
--- a/chrome/browser/performance_manager/graph/mock_graphs.cc
+++ b/chrome/browser/performance_manager/graph/mock_graphs.cc
@@ -16,7 +16,7 @@
 
 namespace performance_manager {
 
-TestProcessNodeImpl::TestProcessNodeImpl(Graph* graph)
+TestProcessNodeImpl::TestProcessNodeImpl(GraphImpl* graph)
     : ProcessNodeImpl(graph) {}
 
 void TestProcessNodeImpl::SetProcessWithPid(base::ProcessId pid,
@@ -26,7 +26,7 @@
 }
 
 MockSinglePageInSingleProcessGraph::MockSinglePageInSingleProcessGraph(
-    Graph* graph)
+    GraphImpl* graph)
     : system(TestNodeWrapper<SystemNodeImpl>::Create(graph)),
       process(TestNodeWrapper<TestProcessNodeImpl>::Create(graph)),
       page(TestNodeWrapper<PageNodeImpl>::Create(graph, nullptr)),
@@ -45,7 +45,7 @@
 }
 
 MockMultiplePagesInSingleProcessGraph::MockMultiplePagesInSingleProcessGraph(
-    Graph* graph)
+    GraphImpl* graph)
     : MockSinglePageInSingleProcessGraph(graph),
       other_page(TestNodeWrapper<PageNodeImpl>::Create(graph, nullptr)),
       other_frame(TestNodeWrapper<FrameNodeImpl>::Create(graph,
@@ -64,7 +64,7 @@
 }
 
 MockSinglePageWithMultipleProcessesGraph::
-    MockSinglePageWithMultipleProcessesGraph(Graph* graph)
+    MockSinglePageWithMultipleProcessesGraph(GraphImpl* graph)
     : MockSinglePageInSingleProcessGraph(graph),
       other_process(TestNodeWrapper<TestProcessNodeImpl>::Create(graph)),
       child_frame(TestNodeWrapper<FrameNodeImpl>::Create(graph,
@@ -82,7 +82,7 @@
     ~MockSinglePageWithMultipleProcessesGraph() = default;
 
 MockMultiplePagesWithMultipleProcessesGraph::
-    MockMultiplePagesWithMultipleProcessesGraph(Graph* graph)
+    MockMultiplePagesWithMultipleProcessesGraph(GraphImpl* graph)
     : MockMultiplePagesInSingleProcessGraph(graph),
       other_process(TestNodeWrapper<TestProcessNodeImpl>::Create(graph)),
       child_frame(TestNodeWrapper<FrameNodeImpl>::Create(graph,
diff --git a/chrome/browser/performance_manager/graph/mock_graphs.h b/chrome/browser/performance_manager/graph/mock_graphs.h
index 94d7a00a..5df6575 100644
--- a/chrome/browser/performance_manager/graph/mock_graphs.h
+++ b/chrome/browser/performance_manager/graph/mock_graphs.h
@@ -10,7 +10,7 @@
 
 namespace performance_manager {
 
-class Graph;
+class GraphImpl;
 class FrameNodeImpl;
 class PageNodeImpl;
 class SystemNodeImpl;
@@ -19,7 +19,7 @@
 // process' PID.
 class TestProcessNodeImpl : public ProcessNodeImpl {
  public:
-  explicit TestProcessNodeImpl(Graph* graph);
+  explicit TestProcessNodeImpl(GraphImpl* graph);
 
   void SetProcessWithPid(base::ProcessId pid,
                          base::Process process,
@@ -38,7 +38,7 @@
 // Pr: process(pid:1)
 // Pg: page
 struct MockSinglePageInSingleProcessGraph {
-  explicit MockSinglePageInSingleProcessGraph(Graph* graph);
+  explicit MockSinglePageInSingleProcessGraph(GraphImpl* graph);
   ~MockSinglePageInSingleProcessGraph();
   TestNodeWrapper<SystemNodeImpl> system;
   TestNodeWrapper<TestProcessNodeImpl> process;
@@ -61,7 +61,7 @@
 // Pr: process(pid:1)
 struct MockMultiplePagesInSingleProcessGraph
     : public MockSinglePageInSingleProcessGraph {
-  explicit MockMultiplePagesInSingleProcessGraph(Graph* graph);
+  explicit MockMultiplePagesInSingleProcessGraph(GraphImpl* graph);
   ~MockMultiplePagesInSingleProcessGraph();
   TestNodeWrapper<PageNodeImpl> other_page;
   TestNodeWrapper<FrameNodeImpl> other_frame;
@@ -85,7 +85,7 @@
 // OPr: other_process(pid:2)
 struct MockSinglePageWithMultipleProcessesGraph
     : public MockSinglePageInSingleProcessGraph {
-  explicit MockSinglePageWithMultipleProcessesGraph(Graph* graph);
+  explicit MockSinglePageWithMultipleProcessesGraph(GraphImpl* graph);
   ~MockSinglePageWithMultipleProcessesGraph();
   TestNodeWrapper<TestProcessNodeImpl> other_process;
   TestNodeWrapper<FrameNodeImpl> child_frame;
@@ -111,7 +111,7 @@
 // OPr: other_process(pid:2)
 struct MockMultiplePagesWithMultipleProcessesGraph
     : public MockMultiplePagesInSingleProcessGraph {
-  explicit MockMultiplePagesWithMultipleProcessesGraph(Graph* graph);
+  explicit MockMultiplePagesWithMultipleProcessesGraph(GraphImpl* graph);
   ~MockMultiplePagesWithMultipleProcessesGraph();
   TestNodeWrapper<TestProcessNodeImpl> other_process;
   TestNodeWrapper<FrameNodeImpl> child_frame;
diff --git a/chrome/browser/performance_manager/graph/node_attached_data.cc b/chrome/browser/performance_manager/graph/node_attached_data.cc
index 7f76d75c..6204af0 100644
--- a/chrome/browser/performance_manager/graph/node_attached_data.cc
+++ b/chrome/browser/performance_manager/graph/node_attached_data.cc
@@ -7,7 +7,7 @@
 #include <utility>
 
 #include "base/logging.h"
-#include "chrome/browser/performance_manager/graph/graph.h"
+#include "chrome/browser/performance_manager/graph/graph_impl.h"
 #include "chrome/browser/performance_manager/graph/node_base.h"
 
 namespace performance_manager {
@@ -23,7 +23,7 @@
 void NodeAttachedData::AttachInMap(const NodeBase* node,
                                    std::unique_ptr<NodeAttachedData> data) {
   CHECK(data->CanAttach(node->type()));
-  Graph::NodeAttachedDataKey data_key = std::make_pair(node, data->key());
+  GraphImpl::NodeAttachedDataKey data_key = std::make_pair(node, data->key());
   auto& map = node->graph()->node_attached_data_map_;
   DCHECK(!base::ContainsKey(map, data_key));
   map[data_key] = std::move(data);
@@ -32,7 +32,7 @@
 // static
 NodeAttachedData* NodeAttachedData::GetFromMap(const NodeBase* node,
                                                const void* key) {
-  Graph::NodeAttachedDataKey data_key = std::make_pair(node, key);
+  GraphImpl::NodeAttachedDataKey data_key = std::make_pair(node, key);
   auto& map = node->graph()->node_attached_data_map_;
   auto it = map.find(data_key);
   if (it == map.end())
@@ -45,7 +45,7 @@
 std::unique_ptr<NodeAttachedData> NodeAttachedData::DetachFromMap(
     const NodeBase* node,
     const void* key) {
-  Graph::NodeAttachedDataKey data_key = std::make_pair(node, key);
+  GraphImpl::NodeAttachedDataKey data_key = std::make_pair(node, key);
   auto& map = node->graph()->node_attached_data_map_;
   auto it = map.find(data_key);
 
diff --git a/chrome/browser/performance_manager/graph/node_attached_data.h b/chrome/browser/performance_manager/graph/node_attached_data.h
index cc0eeb5..d577dbe 100644
--- a/chrome/browser/performance_manager/graph/node_attached_data.h
+++ b/chrome/browser/performance_manager/graph/node_attached_data.h
@@ -9,7 +9,7 @@
 
 #include "base/logging.h"
 #include "base/macros.h"
-#include "chrome/browser/performance_manager/graph/node_type.h"
+#include "chrome/browser/performance_manager/public/graph/node_type.h"
 
 namespace performance_manager {
 
diff --git a/chrome/browser/performance_manager/graph/node_attached_data_unittest.cc b/chrome/browser/performance_manager/graph/node_attached_data_unittest.cc
index 91c6b4e..73bc6c2 100644
--- a/chrome/browser/performance_manager/graph/node_attached_data_unittest.cc
+++ b/chrome/browser/performance_manager/graph/node_attached_data_unittest.cc
@@ -8,7 +8,7 @@
 
 #include "base/test/gtest_util.h"
 #include "chrome/browser/performance_manager/graph/frame_node_impl.h"
-#include "chrome/browser/performance_manager/graph/graph.h"
+#include "chrome/browser/performance_manager/graph/graph_impl.h"
 #include "chrome/browser/performance_manager/graph/graph_test_harness.h"
 #include "chrome/browser/performance_manager/graph/mock_graphs.h"
 #include "chrome/browser/performance_manager/graph/node_attached_data_impl.h"
@@ -29,7 +29,7 @@
 // A dummy node type so that we can exercise node attached storage code paths.
 class DummyNode : public NodeBase {
  public:
-  explicit DummyNode(Graph* graph)
+  explicit DummyNode(GraphImpl* graph)
       : NodeBase(NodeTypeEnum::kInvalidType, graph) {}
 
   ~DummyNode() override = default;
diff --git a/chrome/browser/performance_manager/graph/node_base.cc b/chrome/browser/performance_manager/graph/node_base.cc
index ecf7061..b932506 100644
--- a/chrome/browser/performance_manager/graph/node_base.cc
+++ b/chrome/browser/performance_manager/graph/node_base.cc
@@ -6,12 +6,12 @@
 
 #include <utility>
 
-#include "chrome/browser/performance_manager/graph/graph.h"
+#include "chrome/browser/performance_manager/graph/graph_impl.h"
 #include "chrome/browser/performance_manager/observers/graph_observer.h"
 
 namespace performance_manager {
 
-NodeBase::NodeBase(NodeTypeEnum node_type, Graph* graph)
+NodeBase::NodeBase(NodeTypeEnum node_type, GraphImpl* graph)
     : graph_(graph), type_(node_type) {}
 
 NodeBase::~NodeBase() {
diff --git a/chrome/browser/performance_manager/graph/node_base.h b/chrome/browser/performance_manager/graph/node_base.h
index 6345d776..c639b42 100644
--- a/chrome/browser/performance_manager/graph/node_base.h
+++ b/chrome/browser/performance_manager/graph/node_base.h
@@ -14,10 +14,9 @@
 #include "base/macros.h"
 #include "base/observer_list.h"
 #include "base/sequence_checker.h"
-#include "chrome/browser/performance_manager/graph/graph.h"
-#include "chrome/browser/performance_manager/graph/node_type.h"
 #include "chrome/browser/performance_manager/graph/properties.h"
 #include "chrome/browser/performance_manager/observers/graph_observer.h"
+#include "chrome/browser/performance_manager/public/graph/node_type.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
@@ -25,7 +24,7 @@
 
 namespace performance_manager {
 
-class Graph;
+class GraphImpl;
 
 // NodeBase implements shared functionality among different types of graph
 // nodes. A specific type of graph node will derive from this class and can
@@ -37,7 +36,7 @@
  public:
   // TODO(siggi): Don't store the node type, expose it on a virtual function
   //    instead.
-  NodeBase(NodeTypeEnum type, Graph* graph);
+  NodeBase(NodeTypeEnum type, GraphImpl* graph);
   virtual ~NodeBase();
 
   void AddObserver(GraphObserver* observer);
@@ -47,7 +46,7 @@
   NodeTypeEnum type() const { return type_; }
 
   // May be called on any sequence.
-  Graph* graph() const { return graph_; }
+  GraphImpl* graph() const { return graph_; }
 
   const base::ObserverList<GraphObserver>::Unchecked& observers() const {
     return observers_;
@@ -59,7 +58,7 @@
   static int64_t GetSerializationId(NodeBase* node);
 
  protected:
-  friend class Graph;
+  friend class GraphImpl;
 
   // Called just before joining |graph_|, a good opportunity to initialize
   // node state.
@@ -68,7 +67,7 @@
   // node state.
   virtual void LeaveGraph();
 
-  Graph* const graph_;
+  GraphImpl* const graph_;
   const NodeTypeEnum type_;
 
   // Assigned on first use, immutable from that point forward.
@@ -87,7 +86,8 @@
  public:
   using ObservedProperty = ObservedPropertyImpl<NodeClass, GraphObserver>;
 
-  explicit TypedNodeBase(Graph* graph) : NodeBase(NodeClass::Type(), graph) {}
+  explicit TypedNodeBase(GraphImpl* graph)
+      : NodeBase(NodeClass::Type(), graph) {}
 
   static const NodeClass* FromNodeBase(const NodeBase* node) {
     DCHECK_EQ(node->type(), NodeClass::Type());
@@ -104,7 +104,7 @@
 class CoordinationUnitInterface : public TypedNodeBase<NodeClass>,
                                   public MojoInterfaceClass {
  public:
-  explicit CoordinationUnitInterface(Graph* graph)
+  explicit CoordinationUnitInterface(GraphImpl* graph)
       : TypedNodeBase<NodeClass>(graph) {}
 
   ~CoordinationUnitInterface() override = default;
diff --git a/chrome/browser/performance_manager/graph/page_node_impl.cc b/chrome/browser/performance_manager/graph/page_node_impl.cc
index 4ed8a84..cc61c5e 100644
--- a/chrome/browser/performance_manager/graph/page_node_impl.cc
+++ b/chrome/browser/performance_manager/graph/page_node_impl.cc
@@ -10,6 +10,7 @@
 #include "base/stl_util.h"
 #include "base/time/default_tick_clock.h"
 #include "chrome/browser/performance_manager/graph/frame_node_impl.h"
+#include "chrome/browser/performance_manager/graph/graph_impl.h"
 #include "chrome/browser/performance_manager/graph/process_node_impl.h"
 #include "chrome/browser/performance_manager/observers/graph_observer.h"
 #include "chrome/browser/performance_manager/performance_manager_clock.h"
@@ -42,7 +43,7 @@
 
 }  // namespace
 
-PageNodeImpl::PageNodeImpl(Graph* graph,
+PageNodeImpl::PageNodeImpl(GraphImpl* graph,
                            const base::WeakPtr<WebContentsProxy>& weak_contents)
     : TypedNodeBase(graph),
       contents_proxy_(weak_contents),
diff --git a/chrome/browser/performance_manager/graph/page_node_impl.h b/chrome/browser/performance_manager/graph/page_node_impl.h
index d3320a0..f027137a 100644
--- a/chrome/browser/performance_manager/graph/page_node_impl.h
+++ b/chrome/browser/performance_manager/graph/page_node_impl.h
@@ -29,7 +29,7 @@
 
   static constexpr NodeTypeEnum Type() { return NodeTypeEnum::kPage; }
 
-  explicit PageNodeImpl(Graph* graph,
+  explicit PageNodeImpl(GraphImpl* graph,
                         const base::WeakPtr<WebContentsProxy>& contents_proxy);
   ~PageNodeImpl() override;
 
diff --git a/chrome/browser/performance_manager/graph/page_node_impl_unittest.cc b/chrome/browser/performance_manager/graph/page_node_impl_unittest.cc
index b9f78ea..b955961 100644
--- a/chrome/browser/performance_manager/graph/page_node_impl_unittest.cc
+++ b/chrome/browser/performance_manager/graph/page_node_impl_unittest.cc
@@ -194,7 +194,7 @@
 }
 
 void ExpectInitialInterventionPolicyAggregationWorks(
-    Graph* mock_graph,
+    GraphImpl* mock_graph,
     resource_coordinator::mojom::InterventionPolicy f0_policy,
     resource_coordinator::mojom::InterventionPolicy f1_policy,
     resource_coordinator::mojom::InterventionPolicy f0_policy_aggregated,
diff --git a/chrome/browser/performance_manager/graph/process_node_impl.cc b/chrome/browser/performance_manager/graph/process_node_impl.cc
index 58c3a07..e5f767c6 100644
--- a/chrome/browser/performance_manager/graph/process_node_impl.cc
+++ b/chrome/browser/performance_manager/graph/process_node_impl.cc
@@ -6,11 +6,12 @@
 
 #include "base/logging.h"
 #include "chrome/browser/performance_manager/graph/frame_node_impl.h"
+#include "chrome/browser/performance_manager/graph/graph_impl.h"
 #include "chrome/browser/performance_manager/graph/page_node_impl.h"
 
 namespace performance_manager {
 
-ProcessNodeImpl::ProcessNodeImpl(Graph* graph)
+ProcessNodeImpl::ProcessNodeImpl(GraphImpl* graph)
     : CoordinationUnitInterface(graph) {
   DETACH_FROM_SEQUENCE(sequence_checker_);
 }
diff --git a/chrome/browser/performance_manager/graph/process_node_impl.h b/chrome/browser/performance_manager/graph/process_node_impl.h
index b9affea..e5bd27ff 100644
--- a/chrome/browser/performance_manager/graph/process_node_impl.h
+++ b/chrome/browser/performance_manager/graph/process_node_impl.h
@@ -38,10 +38,10 @@
  public:
   static constexpr NodeTypeEnum Type() { return NodeTypeEnum::kProcess; }
 
-  explicit ProcessNodeImpl(Graph* graph);
+  explicit ProcessNodeImpl(GraphImpl* graph);
   ~ProcessNodeImpl() override;
 
-  // resource_coordinator::mojom::ProcessCoordinationUnit implementation.
+  // resource_coordinator::mojom::ProcessCoordinationUnit implementation:
   void SetExpectedTaskQueueingDuration(base::TimeDelta duration) override;
   void SetMainThreadTaskLoadIsLow(bool main_thread_task_load_is_low) override;
 
diff --git a/chrome/browser/performance_manager/graph/system_node_impl.cc b/chrome/browser/performance_manager/graph/system_node_impl.cc
index bef2d26b..e630354 100644
--- a/chrome/browser/performance_manager/graph/system_node_impl.cc
+++ b/chrome/browser/performance_manager/graph/system_node_impl.cc
@@ -12,6 +12,7 @@
 #include "base/process/process_handle.h"
 
 #include "chrome/browser/performance_manager/graph/frame_node_impl.h"
+#include "chrome/browser/performance_manager/graph/graph_impl.h"
 #include "chrome/browser/performance_manager/graph/page_node_impl.h"
 #include "chrome/browser/performance_manager/graph/process_node_impl.h"
 
@@ -21,7 +22,7 @@
 ProcessResourceMeasurementBatch::ProcessResourceMeasurementBatch() = default;
 ProcessResourceMeasurementBatch::~ProcessResourceMeasurementBatch() = default;
 
-SystemNodeImpl::SystemNodeImpl(Graph* graph) : TypedNodeBase(graph) {}
+SystemNodeImpl::SystemNodeImpl(GraphImpl* graph) : TypedNodeBase(graph) {}
 
 SystemNodeImpl::~SystemNodeImpl() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
diff --git a/chrome/browser/performance_manager/graph/system_node_impl.h b/chrome/browser/performance_manager/graph/system_node_impl.h
index 99b6f5f..6d185f9 100644
--- a/chrome/browser/performance_manager/graph/system_node_impl.h
+++ b/chrome/browser/performance_manager/graph/system_node_impl.h
@@ -49,7 +49,7 @@
  public:
   static constexpr NodeTypeEnum Type() { return NodeTypeEnum::kSystem; }
 
-  explicit SystemNodeImpl(Graph* graph);
+  explicit SystemNodeImpl(GraphImpl* graph);
   ~SystemNodeImpl() override;
 
   void DistributeMeasurementBatch(
diff --git a/chrome/browser/performance_manager/observers/graph_observer.h b/chrome/browser/performance_manager/observers/graph_observer.h
index 4e48a89..88f0f99 100644
--- a/chrome/browser/performance_manager/observers/graph_observer.h
+++ b/chrome/browser/performance_manager/observers/graph_observer.h
@@ -11,7 +11,7 @@
 namespace performance_manager {
 
 class FrameNodeImpl;
-class Graph;
+class GraphImpl;
 class NodeBase;
 class PageNodeImpl;
 class ProcessNodeImpl;
@@ -78,12 +78,12 @@
   // SystemNodeImpl notifications.
   virtual void OnProcessCPUUsageReady(SystemNodeImpl* system_node) {}
 
-  void set_node_graph(Graph* graph) { node_graph_ = graph; }
+  void set_node_graph(GraphImpl* graph) { node_graph_ = graph; }
 
-  Graph* graph() const { return node_graph_; }
+  GraphImpl* graph() const { return node_graph_; }
 
  private:
-  Graph* node_graph_ = nullptr;
+  GraphImpl* node_graph_ = nullptr;
 
   DISALLOW_COPY_AND_ASSIGN(GraphObserver);
 };
diff --git a/chrome/browser/performance_manager/observers/graph_observer_unittest.cc b/chrome/browser/performance_manager/observers/graph_observer_unittest.cc
index a5088833..81dbe513 100644
--- a/chrome/browser/performance_manager/observers/graph_observer_unittest.cc
+++ b/chrome/browser/performance_manager/observers/graph_observer_unittest.cc
@@ -8,7 +8,7 @@
 
 #include "base/process/process_handle.h"
 #include "chrome/browser/performance_manager/graph/frame_node_impl.h"
-#include "chrome/browser/performance_manager/graph/graph.h"
+#include "chrome/browser/performance_manager/graph/graph_impl.h"
 #include "chrome/browser/performance_manager/graph/graph_test_harness.h"
 #include "chrome/browser/performance_manager/graph/process_node_impl.h"
 #include "services/resource_coordinator/public/mojom/coordination_unit.mojom.h"
diff --git a/chrome/browser/performance_manager/observers/metrics_collector.cc b/chrome/browser/performance_manager/observers/metrics_collector.cc
index b42247c..bf4bbe6 100644
--- a/chrome/browser/performance_manager/observers/metrics_collector.cc
+++ b/chrome/browser/performance_manager/observers/metrics_collector.cc
@@ -9,7 +9,7 @@
 #include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_macros.h"
 #include "chrome/browser/performance_manager/graph/frame_node_impl.h"
-#include "chrome/browser/performance_manager/graph/graph.h"
+#include "chrome/browser/performance_manager/graph/graph_impl.h"
 #include "chrome/browser/performance_manager/graph/page_node_impl.h"
 #include "chrome/browser/performance_manager/graph/process_node_impl.h"
 #include "chrome/browser/performance_manager/performance_manager_clock.h"
diff --git a/chrome/browser/performance_manager/performance_manager.cc b/chrome/browser/performance_manager/performance_manager.cc
index 5da8a683..100ae26 100644
--- a/chrome/browser/performance_manager/performance_manager.cc
+++ b/chrome/browser/performance_manager/performance_manager.cc
@@ -145,7 +145,7 @@
 void AddNodeAndInvokeCreationCallback(
     base::OnceCallback<void(NodeType*)> callback,
     NodeType* node,
-    Graph* graph) {
+    GraphImpl* graph) {
   graph->AddNewNode(node);
   if (!callback.is_null())
     std::move(callback).Run(node);
diff --git a/chrome/browser/performance_manager/performance_manager.h b/chrome/browser/performance_manager/performance_manager.h
index b5f985d6..883ffff 100644
--- a/chrome/browser/performance_manager/performance_manager.h
+++ b/chrome/browser/performance_manager/performance_manager.h
@@ -14,7 +14,7 @@
 #include "base/location.h"
 #include "base/sequence_checker.h"
 #include "base/sequenced_task_runner.h"
-#include "chrome/browser/performance_manager/graph/graph.h"
+#include "chrome/browser/performance_manager/graph/graph_impl.h"
 #include "chrome/browser/performance_manager/performance_manager.h"
 #include "chrome/browser/performance_manager/web_contents_proxy.h"
 #include "chrome/browser/performance_manager/webui_graph_dump_impl.h"
@@ -56,7 +56,7 @@
 
   // Invokes |graph_callback| on the performance manager's sequence, with the
   // graph as a parameter.
-  using GraphCallback = base::OnceCallback<void(Graph*)>;
+  using GraphCallback = base::OnceCallback<void(GraphImpl*)>;
   void CallOnGraph(const base::Location& from_here,
                    GraphCallback graph_callback);
 
@@ -139,7 +139,7 @@
 
   // The performance task runner.
   const scoped_refptr<base::SequencedTaskRunner> task_runner_;
-  Graph graph_;
+  GraphImpl graph_;
 
   // The registered graph observers.
   std::vector<std::unique_ptr<GraphObserver>> observers_;
diff --git a/chrome/browser/performance_manager/performance_manager_tab_helper_unittest.cc b/chrome/browser/performance_manager/performance_manager_tab_helper_unittest.cc
index aad2257..3be0c3465 100644
--- a/chrome/browser/performance_manager/performance_manager_tab_helper_unittest.cc
+++ b/chrome/browser/performance_manager/performance_manager_tab_helper_unittest.cc
@@ -67,7 +67,7 @@
     EXPECT_NE(0u, hosts.size());
 
     PerformanceManager::GetInstance()->CallOnGraph(
-        FROM_HERE, base::BindLambdaForTesting([num_hosts](Graph* graph) {
+        FROM_HERE, base::BindLambdaForTesting([num_hosts](GraphImpl* graph) {
           EXPECT_GE(num_hosts, graph->GetAllProcessNodes().size());
           EXPECT_EQ(4u, graph->GetAllFrameNodes().size());
 
@@ -113,7 +113,7 @@
     size_t num_hosts = CountAllRenderProcessHosts();
 
     PerformanceManager::GetInstance()->CallOnGraph(
-        FROM_HERE, base::BindLambdaForTesting([num_hosts](Graph* graph) {
+        FROM_HERE, base::BindLambdaForTesting([num_hosts](GraphImpl* graph) {
           EXPECT_GE(num_hosts, graph->GetAllProcessNodes().size());
           EXPECT_EQ(0u, graph->GetAllFrameNodes().size());
           ASSERT_EQ(0u, graph->GetAllPageNodes().size());
diff --git a/chrome/browser/performance_manager/performance_manager_unittest.cc b/chrome/browser/performance_manager/performance_manager_unittest.cc
index 58d3e39..fe9ef22 100644
--- a/chrome/browser/performance_manager/performance_manager_unittest.cc
+++ b/chrome/browser/performance_manager/performance_manager_unittest.cc
@@ -123,7 +123,7 @@
       performance_manager()->CreatePageNode(nullptr);
 
   PerformanceManager::GraphCallback graph_callback = base::BindLambdaForTesting(
-      [&page_node](Graph* graph) { EXPECT_EQ(page_node->graph(), graph); });
+      [&page_node](GraphImpl* graph) { EXPECT_EQ(page_node->graph(), graph); });
 
   performance_manager()->CallOnGraph(FROM_HERE, std::move(graph_callback));
   RunUntilIdle();
diff --git a/chrome/browser/performance_manager/graph/node_type.h b/chrome/browser/performance_manager/public/graph/node_type.h
similarity index 62%
rename from chrome/browser/performance_manager/graph/node_type.h
rename to chrome/browser/performance_manager/public/graph/node_type.h
index 6209588..83d313d 100644
--- a/chrome/browser/performance_manager/graph/node_type.h
+++ b/chrome/browser/performance_manager/public/graph/node_type.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_PERFORMANCE_MANAGER_GRAPH_NODE_TYPE_H_
-#define CHROME_BROWSER_PERFORMANCE_MANAGER_GRAPH_NODE_TYPE_H_
+#ifndef CHROME_BROWSER_PERFORMANCE_MANAGER_PUBLIC_GRAPH_NODE_TYPE_H_
+#define CHROME_BROWSER_PERFORMANCE_MANAGER_PUBLIC_GRAPH_NODE_TYPE_H_
 
 #include <stdint.h>
 
@@ -19,4 +19,4 @@
 
 }  // namespace performance_manager
 
-#endif  // CHROME_BROWSER_PERFORMANCE_MANAGER_GRAPH_NODE_TYPE_H_
+#endif  // CHROME_BROWSER_PERFORMANCE_MANAGER_PUBLIC_GRAPH_NODE_TYPE_H_
diff --git a/chrome/browser/performance_manager/web_contents_proxy_unittest.cc b/chrome/browser/performance_manager/web_contents_proxy_unittest.cc
index ef82440..fd640f9 100644
--- a/chrome/browser/performance_manager/web_contents_proxy_unittest.cc
+++ b/chrome/browser/performance_manager/web_contents_proxy_unittest.cc
@@ -52,7 +52,7 @@
     base::RunLoop run_loop;
     PerformanceManager::GetInstance()->CallOnGraph(
         FROM_HERE, base::BindLambdaForTesting([&run_loop, &deref_proxy,
-                                               page_node](Graph* graph) {
+                                               page_node](GraphImpl* graph) {
           base::PostTaskWithTraits(
               FROM_HERE, {content::BrowserThread::UI},
               base::BindOnce(deref_proxy, page_node->contents_proxy(),
@@ -70,7 +70,7 @@
     PerformanceManager::GetInstance()->CallOnGraph(
         FROM_HERE,
         base::BindLambdaForTesting([&contents, &run_loop, &deref_proxy,
-                                    page_node](Graph* graph) {
+                                    page_node](GraphImpl* graph) {
           base::PostTaskWithTraits(
               FROM_HERE, {content::BrowserThread::UI},
               base::BindLambdaForTesting([&contents]() { contents.reset(); }));
diff --git a/chrome/browser/performance_manager/webui_graph_dump_impl.cc b/chrome/browser/performance_manager/webui_graph_dump_impl.cc
index e80ddc7..419d666 100644
--- a/chrome/browser/performance_manager/webui_graph_dump_impl.cc
+++ b/chrome/browser/performance_manager/webui_graph_dump_impl.cc
@@ -6,13 +6,13 @@
 
 #include "base/macros.h"
 #include "chrome/browser/performance_manager/graph/frame_node_impl.h"
-#include "chrome/browser/performance_manager/graph/graph.h"
+#include "chrome/browser/performance_manager/graph/graph_impl.h"
 #include "chrome/browser/performance_manager/graph/page_node_impl.h"
 #include "chrome/browser/performance_manager/graph/process_node_impl.h"
 
 namespace performance_manager {
 
-WebUIGraphDumpImpl::WebUIGraphDumpImpl(Graph* graph)
+WebUIGraphDumpImpl::WebUIGraphDumpImpl(GraphImpl* graph)
     : graph_(graph), binding_(this) {
   DCHECK(graph);
 }
diff --git a/chrome/browser/performance_manager/webui_graph_dump_impl.h b/chrome/browser/performance_manager/webui_graph_dump_impl.h
index a04c29a..514918c 100644
--- a/chrome/browser/performance_manager/webui_graph_dump_impl.h
+++ b/chrome/browser/performance_manager/webui_graph_dump_impl.h
@@ -10,11 +10,11 @@
 
 namespace performance_manager {
 
-class Graph;
+class GraphImpl;
 
 class WebUIGraphDumpImpl : public resource_coordinator::mojom::WebUIGraphDump {
  public:
-  explicit WebUIGraphDumpImpl(Graph* graph);
+  explicit WebUIGraphDumpImpl(GraphImpl* graph);
   ~WebUIGraphDumpImpl() override;
 
   // WebUIGraphDump implementation.
@@ -25,7 +25,7 @@
             base::OnceClosure error_handler);
 
  private:
-  Graph* graph_;
+  GraphImpl* graph_;
   mojo::Binding<resource_coordinator::mojom::WebUIGraphDump> binding_;
 
   DISALLOW_COPY_AND_ASSIGN(WebUIGraphDumpImpl);
diff --git a/chrome/browser/performance_manager/webui_graph_dump_impl_unittest.cc b/chrome/browser/performance_manager/webui_graph_dump_impl_unittest.cc
index 45e835a..99a8618 100644
--- a/chrome/browser/performance_manager/webui_graph_dump_impl_unittest.cc
+++ b/chrome/browser/performance_manager/webui_graph_dump_impl_unittest.cc
@@ -17,7 +17,7 @@
 class WebUIGraphDumpImplTest : public GraphTestHarness {};
 
 TEST_F(WebUIGraphDumpImplTest, Create) {
-  Graph graph;
+  GraphImpl graph;
   MockMultiplePagesWithMultipleProcessesGraph mock_graph(&graph);
 
   base::TimeTicks now = PerformanceManagerClock::NowTicks();
diff --git a/chrome/browser/picture_in_picture/picture_in_picture_window_controller_browsertest.cc b/chrome/browser/picture_in_picture/picture_in_picture_window_controller_browsertest.cc
index 8a4fcf4..c5e035d 100644
--- a/chrome/browser/picture_in_picture/picture_in_picture_window_controller_browsertest.cc
+++ b/chrome/browser/picture_in_picture/picture_in_picture_window_controller_browsertest.cc
@@ -18,6 +18,11 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/browser/ui/views/overlay/mute_image_button.h"
+#include "chrome/browser/ui/views/overlay/overlay_window_views.h"
+#include "chrome/browser/ui/views/overlay/playback_image_button.h"
+#include "chrome/browser/ui/views/overlay/skip_ad_label_button.h"
+#include "chrome/browser/ui/views/overlay/track_image_button.h"
 #include "chrome/common/web_application_info.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
@@ -41,16 +46,8 @@
 #include "ui/aura/window.h"
 #include "ui/events/base_event_utils.h"
 #include "ui/gfx/codec/png_codec.h"
-
-#if !defined(OS_ANDROID)
-#include "chrome/browser/ui/views/overlay/mute_image_button.h"
-#include "chrome/browser/ui/views/overlay/overlay_window_views.h"
-#include "chrome/browser/ui/views/overlay/playback_image_button.h"
-#include "chrome/browser/ui/views/overlay/skip_ad_label_button.h"
-#include "chrome/browser/ui/views/overlay/track_image_button.h"
 #include "ui/views/controls/button/image_button.h"
 #include "ui/views/widget/widget_observer.h"
-#endif
 
 #if defined(OS_CHROMEOS)
 #include "ash/accelerators/accelerator_controller.h"
@@ -143,7 +140,6 @@
     EXPECT_TRUE(result);
   }
 
-#if !defined(OS_ANDROID)
   class WidgetBoundsChangeWaiter : public views::WidgetObserver {
    public:
     explicit WidgetBoundsChangeWaiter(views::Widget* widget)
@@ -175,7 +171,6 @@
                               ui::EF_NONE, ui::EF_NONE);
     window->OnMouseEvent(&moved_over);
   }
-#endif  // !defined(OS_ANDROID)
 
  private:
   content::PictureInPictureWindowController* pip_window_controller_ = nullptr;
@@ -270,7 +265,8 @@
             base::BindOnce(
                 &PictureInPicturePixelComparisonBrowserTest::ReadbackResult,
                 base::Unretained(this), run_loop.QuitClosure()));
-    overlay_window_views->GetLayer()->RequestCopyOfOutput(std::move(request));
+    overlay_window_views->GetLayerForTesting()->RequestCopyOfOutput(
+        std::move(request));
     run_loop.Run();
   }
 
@@ -409,8 +405,6 @@
   ui_test_utils::NavigateToURL(browser(), test_page_url);
 }
 
-#if !defined(OS_ANDROID)
-
 // Tests that when creating a Picture-in-Picture window a size is sent to the
 // caller and if the window is resized, the caller is also notified.
 IN_PROC_BROWSER_TEST_F(PictureInPictureWindowControllerBrowserTest,
@@ -447,8 +441,6 @@
                 .WaitAndGetTitle());
 }
 
-#endif  // !defined(OS_ANDROID)
-
 // Tests that when closing a Picture-in-Picture window, the video element is
 // reflected as no longer in Picture-in-Picture.
 IN_PROC_BROWSER_TEST_F(PictureInPictureWindowControllerBrowserTest,
@@ -712,13 +704,11 @@
                                           &is_paused));
   EXPECT_FALSE(is_paused);
 
-#if !defined(OS_ANDROID)
   OverlayWindowViews* overlay_window = static_cast<OverlayWindowViews*>(
       window_controller()->GetWindowForTesting());
 
   EXPECT_EQ(overlay_window->playback_state_for_testing(),
             OverlayWindowViews::PlaybackState::kPaused);
-#endif
 }
 
 // Tests that resetting video src when video is in Picture-in-Picture session
@@ -728,8 +718,11 @@
   LoadTabAndEnterPictureInPicture(browser());
 
   EXPECT_TRUE(window_controller()->GetWindowForTesting()->IsVisible());
-  EXPECT_TRUE(
-      window_controller()->GetWindowForTesting()->GetVideoLayer()->visible());
+
+  OverlayWindowViews* overlay_window = static_cast<OverlayWindowViews*>(
+      window_controller()->GetWindowForTesting());
+
+  EXPECT_TRUE(overlay_window->video_layer_for_testing()->visible());
 
   content::WebContents* active_web_contents =
       browser()->tab_strip_model()->GetActiveWebContents();
@@ -741,8 +734,7 @@
   EXPECT_TRUE(in_picture_in_picture);
 
   EXPECT_TRUE(window_controller()->GetWindowForTesting()->IsVisible());
-  EXPECT_TRUE(
-      window_controller()->GetWindowForTesting()->GetVideoLayer()->visible());
+  EXPECT_TRUE(overlay_window->video_layer_for_testing()->visible());
 }
 
 // Tests that updating video src when video is in Picture-in-Picture session
@@ -752,8 +744,11 @@
   LoadTabAndEnterPictureInPicture(browser());
 
   EXPECT_TRUE(window_controller()->GetWindowForTesting()->IsVisible());
-  EXPECT_TRUE(
-      window_controller()->GetWindowForTesting()->GetVideoLayer()->visible());
+
+  OverlayWindowViews* overlay_window = static_cast<OverlayWindowViews*>(
+      window_controller()->GetWindowForTesting());
+
+  EXPECT_TRUE(overlay_window->video_layer_for_testing()->visible());
 
   content::WebContents* active_web_contents =
       browser()->tab_strip_model()->GetActiveWebContents();
@@ -768,16 +763,9 @@
   EXPECT_TRUE(in_picture_in_picture);
 
   EXPECT_TRUE(window_controller()->GetWindowForTesting()->IsVisible());
-  EXPECT_TRUE(
-      window_controller()->GetWindowForTesting()->GetVideoLayer()->visible());
-
-#if !defined(OS_ANDROID)
-  OverlayWindowViews* overlay_window = static_cast<OverlayWindowViews*>(
-      window_controller()->GetWindowForTesting());
-
   EXPECT_FALSE(
       overlay_window->controls_parent_view_for_testing()->layer()->visible());
-#endif
+  EXPECT_TRUE(overlay_window->video_layer_for_testing()->visible());
 }
 
 // Tests that changing video src to media stream when video is in
@@ -788,8 +776,11 @@
   LoadTabAndEnterPictureInPicture(browser());
 
   EXPECT_TRUE(window_controller()->GetWindowForTesting()->IsVisible());
-  EXPECT_TRUE(
-      window_controller()->GetWindowForTesting()->GetVideoLayer()->visible());
+
+  OverlayWindowViews* overlay_window = static_cast<OverlayWindowViews*>(
+      window_controller()->GetWindowForTesting());
+
+  EXPECT_TRUE(overlay_window->video_layer_for_testing()->visible());
 
   content::WebContents* active_web_contents =
       browser()->tab_strip_model()->GetActiveWebContents();
@@ -804,16 +795,9 @@
   EXPECT_TRUE(in_picture_in_picture);
 
   EXPECT_TRUE(window_controller()->GetWindowForTesting()->IsVisible());
-  EXPECT_TRUE(
-      window_controller()->GetWindowForTesting()->GetVideoLayer()->visible());
-
-#if !defined(OS_ANDROID)
-  OverlayWindowViews* overlay_window = static_cast<OverlayWindowViews*>(
-      window_controller()->GetWindowForTesting());
-
   EXPECT_FALSE(
       overlay_window->controls_parent_view_for_testing()->layer()->visible());
-#endif
+  EXPECT_TRUE(overlay_window->video_layer_for_testing()->visible());
 }
 
 // Tests that we can enter Picture-in-Picture when a video is not preloaded,
@@ -1155,8 +1139,6 @@
   EXPECT_FALSE(window_controller()->GetWindowForTesting()->IsVisible());
 }
 
-#if !defined(OS_ANDROID)
-
 // Tests that when a new surface id is sent to the Picture-in-Picture window, it
 // doesn't move back to its default position.
 IN_PROC_BROWSER_TEST_F(PictureInPictureWindowControllerBrowserTest,
@@ -1246,8 +1228,6 @@
   EXPECT_FALSE(is_paused);
 
   EXPECT_TRUE(window_controller()->GetWindowForTesting()->IsVisible());
-  EXPECT_TRUE(
-      window_controller()->GetWindowForTesting()->GetVideoLayer()->visible());
 
   OverlayWindowViews* overlay_window = static_cast<OverlayWindowViews*>(
       window_controller()->GetWindowForTesting());
@@ -1255,6 +1235,8 @@
   EXPECT_EQ(overlay_window->playback_state_for_testing(),
             OverlayWindowViews::PlaybackState::kPlaying);
 
+  EXPECT_TRUE(overlay_window->video_layer_for_testing()->visible());
+
   ASSERT_TRUE(
       content::ExecuteScript(active_web_contents, "exitPictureInPicture();"));
 
@@ -1340,8 +1322,6 @@
   EXPECT_TRUE(overlay_window->IsVisible());
 }
 
-#endif  // !defined(OS_ANDROID)
-
 // This checks that a video in Picture-in-Picture with preload none, when
 // changing source willproperly update the associated media player id. This is
 // checked by closing the window because the test it at a too high level to be
@@ -1643,7 +1623,6 @@
 
 #endif  // defined(OS_CHROMEOS)
 
-#if !defined(OS_ANDROID)
 // Tests that the Play/Pause button is displayed appropriately in the
 // Picture-in-Picture window.
 IN_PROC_BROWSER_TEST_F(PictureInPictureWindowControllerBrowserTest,
@@ -1680,7 +1659,6 @@
   EXPECT_TRUE(
       overlay_window->play_pause_controls_view_for_testing()->IsDrawn());
 }
-#endif
 
 // Check that page visibility API events are fired when tab is hidden, shown,
 // and even occluded.
@@ -1804,7 +1782,6 @@
   base::test::ScopedFeatureList scoped_feature_list_;
 };
 
-#if !defined(OS_ANDROID)
 // Tests that a Skip Ad button is displayed in the Picture-in-Picture window
 // when Media Session Action "skipad" is handled by the website.
 IN_PROC_BROWSER_TEST_F(MediaSessionPictureInPictureWindowControllerBrowserTest,
@@ -1923,7 +1900,6 @@
   EXPECT_TRUE(
       overlay_window->play_pause_controls_view_for_testing()->IsDrawn());
 }
-#endif
 
 // Tests that a Next Track button is displayed in the Picture-in-Picture window
 // when Media Session Action "nexttrack" is handled by the website.
@@ -2705,8 +2681,6 @@
                 .WaitAndGetTitle());
 }
 
-#if !defined(OS_ANDROID)
-
 class MuteButtonPictureInPictureWindowControllerBrowserTest
     : public PictureInPictureWindowControllerBrowserTest {
  public:
@@ -2896,5 +2870,3 @@
   EXPECT_EQ(overlay_window->muted_state_for_testing(),
             OverlayWindowViews::MutedState::kNoAudio);
 }
-
-#endif  // #if !defined(OS_ANDROID)
diff --git a/chrome/browser/previews/previews_lite_page_browsertest.cc b/chrome/browser/previews/previews_lite_page_browsertest.cc
index af2579a..b41b8bf 100644
--- a/chrome/browser/previews/previews_lite_page_browsertest.cc
+++ b/chrome/browser/previews/previews_lite_page_browsertest.cc
@@ -1094,6 +1094,18 @@
 
 IN_PROC_BROWSER_TEST_P(
     PreviewsLitePageServerBrowserTest,
+    DISABLE_ON_WIN_MAC_CHROMESOS(CoinFlipHoldbackTriggering)) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeatureWithParameters(
+      {previews::features::kCoinFlipHoldback},
+      {{"force_coin_flip_always_holdback", "true"}});
+
+  ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kSuccess));
+  VerifyPreviewNotLoaded();
+}
+
+IN_PROC_BROWSER_TEST_P(
+    PreviewsLitePageServerBrowserTest,
     DISABLE_ON_WIN_MAC_CHROMESOS(LitePagePreviewsLoadOriginal)) {
   base::HistogramTester histogram_tester;
   ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kSuccess));
diff --git a/chrome/browser/previews/previews_lite_page_navigation_throttle.cc b/chrome/browser/previews/previews_lite_page_navigation_throttle.cc
index 1fa983f..e4ba4839 100644
--- a/chrome/browser/previews/previews_lite_page_navigation_throttle.cc
+++ b/chrome/browser/previews/previews_lite_page_navigation_throttle.cc
@@ -318,8 +318,11 @@
       tab_helper ? (tab_helper->GetPreviewsUserData(navigation_handle()))
                  : nullptr;
 
-  if (!previews_data || !(previews_data->allowed_previews_state() &
-                          content::LITE_PAGE_REDIRECT_ON)) {
+  if (!previews_data ||
+      !(previews_data->allowed_previews_state() &
+        content::LITE_PAGE_REDIRECT_ON) ||
+      previews_data->coin_flip_holdback_result() ==
+          previews::CoinFlipHoldbackResult::kHoldback) {
     return false;
   }
 
diff --git a/chrome/browser/resource_coordinator/tab_lifecycle_unit_source.cc b/chrome/browser/resource_coordinator/tab_lifecycle_unit_source.cc
index 58e38d30..5dc7025 100644
--- a/chrome/browser/resource_coordinator/tab_lifecycle_unit_source.cc
+++ b/chrome/browser/resource_coordinator/tab_lifecycle_unit_source.cc
@@ -9,7 +9,7 @@
 #include "base/stl_util.h"
 #include "base/task/post_task.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/performance_manager/graph/graph.h"
+#include "chrome/browser/performance_manager/graph/graph_impl.h"
 #include "chrome/browser/performance_manager/graph/page_node_impl.h"
 #include "chrome/browser/performance_manager/performance_manager.h"
 #include "chrome/browser/performance_manager/web_contents_proxy.h"
diff --git a/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_graphics_tracing_ui.js b/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_graphics_tracing_ui.js
index de992026..338a071 100644
--- a/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_graphics_tracing_ui.js
+++ b/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_graphics_tracing_ui.js
@@ -1098,7 +1098,7 @@
     var totalWidth = bandsWidth + columnsWidth;
     bands.setWidth(totalWidth);
 
-    for (i = 0; i < pids.length; i++) {
+    for (var i = 0; i < pids.length; i++) {
       var pid = pids[i];
       var threads = threadsPerPid[pid].threads;
       var processName;
@@ -1132,7 +1132,7 @@
 
       bands.nextYOffset += (processInfoHeight + padding);
 
-      for (j = 0; j < threads.length; j++) {
+      for (var j = 0; j < threads.length; j++) {
         var tid = threads[j].tid;
         bands.addBand(
             new Events(eventsPerTid[tid].events, 0, 1), cpuBandHeight, padding);
@@ -1452,7 +1452,7 @@
   var chromeBands = new EventBands(
       chromeTitle, 'arc-events-band', resolution, 0, model.duration);
   chromeBands.setWidth(chromeBands.timestampToOffset(model.duration));
-  for (i = 0; i < model.chrome.buffers.length; i++) {
+  for (var i = 0; i < model.chrome.buffers.length; i++) {
     chromeBands.addBand(
         new Events(model.chrome.buffers[i], 500, 599), topBandHeight,
         topBandPadding);
@@ -1477,7 +1477,7 @@
       model.android.global_events, 405 /* kSurfaceFlingerCompositionJank */,
       405 /* kSurfaceFlingerCompositionJank */));
 
-  for (i = 0; i < model.views.length; i++) {
+  for (var i = 0; i < model.views.length; i++) {
     var view = model.views[i];
     var activityTitleText;
     var icon;
@@ -1493,7 +1493,7 @@
     var activityBands = new EventBands(
         activityTitle, 'arc-events-band', resolution, 0, model.duration);
     activityBands.setWidth(activityBands.timestampToOffset(model.duration));
-    for (j = 0; j < view.buffers.length; j++) {
+    for (var j = 0; j < view.buffers.length; j++) {
       // Android buffer events.
       activityBands.addBand(
           new Events(view.buffers[j], 100, 199), innerBandHeight,
diff --git a/chrome/browser/resources/print_preview/print_preview.html b/chrome/browser/resources/print_preview/print_preview.html
index b9f98af..4bbfa95 100644
--- a/chrome/browser/resources/print_preview/print_preview.html
+++ b/chrome/browser/resources/print_preview/print_preview.html
@@ -49,7 +49,7 @@
       content: '';
       display: block;
       height: 100%;
-      width: 326px;  /* --print-preview-sidebar-width */
+      width: 384px;  /* --print-preview-sidebar-width */
     }
 
     [new-print-preview-layout].loading body::before {
diff --git a/chrome/browser/resources/print_preview/ui/destination_select.html b/chrome/browser/resources/print_preview/ui/destination_select.html
index a7dd8886..54a9487 100644
--- a/chrome/browser/resources/print_preview/ui/destination_select.html
+++ b/chrome/browser/resources/print_preview/ui/destination_select.html
@@ -23,10 +23,11 @@
         --printer-icon-size: 20px;
       }
 
-      .md-select {
+      select.md-select {
         background-position: var(--printer-icon-side-padding) center,
             calc(100% - var(--md-select-side-padding)) center;
         background-size: var(--printer-icon-size), var(--md-arrow-width);
+        margin: 2px;
         padding-inline-start: 32px;
         --md-select-width: calc(100% - 4px);
       }
diff --git a/chrome/browser/resources/print_preview/ui/destination_settings.html b/chrome/browser/resources/print_preview/ui/destination_settings.html
index 2e686dc3d..1f53fe3 100644
--- a/chrome/browser/resources/print_preview/ui/destination_settings.html
+++ b/chrome/browser/resources/print_preview/ui/destination_settings.html
@@ -49,7 +49,7 @@
       #destinationSelect {
         /* Reduce margin by 2px so that the <select> inside this element will
            be aligned with others after adding margin for the border. */
-        margin-inline-start: calc(var(--print-preview-sidebar-margin) - 2px);
+        margin: 0 calc(var(--print-preview-sidebar-margin) - 2px);
       }
 
       #destination-status-wrapper,
diff --git a/chrome/browser/resources/print_preview/ui/dpi_settings.html b/chrome/browser/resources/print_preview/ui/dpi_settings.html
index 1f534bf..a9c68bbe 100644
--- a/chrome/browser/resources/print_preview/ui/dpi_settings.html
+++ b/chrome/browser/resources/print_preview/ui/dpi_settings.html
@@ -10,6 +10,9 @@
 <dom-module id="print-preview-dpi-settings">
   <template>
     <style include="print-preview-shared">
+      :host print-preview-settings-select {
+        margin: 0 calc(var(--print-preview-sidebar-margin) - 2px);
+      }
     </style>
     <print-preview-settings-section>
       <span id="dpi-label" slot="title">$i18n{dpiLabel}</span>
diff --git a/chrome/browser/resources/print_preview/ui/header.html b/chrome/browser/resources/print_preview/ui/header.html
index 30d16a7..4a88f67 100644
--- a/chrome/browser/resources/print_preview/ui/header.html
+++ b/chrome/browser/resources/print_preview/ui/header.html
@@ -18,10 +18,7 @@
       :host {
         border-bottom: var(--print-preview-settings-border);
         display: block;
-        padding-bottom: 8px;
-        padding-inline-end: 16px;
-        padding-inline-start: 19px;
-        padding-top: 20px;
+        padding: 20px var(--print-preview-sidebar-margin) 8px;
       }
 
       :host-context(html:not([dark])) {
diff --git a/chrome/browser/resources/print_preview/ui/header_new.html b/chrome/browser/resources/print_preview/ui/header_new.html
index 8187496..88746dd 100644
--- a/chrome/browser/resources/print_preview/ui/header_new.html
+++ b/chrome/browser/resources/print_preview/ui/header_new.html
@@ -17,7 +17,7 @@
         align-items: center;
         display: flex;
         justify-content: space-between;
-        padding: 20px 16px 12px;
+        padding: 20px var(--print-preview-sidebar-margin) 12px;
       }
 
       :host-context(html:not([dark])) {
diff --git a/chrome/browser/resources/print_preview/ui/link_container.html b/chrome/browser/resources/print_preview/ui/link_container.html
index 875819d..3268cb4 100644
--- a/chrome/browser/resources/print_preview/ui/link_container.html
+++ b/chrome/browser/resources/print_preview/ui/link_container.html
@@ -42,7 +42,7 @@
         align-items: center;
         display: flex;
         min-height: 46px;
-        padding: 0 19px;
+        padding: 0 var(--print-preview-sidebar-margin);
       }
 
       #systemDialogLink {
diff --git a/chrome/browser/resources/print_preview/ui/media_size_settings.html b/chrome/browser/resources/print_preview/ui/media_size_settings.html
index 03223df..fb55307 100644
--- a/chrome/browser/resources/print_preview/ui/media_size_settings.html
+++ b/chrome/browser/resources/print_preview/ui/media_size_settings.html
@@ -8,6 +8,9 @@
 <dom-module id="print-preview-media-size-settings">
   <template>
     <style include="print-preview-shared">
+      :host print-preview-settings-select {
+        margin: 0 calc(var(--print-preview-sidebar-margin) - 2px);
+      }
     </style>
     <print-preview-settings-section>
       <span id="media-size-label" slot="title">$i18n{mediaSizeLabel}</span>
diff --git a/chrome/browser/resources/print_preview/ui/more_settings.html b/chrome/browser/resources/print_preview/ui/more_settings.html
index 5bb57a4..994e944 100644
--- a/chrome/browser/resources/print_preview/ui/more_settings.html
+++ b/chrome/browser/resources/print_preview/ui/more_settings.html
@@ -10,6 +10,7 @@
   <template>
     <style include="cr-hidden-style print-preview-shared">
       :host {
+        border-top: var(--print-preview-settings-border);
         display: block;
       }
 
@@ -19,16 +20,14 @@
 
       div {
         align-items: center;
-        border-top: var(--print-preview-settings-border);
         display: flex;
         font: inherit;
-        margin: 0 auto;
+        margin: 0 var(--print-preview-sidebar-margin);
         min-height: 48px;
-        padding: 0 var(--print-preview-sidebar-padding);
       }
 
       :host cr-expand-button {
-        margin-inline-end: 4px;
+        margin-inline-end: 6px;
         --cr-expand-button-size: 28px;
       }
 
diff --git a/chrome/browser/resources/print_preview/ui/print_preview_shared_css.html b/chrome/browser/resources/print_preview/ui/print_preview_shared_css.html
index a4cd75ef..cfacf959 100644
--- a/chrome/browser/resources/print_preview/ui/print_preview_shared_css.html
+++ b/chrome/browser/resources/print_preview/ui/print_preview_shared_css.html
@@ -9,7 +9,8 @@
     <style include="cr-shared-style">
       /* Default state ********************************************************/
       select.md-select {
-        margin: 2px;
+        margin-bottom: 2px;
+        margin-top: 2px;
         min-height: 32px;
         padding-bottom: 1px;
       <if expr="is_win or is_macosx">
@@ -21,6 +22,7 @@
         padding-inline-end: 32px;
         padding-top: 1px;
         user-select: none;
+        --md-select-width: calc(100% - 2 * var(--print-preview-sidebar-margin));
       }
 
       .checkbox cr-checkbox {
@@ -47,7 +49,7 @@
       }
 
       print-preview-settings-section [slot=controls] > * {
-        margin-inline-start: var(--print-preview-sidebar-margin);
+        margin: 0 var(--print-preview-sidebar-margin);
       }
 
       /* Default print preview dialog styles. */
diff --git a/chrome/browser/resources/print_preview/ui/print_preview_vars_css.html b/chrome/browser/resources/print_preview/ui/print_preview_vars_css.html
index 948b8de3..3ded67f 100644
--- a/chrome/browser/resources/print_preview/ui/print_preview_vars_css.html
+++ b/chrome/browser/resources/print_preview/ui/print_preview_vars_css.html
@@ -7,17 +7,13 @@
 <style>
   html {
     --print-preview-row-height: 38px;
-    --print-preview-sidebar-width: 326px;
-    --print-preview-sidebar-padding: 20px;
-    --print-preview-title-width: 100px;
-    --print-preview-sidebar-margin: 15px;
+    --print-preview-sidebar-width: 384px;
+    --print-preview-title-width: 120px;
+    --print-preview-sidebar-margin: 24px;
 
     --cr-input-row-container: {
       min-height: var(--print-preview-row-height);
     };
-    /* Full width - sidebar margin - 2px for end focus ring border */
-    --md-select-width: calc(
-        100% - var(--print-preview-sidebar-margin) - 2px);
     --print-preview-settings-border: 1px solid var(--google-grey-200);
     --print-preview-dialog-margin: 34px;
     --print-preview-disabled-label: {
diff --git a/chrome/browser/resources/print_preview/ui/settings_section.html b/chrome/browser/resources/print_preview/ui/settings_section.html
index d25422b..42248000 100644
--- a/chrome/browser/resources/print_preview/ui/settings_section.html
+++ b/chrome/browser/resources/print_preview/ui/settings_section.html
@@ -8,7 +8,7 @@
     <style include="print-preview-shared">
       :host {
         display: flex;
-        padding: 0 var(--print-preview-sidebar-padding);
+        padding-inline-start: var(--print-preview-sidebar-margin);
       }
 
       ::slotted([slot=controls]),
diff --git a/chrome/browser/resources/print_preview/ui/settings_select.html b/chrome/browser/resources/print_preview/ui/settings_select.html
index 60fc2b36..b5d8e61 100644
--- a/chrome/browser/resources/print_preview/ui/settings_select.html
+++ b/chrome/browser/resources/print_preview/ui/settings_select.html
@@ -10,6 +10,7 @@
   <template>
     <style include="print-preview-shared md-select">
       select.md-select {
+        margin: 2px;
         --md-select-width: calc(100% - 4px);
       }
     </style>
diff --git a/chrome/browser/safe_browsing/safe_browsing_service.cc b/chrome/browser/safe_browsing/safe_browsing_service.cc
index d22ce50..d7141a4 100644
--- a/chrome/browser/safe_browsing/safe_browsing_service.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_service.cc
@@ -42,6 +42,7 @@
 #include "components/safe_browsing/db/database_manager.h"
 #include "components/safe_browsing/ping_manager.h"
 #include "components/safe_browsing/triggers/trigger_manager.h"
+#include "components/safe_browsing/web_ui/safe_browsing_ui.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/notification_service.h"
@@ -174,6 +175,9 @@
           base::BindRepeating(&SafeBrowsingService::CreateNetworkContextParams,
                               base::Unretained(this)));
 
+  WebUIInfoSingleton::GetInstance()->set_network_context(
+      network_context_.get());
+
   ui_manager_ = CreateUIManager();
 
   navigation_observer_manager_ = new SafeBrowsingNavigationObserverManager();
diff --git a/chrome/browser/search/local_ntp_source.cc b/chrome/browser/search/local_ntp_source.cc
index 002556f..d714cfa9 100644
--- a/chrome/browser/search/local_ntp_source.cc
+++ b/chrome/browser/search/local_ntp_source.cc
@@ -143,12 +143,12 @@
      "image/jpg"},
 };
 
-// This enum must match the numbering for NTPSearchSuggestionsRequestStatus in
+// This enum must match the numbering for NTPSearchSuggestionsRequestStatusi in
 // enums.xml. Do not reorder or remove items, and update kMaxValue when new
 // items are added.
 enum class SearchSuggestionsRequestStatus {
   UNKNOWN_ERROR = 0,
-  SENT = 1,
+  RECEIVED_RESPONSE = 1,
   SIGNED_OUT = 2,
   OPTED_OUT = 3,
   IMPRESSION_CAP = 4,
@@ -1146,7 +1146,7 @@
   base::TimeTicks now = base::TimeTicks::Now();
   for (const auto& request : search_suggest_requests_) {
     base::TimeDelta delta = now - request.start_time;
-    UMA_HISTOGRAM_MEDIUM_TIMES("NewTabPage.SearchSuggestions.RequestLatency",
+    UMA_HISTOGRAM_MEDIUM_TIMES("NewTabPage.SearchSuggestions.RequestLatencyV2",
                                delta);
     SearchSuggestionsRequestStatus request_status =
         SearchSuggestionsRequestStatus::UNKNOWN_ERROR;
@@ -1159,16 +1159,24 @@
       request_status = SearchSuggestionsRequestStatus::IMPRESSION_CAP;
     } else if (result == SearchSuggestLoader::Status::REQUESTS_FROZEN) {
       request_status = SearchSuggestionsRequestStatus::FROZEN;
-    } else if (result == SearchSuggestLoader::Status::OK) {
-      request_status = SearchSuggestionsRequestStatus::SENT;
+    } else if (result == SearchSuggestLoader::Status::OK_WITH_SUGGESTIONS) {
+      request_status = SearchSuggestionsRequestStatus::RECEIVED_RESPONSE;
       UMA_HISTOGRAM_MEDIUM_TIMES(
-          "NewTabPage.SearchSuggestions.RequestLatency.Success", delta);
+          "NewTabPage.SearchSuggestions.RequestLatencyV2."
+          "SuccessWithSuggestions",
+          delta);
+    } else if (result == SearchSuggestLoader::Status::OK_WITHOUT_SUGGESTIONS) {
+      request_status = SearchSuggestionsRequestStatus::RECEIVED_RESPONSE;
+      UMA_HISTOGRAM_MEDIUM_TIMES(
+          "NewTabPage.SearchSuggestions.RequestLatencyV2."
+          "SuccessWithoutSuggestions",
+          delta);
     } else if (result == SearchSuggestLoader::Status::FATAL_ERROR) {
       request_status = SearchSuggestionsRequestStatus::FATAL_ERROR;
       UMA_HISTOGRAM_MEDIUM_TIMES(
-          "NewTabPage.SearchSuggestions.RequestLatency.Failure", delta);
+          "NewTabPage.SearchSuggestions.RequestLatencyV2.Failure", delta);
     }
-    UMA_HISTOGRAM_ENUMERATION("NewTabPage.SearchSuggestions.RequestStatus",
+    UMA_HISTOGRAM_ENUMERATION("NewTabPage.SearchSuggestions.RequestStatusV2",
                               request_status);
   }
   search_suggest_requests_.clear();
@@ -1185,7 +1193,8 @@
   base::Optional<SearchSuggestData> data =
       search_suggest_service_->search_suggest_data();
 
-  if (data.has_value()) {
+  if (search_suggest_service_->search_suggest_status() ==
+      SearchSuggestLoader::Status::OK_WITH_SUGGESTIONS) {
     search_suggest_service_->SuggestionsDisplayed();
   }
   scoped_refptr<base::RefCountedString> result;
diff --git a/chrome/browser/search/search_suggest/search_suggest_loader.h b/chrome/browser/search/search_suggest/search_suggest_loader.h
index 8209726c..ace379c 100644
--- a/chrome/browser/search/search_suggest/search_suggest_loader.h
+++ b/chrome/browser/search/search_suggest/search_suggest_loader.h
@@ -17,8 +17,10 @@
 class SearchSuggestLoader {
  public:
   enum class Status {
-    // Received a valid response.
-    OK,
+    // Received a valid response that contained search suggestions.
+    OK_WITH_SUGGESTIONS,
+    // Received a valid response that did not contain search suggestions.
+    OK_WITHOUT_SUGGESTIONS,
     // User is signed out, no request was made.
     SIGNED_OUT,
     // Some transient error occurred, e.g. the network request failed because
diff --git a/chrome/browser/search/search_suggest/search_suggest_loader_impl.cc b/chrome/browser/search/search_suggest/search_suggest_loader_impl.cc
index 4b81c7af..b10c2da 100644
--- a/chrome/browser/search/search_suggest/search_suggest_loader_impl.cc
+++ b/chrome/browser/search/search_suggest/search_suggest_loader_impl.cc
@@ -37,71 +37,82 @@
 
 const char kSearchSuggestResponsePreamble[] = ")]}'";
 
-base::Optional<SearchSuggestData> JsonToSearchSuggestionData(
-    const base::Value& value) {
+// Parses an update proto from |value|. Will return false if |value|
+// is not of the form:
+// {"update":{"query_suggestions":{"query_suggestions_with_html": "", "script":
+// "", impression_cap_expire_time_ms: "", request_freeze_time_ms: "",
+// max_impressions: ""}}}.
+// Additionally |data| will be base::nullopt if "query_suggestions" keys is not
+// present.
+bool JsonToSearchSuggestionData(const base::Value& value,
+                                base::Optional<SearchSuggestData>& data) {
+  data = base::nullopt;
+
+  bool all_fields_present = true;
+
   const base::DictionaryValue* dict = nullptr;
   if (!value.GetAsDictionary(&dict)) {
     DVLOG(1) << "Parse error: top-level dictionary not found";
-    return base::nullopt;
+    return false;
   }
 
   const base::DictionaryValue* update = nullptr;
   if (!dict->GetDictionary("update", &update)) {
     DVLOG(1) << "Parse error: no update";
-    return base::nullopt;
+    return false;
   }
 
   const base::DictionaryValue* query_suggestions = nullptr;
   if (!update->GetDictionary("query_suggestions", &query_suggestions)) {
     DVLOG(1) << "Parse error: no query_suggestions";
-    return base::nullopt;
+    return false;
   }
 
+  SearchSuggestData result;
+  data = result;
+
   std::string suggestions_html = std::string();
   if (!query_suggestions->GetString("query_suggestions_with_html",
                                     &suggestions_html)) {
     DVLOG(1) << "Parse error: no query_suggestions_with_html";
-    return base::nullopt;
+    all_fields_present = false;
   }
 
-  SearchSuggestData result;
-  result.suggestions_html = suggestions_html;
-
   std::string end_of_body_script = std::string();
   if (!query_suggestions->GetString("script", &end_of_body_script)) {
     DVLOG(1) << "Parse error: no script";
-    return base::nullopt;
+    all_fields_present = false;
   }
 
-  result.end_of_body_script = end_of_body_script;
-
   int impression_cap_expire_time_ms;
   if (!query_suggestions->GetInteger("impression_cap_expire_time_ms",
                                      &impression_cap_expire_time_ms)) {
     DVLOG(1) << "Parse error: no impression_cap_expire_time_ms";
-    return base::nullopt;
+    all_fields_present = false;
   }
 
-  result.impression_cap_expire_time_ms = impression_cap_expire_time_ms;
-
   int request_freeze_time_ms;
   if (!query_suggestions->GetInteger("request_freeze_time_ms",
                                      &request_freeze_time_ms)) {
     DVLOG(1) << "Parse error: no request_freeze_time_ms";
-    return base::nullopt;
+    all_fields_present = false;
   }
 
-  result.request_freeze_time_ms = request_freeze_time_ms;
-
   int max_impressions;
   if (!query_suggestions->GetInteger("max_impressions", &max_impressions)) {
     DVLOG(1) << "Parse error: no max_impressions";
-    return base::nullopt;
+    all_fields_present = false;
   }
 
+  result.suggestions_html = suggestions_html;
+  result.end_of_body_script = end_of_body_script;
+  result.impression_cap_expire_time_ms = impression_cap_expire_time_ms;
+  result.request_freeze_time_ms = request_freeze_time_ms;
   result.max_impressions = max_impressions;
 
-  return result;
+  data = result;
+
+  return all_fields_present;
 }
 
 }  // namespace
@@ -267,8 +278,14 @@
 }
 
 void SearchSuggestLoaderImpl::JsonParsed(std::unique_ptr<base::Value> value) {
-  base::Optional<SearchSuggestData> result = JsonToSearchSuggestionData(*value);
-  Respond(result.has_value() ? Status::OK : Status::FATAL_ERROR, result);
+  base::Optional<SearchSuggestData> result;
+  if (JsonToSearchSuggestionData(*value, result)) {
+    Respond(Status::OK_WITH_SUGGESTIONS, result);
+  } else if (result.has_value()) {
+    Respond(Status::OK_WITHOUT_SUGGESTIONS, result);
+  } else {
+    Respond(Status::FATAL_ERROR, result);
+  }
 }
 
 void SearchSuggestLoaderImpl::JsonParseFailed(const std::string& message) {
diff --git a/chrome/browser/search/search_suggest/search_suggest_loader_impl_unittest.cc b/chrome/browser/search/search_suggest/search_suggest_loader_impl_unittest.cc
index f5b5b20..5950459 100644
--- a/chrome/browser/search/search_suggest/search_suggest_loader_impl_unittest.cc
+++ b/chrome/browser/search/search_suggest/search_suggest_loader_impl_unittest.cc
@@ -38,11 +38,14 @@
 
 const char kApplicationLocale[] = "us";
 
-const char kMinimalValidResponse[] = R"json({"update": { "query_suggestions": {
-  "query_suggestions_with_html": "", "script": "",
-  "impression_cap_expire_time_ms": 0, "request_freeze_time_ms": 0,
-  "max_impressions": 0
-}}})json";
+const char kMinimalValidResponseNoSuggestions[] =
+    R"json({"update": { "query_suggestions": { "impression_cap_expire_time_ms":
+     1, "request_freeze_time_ms": 2, "max_impressions": 3}}})json";
+
+const char kMinimalValidResponseWithSuggestions[] =
+    R"json({"update": { "query_suggestions": {"query_suggestions_with_html":
+    "<div></div>", "script": "<script></script>","impression_cap_expire_time_ms"
+    : 1, "request_freeze_time_ms": 2,"max_impressions": 3}}})json";
 
 // Required to instantiate a GoogleUrlTracker in UNIT_TEST_MODE.
 class GoogleURLTrackerClientStub : public GoogleURLTrackerClient {
@@ -138,7 +141,7 @@
 };
 
 TEST_F(SearchSuggestLoaderImplTest, RequestReturns) {
-  SetUpResponseWithData(kMinimalValidResponse);
+  SetUpResponseWithData(kMinimalValidResponseWithSuggestions);
 
   base::MockCallback<SearchSuggestLoader::SearchSuggestionsCallback> callback;
   std::string blocklist;
@@ -146,7 +149,8 @@
 
   base::Optional<SearchSuggestData> data;
   base::RunLoop loop;
-  EXPECT_CALL(callback, Run(SearchSuggestLoader::Status::OK, _))
+  EXPECT_CALL(callback,
+              Run(SearchSuggestLoader::Status::OK_WITH_SUGGESTIONS, _))
       .WillOnce(DoAll(SaveArg<1>(&data), Quit(&loop)));
   loop.Run();
 
@@ -156,7 +160,8 @@
 TEST_F(SearchSuggestLoaderImplTest, HandlesResponsePreamble) {
   // The response may contain a ")]}'" prefix. The loader should ignore that
   // during parsing.
-  SetUpResponseWithData(std::string(")]}'") + kMinimalValidResponse);
+  SetUpResponseWithData(std::string(")]}'") +
+                        kMinimalValidResponseWithSuggestions);
 
   base::MockCallback<SearchSuggestLoader::SearchSuggestionsCallback> callback;
   std::string blocklist;
@@ -164,7 +169,8 @@
 
   base::Optional<SearchSuggestData> data;
   base::RunLoop loop;
-  EXPECT_CALL(callback, Run(SearchSuggestLoader::Status::OK, _))
+  EXPECT_CALL(callback,
+              Run(SearchSuggestLoader::Status::OK_WITH_SUGGESTIONS, _))
       .WillOnce(DoAll(SaveArg<1>(&data), Quit(&loop)));
   loop.Run();
 
@@ -172,11 +178,7 @@
 }
 
 TEST_F(SearchSuggestLoaderImplTest, ParsesFullResponse) {
-  SetUpResponseWithData(R"json({"update": { "query_suggestions": {
-            "query_suggestions_with_html": "<div></div>",
-            "script": "<script></script>", "impression_cap_expire_time_ms": 1,
-            "request_freeze_time_ms": 2, "max_impressions": 3
-            }}})json");
+  SetUpResponseWithData(kMinimalValidResponseWithSuggestions);
 
   base::MockCallback<SearchSuggestLoader::SearchSuggestionsCallback> callback;
   std::string blocklist;
@@ -184,7 +186,8 @@
 
   base::Optional<SearchSuggestData> data;
   base::RunLoop loop;
-  EXPECT_CALL(callback, Run(SearchSuggestLoader::Status::OK, _))
+  EXPECT_CALL(callback,
+              Run(SearchSuggestLoader::Status::OK_WITH_SUGGESTIONS, _))
       .WillOnce(DoAll(SaveArg<1>(&data), Quit(&loop)));
   loop.Run();
 
@@ -196,8 +199,30 @@
   EXPECT_EQ(3, data->max_impressions);
 }
 
+TEST_F(SearchSuggestLoaderImplTest, ParsesValidResponseWithNoSuggestions) {
+  SetUpResponseWithData(kMinimalValidResponseNoSuggestions);
+
+  base::MockCallback<SearchSuggestLoader::SearchSuggestionsCallback> callback;
+  std::string blocklist;
+  search_suggest_loader()->Load(blocklist, callback.Get());
+
+  base::Optional<SearchSuggestData> data;
+  base::RunLoop loop;
+  EXPECT_CALL(callback,
+              Run(SearchSuggestLoader::Status::OK_WITHOUT_SUGGESTIONS, _))
+      .WillOnce(DoAll(SaveArg<1>(&data), Quit(&loop)));
+  loop.Run();
+
+  ASSERT_TRUE(data.has_value());
+  EXPECT_EQ(std::string(), data->suggestions_html);
+  EXPECT_EQ(std::string(), data->end_of_body_script);
+  EXPECT_EQ(1, data->impression_cap_expire_time_ms);
+  EXPECT_EQ(2, data->request_freeze_time_ms);
+  EXPECT_EQ(3, data->max_impressions);
+}
+
 TEST_F(SearchSuggestLoaderImplTest, CoalescesMultipleRequests) {
-  SetUpResponseWithData(kMinimalValidResponse);
+  SetUpResponseWithData(kMinimalValidResponseWithSuggestions);
 
   // Trigger two requests.
   base::MockCallback<SearchSuggestLoader::SearchSuggestionsCallback>
@@ -213,9 +238,11 @@
   base::Optional<SearchSuggestData> second_data;
 
   base::RunLoop loop;
-  EXPECT_CALL(first_callback, Run(SearchSuggestLoader::Status::OK, _))
+  EXPECT_CALL(first_callback,
+              Run(SearchSuggestLoader::Status::OK_WITH_SUGGESTIONS, _))
       .WillOnce(SaveArg<1>(&first_data));
-  EXPECT_CALL(second_callback, Run(SearchSuggestLoader::Status::OK, _))
+  EXPECT_CALL(second_callback,
+              Run(SearchSuggestLoader::Status::OK_WITH_SUGGESTIONS, _))
       .WillOnce(DoAll(SaveArg<1>(&second_data), Quit(&loop)));
   loop.Run();
 
@@ -240,7 +267,8 @@
 
 // Flaky, see https://crbug.com/923953.
 TEST_F(SearchSuggestLoaderImplTest, DISABLED_InvalidJsonErrorIsFatal) {
-  SetUpResponseWithData(kMinimalValidResponse + std::string(")"));
+  SetUpResponseWithData(kMinimalValidResponseWithSuggestions +
+                        std::string(")"));
 
   base::MockCallback<SearchSuggestLoader::SearchSuggestionsCallback> callback;
   std::string blocklist;
diff --git a/chrome/browser/search/search_suggest/search_suggest_service.cc b/chrome/browser/search/search_suggest/search_suggest_service.cc
index 475e506..22420f3 100644
--- a/chrome/browser/search/search_suggest/search_suggest_service.cc
+++ b/chrome/browser/search/search_suggest/search_suggest_service.cc
@@ -102,7 +102,9 @@
           identity_manager,
           base::BindRepeating(&SearchSuggestService::SigninStatusChanged,
                               base::Unretained(this)))),
-      profile_(profile) {}
+      profile_(profile),
+      search_suggest_data_(base::nullopt),
+      search_suggest_status_(SearchSuggestLoader::Status::FATAL_ERROR) {}
 
 SearchSuggestService::~SearchSuggestService() = default;
 
@@ -120,6 +122,11 @@
   return search_suggest_data_;
 }
 
+const SearchSuggestLoader::Status& SearchSuggestService::search_suggest_status()
+    const {
+  return search_suggest_status_;
+}
+
 void SearchSuggestService::Refresh() {
   const std::string blocklist = GetBlocklistAsString();
   MaybeLoadWithBlocklist(blocklist);
@@ -175,13 +182,16 @@
     DictionaryPrefUpdate update(profile_->GetPrefs(),
                                 prefs::kNtpSearchSuggestionsImpressions);
 
-    if (data.has_value()) {
+    if (status == SearchSuggestLoader::Status::OK_WITH_SUGGESTIONS ||
+        status == SearchSuggestLoader::Status::OK_WITHOUT_SUGGESTIONS) {
       base::DictionaryValue* dict = update.Get();
       dict->SetInteger(kMaxImpressions, data->max_impressions);
       dict->SetInteger(kImpressionCapExpireTimeMs,
                        data->impression_cap_expire_time_ms);
       dict->SetInteger(kRequestFreezeTimeMs, data->request_freeze_time_ms);
-    } else if (status == SearchSuggestLoader::Status::FATAL_ERROR) {
+    }
+
+    if (status == SearchSuggestLoader::Status::OK_WITHOUT_SUGGESTIONS) {
       base::DictionaryValue* dict = update.Get();
       dict->SetBoolean(kIsRequestFrozen, true);
       dict->SetInteger(kRequestFrozenTimeMs, base::Time::Now().ToTimeT());
diff --git a/chrome/browser/search/search_suggest/search_suggest_service.h b/chrome/browser/search/search_suggest/search_suggest_service.h
index 59077fc..813dda7 100644
--- a/chrome/browser/search/search_suggest/search_suggest_service.h
+++ b/chrome/browser/search/search_suggest/search_suggest_service.h
@@ -40,9 +40,7 @@
   // Virtual for testing.
   virtual const base::Optional<SearchSuggestData>& search_suggest_data() const;
 
-  const SearchSuggestLoader::Status& search_suggest_status() const {
-    return search_suggest_status_;
-  }
+  virtual const SearchSuggestLoader::Status& search_suggest_status() const;
 
   // Determines if a request for search suggestions should be made. If a request
   // should not be made immediately call SearchSuggestDataLoaded with the
diff --git a/chrome/browser/search/search_suggest/search_suggest_service_unittest.cc b/chrome/browser/search/search_suggest/search_suggest_service_unittest.cc
index 119de9c..19f9207 100644
--- a/chrome/browser/search/search_suggest/search_suggest_service_unittest.cc
+++ b/chrome/browser/search/search_suggest/search_suggest_service_unittest.cc
@@ -159,7 +159,8 @@
 
   // Fulfill it.
   SearchSuggestData data = TestSearchSuggestData();
-  loader()->RespondToAllCallbacks(SearchSuggestLoader::Status::OK, data);
+  loader()->RespondToAllCallbacks(
+      SearchSuggestLoader::Status::OK_WITH_SUGGESTIONS, data);
   EXPECT_EQ(data, service()->search_suggest_data());
 
   // Request another refresh.
@@ -171,7 +172,8 @@
 
   // Fulfill the second request.
   SearchSuggestData other_data = TestSearchSuggestData();
-  loader()->RespondToAllCallbacks(SearchSuggestLoader::Status::OK, other_data);
+  loader()->RespondToAllCallbacks(
+      SearchSuggestLoader::Status::OK_WITH_SUGGESTIONS, other_data);
   EXPECT_EQ(other_data, service()->search_suggest_data());
 }
 
@@ -182,7 +184,8 @@
   // Load some data.
   service()->Refresh();
   SearchSuggestData data = TestSearchSuggestData();
-  loader()->RespondToAllCallbacks(SearchSuggestLoader::Status::OK, data);
+  loader()->RespondToAllCallbacks(
+      SearchSuggestLoader::Status::OK_WITH_SUGGESTIONS, data);
   ASSERT_EQ(data, service()->search_suggest_data());
 
   // Request a refresh and respond with a transient error.
@@ -200,7 +203,8 @@
   // Load some data.
   service()->Refresh();
   SearchSuggestData data = TestSearchSuggestData();
-  loader()->RespondToAllCallbacks(SearchSuggestLoader::Status::OK, data);
+  loader()->RespondToAllCallbacks(
+      SearchSuggestLoader::Status::OK_WITH_SUGGESTIONS, data);
   ASSERT_EQ(data, service()->search_suggest_data());
 
   // Request a refresh and respond with a fatal error.
@@ -218,7 +222,8 @@
   // Load some data.
   service()->Refresh();
   SearchSuggestData data = TestSearchSuggestData();
-  loader()->RespondToAllCallbacks(SearchSuggestLoader::Status::OK, data);
+  loader()->RespondToAllCallbacks(
+      SearchSuggestLoader::Status::OK_WITH_SUGGESTIONS, data);
   ASSERT_EQ(data, service()->search_suggest_data());
 
   // Sign out. This should clear the cached data and notify the observer.
@@ -300,7 +305,8 @@
 
   // Fulfill it.
   SearchSuggestData data = TestSearchSuggestData();
-  loader()->RespondToAllCallbacks(SearchSuggestLoader::Status::OK, data);
+  loader()->RespondToAllCallbacks(
+      SearchSuggestLoader::Status::OK_WITH_SUGGESTIONS, data);
   EXPECT_EQ(data, service()->search_suggest_data());
 
   // Select a suggestion to blocklist.
@@ -312,7 +318,8 @@
   // Fulfill the second request.
   SearchSuggestData other_data;
   other_data.suggestions_html = "<div>Different!</div>";
-  loader()->RespondToAllCallbacks(SearchSuggestLoader::Status::OK, other_data);
+  loader()->RespondToAllCallbacks(
+      SearchSuggestLoader::Status::OK_WITH_SUGGESTIONS, other_data);
   EXPECT_EQ(other_data, service()->search_suggest_data());
 }
 
@@ -328,7 +335,8 @@
 
   // Fulfill it.
   SearchSuggestData data = TestSearchSuggestData();
-  loader()->RespondToAllCallbacks(SearchSuggestLoader::Status::OK, data);
+  loader()->RespondToAllCallbacks(
+      SearchSuggestLoader::Status::OK_WITH_SUGGESTIONS, data);
   EXPECT_EQ(data, service()->search_suggest_data());
 
   // Select a suggestion to blocklist.
@@ -342,7 +350,8 @@
   // Fulfill the second request.
   SearchSuggestData other_data;
   other_data.suggestions_html = "<div>Different!</div>";
-  loader()->RespondToAllCallbacks(SearchSuggestLoader::Status::OK, other_data);
+  loader()->RespondToAllCallbacks(
+      SearchSuggestLoader::Status::OK_WITH_SUGGESTIONS, other_data);
   EXPECT_EQ(other_data, service()->search_suggest_data());
 }
 
@@ -388,7 +397,8 @@
 
   // Fulfill it.
   SearchSuggestData data = TestSearchSuggestData();
-  loader()->RespondToAllCallbacks(SearchSuggestLoader::Status::OK, data);
+  loader()->RespondToAllCallbacks(
+      SearchSuggestLoader::Status::OK_WITH_SUGGESTIONS, data);
   EXPECT_EQ(data, service()->search_suggest_data());
 
   // Request another refresh.
@@ -404,7 +414,8 @@
   other_data.impression_cap_expire_time_ms = 1234;
   other_data.request_freeze_time_ms = 4321;
   other_data.max_impressions = 456;
-  loader()->RespondToAllCallbacks(SearchSuggestLoader::Status::OK, other_data);
+  loader()->RespondToAllCallbacks(
+      SearchSuggestLoader::Status::OK_WITH_SUGGESTIONS, other_data);
   EXPECT_EQ(other_data, service()->search_suggest_data());
 
   // Ensure the pref parses successfully.
@@ -441,7 +452,8 @@
   // Fulfill it.
   SearchSuggestData data = TestSearchSuggestData();
   data.max_impressions = 2;
-  loader()->RespondToAllCallbacks(SearchSuggestLoader::Status::OK, data);
+  loader()->RespondToAllCallbacks(
+      SearchSuggestLoader::Status::OK_WITH_SUGGESTIONS, data);
   EXPECT_EQ(data, service()->search_suggest_data());
   service()->SuggestionsDisplayed();
 
@@ -452,7 +464,9 @@
   // Request another refresh.
   service()->Refresh();
   EXPECT_EQ(1u, loader()->GetCallbackCount());
-  loader()->RespondToAllCallbacks(SearchSuggestLoader::Status::OK, data);
+  data.suggestions_html = "<div>Different!</div>";
+  loader()->RespondToAllCallbacks(
+      SearchSuggestLoader::Status::OK_WITH_SUGGESTIONS, data);
   EXPECT_EQ(data, service()->search_suggest_data());
   service()->SuggestionsDisplayed();
 
@@ -483,7 +497,8 @@
   SearchSuggestData data = TestSearchSuggestData();
   data.max_impressions = 1;
   data.impression_cap_expire_time_ms = 1000;
-  loader()->RespondToAllCallbacks(SearchSuggestLoader::Status::OK, data);
+  loader()->RespondToAllCallbacks(
+      SearchSuggestLoader::Status::OK_WITH_SUGGESTIONS, data);
   EXPECT_EQ(data, service()->search_suggest_data());
   service()->SuggestionsDisplayed();
 
@@ -500,7 +515,8 @@
   // The impression cap timeout has expired.
   service()->Refresh();
   EXPECT_EQ(1u, loader()->GetCallbackCount());
-  loader()->RespondToAllCallbacks(SearchSuggestLoader::Status::OK, data);
+  loader()->RespondToAllCallbacks(
+      SearchSuggestLoader::Status::OK_WITH_SUGGESTIONS, data);
   EXPECT_EQ(data, service()->search_suggest_data());
 }
 
@@ -515,15 +531,16 @@
   // Fulfill it.
   SearchSuggestData data = TestSearchSuggestData();
   data.request_freeze_time_ms = 1000;
-  loader()->RespondToAllCallbacks(SearchSuggestLoader::Status::OK, data);
+  loader()->RespondToAllCallbacks(
+      SearchSuggestLoader::Status::OK_WITH_SUGGESTIONS, data);
   EXPECT_EQ(data, service()->search_suggest_data());
 
   // Request a refresh. That should arrive at the loader.
   service()->Refresh();
   EXPECT_EQ(1u, loader()->GetCallbackCount());
 
-  loader()->RespondToAllCallbacks(SearchSuggestLoader::Status::FATAL_ERROR,
-                                  base::nullopt);
+  loader()->RespondToAllCallbacks(
+      SearchSuggestLoader::Status::OK_WITHOUT_SUGGESTIONS, data);
 
   const base::DictionaryValue* dict =
       pref_service()->GetDictionary(prefs::kNtpSearchSuggestionsImpressions);
@@ -540,6 +557,7 @@
   // The freeze timeout has expired.
   service()->Refresh();
   EXPECT_EQ(1u, loader()->GetCallbackCount());
-  loader()->RespondToAllCallbacks(SearchSuggestLoader::Status::OK, data);
+  loader()->RespondToAllCallbacks(
+      SearchSuggestLoader::Status::OK_WITH_SUGGESTIONS, data);
   EXPECT_EQ(data, service()->search_suggest_data());
 }
diff --git a/chrome/browser/send_tab_to_self/send_tab_to_self_util.cc b/chrome/browser/send_tab_to_self/send_tab_to_self_util.cc
index d74b7d0..fbb19f3 100644
--- a/chrome/browser/send_tab_to_self/send_tab_to_self_util.cc
+++ b/chrome/browser/send_tab_to_self/send_tab_to_self_util.cc
@@ -14,6 +14,7 @@
 #include "components/sync/device_info/device_info.h"
 #include "components/sync/device_info/device_info_sync_service.h"
 #include "components/sync/device_info/device_info_tracker.h"
+#include "components/sync/driver/profile_sync_service.h"
 #include "components/sync/driver/sync_driver_switches.h"
 #include "components/sync/driver/sync_service.h"
 #include "components/sync/driver/sync_user_settings.h"
@@ -33,6 +34,13 @@
          base::FeatureList::IsEnabled(kSendTabToSelfShowSendingUI);
 }
 
+bool IsSyncPaused(Profile* profile) {
+  syncer::ProfileSyncService* service =
+      ProfileSyncServiceFactory::GetAsProfileSyncServiceForProfile(profile);
+  return service->GetDisableReasons() ==
+         syncer::SyncService::DISABLE_REASON_PAUSED;
+}
+
 bool IsUserSyncTypeActive(Profile* profile) {
   SendTabToSelfSyncService* service =
       SendTabToSelfSyncServiceFactory::GetForProfile(profile);
@@ -50,6 +58,12 @@
          device_sync_service->GetDeviceInfoTracker()->CountActiveDevices() > 1;
 }
 
+bool IsSettingRequirementsMet(Profile* profile) {
+  // If sending is enabled, then so is receiving.
+  return IsSendingEnabled() && !IsSyncPaused(profile) &&
+         IsUserSyncTypeActive(profile) && IsSyncingOnMultipleDevices(profile);
+}
+
 bool IsContentRequirementsMet(const GURL& url, Profile* profile) {
   bool is_http_or_https = url.SchemeIsHTTPOrHTTPS();
   bool is_native_page = url.SchemeIs(content::kChromeUIScheme);
@@ -65,9 +79,7 @@
   Profile* profile =
       Profile::FromBrowserContext(web_contents->GetBrowserContext());
 
-  // If sending is enabled, then so is receiving.
-  return IsSendingEnabled() && IsUserSyncTypeActive(profile) &&
-         IsSyncingOnMultipleDevices(profile) &&
+  return IsSettingRequirementsMet(profile) &&
          IsContentRequirementsMet(web_contents->GetURL(), profile);
 }
 
@@ -77,8 +89,7 @@
     return false;
   Profile* profile =
       Profile::FromBrowserContext(web_contents->GetBrowserContext());
-  return IsSendingEnabled() && IsUserSyncTypeActive(profile) &&
-         IsSyncingOnMultipleDevices(profile) &&
+  return IsSettingRequirementsMet(profile) &&
          (IsContentRequirementsMet(web_contents->GetURL(), profile) ||
           IsContentRequirementsMet(link_url, profile));
 }
diff --git a/chrome/browser/send_tab_to_self/send_tab_to_self_util.h b/chrome/browser/send_tab_to_self/send_tab_to_self_util.h
index 80f5c769..fa537de 100644
--- a/chrome/browser/send_tab_to_self/send_tab_to_self_util.h
+++ b/chrome/browser/send_tab_to_self/send_tab_to_self_util.h
@@ -21,12 +21,18 @@
 // flags are enabled.
 bool IsSendingEnabled();
 
+// Return true if the the sync mode is paused.
+bool IsSyncPaused(Profile* profile);
+
 // Returns true if the SendTabToSelf sync datatype is active.
 bool IsUserSyncTypeActive(Profile* profile);
 
 // Returns true if the user syncing on two or more devices.
 bool IsSyncingOnMultipleDevices(Profile* profile);
 
+// Returns true if the flag and sync setting requirements are met.
+bool IsSettingRequirementsMet(Profile* profile);
+
 // Returns true if the tab and web content requirements are met:
 //  User is viewing an HTTP or HTTPS page.
 //  User is not on a native page.
diff --git a/chrome/browser/send_tab_to_self/send_tab_to_self_util_unittest.cc b/chrome/browser/send_tab_to_self/send_tab_to_self_util_unittest.cc
index 1ad5fa8..ced4fa7d 100644
--- a/chrome/browser/send_tab_to_self/send_tab_to_self_util_unittest.cc
+++ b/chrome/browser/send_tab_to_self/send_tab_to_self_util_unittest.cc
@@ -185,6 +185,14 @@
   EXPECT_FALSE(IsReceivingEnabled());
 }
 
+TEST_F(SendTabToSelfUtilTest, IsSyncPaused) {
+  EXPECT_FALSE(IsSyncPaused(profile()));
+
+  test_sync_service_->SetDisableReasons(
+      syncer::SyncService::DISABLE_REASON_PAUSED);
+  EXPECT_TRUE(IsSyncPaused(profile()));
+}
+
 TEST_F(SendTabToSelfUtilTest, IsSyncingOnMultipleDevices_True) {
   mock_device_sync_service_->SetTrackerActiveDevices(2);
 
diff --git a/chrome/browser/site_isolation/site_isolation_policy_unittest.cc b/chrome/browser/site_isolation/site_isolation_policy_unittest.cc
index 2b427ce..866f69b 100644
--- a/chrome/browser/site_isolation/site_isolation_policy_unittest.cc
+++ b/chrome/browser/site_isolation/site_isolation_policy_unittest.cc
@@ -13,6 +13,7 @@
 #include "chrome/test/base/testing_profile_manager.h"
 #include "components/prefs/scoped_user_pref_update.h"
 #include "content/public/browser/site_instance.h"
+#include "content/public/common/content_switches.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -67,8 +68,12 @@
   }
 
   // New SiteInstances for foo.com and bar.com shouldn't require a dedicated
-  // process to start with.
-  {
+  // process to start with.  An exception is if this test runs with a
+  // command-line --site-per-process flag (which might be the case on some
+  // bots).  This will override the feature configuration in this test and make
+  // all sites isolated.
+  if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kSitePerProcess)) {
     scoped_refptr<content::SiteInstance> foo_instance =
         content::SiteInstance::CreateForURL(profile, GURL("http://foo.com/1"));
     EXPECT_FALSE(foo_instance->RequiresDedicatedProcess());
@@ -121,6 +126,13 @@
 // stored isolated origins when site isolation for password sites is off.
 TEST_F(NoPasswordSiteIsolationPolicyTest,
        PersistedIsolatedOriginsIgnoredWithoutPasswordIsolation) {
+  // Running this test with a command-line --site-per-process flag (which might
+  // be the case on some bots) doesn't make sense, as that will make all sites
+  // isolated, overriding the feature configuration in this test.
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kSitePerProcess))
+    return;
+
   EXPECT_FALSE(SiteIsolationPolicy::IsIsolationForPasswordSitesEnabled());
   TestingProfile* profile = manager()->CreateTestingProfile("Test");
 
diff --git a/chrome/browser/transition_manager/full_browser_transition_manager.cc b/chrome/browser/transition_manager/full_browser_transition_manager.cc
index 4eb4f04..e5b0f4180 100644
--- a/chrome/browser/transition_manager/full_browser_transition_manager.cc
+++ b/chrome/browser/transition_manager/full_browser_transition_manager.cc
@@ -17,7 +17,7 @@
   return instance.get();
 }
 
-void FullBrowserTransitionManager::RegisterCallbackOnProfileCreation(
+bool FullBrowserTransitionManager::RegisterCallbackOnProfileCreation(
     SimpleFactoryKey* key,
     OnProfileCreationCallback callback) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -26,8 +26,10 @@
   if (iterator != simple_key_to_profile_.end()) {
     // Profile has already been created, run the callback now.
     std::move(callback).Run(iterator->second);
+    return true;
   } else {
     on_profile_creation_callbacks_[key].push_back(std::move(callback));
+    return false;
   }
 }
 
diff --git a/chrome/browser/transition_manager/full_browser_transition_manager.h b/chrome/browser/transition_manager/full_browser_transition_manager.h
index de3e3f3..d60b2d9 100644
--- a/chrome/browser/transition_manager/full_browser_transition_manager.h
+++ b/chrome/browser/transition_manager/full_browser_transition_manager.h
@@ -32,10 +32,11 @@
   // Return the singleton instance of the class
   static FullBrowserTransitionManager* Get();
 
-  // Register a callback to be called on profile creation. If a profile matching
-  // the key has already been created (i.e. full browser has been loaded), the
-  // callback is run immediately.
-  void RegisterCallbackOnProfileCreation(SimpleFactoryKey* key,
+  // Register a |callback| to be called on profile creation. If a profile
+  // matching the |key| has already been created (i.e. full browser has been
+  // loaded), the |callback| is run immediately and this method returns true.
+  // Otherwise, it returns false and will be run when/if the profile is created.
+  bool RegisterCallbackOnProfileCreation(SimpleFactoryKey* key,
                                          OnProfileCreationCallback callback);
 
   // Marks that a |profile| has been created.
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
index e4efc9d..23fa75e 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
@@ -339,18 +339,6 @@
                             ash::mojom::ShelfItemDelegatePtr) override {
     set_delegate_count_++;
   }
-  void GetAutoHideBehaviorForTesting(
-      int64_t display_id,
-      GetAutoHideBehaviorForTestingCallback callback) override {
-    std::move(callback).Run(auto_hide_behavior_);
-  }
-  void SetAutoHideBehaviorForTesting(
-      int64_t display_id,
-      ash::ShelfAutoHideBehavior behavior,
-      SetAutoHideBehaviorForTestingCallback callback) override {
-    auto_hide_behavior_ = behavior;
-    std::move(callback).Run();
-  }
 
   // Helper that waits for idle and extracts the non-default bitmap from the
   // last updated item in shelf controller.
@@ -389,8 +377,6 @@
   base::OnceClosure updated_callback_;
   size_t set_delegate_count_ = 0;
   ash::ShelfItem last_item_;
-  ash::ShelfAutoHideBehavior auto_hide_behavior_ =
-      ash::ShelfAutoHideBehavior::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS;
 
   ash::mojom::ShelfObserverAssociatedPtr observer_;
   mojo::Binding<ash::mojom::ShelfController> binding_;
diff --git a/chrome/browser/ui/search/local_ntp_suggestions_browsertest.cc b/chrome/browser/ui/search/local_ntp_suggestions_browsertest.cc
index 7b4cbd8..9eb8e57 100644
--- a/chrome/browser/ui/search/local_ntp_suggestions_browsertest.cc
+++ b/chrome/browser/ui/search/local_ntp_suggestions_browsertest.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "base/optional.h"
+#include "base/test/metrics/histogram_tester.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/search/one_google_bar/one_google_bar_service.h"
 #include "chrome/browser/search/one_google_bar/one_google_bar_service_factory.h"
@@ -27,8 +28,7 @@
   MOCK_METHOD0(Refresh, void());
 
   void RefreshImpl() {
-    SearchSuggestDataLoaded(SearchSuggestLoader::Status::OK,
-                            search_suggest_data_);
+    SearchSuggestDataLoaded(search_suggest_status_, search_suggest_data_);
   }
 
   explicit MockSearchSuggestService(Profile* profile)
@@ -38,18 +38,28 @@
     search_suggest_data_ = search_suggest_data;
   }
 
-  const base::Optional<SearchSuggestData>& search_suggest_data()
-      const override {
-    return search_suggest_data_;
+  void set_search_suggest_status(
+      const SearchSuggestLoader::Status search_suggest_status) {
+    search_suggest_status_ = search_suggest_status;
   }
 
   void SuggestionsDisplayed() override { impression_count_++; }
 
   int impression_count() { return impression_count_; }
 
+  const base::Optional<SearchSuggestData>& search_suggest_data()
+      const override {
+    return search_suggest_data_;
+  }
+
+  const SearchSuggestLoader::Status& search_suggest_status() const override {
+    return search_suggest_status_;
+  }
+
  private:
   int impression_count_ = 0;
   base::Optional<SearchSuggestData> search_suggest_data_;
+  SearchSuggestLoader::Status search_suggest_status_;
 };
 
 class LocalNTPSearchSuggestTest : public InProcessBrowserTest {
@@ -94,10 +104,14 @@
       OneGoogleBarServiceFactory::GetForProfile(browser()->profile());
   one_google_bar_service->SetLanguageCodeForTesting("en-US");
 
+  base::HistogramTester histograms;
+
   SearchSuggestData data;
   data.suggestions_html = "<div>suggestions</div>";
   data.end_of_body_script = "console.log('suggestions-done')";
   search_suggest_service()->set_search_suggest_data(data);
+  search_suggest_service()->set_search_suggest_status(
+      SearchSuggestLoader::Status::OK_WITH_SUGGESTIONS);
 
   EXPECT_CALL(*search_suggest_service(), Refresh())
       .WillOnce(Invoke(search_suggest_service(),
@@ -120,11 +134,69 @@
       &result));
   EXPECT_TRUE(result);
   EXPECT_EQ(1, search_suggest_service()->impression_count());
+
+  histograms.ExpectTotalCount(
+      "NewTabPage.SearchSuggestions.RequestLatencyV2.SuccessWithSuggestions",
+      1);
+  histograms.ExpectTotalCount(
+      "NewTabPage.SearchSuggestions.RequestLatencyV2.SuccessWithoutSuggestions",
+      0);
+  histograms.ExpectTotalCount(
+      "NewTabPage.SearchSuggestions.RequestLatencyV2.Failure", 0);
+  histograms.ExpectTotalCount("NewTabPage.SearchSuggestions.RequestStatusV2",
+                              1);
+}
+
+IN_PROC_BROWSER_TEST_F(
+    LocalNTPSearchSuggestTest,
+    NoSuggestionsjectedIntoPageOnResponseWithoutSuggestions) {
+  EXPECT_EQ(base::nullopt, search_suggest_service()->search_suggest_data());
+
+  base::HistogramTester histograms;
+  SearchSuggestData data;
+  search_suggest_service()->set_search_suggest_data(data);
+  search_suggest_service()->set_search_suggest_status(
+      SearchSuggestLoader::Status::OK_WITHOUT_SUGGESTIONS);
+
+  OneGoogleBarService* one_google_bar_service =
+      OneGoogleBarServiceFactory::GetForProfile(browser()->profile());
+  one_google_bar_service->SetLanguageCodeForTesting("en-US");
+
+  EXPECT_CALL(*search_suggest_service(), Refresh())
+      .WillOnce(Invoke(search_suggest_service(),
+                       &MockSearchSuggestService::RefreshImpl));
+
+  content::WebContents* active_tab =
+      local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
+  local_ntp_test_utils::NavigateToNTPAndWaitUntilLoaded(browser(),
+                                                        /*delay=*/1000);
+
+  bool result;
+  ASSERT_TRUE(instant_test_utils::GetBoolFromJS(
+      active_tab, "$('suggestions') === null", &result));
+  EXPECT_TRUE(result);
+  EXPECT_EQ(0, search_suggest_service()->impression_count());
+
+  histograms.ExpectTotalCount(
+      "NewTabPage.SearchSuggestions.RequestLatencyV2.SuccessWithSuggestions",
+      0);
+  histograms.ExpectTotalCount(
+      "NewTabPage.SearchSuggestions.RequestLatencyV2.SuccessWithoutSuggestions",
+      1);
+  histograms.ExpectTotalCount(
+      "NewTabPage.SearchSuggestions.RequestLatencyV2.Failure", 0);
+  histograms.ExpectTotalCount("NewTabPage.SearchSuggestions.RequestStatusV2",
+                              1);
 }
 
 IN_PROC_BROWSER_TEST_F(LocalNTPSearchSuggestTest,
                        SuggestionsNotInjectedIntoPageNonEnUS) {
   EXPECT_EQ(base::nullopt, search_suggest_service()->search_suggest_data());
+  search_suggest_service()->set_search_suggest_status(
+      SearchSuggestLoader::Status::FATAL_ERROR);
+  search_suggest_service()->Refresh();
+
+  base::HistogramTester histograms;
 
   OneGoogleBarService* one_google_bar_service =
       OneGoogleBarServiceFactory::GetForProfile(browser()->profile());
@@ -152,11 +224,16 @@
                        EmptySuggestionsNotInjectedIntoPage) {
   EXPECT_EQ(base::nullopt, search_suggest_service()->search_suggest_data());
 
+  base::HistogramTester histograms;
+
   OneGoogleBarService* one_google_bar_service =
       OneGoogleBarServiceFactory::GetForProfile(browser()->profile());
   one_google_bar_service->SetLanguageCodeForTesting("en-US");
 
   SearchSuggestData data;
+  search_suggest_service()->set_search_suggest_data(data);
+  search_suggest_service()->set_search_suggest_status(
+      SearchSuggestLoader::Status::OK_WITHOUT_SUGGESTIONS);
   EXPECT_CALL(*search_suggest_service(), Refresh())
       .WillOnce(Invoke(search_suggest_service(),
                        &MockSearchSuggestService::RefreshImpl));
@@ -171,4 +248,15 @@
       active_tab, "$('suggestions') === null", &result));
   EXPECT_TRUE(result);
   EXPECT_EQ(0, search_suggest_service()->impression_count());
+
+  histograms.ExpectTotalCount(
+      "NewTabPage.SearchSuggestions.RequestLatencyV2.SuccessWithSuggestions",
+      0);
+  histograms.ExpectTotalCount(
+      "NewTabPage.SearchSuggestions.RequestLatencyV2.SuccessWithoutSuggestions",
+      1);
+  histograms.ExpectTotalCount(
+      "NewTabPage.SearchSuggestions.RequestLatencyV2.Failure", 0);
+  histograms.ExpectTotalCount("NewTabPage.SearchSuggestions.RequestStatusV2",
+                              1);
 }
diff --git a/chrome/browser/ui/search/ntp_user_data_logger.cc b/chrome/browser/ui/search/ntp_user_data_logger.cc
index 151079a..60be683 100644
--- a/chrome/browser/ui/search/ntp_user_data_logger.cc
+++ b/chrome/browser/ui/search/ntp_user_data_logger.cc
@@ -437,6 +437,26 @@
   }
 }
 
+void NTPUserDataLogger::LogSuggestionEventWithValue(
+    NTPSuggestionsLoggingEventType event,
+    int data,
+    base::TimeDelta time) {
+  // Only logged on the Google NTP.
+  if (!DefaultSearchProviderIsGoogle()) {
+    return;
+  }
+
+  switch (event) {
+    case NTPSuggestionsLoggingEventType::kShownCount:
+      UMA_HISTOGRAM_COUNTS_100("NewTabPage.SearchSuggestions.ShownCount", data);
+      break;
+    case NTPSuggestionsLoggingEventType::kIndexClicked:
+      UMA_HISTOGRAM_COUNTS_100("NewTabPage.SearchSuggestions.IndexClicked",
+                               data);
+      break;
+  }
+}
+
 void NTPUserDataLogger::LogMostVisitedImpression(
     const ntp_tiles::NTPTileImpression& impression) {
   if ((impression.index >= kNumMostVisited) ||
diff --git a/chrome/browser/ui/search/ntp_user_data_logger.h b/chrome/browser/ui/search/ntp_user_data_logger.h
index 8893e1d3..676ee17 100644
--- a/chrome/browser/ui/search/ntp_user_data_logger.h
+++ b/chrome/browser/ui/search/ntp_user_data_logger.h
@@ -47,6 +47,15 @@
   // all others require Google as the default search provider.
   void LogEvent(NTPLoggingEventType event, base::TimeDelta time);
 
+  // Called when a search suggestion event occurs on the NTP that has an integer
+  // value associated with it; N suggestions were shown on this NTP load, the
+  // Nth suggestion was clicked, etc. |time| is the delta time from navigation
+  // start until this event happened. Requires Google as the default search
+  // provider.
+  void LogSuggestionEventWithValue(NTPSuggestionsLoggingEventType event,
+                                   int data,
+                                   base::TimeDelta time);
+
   // Logs an impression on one of the NTP tiles by given details.
   void LogMostVisitedImpression(const ntp_tiles::NTPTileImpression& impression);
 
diff --git a/chrome/browser/ui/search/search_ipc_router.cc b/chrome/browser/ui/search/search_ipc_router.cc
index 726a217..dde5d39 100644
--- a/chrome/browser/ui/search/search_ipc_router.cc
+++ b/chrome/browser/ui/search/search_ipc_router.cc
@@ -281,6 +281,20 @@
   delegate_->OnLogEvent(event, time);
 }
 
+void SearchIPCRouter::LogSuggestionEventWithValue(
+    int page_seq_no,
+    NTPSuggestionsLoggingEventType event,
+    int data,
+    base::TimeDelta time) {
+  if (page_seq_no != commit_counter_)
+    return;
+
+  if (!policy_->ShouldProcessLogSuggestionEventWithValue())
+    return;
+
+  delegate_->OnLogSuggestionEventWithValue(event, data, time);
+}
+
 void SearchIPCRouter::LogMostVisitedImpression(
     int page_seq_no,
     const ntp_tiles::NTPTileImpression& impression) {
diff --git a/chrome/browser/ui/search/search_ipc_router.h b/chrome/browser/ui/search/search_ipc_router.h
index 2528709..435934f 100644
--- a/chrome/browser/ui/search/search_ipc_router.h
+++ b/chrome/browser/ui/search/search_ipc_router.h
@@ -85,6 +85,13 @@
     virtual void OnLogEvent(NTPLoggingEventType event,
                             base::TimeDelta time) = 0;
 
+    // Called to signal that an event has occurred on the New Tab Page at a
+    // particular time since navigation start, and provide an int value.
+    virtual void OnLogSuggestionEventWithValue(
+        NTPSuggestionsLoggingEventType event,
+        int data,
+        base::TimeDelta time) = 0;
+
     // Called to log an impression from a given provider on the New Tab Page.
     virtual void OnLogMostVisitedImpression(
         const ntp_tiles::NTPTileImpression& impression) = 0;
@@ -156,6 +163,7 @@
     virtual bool ShouldProcessUndoCustomLinkAction() = 0;
     virtual bool ShouldProcessResetCustomLinks() = 0;
     virtual bool ShouldProcessLogEvent() = 0;
+    virtual bool ShouldProcessLogSuggestionEventWithValue() = 0;
     virtual bool ShouldProcessPasteIntoOmnibox(bool is_active_tab) = 0;
     virtual bool ShouldSendSetInputInProgress(bool is_active_tab) = 0;
     virtual bool ShouldSendOmniboxFocusChanged() = 0;
@@ -237,6 +245,10 @@
   void LogEvent(int page_seq_no,
                 NTPLoggingEventType event,
                 base::TimeDelta time) override;
+  void LogSuggestionEventWithValue(int page_seq_no,
+                                   NTPSuggestionsLoggingEventType event,
+                                   int data,
+                                   base::TimeDelta time) override;
   void LogMostVisitedImpression(
       int page_seq_no,
       const ntp_tiles::NTPTileImpression& impression) override;
diff --git a/chrome/browser/ui/search/search_ipc_router_policy_impl.cc b/chrome/browser/ui/search/search_ipc_router_policy_impl.cc
index 2773548..6fd38bb 100644
--- a/chrome/browser/ui/search/search_ipc_router_policy_impl.cc
+++ b/chrome/browser/ui/search/search_ipc_router_policy_impl.cc
@@ -69,6 +69,10 @@
   return !is_incognito_ && search::IsInstantNTP(web_contents_);
 }
 
+bool SearchIPCRouterPolicyImpl::ShouldProcessLogSuggestionEventWithValue() {
+  return !is_incognito_ && search::IsInstantNTP(web_contents_);
+}
+
 bool SearchIPCRouterPolicyImpl::ShouldProcessPasteIntoOmnibox(
     bool is_active_tab) {
   return is_active_tab && !is_incognito_ && search::IsInstantNTP(web_contents_);
diff --git a/chrome/browser/ui/search/search_ipc_router_policy_impl.h b/chrome/browser/ui/search/search_ipc_router_policy_impl.h
index 9bd24323..5b96046 100644
--- a/chrome/browser/ui/search/search_ipc_router_policy_impl.h
+++ b/chrome/browser/ui/search/search_ipc_router_policy_impl.h
@@ -39,6 +39,7 @@
   bool ShouldProcessUndoCustomLinkAction() override;
   bool ShouldProcessResetCustomLinks() override;
   bool ShouldProcessLogEvent() override;
+  bool ShouldProcessLogSuggestionEventWithValue() override;
   bool ShouldProcessPasteIntoOmnibox(bool is_active_tab) override;
   bool ShouldSendSetInputInProgress(bool is_active_tab) override;
   bool ShouldSendOmniboxFocusChanged() override;
diff --git a/chrome/browser/ui/search/search_ipc_router_unittest.cc b/chrome/browser/ui/search/search_ipc_router_unittest.cc
index 2d720d1..a1664cd 100644
--- a/chrome/browser/ui/search/search_ipc_router_unittest.cc
+++ b/chrome/browser/ui/search/search_ipc_router_unittest.cc
@@ -74,6 +74,10 @@
   MOCK_METHOD0(OnResetCustomLinks, void());
   MOCK_METHOD2(OnLogEvent, void(NTPLoggingEventType event,
                                 base::TimeDelta time));
+  MOCK_METHOD3(OnLogSuggestionEventWithValue,
+               void(NTPSuggestionsLoggingEventType event,
+                    int data,
+                    base::TimeDelta time));
   MOCK_METHOD1(OnLogMostVisitedImpression,
                void(const ntp_tiles::NTPTileImpression& impression));
   MOCK_METHOD1(OnLogMostVisitedNavigation,
@@ -111,6 +115,7 @@
   MOCK_METHOD0(ShouldProcessUndoCustomLinkAction, bool());
   MOCK_METHOD0(ShouldProcessResetCustomLinks, bool());
   MOCK_METHOD0(ShouldProcessLogEvent, bool());
+  MOCK_METHOD0(ShouldProcessLogSuggestionEventWithValue, bool());
   MOCK_METHOD1(ShouldProcessPasteIntoOmnibox, bool(bool));
   MOCK_METHOD0(ShouldProcessSetCustomBackgroundURL, bool());
   MOCK_METHOD0(ShouldProcessSetCustomBackgroundURLWithAttributions, bool());
@@ -304,6 +309,42 @@
                                 delta);
 }
 
+TEST_F(SearchIPCRouterTest, ProcessLogSuggestionEventWithValueMsg) {
+  base::TimeDelta delta = base::TimeDelta::FromMilliseconds(123);
+  NavigateAndCommitActiveTab(GURL(chrome::kChromeSearchLocalNtpUrl));
+  SetupMockDelegateAndPolicy();
+  MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy();
+  EXPECT_CALL(*mock_delegate(),
+              OnLogSuggestionEventWithValue(
+                  NTPSuggestionsLoggingEventType::kShownCount, 1, delta))
+      .Times(1);
+  EXPECT_CALL(*policy, ShouldProcessLogSuggestionEventWithValue())
+      .Times(1)
+      .WillOnce(Return(true));
+
+  GetSearchIPCRouter().LogSuggestionEventWithValue(
+      GetSearchIPCRouterSeqNo(), NTPSuggestionsLoggingEventType::kShownCount, 1,
+      delta);
+}
+
+TEST_F(SearchIPCRouterTest, IgnoreLogSuggestionEventWithValueMsg) {
+  base::TimeDelta delta = base::TimeDelta::FromMilliseconds(123);
+  NavigateAndCommitActiveTab(GURL("chrome-search://foo/bar"));
+  SetupMockDelegateAndPolicy();
+  MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy();
+  EXPECT_CALL(*mock_delegate(),
+              OnLogSuggestionEventWithValue(
+                  NTPSuggestionsLoggingEventType::kShownCount, 1, delta))
+      .Times(0);
+  EXPECT_CALL(*policy, ShouldProcessLogSuggestionEventWithValue())
+      .Times(1)
+      .WillOnce(Return(false));
+
+  GetSearchIPCRouter().LogSuggestionEventWithValue(
+      GetSearchIPCRouterSeqNo(), NTPSuggestionsLoggingEventType::kShownCount, 1,
+      delta);
+}
+
 TEST_F(SearchIPCRouterTest, ProcessLogMostVisitedImpressionMsg) {
   const ntp_tiles::NTPTileImpression impression(
       3, ntp_tiles::TileSource::SUGGESTIONS_SERVICE,
diff --git a/chrome/browser/ui/search/search_tab_helper.cc b/chrome/browser/ui/search/search_tab_helper.cc
index 58b19135..77b66b7 100644
--- a/chrome/browser/ui/search/search_tab_helper.cc
+++ b/chrome/browser/ui/search/search_tab_helper.cc
@@ -334,6 +334,14 @@
       ->LogEvent(event, time);
 }
 
+void SearchTabHelper::OnLogSuggestionEventWithValue(
+    NTPSuggestionsLoggingEventType event,
+    int data,
+    base::TimeDelta time) {
+  NTPUserDataLogger::GetOrCreateFromWebContents(web_contents())
+      ->LogSuggestionEventWithValue(event, data, time);
+}
+
 void SearchTabHelper::OnLogMostVisitedImpression(
     const ntp_tiles::NTPTileImpression& impression) {
   NTPUserDataLogger::GetOrCreateFromWebContents(web_contents())
diff --git a/chrome/browser/ui/search/search_tab_helper.h b/chrome/browser/ui/search/search_tab_helper.h
index d2332be5..9ccfad5 100644
--- a/chrome/browser/ui/search/search_tab_helper.h
+++ b/chrome/browser/ui/search/search_tab_helper.h
@@ -101,6 +101,9 @@
   void OnUndoCustomLinkAction() override;
   void OnResetCustomLinks() override;
   void OnLogEvent(NTPLoggingEventType event, base::TimeDelta time) override;
+  void OnLogSuggestionEventWithValue(NTPSuggestionsLoggingEventType event,
+                                     int data,
+                                     base::TimeDelta time) override;
   void OnLogMostVisitedImpression(
       const ntp_tiles::NTPTileImpression& impression) override;
   void OnLogMostVisitedNavigation(
diff --git a/chrome/browser/ui/views/overlay/overlay_window_views.cc b/chrome/browser/ui/views/overlay/overlay_window_views.cc
index 777c3b8f..39e0fca8 100644
--- a/chrome/browser/ui/views/overlay/overlay_window_views.cc
+++ b/chrome/browser/ui/views/overlay/overlay_window_views.cc
@@ -342,12 +342,13 @@
   // views::View that is displayed when video is hidden. ----------------------
   // Adding an extra pixel to width/height makes sure controls background cover
   // entirely window when platform has fractional scale applied.
-  gfx::Rect larger_window_bounds = GetBounds();
+  gfx::Rect larger_window_bounds =
+      gfx::Rect(0, 0, GetBounds().width(), GetBounds().height());
   larger_window_bounds.Inset(-1, -1);
-  window_background_view_->SetSize(larger_window_bounds.size());
+  window_background_view_->SetBoundsRect(larger_window_bounds);
   window_background_view_->SetPaintToLayer(ui::LAYER_SOLID_COLOR);
   window_background_view_->layer()->set_name("WindowBackgroundView");
-  GetWindowBackgroundLayer()->SetColor(SK_ColorBLACK);
+  window_background_view_->layer()->SetColor(SK_ColorBLACK);
 
   // views::View that holds the scrim, which appears with the controls. -------
   controls_scrim_view_->SetSize(GetBounds().size());
@@ -390,6 +391,9 @@
 
   // view::View that holds the video. -----------------------------------------
   video_view_->SetPaintToLayer(ui::LAYER_TEXTURED);
+  video_view_->SetSize(GetBounds().size());
+  video_view_->layer()->SetMasksToBounds(true);
+  video_view_->layer()->SetFillsBoundsOpaquely(false);
   video_view_->layer()->set_name("VideoView");
 
   // views::View that toggles play/pause/replay. ------------------------------
@@ -415,6 +419,8 @@
   controls_parent_view_->AddChildView(play_pause_controls_view_.get());
   controls_parent_view_->AddChildView(next_track_controls_view_.get());
   controls_parent_view_->AddChildView(previous_track_controls_view_.get());
+  GetContentsView()->AddChildView(window_background_view_.get());
+  GetContentsView()->AddChildView(video_view_.get());
   GetContentsView()->AddChildView(controls_scrim_view_.get());
   GetContentsView()->AddChildView(controls_parent_view_.get());
   GetContentsView()->AddChildView(skip_ad_controls_view_.get());
@@ -461,6 +467,13 @@
   UpdateControlsBounds();
 
   // Update the surface layer bounds to scale with window size changes.
+  window_background_view_->SetBoundsRect(
+      gfx::Rect(gfx::Point(0, 0), GetBounds().size()));
+  video_view_->SetBoundsRect(video_bounds_);
+  if (video_view_->layer()->has_external_content())
+    video_view_->layer()->SetSurfaceSize(video_bounds_.size());
+
+  // Notify the controller that the bounds have changed.
   controller_->UpdateLayerBounds();
 }
 
@@ -489,10 +502,10 @@
 void OverlayWindowViews::UpdateControlsBounds() {
   // Adding an extra pixel to width/height makes sure the scrim covers the
   // entire window when the platform has fractional scaling applied.
-  gfx::Rect larger_window_bounds = GetBounds();
+  gfx::Rect larger_window_bounds =
+      gfx::Rect(0, 0, GetBounds().width(), GetBounds().height());
   larger_window_bounds.Inset(-1, -1);
-  controls_scrim_view_->SetBoundsRect(
-      gfx::Rect(gfx::Point(0, 0), larger_window_bounds.size()));
+  controls_scrim_view_->SetBoundsRect(larger_window_bounds);
 
   WindowQuadrant quadrant = GetCurrentWindowQuadrant(GetBounds(), controller_);
   back_to_tab_controls_view_->SetPosition(GetBounds().size(), quadrant);
@@ -558,6 +571,9 @@
 
 void OverlayWindowViews::Close() {
   views::Widget::Close();
+
+  if (auto* frame_sink_id = GetCurrentFrameSinkId())
+    GetCompositor()->RemoveChildFrameSink(*frame_sink_id);
 }
 
 void OverlayWindowViews::ShowInactive() {
@@ -588,10 +604,6 @@
   return true;
 }
 
-ui::Layer* OverlayWindowViews::GetLayer() {
-  return GetRootView()->layer();
-}
-
 gfx::Rect OverlayWindowViews::GetBounds() const {
   return views::Widget::GetRestoredBounds();
 }
@@ -642,16 +654,20 @@
   UpdateControlsBounds();
 }
 
-ui::Layer* OverlayWindowViews::GetWindowBackgroundLayer() {
-  return window_background_view_->layer();
-}
+void OverlayWindowViews::SetSurfaceId(const viz::SurfaceId& surface_id) {
+  // TODO(https://crbug.com/925346): We also want to unregister the page that
+  // used to embed the video as its parent.
+  if (!GetCurrentFrameSinkId()) {
+    GetCompositor()->AddChildFrameSink(surface_id.frame_sink_id());
+  } else if (*GetCurrentFrameSinkId() != surface_id.frame_sink_id()) {
+    GetCompositor()->RemoveChildFrameSink(*GetCurrentFrameSinkId());
+    GetCompositor()->AddChildFrameSink(surface_id.frame_sink_id());
+  }
 
-ui::Layer* OverlayWindowViews::GetVideoLayer() {
-  return video_view_->layer();
-}
-
-gfx::Rect OverlayWindowViews::GetVideoBounds() {
-  return video_bounds_;
+  video_view_->layer()->SetShowSurface(
+      surface_id, GetBounds().size(), SK_ColorBLACK,
+      cc::DeadlinePolicy::UseDefaultDeadline(),
+      true /* stretch_content_to_fill_bounds */);
 }
 
 void OverlayWindowViews::OnNativeBlur() {
@@ -767,7 +783,7 @@
       // On Windows, ui::ET_MOUSE_EXITED is triggered when hovering over the
       // media controls because of the HitTest. This check ensures the controls
       // are visible if the mouse is still over the window.
-      if (!GetVideoBounds().Contains(event->location()))
+      if (!video_bounds_.Contains(event->location()))
         UpdateControlsVisibility(false);
       break;
 
@@ -1010,3 +1026,18 @@
     const {
   return muted_state_for_testing_;
 }
+
+ui::Layer* OverlayWindowViews::video_layer_for_testing() const {
+  return video_view_->layer();
+}
+
+cc::Layer* OverlayWindowViews::GetLayerForTesting() {
+  return GetRootView()->layer()->cc_layer_for_testing();
+}
+
+const viz::FrameSinkId* OverlayWindowViews::GetCurrentFrameSinkId() const {
+  if (auto* surface = video_view_->layer()->GetSurfaceId())
+    return &surface->frame_sink_id();
+
+  return nullptr;
+}
diff --git a/chrome/browser/ui/views/overlay/overlay_window_views.h b/chrome/browser/ui/views/overlay/overlay_window_views.h
index 09dd141..4607592 100644
--- a/chrome/browser/ui/views/overlay/overlay_window_views.h
+++ b/chrome/browser/ui/views/overlay/overlay_window_views.h
@@ -45,7 +45,6 @@
   void Hide() override;
   bool IsVisible() const override;
   bool IsAlwaysOnTop() const override;
-  ui::Layer* GetLayer() override;
   gfx::Rect GetBounds() const override;
   void UpdateVideoSize(const gfx::Size& natural_size) override;
   void SetPlaybackState(PlaybackState playback_state) override;
@@ -54,9 +53,7 @@
   void SetSkipAdButtonVisibility(bool is_visible) override;
   void SetNextTrackButtonVisibility(bool is_visible) override;
   void SetPreviousTrackButtonVisibility(bool is_visible) override;
-  ui::Layer* GetWindowBackgroundLayer() override;
-  ui::Layer* GetVideoLayer() override;
-  gfx::Rect GetVideoBounds() override;
+  void SetSurfaceId(const viz::SurfaceId& surface_id) override;
 
   // views::Widget:
   void OnNativeBlur() override;
@@ -102,6 +99,8 @@
   views::View* controls_parent_view_for_testing() const;
   OverlayWindowViews::PlaybackState playback_state_for_testing() const;
   OverlayWindowViews::MutedState muted_state_for_testing() const;
+  ui::Layer* video_layer_for_testing() const;
+  cc::Layer* GetLayerForTesting() override;
 
  private:
   // Determine the intended bounds of |this|. This should be called when there
@@ -162,6 +161,11 @@
   // state.
   void ToggleMute();
 
+  // Returns the current frame sink id for the surface displayed in the
+  // |video_view_]. If |video_view_| is not currently displaying a surface then
+  // returns nullptr.
+  const viz::FrameSinkId* GetCurrentFrameSinkId() const;
+
   // Not owned; |controller_| owns |this|.
   content::PictureInPictureWindowController* controller_;
 
diff --git a/chrome/browser/ui/webui/chromeos/login/app_downloading_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/app_downloading_screen_handler.cc
index 60b1c10d..803ccc5 100644
--- a/chrome/browser/ui/webui/chromeos/login/app_downloading_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/app_downloading_screen_handler.cc
@@ -27,6 +27,8 @@
 
 namespace chromeos {
 
+constexpr StaticOobeScreenId AppDownloadingScreenView::kScreenId;
+
 AppDownloadingScreenHandler::AppDownloadingScreenHandler(
     JSCallsContainer* js_calls_container)
     : BaseScreenHandler(kScreenId, js_calls_container) {
diff --git a/chrome/browser/ui/webui/chromeos/login/app_downloading_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/app_downloading_screen_handler.h
index a4a24de..8634d27 100644
--- a/chrome/browser/ui/webui/chromeos/login/app_downloading_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/app_downloading_screen_handler.h
@@ -14,7 +14,8 @@
 
 class AppDownloadingScreenView {
  public:
-  constexpr static OobeScreen kScreenId = OobeScreen::SCREEN_APP_DOWNLOADING;
+  constexpr static StaticOobeScreenId kScreenId =
+      OobeScreen::SCREEN_APP_DOWNLOADING;
 
   virtual ~AppDownloadingScreenView() = default;
 
diff --git a/chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.cc
index 9b9707d..9865a343 100644
--- a/chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.cc
@@ -39,6 +39,8 @@
 
 namespace chromeos {
 
+constexpr StaticOobeScreenId AppLaunchSplashScreenView::kScreenId;
+
 AppLaunchSplashScreenHandler::AppLaunchSplashScreenHandler(
     JSCallsContainer* js_calls_container,
     const scoped_refptr<NetworkStateInformer>& network_state_informer,
diff --git a/chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.h
index 52d9c9a..814a6fd 100644
--- a/chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.h
@@ -28,7 +28,8 @@
     APP_LAUNCH_STATE_SHOWING_NETWORK_CONFIGURE_UI,
   };
 
-  constexpr static OobeScreen kScreenId = OobeScreen::SCREEN_APP_LAUNCH_SPLASH;
+  constexpr static StaticOobeScreenId kScreenId =
+      OobeScreen::SCREEN_APP_LAUNCH_SPLASH;
 
   virtual ~AppLaunchSplashScreenView() {}
 
diff --git a/chrome/browser/ui/webui/chromeos/login/arc_kiosk_splash_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/arc_kiosk_splash_screen_handler.cc
index ae7fa0e..3cf432e7 100644
--- a/chrome/browser/ui/webui/chromeos/login/arc_kiosk_splash_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/arc_kiosk_splash_screen_handler.cc
@@ -19,6 +19,8 @@
 
 namespace chromeos {
 
+constexpr StaticOobeScreenId ArcKioskSplashScreenView::kScreenId;
+
 ArcKioskSplashScreenHandler::ArcKioskSplashScreenHandler(
     JSCallsContainer* js_calls_container)
     : BaseScreenHandler(kScreenId, js_calls_container) {}
diff --git a/chrome/browser/ui/webui/chromeos/login/arc_kiosk_splash_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/arc_kiosk_splash_screen_handler.h
index 0b0a86bc..0f86eca4 100644
--- a/chrome/browser/ui/webui/chromeos/login/arc_kiosk_splash_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/arc_kiosk_splash_screen_handler.h
@@ -27,7 +27,8 @@
     WAITING_APP_WINDOW,
   };
 
-  constexpr static OobeScreen kScreenId = OobeScreen::SCREEN_ARC_KIOSK_SPLASH;
+  constexpr static StaticOobeScreenId kScreenId =
+      OobeScreen::SCREEN_ARC_KIOSK_SPLASH;
 
   ArcKioskSplashScreenView() = default;
 
diff --git a/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.cc
index 7ea6598..1cad4778 100644
--- a/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.cc
@@ -44,6 +44,8 @@
 
 namespace chromeos {
 
+constexpr StaticOobeScreenId ArcTermsOfServiceScreenView::kScreenId;
+
 ArcTermsOfServiceScreenHandler::ArcTermsOfServiceScreenHandler(
     JSCallsContainer* js_calls_container)
     : BaseScreenHandler(kScreenId, js_calls_container),
@@ -85,8 +87,8 @@
 }
 
 void ArcTermsOfServiceScreenHandler::OnCurrentScreenChanged(
-    OobeScreen current_screen,
-    OobeScreen new_screen) {
+    OobeScreenId current_screen,
+    OobeScreenId new_screen) {
   if (new_screen != OobeScreen::SCREEN_GAIA_SIGNIN)
     return;
 
diff --git a/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.h
index cff8cb2..d6bed17a 100644
--- a/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.h
@@ -47,7 +47,7 @@
 
 class ArcTermsOfServiceScreenView {
  public:
-  constexpr static OobeScreen kScreenId =
+  constexpr static StaticOobeScreenId kScreenId =
       OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE;
 
   virtual ~ArcTermsOfServiceScreenView() = default;
@@ -102,8 +102,8 @@
   void Bind(ArcTermsOfServiceScreen* screen) override;
 
   // OobeUI::Observer:
-  void OnCurrentScreenChanged(OobeScreen current_screen,
-                              OobeScreen new_screen) override;
+  void OnCurrentScreenChanged(OobeScreenId current_screen,
+                              OobeScreenId new_screen) override;
   void OnDestroyingOobeUI() override {}
 
   // system::TimezoneSettings::Observer:
diff --git a/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.cc
index eeb7fb6..f6955fe 100644
--- a/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.cc
@@ -40,6 +40,8 @@
 
 }  // namespace
 
+constexpr StaticOobeScreenId AssistantOptInFlowScreenView::kScreenId;
+
 AssistantOptInFlowScreenHandler::AssistantOptInFlowScreenHandler(
     JSCallsContainer* js_calls_container)
     : BaseScreenHandler(kScreenId, js_calls_container),
diff --git a/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.h
index 71319f1..5e5353f 100644
--- a/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.h
@@ -23,7 +23,7 @@
 // and its WebUI representation.
 class AssistantOptInFlowScreenView {
  public:
-  constexpr static OobeScreen kScreenId =
+  constexpr static StaticOobeScreenId kScreenId =
       OobeScreen::SCREEN_ASSISTANT_OPTIN_FLOW;
 
   virtual ~AssistantOptInFlowScreenView() = default;
diff --git a/chrome/browser/ui/webui/chromeos/login/auto_enrollment_check_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/auto_enrollment_check_screen_handler.cc
index 0bd92519..2d2b8c6 100644
--- a/chrome/browser/ui/webui/chromeos/login/auto_enrollment_check_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/auto_enrollment_check_screen_handler.cc
@@ -10,6 +10,8 @@
 
 namespace chromeos {
 
+constexpr StaticOobeScreenId AutoEnrollmentCheckScreenView::kScreenId;
+
 AutoEnrollmentCheckScreenHandler::AutoEnrollmentCheckScreenHandler(
     JSCallsContainer* js_calls_container)
     : BaseScreenHandler(kScreenId, js_calls_container) {
diff --git a/chrome/browser/ui/webui/chromeos/login/base_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/base_screen_handler.cc
index 57c6e84..bf93f4d 100644
--- a/chrome/browser/ui/webui/chromeos/login/base_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/base_screen_handler.cc
@@ -10,7 +10,7 @@
 
 namespace chromeos {
 
-BaseScreenHandler::BaseScreenHandler(OobeScreen oobe_screen,
+BaseScreenHandler::BaseScreenHandler(OobeScreenId oobe_screen,
                                      JSCallsContainer* js_calls_container)
     : BaseWebUIHandler(js_calls_container), oobe_screen_(oobe_screen) {}
 
diff --git a/chrome/browser/ui/webui/chromeos/login/base_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/base_screen_handler.h
index 027f4a8b..3476168 100644
--- a/chrome/browser/ui/webui/chromeos/login/base_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/base_screen_handler.h
@@ -17,11 +17,11 @@
 // to a particular OobeScreen.
 class BaseScreenHandler : public BaseWebUIHandler {
  public:
-  BaseScreenHandler(OobeScreen oobe_screen,
+  BaseScreenHandler(OobeScreenId oobe_screen,
                     JSCallsContainer* js_calls_container);
   ~BaseScreenHandler() override;
 
-  OobeScreen oobe_screen() const { return oobe_screen_; }
+  OobeScreenId oobe_screen() const { return oobe_screen_; }
 
   void SetBaseScreen(BaseScreen* base_screen);
 
@@ -48,7 +48,7 @@
   std::string user_acted_method_path_;
 
   // OobeScreen that this handler corresponds to.
-  OobeScreen oobe_screen_ = OobeScreen::SCREEN_UNKNOWN;
+  OobeScreenId oobe_screen_ = OobeScreen::SCREEN_UNKNOWN;
 
   BaseScreen* base_screen_ = nullptr;
 
diff --git a/chrome/browser/ui/webui/chromeos/login/base_webui_handler.cc b/chrome/browser/ui/webui/chromeos/login/base_webui_handler.cc
index 021907c..fc43edd7 100644
--- a/chrome/browser/ui/webui/chromeos/login/base_webui_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/base_webui_handler.cc
@@ -36,16 +36,16 @@
 
 void BaseWebUIHandler::GetAdditionalParameters(base::DictionaryValue* dict) {}
 
-void BaseWebUIHandler::ShowScreen(OobeScreen screen) {
+void BaseWebUIHandler::ShowScreen(OobeScreenId screen) {
   ShowScreenWithData(screen, nullptr);
 }
 
-void BaseWebUIHandler::ShowScreenWithData(OobeScreen screen,
+void BaseWebUIHandler::ShowScreenWithData(OobeScreenId screen,
                                           const base::DictionaryValue* data) {
   if (!web_ui())
     return;
   base::DictionaryValue screen_params;
-  screen_params.SetString("id", GetOobeScreenName(screen));
+  screen_params.SetString("id", screen.name);
   if (data) {
     screen_params.SetKey("data", data->Clone());
   }
@@ -56,7 +56,7 @@
   return static_cast<OobeUI*>(web_ui()->GetController());
 }
 
-OobeScreen BaseWebUIHandler::GetCurrentScreen() const {
+OobeScreenId BaseWebUIHandler::GetCurrentScreen() const {
   OobeUI* oobe_ui = GetOobeUI();
   if (!oobe_ui)
     return OobeScreen::SCREEN_UNKNOWN;
diff --git a/chrome/browser/ui/webui/chromeos/login/base_webui_handler.h b/chrome/browser/ui/webui/chromeos/login/base_webui_handler.h
index 61c9eef..9bc7641 100644
--- a/chrome/browser/ui/webui/chromeos/login/base_webui_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/base_webui_handler.h
@@ -115,16 +115,17 @@
   virtual void Initialize() = 0;
 
   // Show selected WebUI |screen|.
-  void ShowScreen(OobeScreen screen);
+  void ShowScreen(OobeScreenId screen);
   // Show selected WebUI |screen|. Pass screen initialization using the |data|
   // parameter.
-  void ShowScreenWithData(OobeScreen screen, const base::DictionaryValue* data);
+  void ShowScreenWithData(OobeScreenId screen,
+                          const base::DictionaryValue* data);
 
   // Returns the OobeUI instance.
   OobeUI* GetOobeUI() const;
 
   // Returns current visible OOBE screen.
-  OobeScreen GetCurrentScreen() const;
+  OobeScreenId GetCurrentScreen() const;
 
   // Whether page is ready.
   bool page_is_ready() const { return page_is_ready_; }
diff --git a/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc b/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
index 8dd92f55..ca429de 100644
--- a/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
@@ -320,7 +320,7 @@
 
 void CoreOobeHandler::HandleUpdateCurrentScreen(
     const std::string& screen_name) {
-  const OobeScreen screen = GetOobeScreenFromName(screen_name);
+  const OobeScreenId screen(screen_name);
   GetOobeUI()->CurrentScreenChanged(screen);
 
   content::ServiceManagerConnection* connection =
diff --git a/chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.cc
index 6bd0e9b..56bc0e1 100644
--- a/chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.cc
@@ -11,6 +11,8 @@
 
 namespace chromeos {
 
+constexpr StaticOobeScreenId DemoPreferencesScreenView::kScreenId;
+
 DemoPreferencesScreenView::~DemoPreferencesScreenView() = default;
 
 DemoPreferencesScreenHandler::DemoPreferencesScreenHandler(
diff --git a/chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.h
index 55459002..59f453f 100644
--- a/chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.h
@@ -16,7 +16,7 @@
 // Interface of the demo mode preferences screen view.
 class DemoPreferencesScreenView {
  public:
-  constexpr static OobeScreen kScreenId =
+  constexpr static StaticOobeScreenId kScreenId =
       OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES;
 
   virtual ~DemoPreferencesScreenView();
diff --git a/chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.cc
index 38627639..0d3868e 100644
--- a/chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.cc
@@ -14,6 +14,8 @@
 
 namespace chromeos {
 
+constexpr StaticOobeScreenId DemoSetupScreenView::kScreenId;
+
 DemoSetupScreenView::~DemoSetupScreenView() = default;
 
 DemoSetupScreenHandler::DemoSetupScreenHandler(
diff --git a/chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.h
index 74e2d4b..77e9095 100644
--- a/chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.h
@@ -15,7 +15,8 @@
 // Interface of the demo mode setup screen view.
 class DemoSetupScreenView {
  public:
-  constexpr static OobeScreen kScreenId = OobeScreen::SCREEN_OOBE_DEMO_SETUP;
+  constexpr static StaticOobeScreenId kScreenId =
+      OobeScreen::SCREEN_OOBE_DEMO_SETUP;
 
   virtual ~DemoSetupScreenView();
 
diff --git a/chrome/browser/ui/webui/chromeos/login/device_disabled_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/device_disabled_screen_handler.cc
index c327e31..a0b5afe 100644
--- a/chrome/browser/ui/webui/chromeos/login/device_disabled_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/device_disabled_screen_handler.cc
@@ -12,6 +12,8 @@
 
 namespace chromeos {
 
+constexpr StaticOobeScreenId DeviceDisabledScreenView::kScreenId;
+
 DeviceDisabledScreenHandler::DeviceDisabledScreenHandler(
     JSCallsContainer* js_calls_container)
     : BaseScreenHandler(kScreenId, js_calls_container) {
diff --git a/chrome/browser/ui/webui/chromeos/login/device_disabled_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/device_disabled_screen_handler.h
index f90ad43..15760661 100644
--- a/chrome/browser/ui/webui/chromeos/login/device_disabled_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/device_disabled_screen_handler.h
@@ -15,7 +15,8 @@
 // Interface between the device disabled screen and its representation.
 class DeviceDisabledScreenView {
  public:
-  constexpr static OobeScreen kScreenId = OobeScreen::SCREEN_DEVICE_DISABLED;
+  constexpr static StaticOobeScreenId kScreenId =
+      OobeScreen::SCREEN_DEVICE_DISABLED;
 
   virtual ~DeviceDisabledScreenView() {}
 
diff --git a/chrome/browser/ui/webui/chromeos/login/discover_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/discover_screen_handler.cc
index 520c7c1..beb21b7 100644
--- a/chrome/browser/ui/webui/chromeos/login/discover_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/discover_screen_handler.cc
@@ -8,6 +8,8 @@
 
 namespace chromeos {
 
+constexpr StaticOobeScreenId DiscoverScreenView::kScreenId;
+
 DiscoverScreenHandler::DiscoverScreenHandler(
     JSCallsContainer* js_calls_container)
     : BaseScreenHandler(kScreenId, js_calls_container) {
diff --git a/chrome/browser/ui/webui/chromeos/login/discover_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/discover_screen_handler.h
index 495d3f6..8510831 100644
--- a/chrome/browser/ui/webui/chromeos/login/discover_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/discover_screen_handler.h
@@ -17,7 +17,7 @@
 // WebUI representation.
 class DiscoverScreenView {
  public:
-  constexpr static OobeScreen kScreenId = OobeScreen::SCREEN_DISCOVER;
+  constexpr static StaticOobeScreenId kScreenId = OobeScreen::SCREEN_DISCOVER;
 
   virtual ~DiscoverScreenView() = default;
 
diff --git a/chrome/browser/ui/webui/chromeos/login/enable_debugging_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/enable_debugging_screen_handler.cc
index 5f616a8..a8d2778 100644
--- a/chrome/browser/ui/webui/chromeos/login/enable_debugging_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/enable_debugging_screen_handler.cc
@@ -32,6 +32,8 @@
 
 namespace chromeos {
 
+constexpr StaticOobeScreenId EnableDebuggingScreenView::kScreenId;
+
 EnableDebuggingScreenHandler::EnableDebuggingScreenHandler(
     JSCallsContainer* js_calls_container)
     : BaseScreenHandler(kScreenId, js_calls_container),
diff --git a/chrome/browser/ui/webui/chromeos/login/enable_debugging_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/enable_debugging_screen_handler.h
index f145b4b1e..9664897d 100644
--- a/chrome/browser/ui/webui/chromeos/login/enable_debugging_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/enable_debugging_screen_handler.h
@@ -22,7 +22,7 @@
 // Note, do not forget to call OnViewDestroyed in the dtor.
 class EnableDebuggingScreenView {
  public:
-  constexpr static OobeScreen kScreenId =
+  constexpr static StaticOobeScreenId kScreenId =
       OobeScreen::SCREEN_OOBE_ENABLE_DEBUGGING;
 
   virtual ~EnableDebuggingScreenView() {}
diff --git a/chrome/browser/ui/webui/chromeos/login/encryption_migration_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/encryption_migration_screen_handler.cc
index eadeaee..638501b 100644
--- a/chrome/browser/ui/webui/chromeos/login/encryption_migration_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/encryption_migration_screen_handler.cc
@@ -253,6 +253,8 @@
 
 namespace chromeos {
 
+constexpr StaticOobeScreenId EncryptionMigrationScreenView::kScreenId;
+
 EncryptionMigrationScreenHandler::EncryptionMigrationScreenHandler(
     JSCallsContainer* js_calls_container)
     : BaseScreenHandler(kScreenId, js_calls_container),
diff --git a/chrome/browser/ui/webui/chromeos/login/encryption_migration_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/encryption_migration_screen_handler.h
index 68916602..cdfafacc 100644
--- a/chrome/browser/ui/webui/chromeos/login/encryption_migration_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/encryption_migration_screen_handler.h
@@ -37,7 +37,7 @@
   using ContinueLoginCallback = base::OnceCallback<void(const UserContext&)>;
   using RestartLoginCallback = base::OnceCallback<void(const UserContext&)>;
 
-  constexpr static OobeScreen kScreenId =
+  constexpr static StaticOobeScreenId kScreenId =
       OobeScreen::SCREEN_ENCRYPTION_MIGRATION;
 
   virtual ~EncryptionMigrationScreenView() {}
diff --git a/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc
index bb90faa..c8065702 100644
--- a/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc
@@ -170,6 +170,8 @@
 
 }  // namespace
 
+constexpr StaticOobeScreenId EnrollmentScreenView::kScreenId;
+
 // EnrollmentScreenHandler, public ------------------------------
 
 EnrollmentScreenHandler::EnrollmentScreenHandler(
diff --git a/chrome/browser/ui/webui/chromeos/login/error_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/error_screen_handler.cc
index 1ed2833..e15b21036 100644
--- a/chrome/browser/ui/webui/chromeos/login/error_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/error_screen_handler.cc
@@ -15,6 +15,8 @@
 
 namespace chromeos {
 
+constexpr StaticOobeScreenId ErrorScreenView::kScreenId;
+
 ErrorScreenHandler::ErrorScreenHandler(JSCallsContainer* js_calls_container)
     : BaseScreenHandler(kScreenId, js_calls_container) {
   set_user_acted_method_path("login.ErrorMessageScreen.userActed");
@@ -52,7 +54,7 @@
   BaseScreenHandler::SetBaseScreen(nullptr);
 }
 
-void ErrorScreenHandler::ShowOobeScreen(OobeScreen screen) {
+void ErrorScreenHandler::ShowOobeScreen(OobeScreenId screen) {
   ShowScreen(screen);
 }
 
diff --git a/chrome/browser/ui/webui/chromeos/login/error_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/error_screen_handler.h
index b31cd28d..9db0b684 100644
--- a/chrome/browser/ui/webui/chromeos/login/error_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/error_screen_handler.h
@@ -17,7 +17,8 @@
 // representation. Owned by ErrorScreen.
 class ErrorScreenView {
  public:
-  constexpr static OobeScreen kScreenId = OobeScreen::SCREEN_ERROR_MESSAGE;
+  constexpr static StaticOobeScreenId kScreenId =
+      OobeScreen::SCREEN_ERROR_MESSAGE;
 
   virtual ~ErrorScreenView() {}
 
@@ -34,7 +35,7 @@
   virtual void Unbind() = 0;
 
   // Switches to |screen|.
-  virtual void ShowOobeScreen(OobeScreen screen) = 0;
+  virtual void ShowOobeScreen(OobeScreenId screen) = 0;
 
   // Sets current error state of the screen.
   virtual void SetErrorStateCode(NetworkError::ErrorState error_state) = 0;
@@ -69,7 +70,7 @@
   void Hide() override;
   void Bind(ErrorScreen* screen) override;
   void Unbind() override;
-  void ShowOobeScreen(OobeScreen screen) override;
+  void ShowOobeScreen(OobeScreenId screen) override;
   void SetErrorStateCode(NetworkError::ErrorState error_state) override;
   void SetErrorStateNetwork(const std::string& network_name) override;
   void SetGuestSigninAllowed(bool value) override;
diff --git a/chrome/browser/ui/webui/chromeos/login/eula_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/eula_screen_handler.cc
index bec7655..e0638ca 100644
--- a/chrome/browser/ui/webui/chromeos/login/eula_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/eula_screen_handler.cc
@@ -27,6 +27,8 @@
 
 namespace chromeos {
 
+constexpr StaticOobeScreenId EulaView::kScreenId;
+
 EulaScreenHandler::EulaScreenHandler(JSCallsContainer* js_calls_container,
                                      CoreOobeView* core_oobe_view)
     : BaseScreenHandler(kScreenId, js_calls_container),
diff --git a/chrome/browser/ui/webui/chromeos/login/eula_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/eula_screen_handler.h
index 4d77296b..e6aea40f 100644
--- a/chrome/browser/ui/webui/chromeos/login/eula_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/eula_screen_handler.h
@@ -27,7 +27,7 @@
 // dtor.
 class EulaView {
  public:
-  constexpr static OobeScreen kScreenId = OobeScreen::SCREEN_OOBE_EULA;
+  constexpr static StaticOobeScreenId kScreenId = OobeScreen::SCREEN_OOBE_EULA;
 
   virtual ~EulaView() {}
 
diff --git a/chrome/browser/ui/webui/chromeos/login/fingerprint_setup_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/fingerprint_setup_screen_handler.cc
index 3a5f917..df238a1 100644
--- a/chrome/browser/ui/webui/chromeos/login/fingerprint_setup_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/fingerprint_setup_screen_handler.cc
@@ -47,6 +47,8 @@
 
 namespace chromeos {
 
+constexpr StaticOobeScreenId FingerprintSetupScreenView::kScreenId;
+
 FingerprintSetupScreenHandler::FingerprintSetupScreenHandler(
     JSCallsContainer* js_calls_container)
     : BaseScreenHandler(kScreenId, js_calls_container) {
diff --git a/chrome/browser/ui/webui/chromeos/login/fingerprint_setup_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/fingerprint_setup_screen_handler.h
index 8eb35772..c13329e 100644
--- a/chrome/browser/ui/webui/chromeos/login/fingerprint_setup_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/fingerprint_setup_screen_handler.h
@@ -18,7 +18,8 @@
 // WebUI representation.
 class FingerprintSetupScreenView {
  public:
-  constexpr static OobeScreen kScreenId = OobeScreen::SCREEN_FINGERPRINT_SETUP;
+  constexpr static StaticOobeScreenId kScreenId =
+      OobeScreen::SCREEN_FINGERPRINT_SETUP;
 
   virtual ~FingerprintSetupScreenView() = default;
 
diff --git a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
index 4b7654a..d687bea 100644
--- a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
@@ -240,6 +240,8 @@
 
 }  // namespace
 
+constexpr StaticOobeScreenId GaiaView::kScreenId;
+
 // A class that's used to specify the way how Gaia should be loaded.
 struct GaiaScreenHandler::GaiaContext {
   GaiaContext();
diff --git a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h
index 6f2a772..b5d2ba0 100644
--- a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h
@@ -36,7 +36,8 @@
 
 class GaiaView {
  public:
-  constexpr static OobeScreen kScreenId = OobeScreen::SCREEN_GAIA_SIGNIN;
+  constexpr static StaticOobeScreenId kScreenId =
+      OobeScreen::SCREEN_GAIA_SIGNIN;
 
   GaiaView() = default;
   virtual ~GaiaView() = default;
diff --git a/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.cc
index 5664949..2025c505 100644
--- a/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.cc
@@ -22,6 +22,8 @@
 
 namespace chromeos {
 
+constexpr StaticOobeScreenId HIDDetectionView::kScreenId;
+
 HIDDetectionScreenHandler::HIDDetectionScreenHandler(
     JSCallsContainer* js_calls_container,
     CoreOobeView* core_oobe_view)
diff --git a/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.h
index 8dbda25..55d60aa4 100644
--- a/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.h
@@ -24,7 +24,8 @@
 // dtor.
 class HIDDetectionView {
  public:
-  constexpr static OobeScreen kScreenId = OobeScreen::SCREEN_OOBE_HID_DETECTION;
+  constexpr static StaticOobeScreenId kScreenId =
+      OobeScreen::SCREEN_OOBE_HID_DETECTION;
 
   virtual ~HIDDetectionView() {}
 
diff --git a/chrome/browser/ui/webui/chromeos/login/kiosk_autolaunch_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/kiosk_autolaunch_screen_handler.cc
index 5d503645..865def1b 100644
--- a/chrome/browser/ui/webui/chromeos/login/kiosk_autolaunch_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/kiosk_autolaunch_screen_handler.cc
@@ -27,6 +27,8 @@
 
 namespace chromeos {
 
+constexpr StaticOobeScreenId KioskAutolaunchScreenView::kScreenId;
+
 KioskAutolaunchScreenHandler::KioskAutolaunchScreenHandler(
     JSCallsContainer* js_calls_container)
     : BaseScreenHandler(kScreenId, js_calls_container) {
diff --git a/chrome/browser/ui/webui/chromeos/login/kiosk_autolaunch_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/kiosk_autolaunch_screen_handler.h
index b841c25..11ad4ab0 100644
--- a/chrome/browser/ui/webui/chromeos/login/kiosk_autolaunch_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/kiosk_autolaunch_screen_handler.h
@@ -19,7 +19,8 @@
 // Note, do not forget to call OnViewDestroyed in the dtor.
 class KioskAutolaunchScreenView {
  public:
-  constexpr static OobeScreen kScreenId = OobeScreen::SCREEN_KIOSK_AUTOLAUNCH;
+  constexpr static StaticOobeScreenId kScreenId =
+      OobeScreen::SCREEN_KIOSK_AUTOLAUNCH;
 
   virtual ~KioskAutolaunchScreenView() {}
 
diff --git a/chrome/browser/ui/webui/chromeos/login/kiosk_enable_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/kiosk_enable_screen_handler.cc
index 82951c24..476a82c 100644
--- a/chrome/browser/ui/webui/chromeos/login/kiosk_enable_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/kiosk_enable_screen_handler.cc
@@ -20,6 +20,8 @@
 
 namespace chromeos {
 
+constexpr StaticOobeScreenId KioskEnableScreenView::kScreenId;
+
 KioskEnableScreenHandler::KioskEnableScreenHandler(
     JSCallsContainer* js_calls_container)
     : BaseScreenHandler(kScreenId, js_calls_container),
diff --git a/chrome/browser/ui/webui/chromeos/login/kiosk_enable_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/kiosk_enable_screen_handler.h
index c82e3f1..ca852c8 100644
--- a/chrome/browser/ui/webui/chromeos/login/kiosk_enable_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/kiosk_enable_screen_handler.h
@@ -19,7 +19,8 @@
 // Note, do not forget to call OnViewDestroyed in the dtor.
 class KioskEnableScreenView {
  public:
-  constexpr static OobeScreen kScreenId = OobeScreen::SCREEN_KIOSK_ENABLE;
+  constexpr static StaticOobeScreenId kScreenId =
+      OobeScreen::SCREEN_KIOSK_ENABLE;
 
   virtual ~KioskEnableScreenView() {}
 
diff --git a/chrome/browser/ui/webui/chromeos/login/marketing_opt_in_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/marketing_opt_in_screen_handler.cc
index d0cdb09..01da3bd 100644
--- a/chrome/browser/ui/webui/chromeos/login/marketing_opt_in_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/marketing_opt_in_screen_handler.cc
@@ -10,6 +10,8 @@
 
 namespace chromeos {
 
+constexpr StaticOobeScreenId MarketingOptInScreenView::kScreenId;
+
 MarketingOptInScreenHandler::MarketingOptInScreenHandler(
     JSCallsContainer* js_calls_container)
     : BaseScreenHandler(kScreenId, js_calls_container) {
diff --git a/chrome/browser/ui/webui/chromeos/login/marketing_opt_in_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/marketing_opt_in_screen_handler.h
index 3f934b9e..bf08657 100644
--- a/chrome/browser/ui/webui/chromeos/login/marketing_opt_in_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/marketing_opt_in_screen_handler.h
@@ -16,7 +16,8 @@
 // WebUI representation.
 class MarketingOptInScreenView {
  public:
-  constexpr static OobeScreen kScreenId = OobeScreen::SCREEN_MARKETING_OPT_IN;
+  constexpr static StaticOobeScreenId kScreenId =
+      OobeScreen::SCREEN_MARKETING_OPT_IN;
 
   virtual ~MarketingOptInScreenView() = default;
 
diff --git a/chrome/browser/ui/webui/chromeos/login/multidevice_setup_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/multidevice_setup_screen_handler.cc
index 4ceafb89..030ddf0c 100644
--- a/chrome/browser/ui/webui/chromeos/login/multidevice_setup_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/multidevice_setup_screen_handler.cc
@@ -11,6 +11,8 @@
 
 namespace chromeos {
 
+constexpr StaticOobeScreenId MultiDeviceSetupScreenView::kScreenId;
+
 MultiDeviceSetupScreenHandler::MultiDeviceSetupScreenHandler(
     JSCallsContainer* js_calls_container)
     : BaseScreenHandler(kScreenId, js_calls_container) {
diff --git a/chrome/browser/ui/webui/chromeos/login/multidevice_setup_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/multidevice_setup_screen_handler.h
index 3b0579e..bd11dc7 100644
--- a/chrome/browser/ui/webui/chromeos/login/multidevice_setup_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/multidevice_setup_screen_handler.h
@@ -16,7 +16,8 @@
 // WebUI representation.
 class MultiDeviceSetupScreenView {
  public:
-  constexpr static OobeScreen kScreenId = OobeScreen::SCREEN_MULTIDEVICE_SETUP;
+  constexpr static StaticOobeScreenId kScreenId =
+      OobeScreen::SCREEN_MULTIDEVICE_SETUP;
 
   virtual ~MultiDeviceSetupScreenView() = default;
 
diff --git a/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc
index 02cd99f7..007078bc 100644
--- a/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc
@@ -19,6 +19,8 @@
 
 namespace chromeos {
 
+constexpr StaticOobeScreenId NetworkScreenView::kScreenId;
+
 NetworkScreenHandler::NetworkScreenHandler(JSCallsContainer* js_calls_container,
                                            CoreOobeView* core_oobe_view)
     : BaseScreenHandler(kScreenId, js_calls_container),
diff --git a/chrome/browser/ui/webui/chromeos/login/network_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/network_screen_handler.h
index 94e179f..5a7c8d0 100644
--- a/chrome/browser/ui/webui/chromeos/login/network_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/network_screen_handler.h
@@ -17,7 +17,8 @@
 // Interface of network screen. Owned by NetworkScreen.
 class NetworkScreenView {
  public:
-  constexpr static OobeScreen kScreenId = OobeScreen::SCREEN_OOBE_NETWORK;
+  constexpr static StaticOobeScreenId kScreenId =
+      OobeScreen::SCREEN_OOBE_NETWORK;
 
   virtual ~NetworkScreenView() {}
 
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
index 059aa11..8e2a4e5 100644
--- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
@@ -583,7 +583,7 @@
     handler->InitializeBase();
 }
 
-void OobeUI::CurrentScreenChanged(OobeScreen new_screen) {
+void OobeUI::CurrentScreenChanged(OobeScreenId new_screen) {
   previous_screen_ = current_screen_;
 
   current_screen_ = new_screen;
@@ -591,7 +591,7 @@
     observer.OnCurrentScreenChanged(current_screen_, new_screen);
 }
 
-bool OobeUI::IsScreenInitialized(OobeScreen screen) {
+bool OobeUI::IsScreenInitialized(OobeScreenId screen) {
   for (BaseScreenHandler* handler : screen_handlers_) {
     if (handler->oobe_screen() == screen) {
       return handler->page_is_ready();
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.h b/chrome/browser/ui/webui/chromeos/login/oobe_ui.h
index 88d13769..6361eae 100644
--- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.h
+++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.h
@@ -58,8 +58,8 @@
   class Observer {
    public:
     Observer() {}
-    virtual void OnCurrentScreenChanged(OobeScreen current_screen,
-                                        OobeScreen new_screen) = 0;
+    virtual void OnCurrentScreenChanged(OobeScreenId current_screen,
+                                        OobeScreenId new_screen) = 0;
 
     virtual void OnDestroyingOobeUI() = 0;
 
@@ -81,9 +81,9 @@
   void InitializeHandlers();
 
   // Called when the screen has changed.
-  void CurrentScreenChanged(OobeScreen screen);
+  void CurrentScreenChanged(OobeScreenId screen);
 
-  bool IsScreenInitialized(OobeScreen screen);
+  bool IsScreenInitialized(OobeScreenId screen);
 
   bool IsJSReady(const base::Closure& display_is_ready_callback);
 
@@ -105,9 +105,9 @@
   void AddObserver(Observer* observer);
   void RemoveObserver(Observer* observer);
 
-  OobeScreen current_screen() const { return current_screen_; }
+  OobeScreenId current_screen() const { return current_screen_; }
 
-  OobeScreen previous_screen() const { return previous_screen_; }
+  OobeScreenId previous_screen() const { return previous_screen_; }
 
   const std::string& display_type() const { return display_type_; }
 
@@ -137,14 +137,13 @@
   // Find a handler instance.
   template <typename THandler>
   THandler* GetHandler() {
-    OobeScreen expected_screen = THandler::kScreenId;
+    OobeScreenId expected_screen = THandler::kScreenId;
     for (BaseScreenHandler* handler : screen_handlers_) {
       if (expected_screen == handler->oobe_screen())
         return static_cast<THandler*>(handler);
     }
 
-    NOTREACHED() << "Unable to find handler for screen "
-                 << GetOobeScreenName(expected_screen);
+    NOTREACHED() << "Unable to find handler for screen " << expected_screen;
     return nullptr;
   }
 
@@ -184,10 +183,10 @@
   std::unique_ptr<ErrorScreen> error_screen_;
 
   // Id of the current oobe/login screen.
-  OobeScreen current_screen_ = OobeScreen::SCREEN_UNKNOWN;
+  OobeScreenId current_screen_ = OobeScreen::SCREEN_UNKNOWN;
 
   // Id of the previous oobe/login screen.
-  OobeScreen previous_screen_ = OobeScreen::SCREEN_UNKNOWN;
+  OobeScreenId previous_screen_ = OobeScreen::SCREEN_UNKNOWN;
 
   // Flag that indicates whether JS part is fully loaded and ready to accept
   // calls.
diff --git a/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.cc
index 0a97448d..d8a5fa1 100644
--- a/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.cc
@@ -71,6 +71,8 @@
 
 namespace chromeos {
 
+constexpr StaticOobeScreenId RecommendAppsScreenView::kScreenId;
+
 RecommendAppsScreenHandler::RecommendAppsScreenHandler(
     JSCallsContainer* js_calls_container)
     : BaseScreenHandler(kScreenId, js_calls_container) {
diff --git a/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.h
index 23b672f..2f7231b 100644
--- a/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.h
@@ -18,7 +18,8 @@
 // WebUI representation.
 class RecommendAppsScreenView {
  public:
-  constexpr static OobeScreen kScreenId = OobeScreen::SCREEN_RECOMMEND_APPS;
+  constexpr static StaticOobeScreenId kScreenId =
+      OobeScreen::SCREEN_RECOMMEND_APPS;
 
   virtual ~RecommendAppsScreenView() = default;
 
diff --git a/chrome/browser/ui/webui/chromeos/login/reset_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/reset_screen_handler.cc
index 187aa5d..8187335 100644
--- a/chrome/browser/ui/webui/chromeos/login/reset_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/reset_screen_handler.cc
@@ -19,6 +19,8 @@
 
 namespace chromeos {
 
+constexpr StaticOobeScreenId ResetView::kScreenId;
+
 ResetScreenHandler::ResetScreenHandler(JSCallsContainer* js_calls_container)
     : BaseScreenHandler(kScreenId, js_calls_container) {
   set_user_acted_method_path("login.ResetScreen.userActed");
diff --git a/chrome/browser/ui/webui/chromeos/login/reset_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/reset_screen_handler.h
index c9ea00c..3c820bb 100644
--- a/chrome/browser/ui/webui/chromeos/login/reset_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/reset_screen_handler.h
@@ -19,7 +19,7 @@
 // representation, either views based or WebUI.
 class ResetView {
  public:
-  constexpr static OobeScreen kScreenId = OobeScreen::SCREEN_OOBE_RESET;
+  constexpr static StaticOobeScreenId kScreenId = OobeScreen::SCREEN_OOBE_RESET;
 
   virtual ~ResetView() {}
 
diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
index 8ca1c8c3c..b25784e 100644
--- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
@@ -188,7 +188,7 @@
            frame_error == net::ERR_TUNNEL_CONNECTION_FAILED));
 }
 
-bool IsSigninScreen(const OobeScreen screen) {
+bool IsSigninScreen(const OobeScreenId screen) {
   return screen == OobeScreen::SCREEN_GAIA_SIGNIN ||
          screen == OobeScreen::SCREEN_ACCOUNT_PICKER;
 }
@@ -820,8 +820,8 @@
   registry->RegisterDictionaryPref(prefs::kUsersLastInputMethod);
 }
 
-void SigninScreenHandler::OnCurrentScreenChanged(OobeScreen current_screen,
-                                                 OobeScreen new_screen) {
+void SigninScreenHandler::OnCurrentScreenChanged(OobeScreenId current_screen,
+                                                 OobeScreenId new_screen) {
   if (new_screen == OobeScreen::SCREEN_ACCOUNT_PICKER) {
     // Restore active IME state if returning to user pod row screen.
     input_method::InputMethodManager::Get()->SetState(ime_state_);
diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h
index 9256d90..c2ab54e 100644
--- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h
@@ -221,8 +221,8 @@
   static void RegisterPrefs(PrefRegistrySimple* registry);
 
   // OobeUI::Observer implementation:
-  void OnCurrentScreenChanged(OobeScreen current_screen,
-                              OobeScreen new_screen) override;
+  void OnCurrentScreenChanged(OobeScreenId current_screen,
+                              OobeScreenId new_screen) override;
   void OnDestroyingOobeUI() override {}
 
   // ash::mojom::WallpaperObserver implementation:
diff --git a/chrome/browser/ui/webui/chromeos/login/supervision_transition_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/supervision_transition_screen_handler.cc
index afbd0859..e12cdea 100644
--- a/chrome/browser/ui/webui/chromeos/login/supervision_transition_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/supervision_transition_screen_handler.cc
@@ -27,6 +27,8 @@
 
 namespace chromeos {
 
+constexpr StaticOobeScreenId SupervisionTransitionScreenView::kScreenId;
+
 SupervisionTransitionScreenHandler::SupervisionTransitionScreenHandler(
     JSCallsContainer* js_calls_container)
     : BaseScreenHandler(kScreenId, js_calls_container) {
diff --git a/chrome/browser/ui/webui/chromeos/login/supervision_transition_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/supervision_transition_screen_handler.h
index 502e70fd..5796eb1c 100644
--- a/chrome/browser/ui/webui/chromeos/login/supervision_transition_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/supervision_transition_screen_handler.h
@@ -23,7 +23,7 @@
 // and its WebUI representation.
 class SupervisionTransitionScreenView {
  public:
-  constexpr static OobeScreen kScreenId =
+  constexpr static StaticOobeScreenId kScreenId =
       OobeScreen::SCREEN_SUPERVISION_TRANSITION;
 
   virtual ~SupervisionTransitionScreenView() {}
diff --git a/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.cc
index b9f404d..2ec300f 100644
--- a/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.cc
@@ -55,6 +55,8 @@
 
 namespace chromeos {
 
+constexpr StaticOobeScreenId SyncConsentScreenView::kScreenId;
+
 SyncConsentScreenHandler::SyncConsentScreenHandler(
     JSCallsContainer* js_calls_container)
     : BaseScreenHandler(kScreenId, js_calls_container) {
diff --git a/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.h
index fa73bb4..a90acd5 100644
--- a/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.h
@@ -18,7 +18,8 @@
 // WebUI representation.
 class SyncConsentScreenView {
  public:
-  constexpr static OobeScreen kScreenId = OobeScreen::SCREEN_SYNC_CONSENT;
+  constexpr static StaticOobeScreenId kScreenId =
+      OobeScreen::SCREEN_SYNC_CONSENT;
 
   virtual ~SyncConsentScreenView() = default;
 
diff --git a/chrome/browser/ui/webui/chromeos/login/terms_of_service_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/terms_of_service_screen_handler.cc
index 8811d88..e384545e 100644
--- a/chrome/browser/ui/webui/chromeos/login/terms_of_service_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/terms_of_service_screen_handler.cc
@@ -33,6 +33,8 @@
 
 namespace chromeos {
 
+constexpr StaticOobeScreenId TermsOfServiceScreenView::kScreenId;
+
 TermsOfServiceScreenHandler::TermsOfServiceScreenHandler(
     JSCallsContainer* js_calls_container,
     CoreOobeView* core_oobe_view)
diff --git a/chrome/browser/ui/webui/chromeos/login/terms_of_service_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/terms_of_service_screen_handler.h
index a26fdf6..616b58c 100644
--- a/chrome/browser/ui/webui/chromeos/login/terms_of_service_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/terms_of_service_screen_handler.h
@@ -21,7 +21,8 @@
 // WebUI representation.
 class TermsOfServiceScreenView {
  public:
-  constexpr static OobeScreen kScreenId = OobeScreen::SCREEN_TERMS_OF_SERVICE;
+  constexpr static StaticOobeScreenId kScreenId =
+      OobeScreen::SCREEN_TERMS_OF_SERVICE;
 
   virtual ~TermsOfServiceScreenView() {}
 
diff --git a/chrome/browser/ui/webui/chromeos/login/update_required_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/update_required_screen_handler.cc
index a91034af..1a557a31 100644
--- a/chrome/browser/ui/webui/chromeos/login/update_required_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/update_required_screen_handler.cc
@@ -15,6 +15,8 @@
 
 namespace chromeos {
 
+constexpr StaticOobeScreenId UpdateRequiredView::kScreenId;
+
 UpdateRequiredScreenHandler::UpdateRequiredScreenHandler(
     JSCallsContainer* js_calls_container)
     : BaseScreenHandler(kScreenId, js_calls_container) {
diff --git a/chrome/browser/ui/webui/chromeos/login/update_required_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/update_required_screen_handler.h
index 7b05a5a..c188346 100644
--- a/chrome/browser/ui/webui/chromeos/login/update_required_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/update_required_screen_handler.h
@@ -21,7 +21,8 @@
 
 class UpdateRequiredView {
  public:
-  constexpr static OobeScreen kScreenId = OobeScreen::SCREEN_UPDATE_REQUIRED;
+  constexpr static StaticOobeScreenId kScreenId =
+      OobeScreen::SCREEN_UPDATE_REQUIRED;
 
   virtual ~UpdateRequiredView() {}
 
diff --git a/chrome/browser/ui/webui/chromeos/login/update_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/update_screen_handler.cc
index caa21e6..dc272b0 100644
--- a/chrome/browser/ui/webui/chromeos/login/update_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/update_screen_handler.cc
@@ -15,6 +15,8 @@
 
 namespace chromeos {
 
+constexpr StaticOobeScreenId UpdateView::kScreenId;
+
 UpdateScreenHandler::UpdateScreenHandler(JSCallsContainer* js_calls_container)
     : BaseScreenHandler(kScreenId, js_calls_container) {
   set_user_acted_method_path("login.UpdateScreen.userActed");
diff --git a/chrome/browser/ui/webui/chromeos/login/update_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/update_screen_handler.h
index b8bec37..d12758e 100644
--- a/chrome/browser/ui/webui/chromeos/login/update_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/update_screen_handler.h
@@ -19,7 +19,8 @@
 // representation. Owned by UpdateScreen.
 class UpdateView {
  public:
-  constexpr static OobeScreen kScreenId = OobeScreen::SCREEN_OOBE_UPDATE;
+  constexpr static StaticOobeScreenId kScreenId =
+      OobeScreen::SCREEN_OOBE_UPDATE;
 
   virtual ~UpdateView() {}
 
diff --git a/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.cc
index 857cdfe0..bea38eec 100644
--- a/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.cc
@@ -9,6 +9,8 @@
 
 namespace chromeos {
 
+constexpr StaticOobeScreenId UserBoardView::kScreenId;
+
 UserBoardScreenHandler::UserBoardScreenHandler(
     JSCallsContainer* js_calls_container)
     : BaseScreenHandler(kScreenId, js_calls_container), weak_factory_(this) {}
diff --git a/chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.cc
index e9c476d..cf6cf3e 100644
--- a/chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.cc
@@ -37,6 +37,8 @@
 
 namespace chromeos {
 
+constexpr StaticOobeScreenId WelcomeView::kScreenId;
+
 // WelcomeScreenHandler, public: -----------------------------------------------
 
 WelcomeScreenHandler::WelcomeScreenHandler(JSCallsContainer* js_calls_container,
diff --git a/chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.h
index b3313a6..efecb62 100644
--- a/chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.h
@@ -23,7 +23,8 @@
 // Interface for WelcomeScreenHandler.
 class WelcomeView {
  public:
-  constexpr static OobeScreen kScreenId = OobeScreen::SCREEN_OOBE_WELCOME;
+  constexpr static StaticOobeScreenId kScreenId =
+      OobeScreen::SCREEN_OOBE_WELCOME;
 
   virtual ~WelcomeView() {}
 
diff --git a/chrome/browser/ui/webui/chromeos/login/wrong_hwid_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/wrong_hwid_screen_handler.cc
index 1851eed..e1b8a87d 100644
--- a/chrome/browser/ui/webui/chromeos/login/wrong_hwid_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/wrong_hwid_screen_handler.cc
@@ -11,6 +11,8 @@
 
 namespace chromeos {
 
+constexpr StaticOobeScreenId WrongHWIDScreenView::kScreenId;
+
 WrongHWIDScreenHandler::WrongHWIDScreenHandler(
     JSCallsContainer* js_calls_container)
     : BaseScreenHandler(kScreenId, js_calls_container) {
diff --git a/chrome/browser/ui/webui/chromeos/login/wrong_hwid_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/wrong_hwid_screen_handler.h
index 12e68a51..73ebaa4 100644
--- a/chrome/browser/ui/webui/chromeos/login/wrong_hwid_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/wrong_hwid_screen_handler.h
@@ -18,7 +18,7 @@
 // Note, do not forget to call OnViewDestroyed in the dtor.
 class WrongHWIDScreenView {
  public:
-  constexpr static OobeScreen kScreenId = OobeScreen::SCREEN_WRONG_HWID;
+  constexpr static StaticOobeScreenId kScreenId = OobeScreen::SCREEN_WRONG_HWID;
 
   virtual ~WrongHWIDScreenView() {}
 
diff --git a/chrome/browser/ui/webui/discards/OWNERS b/chrome/browser/ui/webui/discards/OWNERS
index 763236c6..4406fd7e 100644
--- a/chrome/browser/ui/webui/discards/OWNERS
+++ b/chrome/browser/ui/webui/discards/OWNERS
@@ -1,4 +1,4 @@
-file://services/resource_coordinator/OWNERS
+file://chrome/browser/performance_manager/OWNERS
 
 per-file *.mojom=set noparent
 per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/chrome/common/extensions/api/autotest_private.idl b/chrome/common/extensions/api/autotest_private.idl
index 4b78056d..856f6600 100644
--- a/chrome/common/extensions/api/autotest_private.idl
+++ b/chrome/common/extensions/api/autotest_private.idl
@@ -8,6 +8,10 @@
  implemented_in="chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h"]
 namespace autotestPrivate {
 
+  enum ShelfAlignmentType {
+    Bottom, Left, Right, BottomLocked
+  };
+
   dictionary LoginStatusDict {
     // Are we logged in?
     boolean isLoggedIn;
@@ -166,6 +170,8 @@
 
   callback GetShelfAutoHideBehaviorCallback = void (DOMString behavior);
 
+  callback GetShelfAlignmentCallback = void (ShelfAlignmentType alignment);
+
   callback VoidCallback = void ();
 
   interface Functions {
@@ -372,6 +378,19 @@
     static void setShelfAutoHideBehavior(DOMString displayId,
         DOMString behavior, VoidCallback callback);
 
+    // Get the shelf alignment.
+    // |displayId|: display that contains the shelf.
+    // |callback| is invoked with the shelf alignment type.
+    static void getShelfAlignment(DOMString displayId,
+        GetShelfAlignmentCallback callback);
+
+    // Set the shelf alignment.
+    // |displayId|: display that contains the shelf.
+    // |alignment|: the type of alignment to set.
+    // |callback|: Called when the operation has completed.
+    static void setShelfAlignment(DOMString displayId,
+        ShelfAlignmentType alignment, VoidCallback callback);
+
     // Show virtual keyboard of the current input method if it's available.
     static void showVirtualKeyboardIfEnabled();
   };
diff --git a/chrome/common/extensions/api/extension_action/action_info.cc b/chrome/common/extensions/api/extension_action/action_info.cc
index d108f433..e51cf98 100644
--- a/chrome/common/extensions/api/extension_action/action_info.cc
+++ b/chrome/common/extensions/api/extension_action/action_info.cc
@@ -24,8 +24,8 @@
 constexpr char kEnabled[] = "enabled";
 constexpr char kDisabled[] = "disabled";
 
-// The manifest data container for the ActionInfos for BrowserActions,
-// PageActions and SystemIndicators.
+// The manifest data container for the ActionInfos for BrowserActions and
+// PageActions.
 struct ActionInfoData : public Extension::ManifestData {
   explicit ActionInfoData(std::unique_ptr<ActionInfo> action_info);
   ~ActionInfoData() override;
@@ -164,12 +164,6 @@
 }
 
 // static
-const ActionInfo* ActionInfo::GetSystemIndicatorInfo(
-    const Extension* extension) {
-  return GetActionInfo(extension, keys::kSystemIndicator);
-}
-
-// static
 void ActionInfo::SetExtensionActionInfo(Extension* extension,
                                         std::unique_ptr<ActionInfo> info) {
   extension->SetManifestData(keys::kAction,
@@ -191,13 +185,6 @@
 }
 
 // static
-void ActionInfo::SetSystemIndicatorInfo(Extension* extension,
-                                        std::unique_ptr<ActionInfo> info) {
-  extension->SetManifestData(keys::kSystemIndicator,
-                             std::make_unique<ActionInfoData>(std::move(info)));
-}
-
-// static
 bool ActionInfo::IsVerboseInstallMessage(const Extension* extension) {
   const ActionInfo* page_action_info = GetPageActionInfo(extension);
   return page_action_info &&
diff --git a/chrome/common/extensions/api/extension_action/action_info.h b/chrome/common/extensions/api/extension_action/action_info.h
index 6be0b7b..344fefb 100644
--- a/chrome/common/extensions/api/extension_action/action_info.h
+++ b/chrome/common/extensions/api/extension_action/action_info.h
@@ -30,7 +30,6 @@
   enum Type {
     TYPE_BROWSER,
     TYPE_PAGE,
-    TYPE_SYSTEM_INDICATOR,
   };
 
   enum DefaultState {
@@ -44,8 +43,7 @@
                                           base::string16* error);
 
   // Returns any action associated with the extension, whether it's specified
-  // under the "page_action", "browser_action", or "action" key (note this does
-  // *not* check system indicator).
+  // under the "page_action", "browser_action", or "action" key.
   // TODO(devlin): This is a crutch while moving away from the distinct action
   // types. Remove it when that's done.
   static const ActionInfo* GetAnyActionInfo(const Extension* extension);
@@ -59,9 +57,6 @@
   // Returns the extension's page action, if any.
   static const ActionInfo* GetPageActionInfo(const Extension* extension);
 
-  // Returns the extension's system indicator, if any.
-  static const ActionInfo* GetSystemIndicatorInfo(const Extension* extension);
-
   // Sets the extension's action.
   static void SetExtensionActionInfo(Extension* extension,
                                      std::unique_ptr<ActionInfo> info);
@@ -74,10 +69,6 @@
   static void SetPageActionInfo(Extension* extension,
                                 std::unique_ptr<ActionInfo> info);
 
-  // Sets the extension's system indicator.
-  static void SetSystemIndicatorInfo(Extension* extension,
-                                     std::unique_ptr<ActionInfo> info);
-
   // Returns true if the extension needs a verbose install message because
   // of its page action.
   static bool IsVerboseInstallMessage(const Extension* extension);
diff --git a/chrome/common/extensions/api/system_indicator/system_indicator_handler.cc b/chrome/common/extensions/api/system_indicator/system_indicator_handler.cc
index e96dcb5..9269b42 100644
--- a/chrome/common/extensions/api/system_indicator/system_indicator_handler.cc
+++ b/chrome/common/extensions/api/system_indicator/system_indicator_handler.cc
@@ -8,35 +8,96 @@
 
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
-#include "chrome/common/extensions/api/extension_action/action_info.h"
+#include "extensions/common/constants.h"
 #include "extensions/common/extension.h"
+#include "extensions/common/extension_icon_set.h"
 #include "extensions/common/manifest_constants.h"
+#include "extensions/common/manifest_handler_helpers.h"
 
 namespace extensions {
 
+namespace {
+
+struct SystemIndicatorInfo : public Extension::ManifestData {
+  SystemIndicatorInfo();
+  ~SystemIndicatorInfo() override;
+
+  ExtensionIconSet icon_set;
+
+  DISALLOW_COPY_AND_ASSIGN(SystemIndicatorInfo);
+};
+
+SystemIndicatorInfo::SystemIndicatorInfo() {}
+SystemIndicatorInfo::~SystemIndicatorInfo() = default;
+
+}  // namespace
+
 SystemIndicatorHandler::SystemIndicatorHandler() {
 }
 
 SystemIndicatorHandler::~SystemIndicatorHandler() {
 }
 
+const ExtensionIconSet* SystemIndicatorHandler::GetSystemIndicatorIcon(
+    const Extension& extension) {
+  const auto* info = static_cast<SystemIndicatorInfo*>(
+      extension.GetManifestData(manifest_keys::kSystemIndicator));
+  return info ? &info->icon_set : nullptr;
+}
+
 bool SystemIndicatorHandler::Parse(Extension* extension,
                                    base::string16* error) {
-  const base::DictionaryValue* system_indicator_value = NULL;
+  const base::DictionaryValue* system_indicator_value = nullptr;
   if (!extension->manifest()->GetDictionary(
           manifest_keys::kSystemIndicator, &system_indicator_value)) {
     *error = base::ASCIIToUTF16(manifest_errors::kInvalidSystemIndicator);
     return false;
   }
 
-  std::unique_ptr<ActionInfo> action_info =
-      ActionInfo::Load(extension, system_indicator_value, error);
+  auto set_manifest_data = [extension](const ExtensionIconSet& icon_set) {
+    auto info = std::make_unique<SystemIndicatorInfo>();
+    info->icon_set = icon_set;
+    extension->SetManifestData(manifest_keys::kSystemIndicator,
+                               std::move(info));
+  };
 
-  if (!action_info.get())
-    return false;
+  const base::Value* icon_value =
+      system_indicator_value->FindKey(manifest_keys::kActionDefaultIcon);
+  if (!icon_value) {
+    // Empty icon set.
+    set_manifest_data(ExtensionIconSet());
+    return true;
+  }
 
-  ActionInfo::SetSystemIndicatorInfo(extension, std::move(action_info));
-  return true;
+  // The |default_icon| value can be either dictionary {icon size -> icon path}
+  // or a non-empty string value.
+  ExtensionIconSet icons;
+  if (icon_value->is_dict()) {
+    if (!manifest_handler_helpers::LoadIconsFromDictionary(
+            static_cast<const base::DictionaryValue*>(icon_value), &icons,
+            error)) {
+      return false;
+    }
+    set_manifest_data(icons);
+    return true;
+  }
+
+  if (icon_value->is_string()) {
+    std::string default_icon = icon_value->GetString();
+    if (!manifest_handler_helpers::NormalizeAndValidatePath(&default_icon)) {
+      *error = base::ASCIIToUTF16(manifest_errors::kInvalidActionDefaultIcon);
+      return false;
+    }
+    // Choose the most optimistic (highest) icon density regardless of the
+    // actual icon resolution, whatever that happens to be. Code elsewhere
+    // knows how to scale down to 19.
+    icons.Add(extension_misc::EXTENSION_ICON_GIGANTOR, default_icon);
+    set_manifest_data(icons);
+    return true;
+  }
+
+  *error = base::ASCIIToUTF16(manifest_errors::kInvalidActionDefaultIcon);
+  return false;
 }
 
 base::span<const char* const> SystemIndicatorHandler::Keys() const {
diff --git a/chrome/common/extensions/api/system_indicator/system_indicator_handler.h b/chrome/common/extensions/api/system_indicator/system_indicator_handler.h
index fc3be9c2e..b6c4b27b 100644
--- a/chrome/common/extensions/api/system_indicator/system_indicator_handler.h
+++ b/chrome/common/extensions/api/system_indicator/system_indicator_handler.h
@@ -10,6 +10,8 @@
 #include "extensions/common/extension.h"
 #include "extensions/common/manifest_handler.h"
 
+class ExtensionIconSet;
+
 namespace extensions {
 
 // Parses the "system_indicator" manifest key.
@@ -18,6 +20,14 @@
   SystemIndicatorHandler();
   ~SystemIndicatorHandler() override;
 
+  // Returns the default system indicator icon for the given |extension|, if
+  // the extension has a system indicator, and null otherwise. Note that if the
+  // extension has a system indicator, the result is never null (though the
+  // set may be empty).
+  static const ExtensionIconSet* GetSystemIndicatorIcon(
+      const Extension& extension);
+
+  // ManifestHandler:
   bool Parse(Extension* extension, base::string16* error) override;
 
  private:
diff --git a/chrome/common/extensions/api/system_indicator/system_indicator_handler_unittest.cc b/chrome/common/extensions/api/system_indicator/system_indicator_handler_unittest.cc
new file mode 100644
index 0000000..60af0df
--- /dev/null
+++ b/chrome/common/extensions/api/system_indicator/system_indicator_handler_unittest.cc
@@ -0,0 +1,94 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/common/extensions/api/system_indicator/system_indicator_handler.h"
+
+#include "base/test/values_test_util.h"
+#include "components/version_info/channel.h"
+#include "extensions/common/constants.h"
+#include "extensions/common/extension_icon_set.h"
+#include "extensions/common/features/feature_channel.h"
+#include "extensions/common/manifest_test.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+namespace extensions {
+
+using SystemIndicatorHandlerTest = ManifestTest;
+
+TEST_F(SystemIndicatorHandlerTest, BasicTests) {
+  ScopedCurrentChannel current_channel(version_info::Channel::DEV);
+
+  // Simple icon path.
+  {
+    constexpr char kManifest[] =
+        R"({
+             "name": "System Indicator",
+             "manifest_version": 2,
+             "version": "0.1",
+             "system_indicator": { "default_icon": "icon.png" }
+           })";
+    scoped_refptr<const Extension> extension = LoadAndExpectSuccess(
+        ManifestData(base::test::ParseJson(kManifest), "icon"));
+    ASSERT_TRUE(extension);
+    const ExtensionIconSet* icon =
+        SystemIndicatorHandler::GetSystemIndicatorIcon(*extension);
+    ASSERT_TRUE(icon);
+    // Make a copy of the map since [] is more readable than find() for
+    // comparing values.
+    ExtensionIconSet::IconMap icon_map = icon->map();
+    EXPECT_THAT(icon_map,
+                testing::ElementsAre(std::make_pair(
+                    extension_misc::EXTENSION_ICON_GIGANTOR, "icon.png")));
+  }
+
+  // Icon dictionary.
+  {
+    constexpr char kManifest[] =
+        R"({
+             "name": "System Indicator",
+             "manifest_version": 2,
+             "version": "0.1",
+             "system_indicator": {
+               "default_icon": {
+                 "24": "icon24.png",
+                 "48": "icon48.png",
+                 "79": "icon79.png"
+               }
+             }
+           })";
+    scoped_refptr<const Extension> extension = LoadAndExpectSuccess(
+        ManifestData(base::test::ParseJson(kManifest), "icon"));
+    ASSERT_TRUE(extension);
+    const ExtensionIconSet* icon =
+        SystemIndicatorHandler::GetSystemIndicatorIcon(*extension);
+    ASSERT_TRUE(icon);
+    // Make a copy of the map since [] is more readable than find() for
+    // comparing values.
+    ExtensionIconSet::IconMap icon_map = icon->map();
+    EXPECT_THAT(icon_map,
+                testing::ElementsAre(std::make_pair(24, "icon24.png"),
+                                     std::make_pair(48, "icon48.png"),
+                                     std::make_pair(79, "icon79.png")));
+  }
+
+  // Empty dictionary.
+  {
+    constexpr char kManifest[] =
+        R"({
+             "name": "System Indicator",
+             "manifest_version": 2,
+             "version": "0.1",
+             "system_indicator": {}
+           })";
+    scoped_refptr<const Extension> extension = LoadAndExpectSuccess(
+        ManifestData(base::test::ParseJson(kManifest), "icon"));
+    ASSERT_TRUE(extension);
+    const ExtensionIconSet* icon =
+        SystemIndicatorHandler::GetSystemIndicatorIcon(*extension);
+    ASSERT_TRUE(icon);
+    EXPECT_TRUE(icon->empty());
+  }
+}
+
+}  // namespace extensions
diff --git a/chrome/common/features.gni b/chrome/common/features.gni
index e62b5a4..628c4e2c 100644
--- a/chrome/common/features.gni
+++ b/chrome/common/features.gni
@@ -43,7 +43,7 @@
   enable_one_click_signin =
       is_win || is_mac || (is_linux && !is_chromeos && !is_chromecast)
 
-  enable_service_discovery = (enable_mdns && !is_android && !is_ios) || is_mac
+  enable_service_discovery = (enable_mdns && !is_android) || is_mac
 
   # Enables use of the session service, which is enabled by default.
   # Android stores them separately on the Java side.
diff --git a/chrome/common/instant_struct_traits.h b/chrome/common/instant_struct_traits.h
index 698800bf..961d1589 100644
--- a/chrome/common/instant_struct_traits.h
+++ b/chrome/common/instant_struct_traits.h
@@ -20,6 +20,9 @@
 
 IPC_ENUM_TRAITS_MAX_VALUE(NTPLoggingEventType, NTP_EVENT_TYPE_LAST)
 
+IPC_ENUM_TRAITS_MAX_VALUE(NTPSuggestionsLoggingEventType,
+                          NTPSuggestionsLoggingEventType::kMaxValue)
+
 IPC_ENUM_TRAITS_MAX_VALUE(ntp_tiles::TileTitleSource,
                           ntp_tiles::TileTitleSource::LAST)
 
diff --git a/chrome/common/media_router/discovery/media_sink_internal.h b/chrome/common/media_router/discovery/media_sink_internal.h
index a472aae..5dce50cd 100644
--- a/chrome/common/media_router/discovery/media_sink_internal.h
+++ b/chrome/common/media_router/discovery/media_sink_internal.h
@@ -90,6 +90,9 @@
   const MediaSink& sink() const { return sink_; }
   MediaSink& sink() { return sink_; }
 
+  // TOOD(jrw): Use this method where appropriate.
+  const MediaSink::Id& id() const { return sink_.id(); }
+
   void set_dial_data(const DialSinkExtraData& dial_data);
 
   // Must only be called if the sink is a DIAL sink.
diff --git a/chrome/common/search.mojom b/chrome/common/search.mojom
index c94ff17..6b7f168 100644
--- a/chrome/common/search.mojom
+++ b/chrome/common/search.mojom
@@ -12,6 +12,9 @@
 enum NTPLoggingEventType;
 
 [Native]
+enum NTPSuggestionsLoggingEventType;
+
+[Native]
 enum OmniboxFocusState;
 
 [Native]
@@ -77,6 +80,14 @@
            NTPLoggingEventType event,
            mojo_base.mojom.TimeDelta time);
 
+  // Logs events related to search suggestions from InstantExtended New Tab
+  // Pages along with an integer value. These events currently include number
+  // of suggestion chips shown and the index of chips that were clicked.
+  LogSuggestionEventWithValue(int32 page_seq_no,
+           NTPSuggestionsLoggingEventType event,
+           int32 data,
+           mojo_base.mojom.TimeDelta time);
+
   // Logs an impression on one of the Most Visited tile on the InstantExtended
   // New Tab Page.
   LogMostVisitedImpression(int32 page_seq_no, NTPTileImpression impression);
diff --git a/chrome/common/search.typemap b/chrome/common/search.typemap
index 808df6e..680cc1d 100644
--- a/chrome/common/search.typemap
+++ b/chrome/common/search.typemap
@@ -16,6 +16,7 @@
 ]
 type_mappings = [
   "chrome.mojom.NTPLoggingEventType=::NTPLoggingEventType",
+  "chrome.mojom.NTPSuggestionsLoggingEventType=::NTPSuggestionsLoggingEventType",
   "chrome.mojom.NTPTileImpression=::ntp_tiles::NTPTileImpression",
   "chrome.mojom.OmniboxFocusState=::OmniboxFocusState",
   "chrome.mojom.OmniboxFocusChangeReason=::OmniboxFocusChangeReason",
diff --git a/chrome/common/search/ntp_logging_events.h b/chrome/common/search/ntp_logging_events.h
index 5e6e11b..40873c4c 100644
--- a/chrome/common/search/ntp_logging_events.h
+++ b/chrome/common/search/ntp_logging_events.h
@@ -136,4 +136,16 @@
   NTP_EVENT_TYPE_LAST = NTP_MIDDLE_SLOT_PROMO_LINK_CLICKED
 };
 
+// The different types of events that are logged for NTP search suggestions,
+// such as number of chips shown and the index of chips that are clicked. This
+// enum is used to transfer information from the NTP javascript to the renderer
+// and is *not* used as a UMA enum histogram's logged value. These events may be
+// logged by javascript served from GWS, see
+// google3/java/com/google/gws/plugins/newtab/suggestions.js.
+enum class NTPSuggestionsLoggingEventType {
+  kShownCount = 0,
+  kIndexClicked = 1,
+  kMaxValue = kIndexClicked,
+};
+
 #endif  // CHROME_COMMON_SEARCH_NTP_LOGGING_EVENTS_H_
diff --git a/chrome/renderer/searchbox/searchbox.cc b/chrome/renderer/searchbox/searchbox.cc
index f58352d9..a9a24e1 100644
--- a/chrome/renderer/searchbox/searchbox.cc
+++ b/chrome/renderer/searchbox/searchbox.cc
@@ -221,6 +221,17 @@
   embedded_search_service_->LogEvent(page_seq_no_, event, delta);
 }
 
+void SearchBox::LogSuggestionEventWithValue(
+    NTPSuggestionsLoggingEventType event,
+    int data) {
+  base::Time navigation_start = base::Time::FromDoubleT(
+      render_frame()->GetWebFrame()->Performance().NavigationStart());
+  base::Time now = base::Time::Now();
+  base::TimeDelta delta = now - navigation_start;
+  embedded_search_service_->LogSuggestionEventWithValue(page_seq_no_, event,
+                                                        data, delta);
+}
+
 void SearchBox::LogMostVisitedImpression(
     const ntp_tiles::NTPTileImpression& impression) {
   embedded_search_service_->LogMostVisitedImpression(page_seq_no_, impression);
diff --git a/chrome/renderer/searchbox/searchbox.h b/chrome/renderer/searchbox/searchbox.h
index 1a8fd427..2575d72 100644
--- a/chrome/renderer/searchbox/searchbox.h
+++ b/chrome/renderer/searchbox/searchbox.h
@@ -47,6 +47,10 @@
   // Sends LogEvent to the browser.
   void LogEvent(NTPLoggingEventType event);
 
+  // Sends LogSuggestionEventWithValue to the browser.
+  void LogSuggestionEventWithValue(NTPSuggestionsLoggingEventType event,
+                                   int data);
+
   // Sends LogMostVisitedImpression to the browser.
   void LogMostVisitedImpression(const ntp_tiles::NTPTileImpression& impression);
 
diff --git a/chrome/renderer/searchbox/searchbox_extension.cc b/chrome/renderer/searchbox/searchbox_extension.cc
index 7311716..6f843b8 100644
--- a/chrome/renderer/searchbox/searchbox_extension.cc
+++ b/chrome/renderer/searchbox/searchbox_extension.cc
@@ -569,6 +569,7 @@
   static void ResetCustomLinks();
   static std::string FixupAndValidateUrl(const std::string& url);
   static void LogEvent(int event);
+  static void LogSuggestionEventWithValue(int event, int data);
   static void LogMostVisitedImpression(
       int position,
       int tile_title_source,
@@ -634,6 +635,8 @@
       .SetMethod("fixupAndValidateUrl",
                  &NewTabPageBindings::FixupAndValidateUrl)
       .SetMethod("logEvent", &NewTabPageBindings::LogEvent)
+      .SetMethod("logSuggestionEventWithValue",
+                 &NewTabPageBindings::LogSuggestionEventWithValue)
       .SetMethod("logMostVisitedImpression",
                  &NewTabPageBindings::LogMostVisitedImpression)
       .SetMethod("logMostVisitedNavigation",
@@ -879,6 +882,18 @@
 }
 
 // static
+void NewTabPageBindings::LogSuggestionEventWithValue(int event, int data) {
+  SearchBox* search_box = GetSearchBoxForCurrentContext();
+  if (!search_box) {
+    return;
+  }
+  if (event <= static_cast<int>(NTPSuggestionsLoggingEventType::kMaxValue)) {
+    search_box->LogSuggestionEventWithValue(
+        static_cast<NTPSuggestionsLoggingEventType>(event), data);
+  }
+}
+
+// static
 void NewTabPageBindings::LogMostVisitedImpression(
     int position,
     int tile_title_source,
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 3becaca..ee684c6 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -32,6 +32,8 @@
 import("//ui/views/features.gni")
 import("//v8/gni/v8.gni")
 
+assert(!is_ios, "Chromium/iOS shouldn't use anything in //chrome")
+
 if (is_android) {
   import("//build/config/android/rules.gni")
   import("//tools/v8_context_snapshot/v8_context_snapshot.gni")
@@ -53,7 +55,7 @@
     "$root_out_dir/pyproto/components/policy/proto/cloud_policy_pb2.py",
   ]
 
-  if (!is_android && !is_ios) {
+  if (!is_android) {
     # Used by chrome/browser/policy/test/policy_testserver.py
     data += [ "$root_out_dir/pyproto/components/policy/proto/chrome_extension_policy_pb2.py" ]
   }
@@ -1838,6 +1840,7 @@
         "../browser/chromeos/login/enterprise_enrollment_browsertest.cc",
         "../browser/chromeos/login/eula_browsertest.cc",
         "../browser/chromeos/login/existing_user_controller_browsertest.cc",
+        "../browser/chromeos/login/guest_login_browsertest.cc",
         "../browser/chromeos/login/hid_detection_browsertest.cc",
         "../browser/chromeos/login/kiosk_browsertest.cc",
         "../browser/chromeos/login/lock/fingerprint_unlock_browsertest.cc",
@@ -2788,9 +2791,9 @@
     "../browser/performance_manager/decorators/frozen_frame_aggregator_unittest.cc",
     "../browser/performance_manager/decorators/page_almost_idle_decorator_unittest.cc",
     "../browser/performance_manager/graph/frame_node_impl_unittest.cc",
+    "../browser/performance_manager/graph/graph_impl_unittest.cc",
     "../browser/performance_manager/graph/graph_test_harness.cc",
     "../browser/performance_manager/graph/graph_test_harness.h",
-    "../browser/performance_manager/graph/graph_unittest.cc",
     "../browser/performance_manager/graph/mock_graphs.cc",
     "../browser/performance_manager/graph/mock_graphs.h",
     "../browser/performance_manager/graph/node_attached_data_unittest.cc",
@@ -3054,7 +3057,7 @@
     }
   }
 
-  if (!is_android && !is_ios) {
+  if (!is_android) {
     # CRLSets are not supported on Android or iOS, but available on all other
     # platforms.
     sources += [
@@ -3600,6 +3603,7 @@
       "../browser/media/router/mojo/media_router_mojo_metrics_unittest.cc",
       "../browser/media/router/mojo/media_sink_service_status_unittest.cc",
       "../browser/media/router/providers/cast/cast_activity_manager_unittest.cc",
+      "../browser/media/router/providers/cast/cast_activity_record_unittest.cc",
       "../browser/media/router/providers/cast/cast_app_availability_tracker_unittest.cc",
       "../browser/media/router/providers/cast/cast_app_discovery_service_unittest.cc",
       "../browser/media/router/providers/cast/cast_internal_message_util_unittest.cc",
@@ -4054,6 +4058,7 @@
       "../common/extensions/api/extension_action/browser_action_manifest_unittest.cc",
       "../common/extensions/api/extension_action/page_action_manifest_unittest.cc",
       "../common/extensions/api/storage/storage_schema_manifest_handler_unittest.cc",
+      "../common/extensions/api/system_indicator/system_indicator_handler_unittest.cc",
       "../common/extensions/chrome_extensions_client_unittest.cc",
       "../common/extensions/chrome_manifest_url_handlers_unittest.cc",
       "../common/extensions/command_unittest.cc",
diff --git a/chrome/test/data/extensions/api_test/autotest_private/test.js b/chrome/test/data/extensions/api_test/autotest_private/test.js
index ba8d5b8..2a0f0cf 100644
--- a/chrome/test/data/extensions/api_test/autotest_private/test.js
+++ b/chrome/test/data/extensions/api_test/autotest_private/test.js
@@ -341,14 +341,43 @@
         var behavior = behaviors[i];
         chrome.autotestPrivate.setShelfAutoHideBehavior(displayId, behavior,
             function() {
+          chrome.test.assertNoLastError();
           chrome.autotestPrivate.getShelfAutoHideBehavior(displayId,
               function(newBehavior) {
-            chrome.test.assertTrue(behavior === newBehavior);
             chrome.test.assertNoLastError();
-            chrome.test.succeed();
+            chrome.test.assertEq(behavior, newBehavior);
           });
         });
       }
+      chrome.test.succeed();
+    });
+  },
+  // This test verifies that changing the shelf alignment works as expected.
+  function setShelfAlignment() {
+    // Using shelf from primary display.
+    var displayId = "-1";
+    chrome.system.display.getInfo(function(info) {
+      var l = info.length;
+      for (var i = 0; i < l; i++) {
+        if (info[i].isPrimary === true) {
+          displayId = info[i].id;
+          break;
+        }
+      }
+      chrome.test.assertTrue(displayId != "-1");
+      // When running 'browser_tests', Chrome OS reports itself as locked,
+      // so the only valid shelf is Bottom Locked.
+      var alignment = chrome.autotestPrivate.ShelfAlignmentType.BOTTOM_LOCKED;
+      chrome.autotestPrivate.setShelfAlignment(displayId, alignment,
+          function() {
+        chrome.test.assertNoLastError();
+        chrome.autotestPrivate.getShelfAlignment(displayId,
+            function(newAlignment) {
+          chrome.test.assertNoLastError();
+          chrome.test.assertEq(newAlignment, alignment);
+          chrome.test.succeed();
+        });
+      });
     });
   },
 ];
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn
index 6e1a50df..efedeb6 100644
--- a/chrome/test/data/webui/BUILD.gn
+++ b/chrome/test/data/webui/BUILD.gn
@@ -125,7 +125,7 @@
     ]
   }
   if (enable_print_preview) {
-    sources += [ "print_preview/new_print_preview_ui_browsertest.js" ]
+    sources += [ "print_preview/print_preview_ui_browsertest.js" ]
   }
   deps = [
     "//chrome/browser/ui",
diff --git a/chrome/test/data/webui/print_preview/destination_search_test.js b/chrome/test/data/webui/print_preview/destination_search_test.js
index ec5a066..5ee5ec78 100644
--- a/chrome/test/data/webui/print_preview/destination_search_test.js
+++ b/chrome/test/data/webui/print_preview/destination_search_test.js
@@ -14,7 +14,7 @@
         'receive successful setup with policies',
   };
 
-  const suiteName = 'NewDestinationSearchTest';
+  const suiteName = 'DestinationSearchTest';
   suite(suiteName, function() {
     /** @type {?PrintPreviewDestinationDialogElement} */
     let dialog = null;
diff --git a/chrome/test/data/webui/print_preview/new_print_preview_ui_browsertest.js b/chrome/test/data/webui/print_preview/print_preview_ui_browsertest.js
similarity index 91%
rename from chrome/test/data/webui/print_preview/new_print_preview_ui_browsertest.js
rename to chrome/test/data/webui/print_preview/print_preview_ui_browsertest.js
index 3ab107c6..7c95c767 100644
--- a/chrome/test/data/webui/print_preview/new_print_preview_ui_browsertest.js
+++ b/chrome/test/data/webui/print_preview/print_preview_ui_browsertest.js
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-/** @fileoverview Runs the Print Preview tests for the new UI. */
+/** @fileoverview Runs the Print Preview tests. */
 
 GEN_INCLUDE(['//chrome/test/data/webui/polymer_browser_test_base.js']);
 
-const NewPrintPreviewTest = class extends PolymerTest {
+const PrintPreviewTest = class extends PolymerTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/';
@@ -31,7 +31,7 @@
   }
 };
 
-PrintPreviewAppTest = class extends NewPrintPreviewTest {
+PrintPreviewAppTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/app.html';
@@ -64,7 +64,7 @@
   this.runMochaTest(print_preview_app_test.TestNames.PrintPresets);
 });
 
-PrintPreviewSidebarTest = class extends NewPrintPreviewTest {
+PrintPreviewSidebarTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/sidebar.html';
@@ -94,7 +94,7 @@
                             .SettingsSectionsVisibilityChange);
     });
 
-PrintPreviewPagesSettingsTest = class extends NewPrintPreviewTest {
+PrintPreviewPagesSettingsTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/pages_settings.html';
@@ -131,7 +131,7 @@
   this.runMochaTest(pages_settings_test.TestNames.NupChangesPages);
 });
 
-PrintPreviewPolicyTest = class extends NewPrintPreviewTest {
+PrintPreviewPolicyTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/app.html';
@@ -171,7 +171,7 @@
   this.runMochaTest(policy_tests.TestNames.DisableHeaderFooterByPolicy);
 });
 
-PrintPreviewSettingsSelectTest = class extends NewPrintPreviewTest {
+PrintPreviewSettingsSelectTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/settings_select.html';
@@ -191,7 +191,7 @@
   mocha.run();
 });
 
-PrintPreviewSelectBehaviorTest = class extends NewPrintPreviewTest {
+PrintPreviewSelectBehaviorTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/select_behavior.html';
@@ -215,7 +215,7 @@
   this.runMochaTest(select_behavior_test.TestNames.CallProcessSelectChange);
 });
 
-PrintPreviewNumberSettingsSectionTest = class extends NewPrintPreviewTest {
+PrintPreviewNumberSettingsSectionTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/number_settings_section.html';
@@ -235,12 +235,13 @@
   }
 };
 
-TEST_F('PrintPreviewNumberSettingsSectionTest', 'BlocksInvalidKeys',
-    function() {
-  this.runMochaTest(number_settings_section_test.TestNames.BlocksInvalidKeys);
-});
+TEST_F(
+    'PrintPreviewNumberSettingsSectionTest', 'BlocksInvalidKeys', function() {
+      this.runMochaTest(
+          number_settings_section_test.TestNames.BlocksInvalidKeys);
+    });
 
-PrintPreviewRestoreStateTest = class extends NewPrintPreviewTest {
+PrintPreviewRestoreStateTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/app.html';
@@ -275,7 +276,7 @@
   this.runMochaTest(restore_state_test.TestNames.SaveValues);
 });
 
-PrintPreviewModelTest = class extends NewPrintPreviewTest {
+PrintPreviewModelTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/data/model.html';
@@ -316,7 +317,7 @@
   this.runMochaTest(model_test.TestNames.ChangeDestination);
 });
 
-PrintPreviewModelSettingsAvailabilityTest = class extends NewPrintPreviewTest {
+PrintPreviewModelSettingsAvailabilityTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/data/model.html';
@@ -337,7 +338,7 @@
 });
 
 GEN('#if defined(OS_CHROMEOS)');
-PrintPreviewModelSettingsPolicyTest = class extends NewPrintPreviewTest {
+PrintPreviewModelSettingsPolicyTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/data/model.html';
@@ -358,7 +359,7 @@
 });
 GEN('#endif');
 
-PrintPreviewPreviewGenerationTest = class extends NewPrintPreviewTest {
+PrintPreviewPreviewGenerationTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/app.html';
@@ -447,7 +448,7 @@
     });
 
 GEN('#if !defined(OS_CHROMEOS)');
-PrintPreviewLinkContainerTest = class extends NewPrintPreviewTest {
+PrintPreviewLinkContainerTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/link_container.html';
@@ -488,7 +489,7 @@
 GEN('#endif');  // defined(OS_MACOSX)
 
 GEN('#if defined(OS_WIN) || defined(OS_MACOSX)');
-PrintPreviewSystemDialogBrowserTest = class extends NewPrintPreviewTest {
+PrintPreviewSystemDialogBrowserTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/app.html';
@@ -527,7 +528,7 @@
     });
 GEN('#endif');  // defined(OS_WIN) || defined(OS_MACOSX)
 
-PrintPreviewInvalidSettingsBrowserTest = class extends NewPrintPreviewTest {
+PrintPreviewInvalidSettingsBrowserTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/app.html';
@@ -580,7 +581,7 @@
                             .InvalidCertificateErrorReselectDestination);
     });
 
-PrintPreviewDestinationSelectTest = class extends NewPrintPreviewTest {
+PrintPreviewDestinationSelectTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/destination_settings.html';
@@ -671,7 +672,7 @@
           destination_select_test.TestNames.MultipleRecentDestinationsAccounts);
     });
 
-PrintPreviewDestinationDialogTest = class extends NewPrintPreviewTest {
+PrintPreviewDestinationDialogTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/destination_dialog.html';
@@ -717,7 +718,7 @@
   this.runMochaTest(destination_dialog_test.TestNames.UserAccounts);
 });
 
-PrintPreviewAdvancedDialogTest = class extends NewPrintPreviewTest {
+PrintPreviewAdvancedDialogTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/advanced_settings_dialog.html';
@@ -760,7 +761,7 @@
   this.runMochaTest(advanced_dialog_test.TestNames.AdvancedSettingsFilter);
 });
 
-PrintPreviewCustomMarginsTest = class extends NewPrintPreviewTest {
+PrintPreviewCustomMarginsTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/margin_control_container.html';
@@ -838,7 +839,7 @@
           custom_margins_test.TestNames.RequestScrollToOutOfBoundsTextbox);
     });
 
-PrintPreviewNewDestinationSearchTest = class extends NewPrintPreviewTest {
+PrintPreviewDestinationSearchTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/destination_dialog.html';
@@ -863,40 +864,37 @@
 };
 
 TEST_F(
-    'PrintPreviewNewDestinationSearchTest', 'ReceiveSuccessfulSetup',
-    function() {
+    'PrintPreviewDestinationSearchTest', 'ReceiveSuccessfulSetup', function() {
       this.runMochaTest(
           destination_search_test.TestNames.ReceiveSuccessfulSetup);
     });
 
 GEN('#if defined(OS_CHROMEOS)');
-TEST_F('PrintPreviewNewDestinationSearchTest', 'ResolutionFails', function() {
+TEST_F('PrintPreviewDestinationSearchTest', 'ResolutionFails', function() {
   this.runMochaTest(destination_search_test.TestNames.ResolutionFails);
 });
 
-TEST_F(
-    'PrintPreviewNewDestinationSearchTest', 'ReceiveFailedSetup', function() {
-      this.runMochaTest(destination_search_test.TestNames.ReceiveFailedSetup);
-    });
+TEST_F('PrintPreviewDestinationSearchTest', 'ReceiveFailedSetup', function() {
+  this.runMochaTest(destination_search_test.TestNames.ReceiveFailedSetup);
+});
 
 TEST_F(
-    'PrintPreviewNewDestinationSearchTest',
-    'ReceiveSuccessfultSetupWithPolicies', function() {
+    'PrintPreviewDestinationSearchTest', 'ReceiveSuccessfultSetupWithPolicies',
+    function() {
       this.runMochaTest(destination_search_test.TestNames.ResolutionFails);
     });
 
 GEN('#else');  // !defined(OS_CHROMEOS)
-TEST_F(
-    'PrintPreviewNewDestinationSearchTest', 'GetCapabilitiesFails', function() {
-      this.runMochaTest(destination_search_test.TestNames.GetCapabilitiesFails);
-    });
+TEST_F('PrintPreviewDestinationSearchTest', 'GetCapabilitiesFails', function() {
+  this.runMochaTest(destination_search_test.TestNames.GetCapabilitiesFails);
+});
 GEN('#endif');  // defined(OS_CHROMEOS)
 
-TEST_F('PrintPreviewNewDestinationSearchTest', 'CloudKioskPrinter', function() {
+TEST_F('PrintPreviewDestinationSearchTest', 'CloudKioskPrinter', function() {
   this.runMochaTest(destination_search_test.TestNames.CloudKioskPrinter);
 });
 
-PrintPreviewHeaderTest = class extends NewPrintPreviewTest {
+PrintPreviewHeaderTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/header.html';
@@ -940,7 +938,7 @@
   this.runMochaTest(header_test.TestNames.EnterprisePolicy);
 });
 
-PrintPreviewHeaderNewTest = class extends NewPrintPreviewTest {
+PrintPreviewHeaderNewTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/header_new.html';
@@ -980,7 +978,7 @@
   this.runMochaTest(header_new_test.TestNames.EnterprisePolicy);
 });
 
-PrintPreviewButtonStripTest = class extends NewPrintPreviewTest {
+PrintPreviewButtonStripTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/button_strip.html';
@@ -1012,7 +1010,7 @@
   this.runMochaTest(button_strip_test.TestNames.ButtonStripFiresEvents);
 });
 
-PrintPreviewDestinationItemTest = class extends NewPrintPreviewTest {
+PrintPreviewDestinationItemTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/destination_list_item.html';
@@ -1052,7 +1050,7 @@
   this.runMochaTest(destination_item_test.TestNames.QueryDescription);
 });
 
-PrintPreviewAdvancedItemTest = class extends NewPrintPreviewTest {
+PrintPreviewAdvancedItemTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/advanced_settings_item.html';
@@ -1097,7 +1095,7 @@
   this.runMochaTest(advanced_item_test.TestNames.QueryOption);
 });
 
-PrintPreviewDestinationListTest = class extends NewPrintPreviewTest {
+PrintPreviewDestinationListTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/destination_list.html';
@@ -1121,12 +1119,13 @@
   this.runMochaTest(destination_list_test.TestNames.FilterDestinations);
 });
 
-TEST_F('PrintPreviewDestinationListTest', 'FireDestinationSelected',
-    function() {
-  this.runMochaTest(destination_list_test.TestNames.FireDestinationSelected);
-});
+TEST_F(
+    'PrintPreviewDestinationListTest', 'FireDestinationSelected', function() {
+      this.runMochaTest(
+          destination_list_test.TestNames.FireDestinationSelected);
+    });
 
-PrintPreviewPrintButtonTest = class extends NewPrintPreviewTest {
+PrintPreviewPrintButtonTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/app.html';
@@ -1157,7 +1156,7 @@
   this.runMochaTest(print_button_test.TestNames.PDFPrintVisiblePreview);
 });
 
-PrintPreviewKeyEventTest = class extends NewPrintPreviewTest {
+PrintPreviewKeyEventTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/app.html';
@@ -1219,7 +1218,7 @@
   this.runMochaTest(key_event_test.TestNames.CtrlShiftPOpensSystemDialog);
 });
 
-PrintPreviewDestinationSettingsTest = class extends NewPrintPreviewTest {
+PrintPreviewDestinationSettingsTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/destination_settings.html';
@@ -1302,7 +1301,7 @@
           destination_settings_test.TestNames.UpdateRecentDestinations);
     });
 
-PrintPreviewScalingSettingsTest = class extends NewPrintPreviewTest {
+PrintPreviewScalingSettingsTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/scaling_settings.html';
@@ -1341,7 +1340,7 @@
           scaling_settings_test.TestNames.InputNotDisabledOnValidityChange);
     });
 
-PrintPreviewCopiesSettingsTest = class extends NewPrintPreviewTest {
+PrintPreviewCopiesSettingsTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/copies_settings.html';
@@ -1361,7 +1360,7 @@
   mocha.run();
 });
 
-PrintPreviewMediaSizeSettingsTest = class extends NewPrintPreviewTest {
+PrintPreviewMediaSizeSettingsTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/media_size_settings.html';
@@ -1381,7 +1380,7 @@
   mocha.run();
 });
 
-PrintPreviewDpiSettingsTest = class extends NewPrintPreviewTest {
+PrintPreviewDpiSettingsTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/dpi_settings.html';
@@ -1401,7 +1400,7 @@
   mocha.run();
 });
 
-PrintPreviewOtherOptionsSettingsTest = class extends NewPrintPreviewTest {
+PrintPreviewOtherOptionsSettingsTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/other_options_settings.html';
@@ -1421,7 +1420,7 @@
   mocha.run();
 });
 
-PrintPreviewLayoutSettingsTest = class extends NewPrintPreviewTest {
+PrintPreviewLayoutSettingsTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/layout_settings.html';
@@ -1441,7 +1440,7 @@
   mocha.run();
 });
 
-PrintPreviewColorSettingsTest = class extends NewPrintPreviewTest {
+PrintPreviewColorSettingsTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/color_settings.html';
@@ -1461,7 +1460,7 @@
   mocha.run();
 });
 
-PrintPreviewMarginsSettingsTest = class extends NewPrintPreviewTest {
+PrintPreviewMarginsSettingsTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/margins_settings.html';
@@ -1481,7 +1480,7 @@
   mocha.run();
 });
 
-PrintPreviewPagesPerSheetSettingsTest = class extends NewPrintPreviewTest {
+PrintPreviewPagesPerSheetSettingsTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/pages_per_sheet_settings.html';
@@ -1501,7 +1500,7 @@
   mocha.run();
 });
 
-PrintPreviewDuplexSettingsTest = class extends NewPrintPreviewTest {
+PrintPreviewDuplexSettingsTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/duplex_settings.html';
@@ -1522,7 +1521,7 @@
 });
 
 GEN('#if defined(OS_CHROMEOS)');
-PrintPreviewPinSettingsTest = class extends NewPrintPreviewTest {
+PrintPreviewPinSettingsTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
     return 'chrome://print/ui/pin_settings.html';
diff --git a/chrome/test/data/webui/settings/cr_settings_browsertest.js b/chrome/test/data/webui/settings/cr_settings_browsertest.js
index 8e7bd966..e8b92b6 100644
--- a/chrome/test/data/webui/settings/cr_settings_browsertest.js
+++ b/chrome/test/data/webui/settings/cr_settings_browsertest.js
@@ -12,6 +12,7 @@
 GEN('#endif  // defined(OS_CHROMEOS)');
 
 GEN('#include "chrome/common/chrome_features.h"');
+GEN('#include "chromeos/constants/chromeos_features.h"');
 GEN('#include "components/autofill/core/common/autofill_features.h"');
 GEN('#include "components/omnibox/common/omnibox_features.h"');
 
@@ -2496,4 +2497,27 @@
   mocha.run();
 });
 
+CrSettingsSplitSettingsFlagTest = class extends CrSettingsBrowserTest {
+  /** @override */
+  get browsePreload() {
+    return 'chrome://settings/basic_page/basic_page.html';
+  }
+
+  /** @override */
+  get featureList() {
+    return ['chromeos::features::kSplitSettings', ''];
+  }
+
+  /** @override */
+  get extraLibraries() {
+    return super.extraLibraries.concat([
+      'split_settings_flag_test.js',
+    ]);
+  }
+};
+
+TEST_F('CrSettingsSplitSettingsFlagTest', 'All', function() {
+  mocha.run();
+});
+
 GEN('#endif  // defined(OS_CHROMEOS)');
diff --git a/chrome/test/data/webui/settings/split_settings_flag_test.js b/chrome/test/data/webui/settings/split_settings_flag_test.js
new file mode 100644
index 0000000..3a57bac8
--- /dev/null
+++ b/chrome/test/data/webui/settings/split_settings_flag_test.js
@@ -0,0 +1,86 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+cr.define('split_settings_flag', function() {
+  suite('splitSettingsFlag', function() {
+    const attachedSections = new Set();
+
+    /**
+     * Names of settings sections that affect Chrome browser (and possibly CrOS)
+     * and therefore should appear in browser settings even when SettingsSplit
+     * feature is enabled.
+     * @type {!Array<string>}
+     */
+    const BROWSER_SETTINGS_SECTIONS = [
+      'a11y',
+      'appearance',
+      'autofill',
+      'languages',
+      'onStartup',
+      'printing',
+      'privacy',
+      'search',
+    ];
+
+    /**
+     * Names of settings sections that affect only CrOS (i.e. not the Chrome
+     * broswer) and therefore should not appear in browser settings when
+     * SettingsSplit feature is enabled.
+     * @type {!Array<string>}
+     */
+    const OS_SETTINGS_ONLY_SECTIONS = [
+      'androidApps',
+      'bluetooth',
+      'changePassword',
+      'crostini',
+      'date-time',
+      'device',
+      'internet',
+      'kiosk-next-shell',
+      'multidevice',
+      'people',
+    ];
+
+    const UNMIGRATED_SECTIONS = [
+      'changePassword',
+      'date-time',
+      'people',
+      'reset',
+    ];
+
+    setup(async function() {
+      PolymerTest.clearBody();
+      const browserSettings = document.createElement('settings-basic-page');
+      // In prod, page visibility is passed via Polymer binding layers but it
+      // is always set to settings.pageVisibility.
+      browserSettings.pageVisibility = settings.pageVisibility;
+      document.body.appendChild(browserSettings);
+      Polymer.dom.flush();
+
+      // Expand <settings-idle-load> containing advanced section
+      await browserSettings.$$('#advancedPageTemplate').get();
+
+      browserSettings.shadowRoot.querySelectorAll('settings-section')
+          .forEach(element => attachedSections.add(element.section));
+    });
+
+    test(
+        'Browser settings page contains all browser-relevant settings',
+        function() {
+          for (let section of BROWSER_SETTINGS_SECTIONS) {
+            assertTrue(attachedSections.has(section));
+          }
+        });
+
+    test(
+        'Browser settings page contains no migrated CrOS-only settings',
+        function() {
+          const attachedOsSections =
+              OS_SETTINGS_ONLY_SECTIONS.filter(e => attachedSections.has(e));
+          for (let section of attachedOsSections) {
+            assertTrue(UNMIGRATED_SECTIONS.includes(section));
+          }
+        });
+  });
+});
diff --git a/chromecast/media/cma/pipeline/media_pipeline_impl.cc b/chromecast/media/cma/pipeline/media_pipeline_impl.cc
index 01f4b82..26add94 100644
--- a/chromecast/media/cma/pipeline/media_pipeline_impl.cc
+++ b/chromecast/media/cma/pipeline/media_pipeline_impl.cc
@@ -14,6 +14,7 @@
 #include "base/logging.h"
 #include "base/single_thread_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
+#include "base/time/default_tick_clock.h"
 #include "chromecast/base/metrics/cast_metrics_helper.h"
 #include "chromecast/media/cdm/cast_cdm_context.h"
 #include "chromecast/media/cma/backend/cma_backend.h"
@@ -99,6 +100,7 @@
       video_bytes_for_bitrate_estimation_(0),
       playback_stalled_(false),
       playback_stalled_notification_sent_(false),
+      media_time_interpolator_(base::DefaultTickClock::GetInstance()),
       weak_factory_(this) {
   LOG(INFO) << __FUNCTION__;
   weak_this_ = weak_factory_.GetWeakPtr();
@@ -248,6 +250,9 @@
 
   waiting_for_first_have_enough_data_ = true;
 
+  media_time_interpolator_.SetBounds(time, time, base::TimeTicks::Now());
+  media_time_interpolator_.StartInterpolating();
+
   // Setup the audio and video pipeline for the new timeline.
   if (audio_pipeline_) {
     scoped_refptr<BufferingState> buffering_state;
@@ -277,6 +282,8 @@
   DCHECK(audio_pipeline_ || video_pipeline_);
   DCHECK(!pending_flush_task_);
 
+  media_time_interpolator_.StopInterpolating();
+
   buffering_controller_->Reset();
 
   // Flush both audio and video pipeline. This will flush the frame
@@ -308,6 +315,7 @@
 
   if (rate != 0.0f) {
     media_pipeline_backend_->SetPlaybackRate(rate);
+    media_time_interpolator_.SetPlaybackRate(rate);
     if (backend_state_ == BACKEND_STATE_PAUSED) {
       media_pipeline_backend_->Resume();
       backend_state_ = BACKEND_STATE_PLAYING;
@@ -317,6 +325,7 @@
     }
   } else if (backend_state_ == BACKEND_STATE_PLAYING) {
     media_pipeline_backend_->Pause();
+    media_time_interpolator_.SetPlaybackRate(0.f);
     backend_state_ = BACKEND_STATE_PAUSED;
     metrics::CastMetricsHelper::GetInstance()->RecordApplicationEvent(
         "Cast.Platform.Pause");
@@ -403,6 +412,7 @@
 
   if (is_buffering && (backend_state_ == BACKEND_STATE_PLAYING)) {
     media_pipeline_backend_->Pause();
+    media_time_interpolator_.SetPlaybackRate(0.f);
     backend_state_ = BACKEND_STATE_PAUSED;
     metrics::CastMetricsHelper::GetInstance()->RecordApplicationEvent(
         "Cast.Platform.Pause");
@@ -501,9 +511,14 @@
   statistics_rolling_counter_ =
       (statistics_rolling_counter_ + 1) % kStatisticsUpdatePeriod;
 
+  // Wait until the first available timestamp returned from backend, which means
+  // the actual playback starts. Some of the rest of the logic, mainly media
+  // time interpolating, expects a valid timestamp as baseline.
   base::TimeDelta media_time = base::TimeDelta::FromMicroseconds(
       media_pipeline_backend_->GetCurrentPts());
-  if (media_time == ::media::kNoTimestamp) {
+  if (media_time == ::media::kNoTimestamp &&
+      (last_media_time_ == ::media::kNoTimestamp ||
+       !media_time_interpolator_.interpolating())) {
     pending_time_update_task_ = true;
     base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
         FROM_HERE,
@@ -511,8 +526,23 @@
         kTimeUpdateInterval);
     return;
   }
+
   base::TimeTicks stc = base::TimeTicks::Now();
 
+  if (media_time == ::media::kNoTimestamp) {
+    DCHECK(media_time_interpolator_.interpolating());
+    media_time = media_time_interpolator_.GetInterpolatedTime();
+
+    LOG(WARNING) << "Backend returns invalid timestamp. Estimated time is "
+                 << media_time;
+  } else {
+    // It's safe to use kInfiniteDuration as upper bound. When pipeline
+    // rebuffers, time interpolator is also paused, in which case it returns
+    // the timestamp when pausing it.
+    media_time_interpolator_.SetBounds(media_time, ::media::kInfiniteDuration,
+                                       stc);
+  }
+
   CheckForPlaybackStall(media_time, stc);
 
   base::TimeDelta max_rendering_time = media_time;
diff --git a/chromecast/media/cma/pipeline/media_pipeline_impl.h b/chromecast/media/cma/pipeline/media_pipeline_impl.h
index 53b1f324..564db33f8 100644
--- a/chromecast/media/cma/pipeline/media_pipeline_impl.h
+++ b/chromecast/media/cma/pipeline/media_pipeline_impl.h
@@ -17,6 +17,7 @@
 #include "chromecast/media/cma/backend/cma_backend.h"
 #include "chromecast/media/cma/pipeline/load_type.h"
 #include "chromecast/media/cma/pipeline/media_pipeline_client.h"
+#include "media/base/time_delta_interpolator.h"
 
 namespace media {
 class AudioDecoderConfig;
@@ -123,6 +124,10 @@
   base::TimeTicks playback_stalled_time_;
   bool playback_stalled_notification_sent_;
 
+  // It's used to estimate current media time when the timestamp returned by
+  // backend is invalid.
+  ::media::TimeDeltaInterpolator media_time_interpolator_;
+
   bool waiting_for_first_have_enough_data_ = true;
 
   base::WeakPtr<MediaPipelineImpl> weak_this_;
diff --git a/chromeos/dbus/README.md b/chromeos/dbus/README.md
index 00b22d98..2484befe5 100644
--- a/chromeos/dbus/README.md
+++ b/chromeos/dbus/README.md
@@ -41,6 +41,10 @@
     (Many existing clients provide additional test functionality in the fake
     implementation, however this complicates tests and the fake implementation).
 
+*   These clients do not have any dependency on FeatureList, and care should be
+    taken regarding initialization order if such dependencies are added (see
+    BluezDBusManager for an example of such client).
+
 ## Shill clients
 
 Shill clients will eventually only be available to Chrome. As such, the
diff --git a/chromeos/dbus/session_manager/fake_session_manager_client.cc b/chromeos/dbus/session_manager/fake_session_manager_client.cc
index 515e419..f5ddf40 100644
--- a/chromeos/dbus/session_manager/fake_session_manager_client.cc
+++ b/chromeos/dbus/session_manager/fake_session_manager_client.cc
@@ -271,7 +271,16 @@
 
 void FakeSessionManagerClient::RestartJob(int socket_fd,
                                           const std::vector<std::string>& argv,
-                                          VoidDBusMethodCallback callback) {}
+                                          VoidDBusMethodCallback callback) {
+  DCHECK(supports_browser_restart_);
+
+  restart_job_argv_ = argv;
+  if (restart_job_callback_)
+    std::move(restart_job_callback_).Run();
+
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE, base::BindOnce(std::move(callback), true));
+}
 
 void FakeSessionManagerClient::SaveLoginPassword(const std::string& password) {}
 
@@ -516,8 +525,8 @@
   }
 }
 
-bool FakeSessionManagerClient::SupportsRestartToApplyUserFlags() const {
-  return supports_restart_to_apply_user_flags_;
+bool FakeSessionManagerClient::SupportsBrowserRestart() const {
+  return supports_browser_restart_;
 }
 
 void FakeSessionManagerClient::SetFlagsForUser(
diff --git a/chromeos/dbus/session_manager/fake_session_manager_client.h b/chromeos/dbus/session_manager/fake_session_manager_client.h
index 780c256..c4b40ae 100644
--- a/chromeos/dbus/session_manager/fake_session_manager_client.h
+++ b/chromeos/dbus/session_manager/fake_session_manager_client.h
@@ -102,7 +102,7 @@
   void StorePolicy(const login_manager::PolicyDescriptor& descriptor,
                    const std::string& policy_blob,
                    VoidDBusMethodCallback callback) override;
-  bool SupportsRestartToApplyUserFlags() const override;
+  bool SupportsBrowserRestart() const override;
   void SetFlagsForUser(const cryptohome::AccountIdentifier& cryptohome_id,
                        const std::vector<std::string>& flags) override;
   void GetServerBackedStateKeys(StateKeysCallback callback) override;
@@ -133,14 +133,21 @@
                        std::vector<std::string>* out_flags_for_user) const;
 
   // Sets whether FakeSessionManagerClient should advertise (through
-  // |SupportsRestartToApplyUserFlags|) that it supports restarting chrome to
-  // apply user-session flags. The default is |false|.
-  void set_supports_restart_to_apply_user_flags(
-      bool supports_restart_to_apply_user_flags) {
-    supports_restart_to_apply_user_flags_ =
-        supports_restart_to_apply_user_flags;
+  // |SupportsBrowserRestart|) that it supports restarting Chrome. For example,
+  // to apply user-session flags, or to start guest session.
+  // The default is |false|.
+  void set_supports_browser_restart(bool supports_browser_restart) {
+    supports_browser_restart_ = supports_browser_restart;
   }
 
+  // Requires set_support_restart_job() to be called.
+  void set_restart_job_callback(base::OnceClosure callback) {
+    restart_job_callback_ = std::move(callback);
+  }
+
+  const base::Optional<std::vector<std::string>>& restart_job_argv() const {
+    return restart_job_argv_;
+  }
   // If |force_failure| is true, forces StorePolicy() to fail.
   void ForceStorePolicyFailure(bool force_failure) {
     force_store_policy_failure_ = force_failure;
@@ -245,7 +252,15 @@
   }
 
  private:
-  bool supports_restart_to_apply_user_flags_ = false;
+  // Whether browser restarts should be handled - intended for use in tests.
+  bool supports_browser_restart_ = false;
+
+  // Callback that will be run, if set, when RestartJob() is called.
+  base::OnceClosure restart_job_callback_;
+
+  // If restart job was requested, and the client supports restart job, the
+  // requested restarted arguments.
+  base::Optional<std::vector<std::string>> restart_job_argv_;
 
   base::ObserverList<Observer>::Unchecked observers_;
   SessionManagerClient::ActiveSessionsMap user_sessions_;
diff --git a/chromeos/dbus/session_manager/session_manager_client.cc b/chromeos/dbus/session_manager/session_manager_client.cc
index ca500cc..cccdcdf 100644
--- a/chromeos/dbus/session_manager/session_manager_client.cc
+++ b/chromeos/dbus/session_manager/session_manager_client.cc
@@ -369,7 +369,7 @@
     CallStorePolicy(descriptor, policy_blob, std::move(callback));
   }
 
-  bool SupportsRestartToApplyUserFlags() const override { return true; }
+  bool SupportsBrowserRestart() const override { return true; }
 
   void SetFlagsForUser(const cryptohome::AccountIdentifier& cryptohome_id,
                        const std::vector<std::string>& flags) override {
diff --git a/chromeos/dbus/session_manager/session_manager_client.h b/chromeos/dbus/session_manager/session_manager_client.h
index 1492996c..d4e543d 100644
--- a/chromeos/dbus/session_manager/session_manager_client.h
+++ b/chromeos/dbus/session_manager/session_manager_client.h
@@ -309,8 +309,10 @@
                            VoidDBusMethodCallback callback) = 0;
 
   // Returns whether session manager can be used to restart Chrome in order to
-  // apply per-user session flags.
-  virtual bool SupportsRestartToApplyUserFlags() const = 0;
+  // apply per-user session flags, or start guest session.
+  // This returns true for the real session manager client implementation, and
+  // false for the fake (unless explicitly set by a test).
+  virtual bool SupportsBrowserRestart() const = 0;
 
   // Sets the flags to be applied next time by the session manager when Chrome
   // is restarted inside an already started session for a particular user.
diff --git a/chromeos/services/device_sync/cryptauth_api_call_flow.cc b/chromeos/services/device_sync/cryptauth_api_call_flow.cc
index 495dce1..ec01c92 100644
--- a/chromeos/services/device_sync/cryptauth_api_call_flow.cc
+++ b/chromeos/services/device_sync/cryptauth_api_call_flow.cc
@@ -4,9 +4,9 @@
 
 #include "chromeos/services/device_sync/cryptauth_api_call_flow.h"
 
-#include "base/optional.h"
 #include "base/strings/string_number_conversions.h"
 #include "chromeos/components/multidevice/logging/logging.h"
+#include "net/base/url_util.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 
@@ -17,6 +17,10 @@
 namespace {
 
 const char kPost[] = "POST";
+const char kGet[] = "GET";
+const char kProtobufContentType[] = "application/x-protobuf";
+const char kQueryParameterAlternateOutputKey[] = "alt";
+const char kQueryParameterAlternateOutputProto[] = "proto";
 
 NetworkRequestError GetErrorForHttpResponseCode(int response_code) {
   if (response_code == 400)
@@ -40,11 +44,11 @@
 
 CryptAuthApiCallFlow::~CryptAuthApiCallFlow() {}
 
-void CryptAuthApiCallFlow::Start(
+void CryptAuthApiCallFlow::StartPostRequest(
     const GURL& request_url,
+    const std::string& serialized_request,
     scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
     const std::string& access_token,
-    const std::string& serialized_request,
     const ResultCallback& result_callback,
     const ErrorCallback& error_callback) {
   request_url_ = request_url;
@@ -54,21 +58,60 @@
   OAuth2ApiCallFlow::Start(std::move(url_loader_factory), access_token);
 }
 
+void CryptAuthApiCallFlow::StartGetRequest(
+    const GURL& request_url,
+    const std::vector<std::pair<std::string, std::string>>&
+        request_as_query_parameters,
+    scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
+    const std::string& access_token,
+    const ResultCallback& result_callback,
+    const ErrorCallback& error_callback) {
+  request_url_ = request_url;
+  request_as_query_parameters_ = request_as_query_parameters;
+  result_callback_ = result_callback;
+  error_callback_ = error_callback;
+  OAuth2ApiCallFlow::Start(std::move(url_loader_factory), access_token);
+}
+
 GURL CryptAuthApiCallFlow::CreateApiCallUrl() {
+  // Specifies that the server's response body should be formatted as a
+  // serialized proto.
+  request_url_ =
+      net::AppendQueryParameter(request_url_, kQueryParameterAlternateOutputKey,
+                                kQueryParameterAlternateOutputProto);
+
+  // GET requests encode the request proto as query parameters.
+  if (request_as_query_parameters_) {
+    for (const auto& key_value_pair : *request_as_query_parameters_) {
+      request_url_ = net::AppendQueryParameter(
+          request_url_, key_value_pair.first, key_value_pair.second);
+    }
+  }
+
   return request_url_;
 }
 
 std::string CryptAuthApiCallFlow::CreateApiCallBody() {
-  return serialized_request_;
+  return serialized_request_.value_or(std::string());
 }
 
 std::string CryptAuthApiCallFlow::CreateApiCallBodyContentType() {
-  return "application/x-protobuf";
+  return serialized_request_ ? kProtobufContentType : std::string();
 }
 
+// Note: Unlike OAuth2ApiCallFlow, we do *not* determine the request type
+// based on whether or not the body is empty. It is possible to send a POST
+// request with an empty body because a proto with default parameters is
+// encoded as an empty string.
 std::string CryptAuthApiCallFlow::GetRequestTypeForBody(
     const std::string& body) {
-  return kPost;
+  if (serialized_request_) {
+    DCHECK(!request_as_query_parameters_);
+    return kPost;
+  }
+
+  DCHECK(request_as_query_parameters_);
+  return kGet;
 }
 
 void CryptAuthApiCallFlow::ProcessApiCallSuccess(
diff --git a/chromeos/services/device_sync/cryptauth_api_call_flow.h b/chromeos/services/device_sync/cryptauth_api_call_flow.h
index 94239f49..06da1c7 100644
--- a/chromeos/services/device_sync/cryptauth_api_call_flow.h
+++ b/chromeos/services/device_sync/cryptauth_api_call_flow.h
@@ -6,9 +6,12 @@
 #define CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_API_CALL_FLOW_H_
 
 #include <string>
+#include <utility>
+#include <vector>
 
 #include "base/callback.h"
 #include "base/macros.h"
+#include "base/optional.h"
 #include "chromeos/services/device_sync/network_request_error.h"
 #include "google_apis/gaia/oauth2_api_call_flow.h"
 #include "services/network/public/cpp/resource_response.h"
@@ -19,7 +22,12 @@
 
 // Google API call flow implementation underlying all CryptAuth API calls.
 // CryptAuth is a Google service that manages authorization and cryptographic
-// credentials for users' devices (eg. public keys).
+// credentials for users' devices (eg. public keys). We assume the following:
+//   * A POST request's body is the serialized request proto,
+//   * A GET request encodes the request proto as query parameters and has no
+//     body,
+//   * The response body is the serialized response proto.
+
 class CryptAuthApiCallFlow : public OAuth2ApiCallFlow {
  public:
   typedef base::Callback<void(const std::string& serialized_response)>
@@ -29,19 +37,36 @@
   CryptAuthApiCallFlow();
   ~CryptAuthApiCallFlow() override;
 
-  // Starts the API call.
-  //   request_url: The URL endpoint of the API request.
-  //   context: The URL context used to make the request.
-  //   access_token: The access token for whom to make the to make the request.
-  //   serialized_request: A serialized proto containing the request data.
-  //   result_callback: Called when the flow completes successfully with a
-  //       serialized response proto.
-  //   error_callback: Called when the flow completes with an error.
-  virtual void Start(
+  // Starts the API POST request call.
+  //   |request_url|: The URL endpoint of the API request.
+  //   |serialized_request|: A serialized proto containing the request data.
+  //   |access_token|: The access token for whom to make the request.
+  //   |result_callback|: Called when the flow completes successfully
+  //                      with a serialized response proto.
+  //   |error_callback|: Called when the flow completes with an error.
+  virtual void StartPostRequest(
       const GURL& request_url,
+      const std::string& serialized_request,
       scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
       const std::string& access_token,
-      const std::string& serialized_request,
+      const ResultCallback& result_callback,
+      const ErrorCallback& error_callback);
+
+  // Starts the API GET request call.
+  //   |request_url|: The URL endpoint of the API request.
+  //   |request_as_query_parameters|: The request proto represented as key-value
+  //                                  pairs to be sent as query parameters.
+  //                                  Note: A key can have multiple values.
+  //   |access_token|: The access token for whom to make the request.
+  //   |result_callback|: Called when the flow completes successfully
+  //                      with a serialized response proto.
+  //   |error_callback|: Called when the flow completes with an error.
+  virtual void StartGetRequest(
+      const GURL& request_url,
+      const std::vector<std::pair<std::string, std::string>>&
+          request_as_query_parameters,
+      scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
+      const std::string& access_token,
       const ResultCallback& result_callback,
       const ErrorCallback& error_callback);
 
@@ -75,8 +100,15 @@
   // The URL of the CryptAuth endpoint serving the request.
   GURL request_url_;
 
-  // Serialized request message proto that will be sent in the API request.
-  std::string serialized_request_;
+  // Serialized request message proto that will be sent in the API POST request.
+  // Null if request type is not POST.
+  base::Optional<std::string> serialized_request_;
+
+  // The request message proto represented as key-value pairs that will be sent
+  // as query parameters in the API GET request. Note: A key can have multiple
+  // values. Null if request type is not GET.
+  base::Optional<std::vector<std::pair<std::string, std::string>>>
+      request_as_query_parameters_;
 
   // Callback invoked with the serialized response message proto when the flow
   // completes successfully.
diff --git a/chromeos/services/device_sync/cryptauth_api_call_flow_unittest.cc b/chromeos/services/device_sync/cryptauth_api_call_flow_unittest.cc
index 93d1fa1..b8d56d6 100644
--- a/chromeos/services/device_sync/cryptauth_api_call_flow_unittest.cc
+++ b/chromeos/services/device_sync/cryptauth_api_call_flow_unittest.cc
@@ -5,12 +5,17 @@
 #include "chromeos/services/device_sync/cryptauth_api_call_flow.h"
 
 #include <memory>
+#include <string>
+#include <utility>
+#include <vector>
 
 #include "base/bind.h"
 #include "base/macros.h"
+#include "base/optional.h"
 #include "base/test/scoped_task_environment.h"
 #include "chromeos/services/device_sync/network_request_error.h"
 #include "net/base/net_errors.h"
+#include "net/base/url_util.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
 #include "services/network/test/test_url_loader_factory.h"
@@ -26,6 +31,47 @@
 const char kSerializedRequestProto[] = "serialized_request_proto";
 const char kSerializedResponseProto[] = "result_proto";
 const char kRequestUrl[] = "https://googleapis.com/cryptauth/test";
+const char kAccessToken[] = "access_token";
+const char kQueryParameterAlternateOutputKey[] = "alt";
+const char kQueryParameterAlternateOutputProto[] = "proto";
+
+const std::vector<std::pair<std::string, std::string>>&
+GetTestRequestProtoAsQueryParameters() {
+  static const base::NoDestructor<
+      std::vector<std::pair<std::string, std::string>>>
+      request_as_query_parameters([] {
+        std::vector<std::pair<std::string, std::string>>
+            request_as_query_parameters = {{"field1", "value1a"},
+                                           {"field1", "value1b"},
+                                           {"field2", "value2"}};
+        return request_as_query_parameters;
+      }());
+  return *request_as_query_parameters;
+}
+
+// Adds the "alt=proto" query parameters which specifies that the response
+// should be formatted as a serialized proto. Adds the key-value pairs of
+// |request_as_query_parameters| as query parameters.
+// |request_as_query_parameters| is only non-null for GET requests.
+GURL UrlWithQueryParameters(
+    const std::string& url,
+    const base::Optional<std::vector<std::pair<std::string, std::string>>>&
+        request_as_query_parameters) {
+  GURL url_with_qp(url);
+
+  url_with_qp =
+      net::AppendQueryParameter(url_with_qp, kQueryParameterAlternateOutputKey,
+                                kQueryParameterAlternateOutputProto);
+
+  if (request_as_query_parameters) {
+    for (const auto& key_value : *request_as_query_parameters) {
+      url_with_qp = net::AppendQueryParameter(url_with_qp, key_value.first,
+                                              key_value.second);
+    }
+  }
+
+  return url_with_qp;
+}
 
 }  // namespace
 
@@ -39,19 +85,39 @@
         PARTIAL_TRAFFIC_ANNOTATION_FOR_TESTS);
   }
 
-  void StartApiCallFlow() {
-    StartApiCallFlowWithRequest(kSerializedRequestProto);
+  void StartPostRequestApiCallFlow() {
+    StartPostRequestApiCallFlowWithSerializedRequest(kSerializedRequestProto);
   }
 
-  void StartApiCallFlowWithRequest(const std::string& serialized_request) {
-    flow_.Start(GURL(kRequestUrl), shared_factory_, "access_token",
-                serialized_request,
-                base::Bind(&DeviceSyncCryptAuthApiCallFlowTest::OnResult,
-                           base::Unretained(this)),
-                base::Bind(&DeviceSyncCryptAuthApiCallFlowTest::OnError,
-                           base::Unretained(this)));
+  void StartPostRequestApiCallFlowWithSerializedRequest(
+      const std::string& serialized_request) {
+    flow_.StartPostRequest(
+        GURL(kRequestUrl), serialized_request, shared_factory_, kAccessToken,
+        base::Bind(&DeviceSyncCryptAuthApiCallFlowTest::OnResult,
+                   base::Unretained(this)),
+        base::Bind(&DeviceSyncCryptAuthApiCallFlowTest::OnError,
+                   base::Unretained(this)));
     // A pending fetch for the API request should be created.
-    CheckCryptAuthHttpRequest(serialized_request);
+    CheckCryptAuthHttpPostRequest(serialized_request);
+  }
+
+  void StartGetRequestApiCallFlow() {
+    StartGetRequestApiCallFlowWithRequestAsQueryParameters(
+        GetTestRequestProtoAsQueryParameters());
+  }
+
+  void StartGetRequestApiCallFlowWithRequestAsQueryParameters(
+      const std::vector<std::pair<std::string, std::string>>&
+          request_as_query_parameters) {
+    flow_.StartGetRequest(
+        GURL(kRequestUrl), request_as_query_parameters, shared_factory_,
+        kAccessToken,
+        base::Bind(&DeviceSyncCryptAuthApiCallFlowTest::OnResult,
+                   base::Unretained(this)),
+        base::Bind(&DeviceSyncCryptAuthApiCallFlowTest::OnError,
+                   base::Unretained(this)));
+    // A pending fetch for the API request should be created.
+    CheckCryptAuthHttpGetRequest(request_as_query_parameters);
   }
 
   void OnResult(const std::string& result) {
@@ -64,12 +130,16 @@
     network_error_.reset(new NetworkRequestError(network_error));
   }
 
-  void CheckCryptAuthHttpRequest(const std::string& serialized_request) {
+  void CheckCryptAuthHttpPostRequest(const std::string& serialized_request) {
     const std::vector<network::TestURLLoaderFactory::PendingRequest>& pending =
         *test_url_loader_factory_.pending_requests();
     ASSERT_EQ(1u, pending.size());
     const network::ResourceRequest& request = pending[0].request;
-    EXPECT_EQ(GURL(kRequestUrl), request.url);
+
+    EXPECT_EQ(UrlWithQueryParameters(
+                  kRequestUrl, base::nullopt /* request_as_query_parameters */),
+              request.url);
+
     EXPECT_EQ(serialized_request, network::GetUploadData(request));
 
     std::string content_type;
@@ -78,21 +148,67 @@
     EXPECT_EQ("application/x-protobuf", content_type);
   }
 
-  // Responds to the current HTTP request. If the |error| is not |net::OK|, then
-  // the |response_code| and |response_string| arguments will be ignored.
-  void CompleteCurrentRequest(net::Error error,
-                              int response_code,
-                              const std::string& response_string) {
+  void CheckCryptAuthHttpGetRequest(
+      const std::vector<std::pair<std::string, std::string>>&
+          request_as_query_parameters) {
+    const std::vector<network::TestURLLoaderFactory::PendingRequest>& pending =
+        *test_url_loader_factory_.pending_requests();
+    ASSERT_EQ(1u, pending.size());
+    const network::ResourceRequest& request = pending[0].request;
+
+    EXPECT_EQ(UrlWithQueryParameters(kRequestUrl, request_as_query_parameters),
+              request.url);
+
+    // Expect no body.
+    EXPECT_TRUE(network::GetUploadData(request).empty());
+    EXPECT_FALSE(
+        request.headers.HasHeader(net::HttpRequestHeaders::kContentType));
+  }
+
+  // Responds to the current HTTP POST request. If the |error| is not net::OK,
+  // then the |response_code| and |response_string| are null.
+  void CompleteCurrentPostRequest(
+      net::Error error,
+      base::Optional<int> response_code = base::nullopt,
+      const base::Optional<std::string>& response_string = base::nullopt) {
     network::URLLoaderCompletionStatus completion_status(error);
     network::ResourceResponseHead response_head;
     std::string content;
     if (error == net::OK) {
       response_head = network::CreateResourceResponseHead(
-          static_cast<net::HttpStatusCode>(response_code));
-      content = response_string;
+          static_cast<net::HttpStatusCode>(*response_code));
+      content = *response_string;
     }
+
+    // Use kUrlMatchPrefix flag to match URL without query parameters.
     EXPECT_TRUE(test_url_loader_factory_.SimulateResponseForPendingRequest(
-        GURL(kRequestUrl), completion_status, response_head, content));
+        GURL(kRequestUrl), completion_status, response_head, content,
+        network::TestURLLoaderFactory::ResponseMatchFlags::kUrlMatchPrefix));
+
+    scoped_task_environment_.RunUntilIdle();
+    EXPECT_TRUE(result_ || network_error_);
+  }
+
+  // Responds to the current HTTP GET request. If the |error| is not net::OK,
+  // then the |response_code| and |response_string| are null.
+  void CompleteCurrentGetRequest(
+      net::Error error,
+      base::Optional<int> response_code = base::nullopt,
+      const base::Optional<std::string>& response_string = base::nullopt) {
+    network::URLLoaderCompletionStatus completion_status(error);
+    network::ResourceResponseHead response_head;
+    std::string content;
+    if (error == net::OK) {
+      response_head = network::CreateResourceResponseHead(
+          static_cast<net::HttpStatusCode>(*response_code));
+      content = *response_string;
+    }
+
+    // Use kUrlMatchPrefix flag to match URL without query parameters.
+    EXPECT_TRUE(test_url_loader_factory_.SimulateResponseForPendingRequest(
+        GURL(kRequestUrl), completion_status, response_head, content,
+        network::TestURLLoaderFactory::ResponseMatchFlags::kUrlMatchPrefix));
+
     scoped_task_environment_.RunUntilIdle();
     EXPECT_TRUE(result_ || network_error_);
   }
@@ -110,40 +226,78 @@
   DISALLOW_COPY_AND_ASSIGN(DeviceSyncCryptAuthApiCallFlowTest);
 };
 
-TEST_F(DeviceSyncCryptAuthApiCallFlowTest, RequestSuccess) {
-  StartApiCallFlow();
-  CompleteCurrentRequest(net::OK, net::HTTP_OK, kSerializedResponseProto);
+TEST_F(DeviceSyncCryptAuthApiCallFlowTest, PostRequestSuccess) {
+  StartPostRequestApiCallFlow();
+  CompleteCurrentPostRequest(net::OK, net::HTTP_OK, kSerializedResponseProto);
   EXPECT_EQ(kSerializedResponseProto, *result_);
   EXPECT_FALSE(network_error_);
 }
 
-TEST_F(DeviceSyncCryptAuthApiCallFlowTest, RequestFailure) {
-  StartApiCallFlow();
-  CompleteCurrentRequest(net::ERR_FAILED, 0, std::string());
+TEST_F(DeviceSyncCryptAuthApiCallFlowTest, GetRequestSuccess) {
+  StartGetRequestApiCallFlow();
+  CompleteCurrentGetRequest(net::OK, net::HTTP_OK, kSerializedResponseProto);
+  EXPECT_EQ(kSerializedResponseProto, *result_);
+  EXPECT_FALSE(network_error_);
+}
+
+TEST_F(DeviceSyncCryptAuthApiCallFlowTest, PostRequestFailure) {
+  StartPostRequestApiCallFlow();
+  CompleteCurrentPostRequest(net::ERR_FAILED);
+  EXPECT_FALSE(result_);
+  EXPECT_EQ(NetworkRequestError::kOffline, *network_error_);
+}
+
+TEST_F(DeviceSyncCryptAuthApiCallFlowTest, GetRequestFailure) {
+  StartGetRequestApiCallFlow();
+  CompleteCurrentPostRequest(net::ERR_FAILED);
   EXPECT_FALSE(result_);
   EXPECT_EQ(NetworkRequestError::kOffline, *network_error_);
 }
 
 TEST_F(DeviceSyncCryptAuthApiCallFlowTest, RequestStatus500) {
-  StartApiCallFlow();
-  CompleteCurrentRequest(net::OK, net::HTTP_INTERNAL_SERVER_ERROR,
-                         "CryptAuth Meltdown.");
+  StartPostRequestApiCallFlow();
+  CompleteCurrentPostRequest(net::OK, net::HTTP_INTERNAL_SERVER_ERROR,
+                             "CryptAuth Meltdown.");
+  EXPECT_FALSE(result_);
+  EXPECT_EQ(NetworkRequestError::kInternalServerError, *network_error_);
+}
+
+TEST_F(DeviceSyncCryptAuthApiCallFlowTest, GetRequestStatus500) {
+  StartGetRequestApiCallFlow();
+  CompleteCurrentPostRequest(net::OK, net::HTTP_INTERNAL_SERVER_ERROR,
+                             "CryptAuth Meltdown.");
   EXPECT_FALSE(result_);
   EXPECT_EQ(NetworkRequestError::kInternalServerError, *network_error_);
 }
 
 // The empty string is a valid protocol buffer message serialization.
-TEST_F(DeviceSyncCryptAuthApiCallFlowTest, RequestWithNoBody) {
-  StartApiCallFlowWithRequest(std::string());
-  CompleteCurrentRequest(net::OK, net::HTTP_OK, kSerializedResponseProto);
+TEST_F(DeviceSyncCryptAuthApiCallFlowTest, PostRequestWithNoBody) {
+  StartPostRequestApiCallFlowWithSerializedRequest(std::string());
+  CompleteCurrentPostRequest(net::OK, net::HTTP_OK, kSerializedResponseProto);
+  EXPECT_EQ(kSerializedResponseProto, *result_);
+  EXPECT_FALSE(network_error_);
+}
+
+TEST_F(DeviceSyncCryptAuthApiCallFlowTest, GetRequestWithNoQueryParameters) {
+  StartGetRequestApiCallFlowWithRequestAsQueryParameters(
+      {} /* request_as_query_parameters */);
+  CompleteCurrentPostRequest(net::OK, net::HTTP_OK, kSerializedResponseProto);
   EXPECT_EQ(kSerializedResponseProto, *result_);
   EXPECT_FALSE(network_error_);
 }
 
 // The empty string is a valid protocol buffer message serialization.
-TEST_F(DeviceSyncCryptAuthApiCallFlowTest, ResponseWithNoBody) {
-  StartApiCallFlow();
-  CompleteCurrentRequest(net::OK, net::HTTP_OK, std::string());
+TEST_F(DeviceSyncCryptAuthApiCallFlowTest, PostResponseWithNoBody) {
+  StartPostRequestApiCallFlow();
+  CompleteCurrentPostRequest(net::OK, net::HTTP_OK, std::string());
+  EXPECT_EQ(std::string(), *result_);
+  EXPECT_FALSE(network_error_);
+}
+
+// The empty string is a valid protocol buffer message serialization.
+TEST_F(DeviceSyncCryptAuthApiCallFlowTest, GetResponseWithNoBody) {
+  StartGetRequestApiCallFlow();
+  CompleteCurrentPostRequest(net::OK, net::HTTP_OK, std::string());
   EXPECT_EQ(std::string(), *result_);
   EXPECT_FALSE(network_error_);
 }
diff --git a/chromeos/services/device_sync/cryptauth_client_impl.cc b/chromeos/services/device_sync/cryptauth_client_impl.cc
index 5bd098e..fd28c45 100644
--- a/chromeos/services/device_sync/cryptauth_client_impl.cc
+++ b/chromeos/services/device_sync/cryptauth_client_impl.cc
@@ -5,7 +5,6 @@
 #include "chromeos/services/device_sync/cryptauth_client_impl.h"
 
 #include <memory>
-#include <utility>
 
 #include "base/bind.h"
 #include "base/command_line.h"
@@ -13,6 +12,7 @@
 #include "chromeos/components/multidevice/logging/logging.h"
 #include "chromeos/services/device_sync/proto/cryptauth_devicesync.pb.h"
 #include "chromeos/services/device_sync/proto/cryptauth_enrollment.pb.h"
+#include "chromeos/services/device_sync/proto/cryptauth_proto_to_query_parameters_util.h"
 #include "chromeos/services/device_sync/switches.h"
 #include "services/identity/public/cpp/identity_manager.h"
 #include "services/identity/public/cpp/primary_account_access_token_fetcher.h"
@@ -24,6 +24,8 @@
 
 namespace {
 
+// -------------------- CryptAuth v1 Endpoints --------------------
+
 // Default URL of Google APIs endpoint hosting CryptAuth v1.
 const char kDefaultCryptAuthV1HTTPHost[] = "https://www.googleapis.com";
 
@@ -41,6 +43,8 @@
 const char kSetupEnrollmentPath[] = "enrollment/setup";
 const char kFinishEnrollmentPath[] = "enrollment/finish";
 
+// -------------------- CryptAuth v2 Endpoints --------------------
+
 // Default URL of Google APIs endpoint hosting CryptAuth v2 Enrollment.
 const char kDefaultCryptAuthV2EnrollmentHTTPHost[] =
     "https://cryptauthenrollment.googleapis.com";
@@ -61,10 +65,6 @@
 const char kBatchGetFeatureStatusesPath[] = "/v1:batchGetFeatureStatuses";
 const char kBatchSetFeatureStatusesPath[] = "/v1:batchSetFeatureStatuses";
 
-// Query string of the API URL indicating that the response should be in a
-// serialized protobuf format.
-const char kQueryProtobuf[] = "?alt=proto";
-
 const char kCryptAuthOAuth2Scope[] =
     "https://www.googleapis.com/auth/cryptauth";
 
@@ -76,8 +76,7 @@
                              ? GURL(command_line->GetSwitchValueASCII(
                                    switches::kCryptAuthHTTPHost))
                              : GURL(kDefaultCryptAuthV1HTTPHost);
-  return google_apis_url.Resolve(kCryptAuthV1Path + request_path +
-                                 kQueryProtobuf);
+  return google_apis_url.Resolve(kCryptAuthV1Path + request_path);
 }
 
 // Creates the full URL for endpoint to the CryptAuth v2 Enrollment API with
@@ -89,7 +88,7 @@
           ? GURL(command_line->GetSwitchValueASCII(
                 switches::kCryptAuthV2EnrollmentHTTPHost))
           : GURL(kDefaultCryptAuthV2EnrollmentHTTPHost);
-  return google_apis_url.Resolve(request_path + kQueryProtobuf);
+  return google_apis_url.Resolve(request_path);
 }
 
 // Creates the full URL for endpoint to the CryptAuth v2 DeviceSync API with
@@ -101,7 +100,7 @@
           ? GURL(command_line->GetSwitchValueASCII(
                 switches::kCryptAuthV2DeviceSyncHTTPHost))
           : GURL(kDefaultCryptAuthV2DeviceSyncHTTPHost);
-  return google_apis_url.Resolve(request_path + kQueryProtobuf);
+  return google_apis_url.Resolve(request_path);
 }
 
 }  // namespace
@@ -125,9 +124,10 @@
     const GetMyDevicesCallback& callback,
     const ErrorCallback& error_callback,
     const net::PartialNetworkTrafficAnnotationTag& partial_traffic_annotation) {
-  MakeApiCall(CreateV1RequestUrl(kGetMyDevicesPath),
-              RequestWithDeviceClassifierSet(request), callback, error_callback,
-              partial_traffic_annotation);
+  MakeApiCall(CreateV1RequestUrl(kGetMyDevicesPath), RequestType::kPost,
+              RequestWithDeviceClassifierSet(request).SerializeAsString(),
+              base::nullopt /* request_as_query_parameters */, callback,
+              error_callback, partial_traffic_annotation);
 }
 
 void CryptAuthClientImpl::FindEligibleUnlockDevices(
@@ -160,8 +160,10 @@
         }
       })");
   MakeApiCall(CreateV1RequestUrl(kFindEligibleUnlockDevicesPath),
-              RequestWithDeviceClassifierSet(request), callback, error_callback,
-              partial_traffic_annotation);
+              RequestType::kPost,
+              RequestWithDeviceClassifierSet(request).SerializeAsString(),
+              base::nullopt /* request_as_query_parameters */, callback,
+              error_callback, partial_traffic_annotation);
 }
 
 void CryptAuthClientImpl::FindEligibleForPromotion(
@@ -191,8 +193,10 @@
         }
       })");
   MakeApiCall(CreateV1RequestUrl(kFindEligibleForPromotionPath),
-              RequestWithDeviceClassifierSet(request), callback, error_callback,
-              partial_traffic_annotation);
+              RequestType::kPost,
+              RequestWithDeviceClassifierSet(request).SerializeAsString(),
+              base::nullopt /* request_as_query_parameters */, callback,
+              error_callback, partial_traffic_annotation);
 }
 
 void CryptAuthClientImpl::SendDeviceSyncTickle(
@@ -200,9 +204,10 @@
     const SendDeviceSyncTickleCallback& callback,
     const ErrorCallback& error_callback,
     const net::PartialNetworkTrafficAnnotationTag& partial_traffic_annotation) {
-  MakeApiCall(CreateV1RequestUrl(kSendDeviceSyncTicklePath),
-              RequestWithDeviceClassifierSet(request), callback, error_callback,
-              partial_traffic_annotation);
+  MakeApiCall(CreateV1RequestUrl(kSendDeviceSyncTicklePath), RequestType::kPost,
+              RequestWithDeviceClassifierSet(request).SerializeAsString(),
+              base::nullopt /* request_as_query_parameters */, callback,
+              error_callback, partial_traffic_annotation);
 }
 
 void CryptAuthClientImpl::ToggleEasyUnlock(
@@ -232,9 +237,10 @@
           }
         }
       })");
-  MakeApiCall(CreateV1RequestUrl(kToggleEasyUnlockPath),
-              RequestWithDeviceClassifierSet(request), callback, error_callback,
-              partial_traffic_annotation);
+  MakeApiCall(CreateV1RequestUrl(kToggleEasyUnlockPath), RequestType::kPost,
+              RequestWithDeviceClassifierSet(request).SerializeAsString(),
+              base::nullopt /* request_as_query_parameters */, callback,
+              error_callback, partial_traffic_annotation);
 }
 
 void CryptAuthClientImpl::SetupEnrollment(
@@ -267,9 +273,10 @@
           }
         }
       })");
-  MakeApiCall(CreateV1RequestUrl(kSetupEnrollmentPath),
-              RequestWithDeviceClassifierSet(request), callback, error_callback,
-              partial_traffic_annotation);
+  MakeApiCall(CreateV1RequestUrl(kSetupEnrollmentPath), RequestType::kPost,
+              RequestWithDeviceClassifierSet(request).SerializeAsString(),
+              base::nullopt /* request_as_query_parameters */, callback,
+              error_callback, partial_traffic_annotation);
 }
 
 void CryptAuthClientImpl::FinishEnrollment(
@@ -299,9 +306,10 @@
           }
         }
       })");
-  MakeApiCall(CreateV1RequestUrl(kFinishEnrollmentPath),
-              RequestWithDeviceClassifierSet(request), callback, error_callback,
-              partial_traffic_annotation);
+  MakeApiCall(CreateV1RequestUrl(kFinishEnrollmentPath), RequestType::kPost,
+              RequestWithDeviceClassifierSet(request).SerializeAsString(),
+              base::nullopt /* request_as_query_parameters */, callback,
+              error_callback, partial_traffic_annotation);
 }
 
 void CryptAuthClientImpl::SyncKeys(const cryptauthv2::SyncKeysRequest& request,
@@ -334,7 +342,9 @@
           }
         }
       })");
-  MakeApiCall(CreateV2EnrollmentRequestUrl(kSyncKeysPath), request, callback,
+  MakeApiCall(CreateV2EnrollmentRequestUrl(kSyncKeysPath), RequestType::kPost,
+              request.SerializeAsString(),
+              base::nullopt /* request_as_query_parameters */, callback,
               error_callback, partial_traffic_annotation);
 }
 
@@ -368,7 +378,9 @@
           }
         }
       })");
-  MakeApiCall(CreateV2EnrollmentRequestUrl(kEnrollKeysPath), request, callback,
+  MakeApiCall(CreateV2EnrollmentRequestUrl(kEnrollKeysPath), RequestType::kPost,
+              request.SerializeAsString(),
+              base::nullopt /* request_as_query_parameters */, callback,
               error_callback, partial_traffic_annotation);
 }
 
@@ -407,8 +419,10 @@
           }
         }
       })");
-  MakeApiCall(CreateV2DeviceSyncRequestUrl(kSyncMetadataPath), request,
-              callback, error_callback, partial_traffic_annotation);
+  MakeApiCall(CreateV2DeviceSyncRequestUrl(kSyncMetadataPath),
+              RequestType::kPost, request.SerializeAsString(),
+              base::nullopt /* request_as_query_parameters */, callback,
+              error_callback, partial_traffic_annotation);
 }
 
 void CryptAuthClientImpl::ShareGroupPrivateKey(
@@ -444,8 +458,10 @@
           }
         }
       })");
-  MakeApiCall(CreateV2DeviceSyncRequestUrl(kShareGroupPrivateKeyPath), request,
-              callback, error_callback, partial_traffic_annotation);
+  MakeApiCall(CreateV2DeviceSyncRequestUrl(kShareGroupPrivateKeyPath),
+              RequestType::kPost, request.SerializeAsString(),
+              base::nullopt /* request_as_query_parameters */, callback,
+              error_callback, partial_traffic_annotation);
 }
 
 // TODO(https://crbug.com/953087): Populate the "sender" and "trigger" fields
@@ -481,8 +497,11 @@
           }
         }
       })");
-  MakeApiCall(CreateV2DeviceSyncRequestUrl(kBatchNotifyGroupDevicesPath),
-              request, callback, error_callback, partial_traffic_annotation);
+  MakeApiCall(
+      CreateV2DeviceSyncRequestUrl(kBatchNotifyGroupDevicesPath),
+      RequestType::kGet, base::nullopt /* serialized_request */,
+      cryptauthv2::BatchNotifyGroupDevicesRequestToQueryParameters(request),
+      callback, error_callback, partial_traffic_annotation);
 }
 
 // TODO(https://crbug.com/953087): Populate the "sender" and "trigger" fields
@@ -516,8 +535,11 @@
           }
         }
       })");
-  MakeApiCall(CreateV2DeviceSyncRequestUrl(kBatchGetFeatureStatusesPath),
-              request, callback, error_callback, partial_traffic_annotation);
+  MakeApiCall(
+      CreateV2DeviceSyncRequestUrl(kBatchGetFeatureStatusesPath),
+      RequestType::kGet, base::nullopt /* serialized_request */,
+      cryptauthv2::BatchGetFeatureStatusesRequestToQueryParameters(request),
+      callback, error_callback, partial_traffic_annotation);
 }
 
 // TODO(https://crbug.com/953087): Populate the "sender" and "trigger" fields
@@ -551,17 +573,22 @@
         }
       })");
   MakeApiCall(CreateV2DeviceSyncRequestUrl(kBatchSetFeatureStatusesPath),
-              request, callback, error_callback, partial_traffic_annotation);
+              RequestType::kPost, request.SerializeAsString(),
+              base::nullopt /* request_as_query_parameters */, callback,
+              error_callback, partial_traffic_annotation);
 }
 
 std::string CryptAuthClientImpl::GetAccessTokenUsed() {
   return access_token_used_;
 }
 
-template <class RequestProto, class ResponseProto>
+template <class ResponseProto>
 void CryptAuthClientImpl::MakeApiCall(
     const GURL& request_url,
-    const RequestProto& request_proto,
+    RequestType request_type,
+    const base::Optional<std::string>& serialized_request,
+    const base::Optional<std::vector<std::pair<std::string, std::string>>>&
+        request_as_query_parameters,
     const base::Callback<void(const ResponseProto&)>& response_callback,
     const ErrorCallback& error_callback,
     const net::PartialNetworkTrafficAnnotationTag& partial_traffic_annotation) {
@@ -576,14 +603,6 @@
   api_call_flow_->SetPartialNetworkTrafficAnnotation(
       partial_traffic_annotation);
 
-  std::string serialized_request;
-  if (!request_proto.SerializeToString(&serialized_request)) {
-    PA_LOG(ERROR) << "CryptAuthClientImpl::MakeApiCall(): Failure serializing "
-                  << "request proto.";
-    NOTREACHED();
-    return;
-  }
-
   request_url_ = request_url;
   error_callback_ = error_callback;
 
@@ -594,14 +613,18 @@
       identity::PrimaryAccountAccessTokenFetcher>(
       "cryptauth_client", identity_manager_, scopes,
       base::BindOnce(&CryptAuthClientImpl::OnAccessTokenFetched<ResponseProto>,
-                     weak_ptr_factory_.GetWeakPtr(), serialized_request,
+                     weak_ptr_factory_.GetWeakPtr(), request_type,
+                     serialized_request, request_as_query_parameters,
                      response_callback),
       identity::PrimaryAccountAccessTokenFetcher::Mode::kWaitUntilAvailable);
 }
 
 template <class ResponseProto>
 void CryptAuthClientImpl::OnAccessTokenFetched(
-    const std::string& serialized_request,
+    RequestType request_type,
+    const base::Optional<std::string>& serialized_request,
+    const base::Optional<std::vector<std::pair<std::string, std::string>>>&
+        request_as_query_parameters,
     const base::Callback<void(const ResponseProto&)>& response_callback,
     GoogleServiceAuthError error,
     identity::AccessTokenInfo access_token_info) {
@@ -613,12 +636,28 @@
   }
   access_token_used_ = access_token_info.token;
 
-  api_call_flow_->Start(
-      request_url_, url_loader_factory_, access_token_used_, serialized_request,
-      base::Bind(&CryptAuthClientImpl::OnFlowSuccess<ResponseProto>,
-                 weak_ptr_factory_.GetWeakPtr(), response_callback),
-      base::Bind(&CryptAuthClientImpl::OnApiCallFailed,
-                 weak_ptr_factory_.GetWeakPtr()));
+  switch (request_type) {
+    case RequestType::kGet:
+      DCHECK(request_as_query_parameters && !serialized_request);
+      api_call_flow_->StartGetRequest(
+          request_url_, *request_as_query_parameters, url_loader_factory_,
+          access_token_used_,
+          base::Bind(&CryptAuthClientImpl::OnFlowSuccess<ResponseProto>,
+                     weak_ptr_factory_.GetWeakPtr(), response_callback),
+          base::Bind(&CryptAuthClientImpl::OnApiCallFailed,
+                     weak_ptr_factory_.GetWeakPtr()));
+      break;
+    case RequestType::kPost:
+      DCHECK(serialized_request && !request_as_query_parameters);
+      api_call_flow_->StartPostRequest(
+          request_url_, *serialized_request, url_loader_factory_,
+          access_token_used_,
+          base::Bind(&CryptAuthClientImpl::OnFlowSuccess<ResponseProto>,
+                     weak_ptr_factory_.GetWeakPtr(), response_callback),
+          base::Bind(&CryptAuthClientImpl::OnApiCallFailed,
+                     weak_ptr_factory_.GetWeakPtr()));
+      break;
+  }
 }
 
 template <class ResponseProto>
diff --git a/chromeos/services/device_sync/cryptauth_client_impl.h b/chromeos/services/device_sync/cryptauth_client_impl.h
index b14bd43..9c906db 100644
--- a/chromeos/services/device_sync/cryptauth_client_impl.h
+++ b/chromeos/services/device_sync/cryptauth_client_impl.h
@@ -5,8 +5,13 @@
 #ifndef CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_CLIENT_IMPL_H_
 #define CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_CLIENT_IMPL_H_
 
+#include <string>
+#include <utility>
+#include <vector>
+
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
+#include "base/optional.h"
 #include "chromeos/services/device_sync/cryptauth_api_call_flow.h"
 #include "chromeos/services/device_sync/cryptauth_client.h"
 #include "chromeos/services/device_sync/proto/cryptauth_api.pb.h"
@@ -102,13 +107,30 @@
   std::string GetAccessTokenUsed() override;
 
  private:
-  // Starts a call to the API given by |request_url|, with the templated
-  // request and response types. The client first fetches the access token and
-  // then makes the HTTP request.
-  template <class RequestProto, class ResponseProto>
+  enum class RequestType { kGet, kPost };
+
+  // Starts a call to the API given by |request_url|. The client first fetches
+  // the access token and then makes the HTTP request.
+  //   |request_url|: API endpoint.
+  //   |request_type|: Whether the request is a GET or POST.
+  //   |serialized_request|: Serialized request message proto that will be sent
+  //                         as the body of a POST request. Null if
+  //                         request type is not POST.
+  //   |request_as_query_parameters|: The request message proto represented as
+  //                                  key-value pairs that will be sent as query
+  //                                  parameters in a GET request. Note: A key
+  //                                  can have multiple values. Null if request
+  //                                  type is not GET.
+  //   |response_callback|: Callback for a successful request.
+  //   |error_callback|: Callback for a failed request.
+  //   |partial_traffic_annotation|: A partial tag used to mark a source of
+  template <class ResponseProto>
   void MakeApiCall(
       const GURL& request_url,
-      const RequestProto& request_proto,
+      RequestType request_type,
+      const base::Optional<std::string>& serialized_request,
+      const base::Optional<std::vector<std::pair<std::string, std::string>>>&
+          request_as_query_parameters,
       const base::Callback<void(const ResponseProto&)>& response_callback,
       const ErrorCallback& error_callback,
       const net::PartialNetworkTrafficAnnotationTag&
@@ -117,7 +139,10 @@
   // Called when the access token is obtained so the API request can be made.
   template <class ResponseProto>
   void OnAccessTokenFetched(
-      const std::string& serialized_request,
+      RequestType request_type,
+      const base::Optional<std::string>& serialized_request,
+      const base::Optional<std::vector<std::pair<std::string, std::string>>>&
+          request_as_query_parameters,
       const base::Callback<void(const ResponseProto&)>& response_callback,
       GoogleServiceAuthError error,
       identity::AccessTokenInfo access_token_info);
diff --git a/chromeos/services/device_sync/cryptauth_client_impl_unittest.cc b/chromeos/services/device_sync/cryptauth_client_impl_unittest.cc
index dd8ca328..ad58d3ba 100644
--- a/chromeos/services/device_sync/cryptauth_client_impl_unittest.cc
+++ b/chromeos/services/device_sync/cryptauth_client_impl_unittest.cc
@@ -4,10 +4,15 @@
 
 #include "chromeos/services/device_sync/cryptauth_client_impl.h"
 
+#include <string>
+#include <utility>
+#include <vector>
+
 #include "base/bind.h"
 #include "base/command_line.h"
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
+#include "base/strings/string_number_conversions.h"
 #include "base/test/gtest_util.h"
 #include "base/test/null_task_runner.h"
 #include "base/test/scoped_task_environment.h"
@@ -52,6 +57,7 @@
 const char kDeviceId2[] = "device_id2";
 const char kFeatureType1[] = "feature_type1";
 const char kFeatureType2[] = "feature_type2";
+const char kClientMetadataSessionId[] = "session_id";
 
 // Values for the DeviceClassifier field.
 const int kDeviceOsVersionCode = 100;
@@ -68,11 +74,21 @@
   virtual ~MockCryptAuthApiCallFlow() {}
 
   MOCK_METHOD6(
-      Start,
-      void(const GURL&,
+      StartPostRequest,
+      void(const GURL& request_url,
+           const std::string& serialized_request,
            scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
            const std::string& access_token,
-           const std::string& serialized_request,
+           const ResultCallback& result_callback,
+           const ErrorCallback& error_callback));
+
+  MOCK_METHOD6(
+      StartGetRequest,
+      void(const GURL& request_url,
+           const std::vector<std::pair<std::string, std::string>>&
+               request_as_query_parameters,
+           scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
+           const std::string& access_token,
            const ResultCallback& result_callback,
            const ErrorCallback& error_callback));
 
@@ -144,13 +160,24 @@
                                 shared_factory_, device_classifier));
   }
 
-  // Sets up an expectation and captures a CryptAuth API request to
+  // Sets up an expectation and captures a CryptAuth API POST request to
   // |request_url|.
-  void ExpectRequest(const std::string& request_url) {
+  void ExpectPostRequest(const std::string& request_url) {
     GURL url(request_url);
     EXPECT_CALL(*api_call_flow_,
-                Start(url, shared_factory_, kAccessToken, _, _, _))
-        .WillOnce(DoAll(SaveArg<3>(&serialized_request_),
+                StartPostRequest(url, _, shared_factory_, kAccessToken, _, _))
+        .WillOnce(DoAll(SaveArg<1>(&serialized_request_),
+                        SaveArg<4>(&flow_result_callback_),
+                        SaveArg<5>(&flow_error_callback_)));
+  }
+
+  // Sets up an expectation and captures a CryptAuth API GET request to
+  // |request_url|.
+  void ExpectGetRequest(const std::string& request_url) {
+    GURL url(request_url);
+    EXPECT_CALL(*api_call_flow_,
+                StartGetRequest(url, _, shared_factory_, kAccessToken, _, _))
+        .WillOnce(DoAll(SaveArg<1>(&request_as_query_parameters_),
                         SaveArg<4>(&flow_result_callback_),
                         SaveArg<5>(&flow_error_callback_)));
   }
@@ -178,14 +205,15 @@
   std::unique_ptr<CryptAuthClient> client_;
 
   std::string serialized_request_;
+  std::vector<std::pair<std::string, std::string>> request_as_query_parameters_;
   CryptAuthApiCallFlow::ResultCallback flow_result_callback_;
   CryptAuthApiCallFlow::ErrorCallback flow_error_callback_;
 };
 
 TEST_F(DeviceSyncCryptAuthClientTest, GetMyDevicesSuccess) {
-  ExpectRequest(
+  ExpectPostRequest(
       "https://www.testgoogleapis.com/cryptauth/v1/deviceSync/"
-      "getmydevices?alt=proto");
+      "getmydevices");
 
   cryptauth::GetMyDevicesResponse result_proto;
   cryptauth::GetMyDevicesRequest request_proto;
@@ -228,9 +256,9 @@
 }
 
 TEST_F(DeviceSyncCryptAuthClientTest, GetMyDevicesFailure) {
-  ExpectRequest(
+  ExpectPostRequest(
       "https://www.testgoogleapis.com/cryptauth/v1/deviceSync/"
-      "getmydevices?alt=proto");
+      "getmydevices");
 
   NetworkRequestError error;
   client_->GetMyDevices(
@@ -247,9 +275,9 @@
 }
 
 TEST_F(DeviceSyncCryptAuthClientTest, FindEligibleUnlockDevicesSuccess) {
-  ExpectRequest(
+  ExpectPostRequest(
       "https://www.testgoogleapis.com/cryptauth/v1/deviceSync/"
-      "findeligibleunlockdevices?alt=proto");
+      "findeligibleunlockdevices");
 
   cryptauth::FindEligibleUnlockDevicesResponse result_proto;
   cryptauth::FindEligibleUnlockDevicesRequest request_proto;
@@ -295,9 +323,9 @@
 }
 
 TEST_F(DeviceSyncCryptAuthClientTest, FindEligibleUnlockDevicesFailure) {
-  ExpectRequest(
+  ExpectPostRequest(
       "https://www.testgoogleapis.com/cryptauth/v1/deviceSync/"
-      "findeligibleunlockdevices?alt=proto");
+      "findeligibleunlockdevices");
 
   NetworkRequestError error;
   cryptauth::FindEligibleUnlockDevicesRequest request_proto;
@@ -316,9 +344,9 @@
 }
 
 TEST_F(DeviceSyncCryptAuthClientTest, FindEligibleForPromotionSuccess) {
-  ExpectRequest(
+  ExpectPostRequest(
       "https://www.testgoogleapis.com/cryptauth/v1/deviceSync/"
-      "findeligibleforpromotion?alt=proto");
+      "findeligibleforpromotion");
 
   cryptauth::FindEligibleForPromotionResponse result_proto;
   client_->FindEligibleForPromotion(
@@ -339,9 +367,9 @@
 }
 
 TEST_F(DeviceSyncCryptAuthClientTest, SendDeviceSyncTickleSuccess) {
-  ExpectRequest(
+  ExpectPostRequest(
       "https://www.testgoogleapis.com/cryptauth/v1/deviceSync/"
-      "senddevicesynctickle?alt=proto");
+      "senddevicesynctickle");
 
   cryptauth::SendDeviceSyncTickleResponse result_proto;
   client_->SendDeviceSyncTickle(
@@ -362,9 +390,9 @@
 }
 
 TEST_F(DeviceSyncCryptAuthClientTest, ToggleEasyUnlockSuccess) {
-  ExpectRequest(
+  ExpectPostRequest(
       "https://www.testgoogleapis.com/cryptauth/v1/deviceSync/"
-      "toggleeasyunlock?alt=proto");
+      "toggleeasyunlock");
 
   cryptauth::ToggleEasyUnlockResponse result_proto;
   cryptauth::ToggleEasyUnlockRequest request_proto;
@@ -391,9 +419,9 @@
 }
 
 TEST_F(DeviceSyncCryptAuthClientTest, SetupEnrollmentSuccess) {
-  ExpectRequest(
+  ExpectPostRequest(
       "https://www.testgoogleapis.com/cryptauth/v1/enrollment/"
-      "setup?alt=proto");
+      "setup");
 
   std::string kApplicationId = "mkaes";
   std::vector<std::string> supported_protocols;
@@ -441,9 +469,9 @@
 }
 
 TEST_F(DeviceSyncCryptAuthClientTest, FinishEnrollmentSuccess) {
-  ExpectRequest(
+  ExpectPostRequest(
       "https://www.testgoogleapis.com/cryptauth/v1/enrollment/"
-      "finish?alt=proto");
+      "finish");
 
   static const char kEnrollmentSessionId[] = "enrollment_session_id";
   static const char kEnrollmentMessage[] = "enrollment_message";
@@ -477,8 +505,8 @@
 }
 
 TEST_F(DeviceSyncCryptAuthClientTest, SyncKeysSuccess) {
-  ExpectRequest(
-      "https://cryptauthenrollment.testgoogleapis.com/v1:syncKeys?alt=proto");
+  ExpectPostRequest(
+      "https://cryptauthenrollment.testgoogleapis.com/v1:syncKeys");
 
   static const char kApplicationName[] = "application_name";
   static const char kRandomSessionId[] = "random_session_id";
@@ -509,8 +537,8 @@
 }
 
 TEST_F(DeviceSyncCryptAuthClientTest, EnrollKeysSuccess) {
-  ExpectRequest(
-      "https://cryptauthenrollment.testgoogleapis.com/v1:enrollKeys?alt=proto");
+  ExpectPostRequest(
+      "https://cryptauthenrollment.testgoogleapis.com/v1:enrollKeys");
 
   static const char kRandomSessionId[] = "random_session_id";
   static const char kCertificateName[] = "certificate_name";
@@ -547,9 +575,9 @@
 }
 
 TEST_F(DeviceSyncCryptAuthClientTest, SyncMetadataSuccess) {
-  ExpectRequest(
+  ExpectPostRequest(
       "https://cryptauthdevicesync.testgoogleapis.com/"
-      "v1:syncMetadata?alt=proto");
+      "v1:syncMetadata");
 
   static const char kMyDeviceEncryptedMetadata[] = "my_encrypted_metadata";
   static const char kOtherDeviceEncryptedMetadata[] =
@@ -613,9 +641,9 @@
 }
 
 TEST_F(DeviceSyncCryptAuthClientTest, ShareGroupPrivateKeySuccess) {
-  ExpectRequest(
+  ExpectPostRequest(
       "https://cryptauthdevicesync.testgoogleapis.com/"
-      "v1:shareGroupPrivateKey?alt=proto");
+      "v1:shareGroupPrivateKey");
 
   cryptauthv2::EncryptedGroupPrivateKey encrypted_group_private_key;
   encrypted_group_private_key.set_recipient_device_id(kDeviceId1);
@@ -656,12 +684,17 @@
 }
 
 TEST_F(DeviceSyncCryptAuthClientTest, BatchNotifyGroupDevicesSuccess) {
-  ExpectRequest(
+  ExpectGetRequest(
       "https://cryptauthdevicesync.testgoogleapis.com/"
-      "v1:batchNotifyGroupDevices?alt=proto");
+      "v1:batchNotifyGroupDevices");
 
   cryptauthv2::BatchNotifyGroupDevicesRequest request;
-  request.mutable_context()->CopyFrom(cryptauthv2::GetRequestContextForTest());
+  request.mutable_context()->CopyFrom(cryptauthv2::BuildRequestContext(
+      cryptauthv2::kTestDeviceSyncGroupName,
+      BuildClientMetadata(2 /* retry_count */,
+                          cryptauthv2::ClientMetadata::MANUAL,
+                          kClientMetadataSessionId),
+      cryptauthv2::kTestInstanceId, cryptauthv2::kTestInstanceIdToken));
   request.add_notify_device_ids(kDeviceId1);
   request.add_notify_device_ids(kDeviceId2);
   request.set_target_service(cryptauthv2::TargetService::DEVICE_SYNC);
@@ -678,16 +711,21 @@
       .WaitForAccessTokenRequestIfNecessaryAndRespondWithToken(
           kAccessToken, base::Time::Max());
 
-  cryptauthv2::BatchNotifyGroupDevicesRequest expected_request;
-  EXPECT_TRUE(expected_request.ParseFromString(serialized_request_));
-  EXPECT_EQ(cryptauthv2::GetRequestContextForTest().SerializeAsString(),
-            expected_request.context().SerializeAsString());
-  ASSERT_EQ(2, expected_request.notify_device_ids_size());
-  EXPECT_EQ(kDeviceId1, expected_request.notify_device_ids(0));
-  EXPECT_EQ(kDeviceId2, expected_request.notify_device_ids(1));
-  EXPECT_EQ(cryptauthv2::TargetService::DEVICE_SYNC,
-            expected_request.target_service());
-  EXPECT_EQ(kFeatureType1, expected_request.feature_type());
+  std::vector<std::pair<std::string, std::string>>
+      expected_request_as_query_parameters = {
+          {"context.client_metadata.retry_count", "2"},
+          {"context.client_metadata.invocation_reason",
+           base::NumberToString(cryptauthv2::ClientMetadata::MANUAL)},
+          {"context.client_metadata.session_id", kClientMetadataSessionId},
+          {"context.group", cryptauthv2::kTestDeviceSyncGroupName},
+          {"context.device_id", cryptauthv2::kTestInstanceId},
+          {"context.device_id_token", cryptauthv2::kTestInstanceIdToken},
+          {"notify_device_ids", kDeviceId1},
+          {"notify_device_ids", kDeviceId2},
+          {"target_service",
+           base::NumberToString(cryptauthv2::TargetService::DEVICE_SYNC)},
+          {"feature_type", kFeatureType1}};
+  EXPECT_EQ(expected_request_as_query_parameters, request_as_query_parameters_);
 
   {
     cryptauthv2::BatchNotifyGroupDevicesResponse response;
@@ -698,12 +736,17 @@
 }
 
 TEST_F(DeviceSyncCryptAuthClientTest, BatchGetFeatureStatusesSuccess) {
-  ExpectRequest(
+  ExpectGetRequest(
       "https://cryptauthdevicesync.testgoogleapis.com/"
-      "v1:batchGetFeatureStatuses?alt=proto");
+      "v1:batchGetFeatureStatuses");
 
   cryptauthv2::BatchGetFeatureStatusesRequest request;
-  request.mutable_context()->CopyFrom(cryptauthv2::GetRequestContextForTest());
+  request.mutable_context()->CopyFrom(cryptauthv2::BuildRequestContext(
+      cryptauthv2::kTestDeviceSyncGroupName,
+      BuildClientMetadata(2 /* retry_count */,
+                          cryptauthv2::ClientMetadata::MANUAL,
+                          kClientMetadataSessionId),
+      cryptauthv2::kTestInstanceId, cryptauthv2::kTestInstanceIdToken));
   request.add_device_ids(kDeviceId1);
   request.add_device_ids(kDeviceId2);
   request.add_feature_types(kFeatureType1);
@@ -720,16 +763,20 @@
       .WaitForAccessTokenRequestIfNecessaryAndRespondWithToken(
           kAccessToken, base::Time::Max());
 
-  cryptauthv2::BatchGetFeatureStatusesRequest expected_request;
-  EXPECT_TRUE(expected_request.ParseFromString(serialized_request_));
-  EXPECT_EQ(cryptauthv2::GetRequestContextForTest().SerializeAsString(),
-            expected_request.context().SerializeAsString());
-  ASSERT_EQ(2, expected_request.device_ids_size());
-  EXPECT_EQ(kDeviceId1, expected_request.device_ids(0));
-  EXPECT_EQ(kDeviceId2, expected_request.device_ids(1));
-  ASSERT_EQ(2, expected_request.feature_types_size());
-  EXPECT_EQ(kFeatureType1, expected_request.feature_types(0));
-  EXPECT_EQ(kFeatureType2, expected_request.feature_types(1));
+  std::vector<std::pair<std::string, std::string>>
+      expected_request_as_query_parameters = {
+          {"context.client_metadata.retry_count", "2"},
+          {"context.client_metadata.invocation_reason",
+           base::NumberToString(cryptauthv2::ClientMetadata::MANUAL)},
+          {"context.client_metadata.session_id", kClientMetadataSessionId},
+          {"context.group", cryptauthv2::kTestDeviceSyncGroupName},
+          {"context.device_id", cryptauthv2::kTestInstanceId},
+          {"context.device_id_token", cryptauthv2::kTestInstanceIdToken},
+          {"device_ids", kDeviceId1},
+          {"device_ids", kDeviceId2},
+          {"feature_types", kFeatureType1},
+          {"feature_types", kFeatureType2}};
+  EXPECT_EQ(expected_request_as_query_parameters, request_as_query_parameters_);
 
   {
     cryptauthv2::BatchGetFeatureStatusesResponse response;
@@ -771,9 +818,9 @@
 }
 
 TEST_F(DeviceSyncCryptAuthClientTest, BatchSetFeatureStatusesSuccess) {
-  ExpectRequest(
+  ExpectPostRequest(
       "https://cryptauthdevicesync.testgoogleapis.com/"
-      "v1:batchSetFeatureStatuses?alt=proto");
+      "v1:batchSetFeatureStatuses");
 
   cryptauthv2::BatchSetFeatureStatusesRequest request;
   request.mutable_context()->CopyFrom(cryptauthv2::GetRequestContextForTest());
@@ -862,9 +909,9 @@
 }
 
 TEST_F(DeviceSyncCryptAuthClientTest, ParseResponseProtoFailure) {
-  ExpectRequest(
+  ExpectPostRequest(
       "https://www.testgoogleapis.com/cryptauth/v1/deviceSync/"
-      "getmydevices?alt=proto");
+      "getmydevices");
 
   NetworkRequestError error;
   client_->GetMyDevices(
@@ -882,9 +929,9 @@
 
 TEST_F(DeviceSyncCryptAuthClientTest,
        MakeSecondRequestBeforeFirstRequestSucceeds) {
-  ExpectRequest(
+  ExpectPostRequest(
       "https://www.testgoogleapis.com/cryptauth/v1/deviceSync/"
-      "getmydevices?alt=proto");
+      "getmydevices");
 
   // Make first request.
   cryptauth::GetMyDevicesResponse result_proto;
@@ -924,9 +971,9 @@
        MakeSecondRequestAfterFirstRequestSucceeds) {
   // Make first request successfully.
   {
-    ExpectRequest(
+    ExpectPostRequest(
         "https://www.testgoogleapis.com/cryptauth/v1/deviceSync/"
-        "getmydevices?alt=proto");
+        "getmydevices");
     cryptauth::GetMyDevicesResponse result_proto;
     client_->GetMyDevices(
         cryptauth::GetMyDevicesRequest(),
@@ -958,9 +1005,9 @@
 }
 
 TEST_F(DeviceSyncCryptAuthClientTest, DeviceClassifierIsSet) {
-  ExpectRequest(
+  ExpectPostRequest(
       "https://www.testgoogleapis.com/cryptauth/v1/deviceSync/"
-      "getmydevices?alt=proto");
+      "getmydevices");
 
   cryptauth::GetMyDevicesResponse result_proto;
   cryptauth::GetMyDevicesRequest request_proto;
@@ -991,9 +1038,9 @@
 TEST_F(DeviceSyncCryptAuthClientTest, GetAccessTokenUsed) {
   EXPECT_TRUE(client_->GetAccessTokenUsed().empty());
 
-  ExpectRequest(
+  ExpectPostRequest(
       "https://www.testgoogleapis.com/cryptauth/v1/deviceSync/"
-      "getmydevices?alt=proto");
+      "getmydevices");
 
   cryptauth::GetMyDevicesResponse result_proto;
   cryptauth::GetMyDevicesRequest request_proto;
diff --git a/chromeos/services/device_sync/proto/BUILD.gn b/chromeos/services/device_sync/proto/BUILD.gn
index b9bbbec..788020dc 100644
--- a/chromeos/services/device_sync/proto/BUILD.gn
+++ b/chromeos/services/device_sync/proto/BUILD.gn
@@ -19,6 +19,8 @@
 
 static_library("util") {
   sources = [
+    "cryptauth_proto_to_query_parameters_util.cc",
+    "cryptauth_proto_to_query_parameters_util.h",
     "device_classifier_util.cc",
     "device_classifier_util.h",
     "enum_util.cc",
diff --git a/chromeos/services/device_sync/proto/cryptauth_devicesync.proto b/chromeos/services/device_sync/proto/cryptauth_devicesync.proto
index 57c7f5d..e9bba37 100644
--- a/chromeos/services/device_sync/proto/cryptauth_devicesync.proto
+++ b/chromeos/services/device_sync/proto/cryptauth_devicesync.proto
@@ -167,6 +167,10 @@
 // Allows a device, which is part of the group, notify another group device.
 // This allows setup to work, e.g. by letting the other device know it needs to
 // turn on the bluetooth radio.
+//
+// Note: This request is encoded as query parameters in a GET request. If any
+// field or subfield of this proto changes, update the files
+// cryptauth_proto_to_query_parameters_util.{h,cc}.
 message BatchNotifyGroupDevicesRequest {
   // The context of this request.
   RequestContext context = 1;
@@ -184,6 +188,10 @@
 message BatchNotifyGroupDevicesResponse {}
 
 // Requests feature enabled/disabled statuses per device in the group.
+//
+// Note: This request is encoded as query parameters in a GET request. If any
+// field or subfield of this proto changes, update the files
+// cryptauth_proto_to_query_parameters_util.{h,cc}.
 message BatchGetFeatureStatusesRequest {
   // The context of this request.
   RequestContext context = 1;
diff --git a/chromeos/services/device_sync/proto/cryptauth_proto_to_query_parameters_util.cc b/chromeos/services/device_sync/proto/cryptauth_proto_to_query_parameters_util.cc
new file mode 100644
index 0000000..76075662
--- /dev/null
+++ b/chromeos/services/device_sync/proto/cryptauth_proto_to_query_parameters_util.cc
@@ -0,0 +1,111 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromeos/services/device_sync/proto/cryptauth_proto_to_query_parameters_util.h"
+
+#include "base/strings/string_number_conversions.h"
+#include "chromeos/services/device_sync/proto/cryptauth_common.pb.h"
+#include "chromeos/services/device_sync/proto/cryptauth_devicesync.pb.h"
+
+namespace cryptauthv2 {
+
+namespace {
+
+const char kSubFieldDelimiter[] = ".";
+
+const char kClientMetadataRetryCount[] = "retry_count";
+const char kClientMetadataInvocationReason[] = "invocation_reason";
+const char kClientMetadataSessionId[] = "session_id";
+
+const char kRequestContextGroup[] = "group";
+const char kRequestContextClientMetadata[] = "client_metadata";
+const char kRequestContextDeviceId[] = "device_id";
+const char kRequestContextDeviceIdToken[] = "device_id_token";
+
+const char kBatchNotifyGroupDevicesRequestContext[] = "context";
+const char kBatchNotifyGroupDevicesRequestNotifyDeviceIds[] =
+    "notify_device_ids";
+const char kBatchNotifyGroupDevicesRequestTargetService[] = "target_service";
+const char kBatchNotifyGroupDevicesRequestFeatureType[] = "feature_type";
+
+const char kBatchGetFeatureStatusesRequestContext[] = "context";
+const char kBatchGetFeatureStatusesRequestDeviceIds[] = "device_ids";
+const char kBatchGetFeatureStatusesRequestFeatureTypes[] = "feature_types";
+
+}  // namespace
+
+std::vector<std::pair<std::string, std::string>>
+ClientMetadataToQueryParameters(const ClientMetadata& client_metadata,
+                                const std::string& key_prefix) {
+  // |crypto_hardware| is not processed; make sure it has no value.
+  DCHECK(!client_metadata.has_crypto_hardware());
+
+  return {
+      {key_prefix + kClientMetadataRetryCount,
+       base::NumberToString(client_metadata.retry_count())},
+      {key_prefix + kClientMetadataInvocationReason,
+       base::NumberToString(client_metadata.invocation_reason())},
+      {key_prefix + kClientMetadataSessionId, client_metadata.session_id()}};
+}
+
+std::vector<std::pair<std::string, std::string>>
+RequestContextToQueryParameters(const RequestContext& context,
+                                const std::string& key_prefix) {
+  std::vector<std::pair<std::string, std::string>> pairs =
+      ClientMetadataToQueryParameters(
+          context.client_metadata(),
+          key_prefix + kRequestContextClientMetadata + kSubFieldDelimiter);
+
+  pairs.insert(
+      pairs.end(),
+      {{key_prefix + kRequestContextGroup, context.group()},
+       {key_prefix + kRequestContextDeviceId, context.device_id()},
+       {key_prefix + kRequestContextDeviceIdToken, context.device_id_token()}});
+
+  return pairs;
+}
+
+std::vector<std::pair<std::string, std::string>>
+BatchNotifyGroupDevicesRequestToQueryParameters(
+    const BatchNotifyGroupDevicesRequest& request) {
+  std::vector<std::pair<std::string, std::string>> pairs =
+      RequestContextToQueryParameters(
+          request.context(),
+          std::string(kBatchNotifyGroupDevicesRequestContext) +
+              kSubFieldDelimiter);
+
+  for (const std::string& notify_device_id : request.notify_device_ids()) {
+    pairs.emplace_back(kBatchNotifyGroupDevicesRequestNotifyDeviceIds,
+                       notify_device_id);
+  }
+
+  pairs.emplace_back(kBatchNotifyGroupDevicesRequestTargetService,
+                     base::NumberToString(request.target_service()));
+  pairs.emplace_back(kBatchNotifyGroupDevicesRequestFeatureType,
+                     request.feature_type());
+
+  return pairs;
+}
+
+std::vector<std::pair<std::string, std::string>>
+BatchGetFeatureStatusesRequestToQueryParameters(
+    const BatchGetFeatureStatusesRequest& request) {
+  std::vector<std::pair<std::string, std::string>> pairs =
+      RequestContextToQueryParameters(
+          request.context(),
+          std::string(kBatchGetFeatureStatusesRequestContext) +
+              kSubFieldDelimiter);
+
+  for (const std::string& device_id : request.device_ids())
+    pairs.emplace_back(kBatchGetFeatureStatusesRequestDeviceIds, device_id);
+
+  for (const std::string& feature_type : request.feature_types()) {
+    pairs.emplace_back(kBatchGetFeatureStatusesRequestFeatureTypes,
+                       feature_type);
+  }
+
+  return pairs;
+}
+
+}  // namespace cryptauthv2
diff --git a/chromeos/services/device_sync/proto/cryptauth_proto_to_query_parameters_util.h b/chromeos/services/device_sync/proto/cryptauth_proto_to_query_parameters_util.h
new file mode 100644
index 0000000..1a6134c
--- /dev/null
+++ b/chromeos/services/device_sync/proto/cryptauth_proto_to_query_parameters_util.h
@@ -0,0 +1,82 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROMEOS_SERVICES_DEVICE_SYNC_PROTO_CRYPTAUTH_PROTO_TO_QUERY_PARAMETERS_UTIL_H_
+#define CHROMEOS_SERVICES_DEVICE_SYNC_PROTO_CRYPTAUTH_PROTO_TO_QUERY_PARAMETERS_UTIL_H_
+
+#include <string>
+#include <utility>
+#include <vector>
+
+// Utility functions for converting relevant CryptAuth v2 protos to lists of
+// key-value pairs to be sent as query parameters in HTTP GET requests. Note: A
+// key can have multiple values.
+namespace cryptauthv2 {
+
+class BatchGetFeatureStatusesRequest;
+class BatchNotifyGroupDevicesRequest;
+class ClientMetadata;
+class RequestContext;
+
+// Example output with |key_prefix| = "client_metadata.":
+//   {
+//     {"client_metadata.retry_count", "2"},
+//     {"client_metadata.invocation_reason", "13"},
+//     {"client_metadata.session_id", "abc123"}
+//   }
+// Note: |crypto_hardware| field is not processed.
+std::vector<std::pair<std::string, std::string>>
+ClientMetadataToQueryParameters(const ClientMetadata& client_metadata,
+                                const std::string& key_prefix = std::string());
+
+// Example output with |key_prefix| = "context.":
+//   {
+//     {"context.client_metadata.retry_count", "2"},
+//     {"context.client_metadata.invocation_reason", "13"},
+//     {"context.client_metadata.session_id", "abc"}
+//     {"context.group", "DeviceSync:BetterTogether"},
+//     {"context.device_id", "123"},
+//     {"context.device_id_token", "123token"},
+//   }
+std::vector<std::pair<std::string, std::string>>
+RequestContextToQueryParameters(const RequestContext& context,
+                                const std::string& key_prefix = std::string());
+
+// Example output:
+//   {
+//     {"context.client_metadata.retry_count", "2"},
+//     {"context.client_metadata.invocation_reason", "13"},
+//     {"context.client_metadata.session_id", "abc"}
+//     {"context.group", "DeviceSync:BetterTogether"},
+//     {"context.device_id", "123"},
+//     {"context.device_id_token", "123token"},
+//     {"notify_device_ids", "123"},
+//     {"notify_device_ids", "456"},
+//     {"target_service", "2"},
+//     {"feature_type", "my_feature"}};
+//   }
+std::vector<std::pair<std::string, std::string>>
+BatchNotifyGroupDevicesRequestToQueryParameters(
+    const BatchNotifyGroupDevicesRequest& request);
+
+// Example output:
+//   {
+//     {"context.client_metadata.retry_count", "2"},
+//     {"context.client_metadata.invocation_reason", "13"},
+//     {"context.client_metadata.session_id", "abc"}
+//     {"context.group", "DeviceSync:BetterTogether"},
+//     {"context.device_id", "123"},
+//     {"context.device_id_token", "123token"},
+//     {"device_ids", "123"},
+//     {"device_ids", "456"},
+//     {"feature_types", "my_feature_1"},
+//     {"feature_types", "my_feature_2"}};
+//   }
+std::vector<std::pair<std::string, std::string>>
+BatchGetFeatureStatusesRequestToQueryParameters(
+    const BatchGetFeatureStatusesRequest& request);
+
+}  // namespace cryptauthv2
+
+#endif  // CHROMEOS_SERVICES_DEVICE_SYNC_PROTO_CRYPTAUTH_PROTO_TO_QUERY_PARAMETERS_UTIL_H_
diff --git a/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc b/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc
index 4362b17f..f750808f 100644
--- a/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc
+++ b/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc
@@ -16,6 +16,7 @@
 
 #include "base/guid.h"
 #include "base/metrics/metrics_hashes.h"
+#include "base/strings/string16.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/scoped_task_environment.h"
@@ -91,6 +92,39 @@
   return std::to_string(now.month % 12 + 1);
 }
 
+// Used to configure form for |CreateTestCreditCardFormData|.
+struct CreditCardFormOptions {
+  CreditCardFormOptions& with_is_https(bool b) {
+    is_https = b;
+    return *this;
+  }
+
+  CreditCardFormOptions& with_split_names(bool b) {
+    split_names = b;
+    return *this;
+  }
+
+  CreditCardFormOptions& with_is_from_non_focusable_form(bool b) {
+    is_from_non_focusable_form = b;
+    return *this;
+  }
+
+  CreditCardFormOptions& with_is_google_host(bool b) {
+    is_google_host = b;
+    return *this;
+  }
+  // True if the scheme of a form is https.
+  bool is_https = true;
+  // True if the form is using both first name and last name field.
+  bool split_names = false;
+  // True if the form is a non-focusable form, such as a form that is hidden
+  // after information has been entered into it.
+  bool is_from_non_focusable_form = false;
+  // True if the form is from Google-hosted website, such as payments.google.com
+  // or YouTube.
+  bool is_google_host = false;
+};
+
 }  // anonymous namespace
 
 class MockPersonalDataManager : public TestPersonalDataManager {
@@ -180,20 +214,19 @@
 
   // Populates |form| with data corresponding to a simple credit card form.
   // Note that this actually appends fields to the form data, which can be
-  // useful for building up more complex test forms.
+  // useful for building up more complex test forms. The |form| can be
+  // configured using the provided |options|.
   void CreateTestCreditCardFormData(FormData* form,
-                                    bool is_https,
-                                    bool use_month_type,
-                                    bool split_names = false,
-                                    bool is_from_non_focusable_form = false,
-                                    bool is_google_host = false) {
+                                    CreditCardFormOptions options) {
     form->name = ASCIIToUTF16("MyForm");
     base::string16 scheme =
-        is_https ? ASCIIToUTF16("https://") : ASCIIToUTF16("http://");
-    base::string16 host = is_google_host ? ASCIIToUTF16("pay.google.com")
-                                         : ASCIIToUTF16("myform.com");
-    base::string16 root_host = is_google_host ? ASCIIToUTF16("pay.google.com")
-                                              : ASCIIToUTF16("myform.root.com");
+        options.is_https ? ASCIIToUTF16("https://") : ASCIIToUTF16("http://");
+    base::string16 host = options.is_google_host
+                              ? ASCIIToUTF16("pay.google.com")
+                              : ASCIIToUTF16("myform.com");
+    base::string16 root_host = options.is_google_host
+                                   ? ASCIIToUTF16("pay.google.com")
+                                   : ASCIIToUTF16("myform.root.com");
     base::string16 form_path = ASCIIToUTF16("/form.html");
     base::string16 submit_path = ASCIIToUTF16("/submit.html");
     form->url = GURL(scheme + host + form_path);
@@ -202,7 +235,7 @@
         url::Origin::Create(GURL(scheme + root_host + form_path));
 
     FormFieldData field;
-    if (split_names) {
+    if (options.split_names) {
       test::CreateTestFormField("First Name on Card", "firstnameoncard", "",
                                 "text", &field);
       field.autocomplete_attribute = "cc-given-name";
@@ -218,19 +251,12 @@
       form->fields.push_back(field);
     }
     test::CreateTestFormField("Card Number", "cardnumber", "", "text", &field);
-    field.is_focusable = !is_from_non_focusable_form;
+    field.is_focusable = !options.is_from_non_focusable_form;
     form->fields.push_back(field);
-    if (use_month_type) {
-      test::CreateTestFormField("Expiration Date", "ccmonth", "", "month",
-                                &field);
-      form->fields.push_back(field);
-    } else {
-      test::CreateTestFormField("Expiration Date", "ccmonth", "", "text",
-                                &field);
-      form->fields.push_back(field);
-      test::CreateTestFormField("", "ccyear", "", "text", &field);
-      form->fields.push_back(field);
-    }
+    test::CreateTestFormField("Expiration Date", "ccmonth", "", "text", &field);
+    form->fields.push_back(field);
+    test::CreateTestFormField("", "ccyear", "", "text", &field);
+    form->fields.push_back(field);
     test::CreateTestFormField("CVC", "cvc", "", "text", &field);
     form->fields.push_back(field);
   }
@@ -263,7 +289,8 @@
   void TestSaveCreditCards(bool is_https) {
     // Set up our form data.
     FormData form;
-    CreateTestCreditCardFormData(&form, is_https, false);
+    CreateTestCreditCardFormData(
+        &form, CreditCardFormOptions().with_is_https(is_https));
     std::vector<FormData> forms(1, form);
     FormsSeen(forms);
 
@@ -403,7 +430,8 @@
 
   // Set up our form data.
   FormData form;
-  CreateTestCreditCardFormData(&form, false, false);
+  CreateTestCreditCardFormData(&form,
+                               CreditCardFormOptions().with_is_https(false));
 
   // Set "autocomplete=off" for cardnumber field.
   form.fields[1].should_autocomplete = false;
@@ -424,7 +452,7 @@
 TEST_F(CreditCardSaveManagerTest, InvalidCreditCardNumberIsNotSaved) {
   // Set up our form data.
   FormData form;
-  CreateTestCreditCardFormData(&form, true, false);
+  CreateTestCreditCardFormData(&form, CreditCardFormOptions());
   std::vector<FormData> forms(1, form);
   FormsSeen(forms);
 
@@ -451,7 +479,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -488,7 +516,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
   ExpectFillableFormParsedUkm(2 /* num_fillable_forms_parsed */);
 
@@ -554,7 +582,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
   ExpectFillableFormParsedUkm(2 /* num_fillable_forms_parsed */);
 
@@ -625,8 +653,8 @@
   // Set up our credit card form data with credit card first and last name
   // fields.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, /*is_https=*/true,
-                               /*use_month_type=*/false, /*split_names=*/true);
+  CreateTestCreditCardFormData(&credit_card_form,
+                               CreditCardFormOptions().with_split_names(true));
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -736,8 +764,8 @@
   // Set up our credit card form data with credit card first and last name
   // fields.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, /*is_https=*/true,
-                               /*use_month_type=*/false, /*split_names=*/true);
+  CreateTestCreditCardFormData(&credit_card_form,
+                               CreditCardFormOptions().with_split_names(true));
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -779,9 +807,10 @@
 
   // Set up our credit card form data with non_focusable form field.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, /*is_https=*/true,
-                               /*use_month_type=*/false, /*split_names=*/true,
-                               /*is_from_non_focusable_form=*/true);
+  CreateTestCreditCardFormData(&credit_card_form,
+                               CreditCardFormOptions()
+                                   .with_split_names(true)
+                                   .with_is_from_non_focusable_form(true));
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -827,9 +856,10 @@
 
   // Set up our credit card form data with non_focusable form field.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, /*is_https=*/true,
-                               /*use_month_type=*/false, /*split_names=*/true,
-                               /*is_from_non_focusable_form=*/true);
+  CreateTestCreditCardFormData(&credit_card_form,
+                               CreditCardFormOptions()
+                                   .with_split_names(true)
+                                   .with_is_from_non_focusable_form(true));
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -865,9 +895,10 @@
 
   // Set up our credit card form data with non_focusable form field.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, /*is_https=*/true,
-                               /*use_month_type=*/false, /*split_names=*/true,
-                               /*is_from_non_focusable_form=*/true);
+  CreateTestCreditCardFormData(&credit_card_form,
+                               CreditCardFormOptions()
+                                   .with_split_names(true)
+                                   .with_is_from_non_focusable_form(true));
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -905,9 +936,10 @@
 
   // Set up our credit card form data with non_focusable form field.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, /*is_https=*/true,
-                               /*use_month_type=*/false, /*split_names=*/true,
-                               /*is_from_non_focusable_form=*/true);
+  CreateTestCreditCardFormData(&credit_card_form,
+                               CreditCardFormOptions()
+                                   .with_split_names(true)
+                                   .with_is_from_non_focusable_form(true));
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -941,8 +973,8 @@
   // Set up our credit card form data with credit card first and last name
   // fields.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, /*is_https=*/true,
-                               /*use_month_type=*/false, /*split_names=*/true);
+  CreateTestCreditCardFormData(&credit_card_form,
+                               CreditCardFormOptions().with_split_names(true));
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -1080,7 +1112,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -1134,7 +1166,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -1165,7 +1197,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -1199,7 +1231,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
   ExpectFillableFormParsedUkm(2 /* num_fillable_forms_parsed */);
 
@@ -1238,7 +1270,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -1547,7 +1579,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -1593,7 +1625,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -1631,7 +1663,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -1673,7 +1705,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, but don't include a name, and submit.
@@ -1705,7 +1737,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, but don't include a name, and submit.
@@ -1755,7 +1787,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
   ExpectFillableFormParsedUkm(3 /* num_fillable_forms_parsed */);
 
@@ -1804,7 +1836,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen({credit_card_form});
 
   // Edit the data and submit.
@@ -1851,7 +1883,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data and submit.
@@ -1893,7 +1925,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -1937,7 +1969,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen({credit_card_form});
 
   // Edit the data, but use the name with a middle initial *and* period, and
@@ -1977,7 +2009,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen({credit_card_form});
 
   // Edit the data, but do not use middle initial.
@@ -2012,7 +2044,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen({credit_card_form});
 
   // Edit the name by adding a middle name.
@@ -2050,7 +2082,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen({credit_card_form});
 
   // Edit the name by removing middle name.
@@ -2097,7 +2129,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, but use yet another name, and submit.
@@ -2148,7 +2180,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, but use yet another name, and submit.
@@ -2189,7 +2221,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, but don't include a name, and submit.
@@ -2231,7 +2263,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, but include a conflicting name, and submit.
@@ -2269,10 +2301,8 @@
   FormSubmitted(address_form);
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, /*is_https=*/true,
-                               /*split_names=*/false, /*split_names=*/false,
-                               /*is_from_non_focusable_form*/ false,
-                               /*is_google_host*/ true);
+  CreateTestCreditCardFormData(
+      &credit_card_form, CreditCardFormOptions().with_is_google_host(true));
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -2306,10 +2336,9 @@
   FormSubmitted(address_form);
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, /*is_https=*/true,
-                               /*split_names=*/false, /*split_names=*/false,
-                               /*is_from_non_focusable_form*/ false,
-                               /*is_google_host*/ true);
+  CreateTestCreditCardFormData(
+      &credit_card_form, CreditCardFormOptions().with_is_google_host(true));
+
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -2343,7 +2372,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -2390,7 +2419,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, but don't include a name, and submit.
@@ -2437,7 +2466,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, but include a conflicting name, and submit.
@@ -2481,7 +2510,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, but don't include a name, and submit.
@@ -2523,7 +2552,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, but include a conflicting name, and submit.
@@ -2569,7 +2598,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, but don't include a name, and submit.
@@ -2620,7 +2649,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, but don't include a expiration date, and submit.
@@ -2671,7 +2700,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -2702,7 +2731,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -2745,7 +2774,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -2788,7 +2817,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -2831,7 +2860,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -2875,7 +2904,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data with 2 digit year and submit.
@@ -2919,7 +2948,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -2969,7 +2998,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen({credit_card_form});
 
   // Edit the credit card form and submit.
@@ -3007,7 +3036,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -3052,7 +3081,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -3093,7 +3122,7 @@
 TEST_P(CreditCardSaveManagerFeatureParameterizedTest, NothingIfNothingFound) {
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -3111,7 +3140,7 @@
 TEST_P(CreditCardSaveManagerFeatureParameterizedTest, DetectCvc) {
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -3133,7 +3162,7 @@
 TEST_P(CreditCardSaveManagerFeatureParameterizedTest, DetectCardholderName) {
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -3162,7 +3191,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -3192,7 +3221,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -3223,7 +3252,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -3247,7 +3276,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -3281,7 +3310,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -3305,7 +3334,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -3334,7 +3363,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -3363,7 +3392,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -3392,7 +3421,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -3421,7 +3450,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -3455,7 +3484,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -3495,7 +3524,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -3544,7 +3573,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -3584,7 +3613,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -3637,7 +3666,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -3678,8 +3707,8 @@
   // Set up our credit card form data with credit card first and last name
   // fields.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, /*is_https=*/true,
-                               /*use_month_type=*/false, /*split_names=*/true);
+  CreateTestCreditCardFormData(&credit_card_form,
+                               CreditCardFormOptions().with_split_names(true));
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -3725,7 +3754,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -3756,7 +3785,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -3799,7 +3828,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -3841,7 +3870,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -3885,7 +3914,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -3941,7 +3970,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -3984,7 +4013,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -4042,7 +4071,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
   ExpectFillableFormParsedUkm(2 /* num_fillable_forms_parsed */);
 
@@ -4083,7 +4112,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
   ExpectFillableFormParsedUkm(2 /* num_fillable_forms_parsed */);
 
@@ -4138,7 +4167,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
   ExpectFillableFormParsedUkm(2 /* num_fillable_forms_parsed */);
 
@@ -4183,7 +4212,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -4213,7 +4242,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -4242,7 +4271,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -4264,7 +4293,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -4294,7 +4323,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -4323,7 +4352,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -4353,7 +4382,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -4393,7 +4422,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -4432,7 +4461,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
   ExpectFillableFormParsedUkm(1 /* num_fillable_forms_parsed */);
 
@@ -4484,7 +4513,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
   ExpectFillableFormParsedUkm(2 /* num_fillable_forms_parsed */);
 
@@ -4527,7 +4556,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
   ExpectFillableFormParsedUkm(1 /* num_fillable_forms_parsed */);
 
@@ -4577,7 +4606,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
   ExpectFillableFormParsedUkm(2 /* num_fillable_forms_parsed */);
 
@@ -4619,7 +4648,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
   ExpectFillableFormParsedUkm(1 /* num_fillable_forms_parsed */);
 
@@ -4667,7 +4696,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
   ExpectFillableFormParsedUkm(2 /* num_fillable_forms_parsed */);
 
@@ -4714,7 +4743,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
   ExpectFillableFormParsedUkm(1 /* num_fillable_forms_parsed */);
 
@@ -4766,7 +4795,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
   ExpectFillableFormParsedUkm(2 /* num_fillable_forms_parsed */);
 
@@ -4811,7 +4840,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
   ExpectFillableFormParsedUkm(1 /* num_fillable_forms_parsed */);
 
@@ -4856,7 +4885,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
   ExpectFillableFormParsedUkm(2 /* num_fillable_forms_parsed */);
 
@@ -4893,7 +4922,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
   ExpectFillableFormParsedUkm(1 /* num_fillable_forms_parsed */);
 
@@ -4942,7 +4971,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
   ExpectFillableFormParsedUkm(2 /* num_fillable_forms_parsed */);
 
@@ -5003,7 +5032,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
   ExpectFillableFormParsedUkm(1 /* num_fillable_forms_parsed */);
 
@@ -5054,7 +5083,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
   ExpectFillableFormParsedUkm(2 /* num_fillable_forms_parsed */);
 
@@ -5098,7 +5127,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
   ExpectFillableFormParsedUkm(1 /* num_fillable_forms_parsed */);
 
@@ -5147,7 +5176,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
   ExpectFillableFormParsedUkm(2 /* num_fillable_forms_parsed */);
 
@@ -5196,7 +5225,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
   ExpectFillableFormParsedUkm(1 /* num_fillable_forms_parsed */);
 
@@ -5249,7 +5278,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
   ExpectFillableFormParsedUkm(2 /* num_fillable_forms_parsed */);
 
@@ -5292,7 +5321,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
   ExpectFillableFormParsedUkm(1 /* num_fillable_forms_parsed */);
 
@@ -5335,7 +5364,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
   ExpectFillableFormParsedUkm(2 /* num_fillable_forms_parsed */);
 
@@ -5370,7 +5399,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
   ExpectFillableFormParsedUkm(1 /* num_fillable_forms_parsed */);
 
@@ -5417,7 +5446,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
   ExpectFillableFormParsedUkm(2 /* num_fillable_forms_parsed */);
 
@@ -5500,8 +5529,8 @@
   // Set up our credit card form data with credit card first and last name
   // fields.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, /*is_https=*/true,
-                               /*use_month_type=*/false, /*split_names=*/true);
+  CreateTestCreditCardFormData(&credit_card_form,
+                               CreditCardFormOptions().with_split_names(true));
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -5551,8 +5580,8 @@
   // Set up our credit card form data with credit card first and last name
   // fields.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, /*is_https=*/true,
-                               /*use_month_type=*/false, /*split_names=*/true);
+  CreateTestCreditCardFormData(&credit_card_form,
+                               CreditCardFormOptions().with_split_names(true));
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -5584,7 +5613,7 @@
   payments_client_->SetSupportedBINRanges(supported_card_bin_ranges);
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
@@ -5612,7 +5641,7 @@
   payments_client_->SetSupportedBINRanges(supported_card_bin_ranges);
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Add a local credit card whose number matches what we will
@@ -5647,7 +5676,7 @@
 
   // Set up our credit card form data.
   FormData credit_card_form;
-  CreateTestCreditCardFormData(&credit_card_form, true, false);
+  CreateTestCreditCardFormData(&credit_card_form, CreditCardFormOptions());
   FormsSeen(std::vector<FormData>(1, credit_card_form));
 
   // Edit the data, and submit.
diff --git a/components/autofill/core/browser/suggestion_selection.cc b/components/autofill/core/browser/suggestion_selection.cc
index 5d18a56..5311f20 100644
--- a/components/autofill/core/browser/suggestion_selection.cc
+++ b/components/autofill/core/browser/suggestion_selection.cc
@@ -60,6 +60,10 @@
 // indices clicked by our users. The suggestions will also refine as they type.
 constexpr size_t kMaxUniqueSuggestionsCount = 10;
 
+// This is the maximum number of suggestions that will be displayed when the
+// kAutofillPruneSuggestions flag is enabled.
+constexpr size_t kMaxPrunedUniqueSuggestionsCount = 3;
+
 std::vector<Suggestion> GetPrefixMatchedSuggestions(
     const AutofillType& type,
     const base::string16& field_contents_canon,
@@ -131,11 +135,18 @@
     std::vector<AutofillProfile*>* unique_matched_profiles) {
   std::vector<Suggestion> unique_suggestions;
 
-  // Limit number of unique profiles as having too many makes the browser hang
-  // due to drawing calculations (and is also not very useful for the user).
+  size_t max_num_suggestions =
+      base::FeatureList::IsEnabled(
+          autofill::features::kAutofillPruneSuggestions)
+          ? kMaxPrunedUniqueSuggestionsCount
+          : kMaxUniqueSuggestionsCount;
+
+  // Limit number of unique profiles as having too many makes the
+  // browser hang due to drawing calculations (and is also not
+  // very useful for the user).
   ServerFieldTypeSet types(field_types.begin(), field_types.end());
   for (size_t i = 0; i < matched_profiles.size() &&
-                     unique_suggestions.size() < kMaxUniqueSuggestionsCount;
+                     unique_suggestions.size() < max_num_suggestions;
        ++i) {
     bool include = true;
     AutofillProfile* profile_a = matched_profiles[i];
@@ -166,7 +177,6 @@
       unique_suggestions.push_back(suggestions[i]);
     }
   }
-
   return unique_suggestions;
 }
 
diff --git a/components/autofill/core/browser/suggestion_selection.h b/components/autofill/core/browser/suggestion_selection.h
index dd8bf52..319c38e 100644
--- a/components/autofill/core/browser/suggestion_selection.h
+++ b/components/autofill/core/browser/suggestion_selection.h
@@ -22,6 +22,7 @@
 
 extern const size_t kMaxSuggestedProfilesCount;
 extern const size_t kMaxUniqueSuggestionsCount;
+extern const size_t kMaxPrunedUniqueSuggestionsCount;
 
 // Matches based on prefix search, and limits number of profiles.
 // Returns the top matching suggestions based on prefix search, and adds the
diff --git a/components/autofill/core/browser/suggestion_selection_unittest.cc b/components/autofill/core/browser/suggestion_selection_unittest.cc
index 422afeb7..4d35f953 100644
--- a/components/autofill/core/browser/suggestion_selection_unittest.cc
+++ b/components/autofill/core/browser/suggestion_selection_unittest.cc
@@ -190,7 +190,6 @@
       /*enabled_features=*/{features::kAutofillProfileServerValidation,
                             features::kAutofillProfileClientValidation},
       /*disabled_features=*/{});
-
   const std::unique_ptr<AutofillProfile> profile_server_invalid =
       CreateProfileUniquePtr("Marion");
   const std::unique_ptr<AutofillProfile> profile_client_invalid =
@@ -314,6 +313,41 @@
   }
 }
 
+TEST_F(SuggestionSelectionTest, GetUniqueSuggestions_PruneSuggestions) {
+  base::test::ScopedFeatureList scoped_features;
+  scoped_features.InitAndEnableFeature(features::kAutofillPruneSuggestions);
+
+  // Test limit of suggestions when the feature is enabled.
+  std::vector<std::unique_ptr<AutofillProfile>> profiles_data;
+  for (size_t i = 0; i < kMaxPrunedUniqueSuggestionsCount + 1; i++) {
+    profiles_data.push_back(CreateProfileUniquePtr(
+        base::StringPrintf("Bob %zu", i).c_str(), "Doe"));
+  }
+
+  // Map all the pointers into an array that has the right type.
+  std::vector<AutofillProfile*> profiles_pointers;
+  std::transform(profiles_data.begin(), profiles_data.end(),
+                 std::back_inserter(profiles_pointers),
+                 [](const std::unique_ptr<AutofillProfile>& profile) {
+                   return profile.get();
+                 });
+
+  std::vector<AutofillProfile*> unique_matched_profiles;
+  auto unique_suggestions = GetUniqueSuggestions(
+      {NAME_LAST}, comparator_, app_locale_, profiles_pointers,
+      CreateSuggestions(profiles_pointers, NAME_FIRST),
+      &unique_matched_profiles);
+
+  ASSERT_EQ(kMaxPrunedUniqueSuggestionsCount, unique_suggestions.size());
+  ASSERT_EQ(kMaxPrunedUniqueSuggestionsCount, unique_matched_profiles.size());
+
+  // All profiles are different.
+  for (size_t i = 0; i < unique_suggestions.size(); i++) {
+    ASSERT_EQ(base::ASCIIToUTF16(base::StringPrintf("Bob %zu", i)),
+              unique_suggestions[i].value);
+  }
+}
+
 TEST_F(SuggestionSelectionTest, GetUniqueSuggestions_EmptyMatchingProfiles) {
   std::vector<AutofillProfile*> unique_matched_profiles;
   auto unique_suggestions = GetUniqueSuggestions(
diff --git a/components/autofill/core/common/autofill_features.cc b/components/autofill/core/common/autofill_features.cc
index d861b6d..665162d 100644
--- a/components/autofill/core/common/autofill_features.cc
+++ b/components/autofill/core/common/autofill_features.cc
@@ -105,6 +105,9 @@
 const base::Feature kAutofillManualFallbackPhaseTwo{
     "AutofillManualFallbackPhaseTwo", base::FEATURE_DISABLED_BY_DEFAULT};
 
+const base::Feature kAutofillPruneSuggestions{
+    "AutofillPruneSuggestions", base::FEATURE_DISABLED_BY_DEFAULT};
+
 const base::Feature kAutofillMetadataUploads{"AutofillMetadataUploads",
                                              base::FEATURE_DISABLED_BY_DEFAULT};
 
diff --git a/components/autofill/core/common/autofill_features.h b/components/autofill/core/common/autofill_features.h
index f8a1e66..c99f3c70 100644
--- a/components/autofill/core/common/autofill_features.h
+++ b/components/autofill/core/common/autofill_features.h
@@ -39,6 +39,7 @@
 extern const base::Feature kAutofillKeyboardAccessory;
 extern const base::Feature kAutofillManualFallback;
 extern const base::Feature kAutofillManualFallbackPhaseTwo;
+extern const base::Feature kAutofillPruneSuggestions;
 extern const base::Feature kAutofillMetadataUploads;
 extern const base::Feature kAutofillOffNoServerData;
 extern const base::Feature kAutofillOverrideWithRaterConsensus;
diff --git a/components/autofill/ios/browser/BUILD.gn b/components/autofill/ios/browser/BUILD.gn
index 58fe3dab..688e561 100644
--- a/components/autofill/ios/browser/BUILD.gn
+++ b/components/autofill/ios/browser/BUILD.gn
@@ -40,7 +40,8 @@
     "//components/prefs:prefs",
     "//components/prefs/ios",
     "//google_apis",
-    "//ios/web",
+    "//ios/web/common",
+    "//ios/web/public",
     "//services/network/public/cpp",
     "//ui/gfx/geometry",
   ]
diff --git a/components/autofill/ios/browser/DEPS b/components/autofill/ios/browser/DEPS
index c6de2be..cfaa9b0 100644
--- a/components/autofill/ios/browser/DEPS
+++ b/components/autofill/ios/browser/DEPS
@@ -1,4 +1,5 @@
 include_rules = [
+  "+ios/web/common",
   "+ios/web/public",
   "+services/network/public/cpp",
   "+third_party/ocmock",
diff --git a/components/autofill/ios/browser/autofill_driver_ios.mm b/components/autofill/ios/browser/autofill_driver_ios.mm
index 07d835f..686120ae 100644
--- a/components/autofill/ios/browser/autofill_driver_ios.mm
+++ b/components/autofill/ios/browser/autofill_driver_ios.mm
@@ -8,8 +8,8 @@
 #include "components/autofill/core/browser/form_structure.h"
 #include "components/autofill/ios/browser/autofill_driver_ios_bridge.h"
 #include "components/autofill/ios/browser/autofill_driver_ios_webframe.h"
+#import "ios/web/common/origin_util.h"
 #include "ios/web/public/browser_state.h"
-#import "ios/web/public/origin_util.h"
 #import "ios/web/public/web_state/web_frame_util.h"
 #import "ios/web/public/web_state/web_state.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
diff --git a/components/cronet/cronet_url_request_context.cc b/components/cronet/cronet_url_request_context.cc
index 899f12e..3212188d 100644
--- a/components/cronet/cronet_url_request_context.cc
+++ b/components/cronet/cronet_url_request_context.cc
@@ -393,7 +393,7 @@
           static_cast<uint16_t>(quic_hint->alternate_port));
       context_->http_server_properties()->SetQuicAlternativeService(
           quic_server, alternative_service, base::Time::Max(),
-          quic::QuicTransportVersionVector());
+          quic::ParsedQuicVersionVector());
     }
   }
 
diff --git a/components/cronet/ios/cronet_environment.mm b/components/cronet/ios/cronet_environment.mm
index 478b15b..72b7674 100644
--- a/components/cronet/ios/cronet_environment.mm
+++ b/components/cronet/ios/cronet_environment.mm
@@ -402,7 +402,7 @@
                                          quic_hint.port());
     main_context_->http_server_properties()->SetQuicAlternativeService(
         quic_hint_server, alternative_service, base::Time::Max(),
-        quic::QuicTransportVersionVector());
+        quic::ParsedQuicVersionVector());
   }
 
   main_context_->transport_security_state()
diff --git a/components/cronet/url_request_context_config.cc b/components/cronet/url_request_context_config.cc
index aebd97a..75df963 100644
--- a/components/cronet/url_request_context_config.cc
+++ b/components/cronet/url_request_context_config.cc
@@ -203,9 +203,9 @@
   return result;
 }
 
-quic::QuicTransportVersionVector ParseQuicVersions(
+quic::ParsedQuicVersionVector ParseQuicVersions(
     const std::string& quic_versions) {
-  quic::QuicTransportVersionVector supported_versions;
+  quic::ParsedQuicVersionVector supported_versions;
   quic::QuicTransportVersionVector all_supported_versions =
       quic::AllSupportedTransportVersions();
 
@@ -214,7 +214,8 @@
     auto it = all_supported_versions.begin();
     while (it != all_supported_versions.end()) {
       if (quic::QuicVersionToString(*it) == version) {
-        supported_versions.push_back(*it);
+        supported_versions.push_back(
+            quic::ParsedQuicVersion(quic::PROTOCOL_QUIC_CRYPTO, *it));
         // Remove the supported version to deduplicate versions extracted from
         // |quic_versions|.
         all_supported_versions.erase(it);
@@ -336,7 +337,7 @@
 
       std::string quic_version_string;
       if (quic_args->GetString(kQuicVersion, &quic_version_string)) {
-        quic::QuicTransportVersionVector supported_versions =
+        quic::ParsedQuicVersionVector supported_versions =
             ParseQuicVersions(quic_version_string);
         if (!supported_versions.empty())
           session_params->quic_supported_versions = supported_versions;
diff --git a/components/cronet/url_request_context_config_unittest.cc b/components/cronet/url_request_context_config_unittest.cc
index 2b094f7f..3143fcd 100644
--- a/components/cronet/url_request_context_config_unittest.cc
+++ b/components/cronet/url_request_context_config_unittest.cc
@@ -334,7 +334,9 @@
   const net::HttpNetworkSession::Params* params =
       context->GetNetworkSessionParams();
   EXPECT_EQ(params->quic_supported_versions.size(), 1u);
-  EXPECT_EQ(params->quic_supported_versions[0], quic::QUIC_VERSION_44);
+  EXPECT_EQ(params->quic_supported_versions[0],
+            quic::ParsedQuicVersion(quic::PROTOCOL_QUIC_CRYPTO,
+                                    quic::QUIC_VERSION_44));
 }
 
 TEST(URLRequestContextConfigTest, SetUnsupportedQuicVersion) {
@@ -385,7 +387,9 @@
   const net::HttpNetworkSession::Params* params =
       context->GetNetworkSessionParams();
   EXPECT_EQ(params->quic_supported_versions.size(), 1u);
-  EXPECT_EQ(params->quic_supported_versions[0], quic::QUIC_VERSION_43);
+  EXPECT_EQ(params->quic_supported_versions[0],
+            quic::ParsedQuicVersion(quic::PROTOCOL_QUIC_CRYPTO,
+                                    quic::QUIC_VERSION_43));
 }
 
 TEST(URLRequestContextConfigTest, SetQuicServerMigrationOptions) {
diff --git a/components/download/internal/common/BUILD.gn b/components/download/internal/common/BUILD.gn
index 2c3ee13..419ee87c 100644
--- a/components/download/internal/common/BUILD.gn
+++ b/components/download/internal/common/BUILD.gn
@@ -74,8 +74,10 @@
     "//components/leveldb_proto",
     "//mojo/public/c/system",
     "//net",
+    "//services/device/public/mojom:mojom",
     "//services/metrics/public/cpp:ukm_builders",
     "//services/network/public/cpp",
+    "//services/service_manager/public/cpp:cpp",
   ]
 
   if (is_android) {
diff --git a/components/download/internal/common/DEPS b/components/download/internal/common/DEPS
index 713aa40..015703b0 100644
--- a/components/download/internal/common/DEPS
+++ b/components/download/internal/common/DEPS
@@ -22,7 +22,9 @@
   "+net/http/http_util.h",
   "+net/traffic_annotation/network_traffic_annotation.h",
   "+net/url_request/url_request_context_getter.h",
+  "+services/device/public/mojom",
   "+services/metrics/public/cpp",
   "+services/network/public/cpp",
   "+services/network/public/mojom",
+  "+services/service_manager/public/cpp",
 ]
diff --git a/components/download/internal/common/download_item_impl.cc b/components/download/internal/common/download_item_impl.cc
index b1bc7b7d..09a3173f 100644
--- a/components/download/internal/common/download_item_impl.cc
+++ b/components/download/internal/common/download_item_impl.cc
@@ -421,7 +421,7 @@
       weak_ptr_factory_(this) {
   job_ = DownloadJobFactory::CreateJob(this, std::move(request_handle),
                                        DownloadCreateInfo(), true, nullptr,
-                                       nullptr);
+                                       nullptr, nullptr);
   delegate_->Attach();
   Init(true /* actively downloading */, TYPE_SAVE_PAGE_AS);
 }
@@ -1398,7 +1398,8 @@
   download_file_ = std::move(file);
   job_ = DownloadJobFactory::CreateJob(
       this, std::move(req_handle), new_create_info, false,
-      std::move(url_loader_factory_getter), url_request_context_getter);
+      std::move(url_loader_factory_getter), url_request_context_getter,
+      delegate_ ? delegate_->GetServiceManagerConnector() : nullptr);
   if (job_->IsParallelizable()) {
     RecordParallelizableDownloadCount(START_COUNT, IsParallelDownloadEnabled());
   }
diff --git a/components/download/internal/common/download_item_impl_delegate.cc b/components/download/internal/common/download_item_impl_delegate.cc
index cc3fb6af5d..f5dff20a 100644
--- a/components/download/internal/common/download_item_impl_delegate.cc
+++ b/components/download/internal/common/download_item_impl_delegate.cc
@@ -103,4 +103,9 @@
 
 void DownloadItemImplDelegate::ReportBytesWasted(DownloadItemImpl* download) {}
 
+service_manager::Connector*
+DownloadItemImplDelegate::GetServiceManagerConnector() {
+  return nullptr;
+}
+
 }  // namespace download
diff --git a/components/download/internal/common/download_job_factory.cc b/components/download/internal/common/download_job_factory.cc
index f3cea3ae..0c35188 100644
--- a/components/download/internal/common/download_job_factory.cc
+++ b/components/download/internal/common/download_job_factory.cc
@@ -98,7 +98,8 @@
     bool is_save_package_download,
     scoped_refptr<download::DownloadURLLoaderFactoryGetter>
         url_loader_factory_getter,
-    net::URLRequestContextGetter* url_request_context_getter) {
+    net::URLRequestContextGetter* url_request_context_getter,
+    service_manager::Connector* connector) {
   if (is_save_package_download) {
     return std::make_unique<SavePackageDownloadJob>(download_item,
                                                     std::move(req_handle));
@@ -109,7 +110,8 @@
   if (IsParallelDownloadEnabled() && is_parallelizable) {
     return std::make_unique<ParallelDownloadJob>(
         download_item, std::move(req_handle), create_info,
-        std::move(url_loader_factory_getter), url_request_context_getter);
+        std::move(url_loader_factory_getter), url_request_context_getter,
+        connector);
   }
 
   // An ordinary download job.
diff --git a/components/download/internal/common/download_worker.cc b/components/download/internal/common/download_worker.cc
index 05f8261..ad5bec8 100644
--- a/components/download/internal/common/download_worker.cc
+++ b/components/download/internal/common/download_worker.cc
@@ -16,6 +16,7 @@
 #include "net/url_request/url_request_context_getter.h"
 #include "services/network/public/cpp/features.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
+#include "services/service_manager/public/cpp/connector.h"
 
 namespace download {
 namespace {
@@ -55,10 +56,12 @@
         url_loader_factory_getter,
     const URLSecurityPolicy& url_security_policy,
     scoped_refptr<net::URLRequestContextGetter> url_request_context_getter,
+    std::unique_ptr<service_manager::Connector> connector,
     const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) {
   auto downloader = UrlDownloadHandlerFactory::Create(
       std::move(params), delegate, std::move(url_loader_factory_getter),
-      url_security_policy, std::move(url_request_context_getter), task_runner);
+      url_security_policy, std::move(url_request_context_getter),
+      std::move(connector), task_runner);
   task_runner->PostTask(
       FROM_HERE,
       base::BindOnce(&UrlDownloadHandler::Delegate::OnUrlDownloadHandlerCreated,
@@ -87,13 +90,15 @@
     std::unique_ptr<DownloadUrlParameters> params,
     scoped_refptr<download::DownloadURLLoaderFactoryGetter>
         url_loader_factory_getter,
-    scoped_refptr<net::URLRequestContextGetter> url_request_context_getter) {
+    scoped_refptr<net::URLRequestContextGetter> url_request_context_getter,
+    service_manager::Connector* connector) {
   GetIOTaskRunner()->PostTask(
       FROM_HERE, base::BindOnce(&CreateUrlDownloadHandler, std::move(params),
                                 weak_factory_.GetWeakPtr(),
                                 std::move(url_loader_factory_getter),
                                 base::BindRepeating(&IsURLSafe),
                                 std::move(url_request_context_getter),
+                                connector ? connector->Clone() : nullptr,
                                 base::ThreadTaskRunnerHandle::Get()));
 }
 
diff --git a/components/download/internal/common/download_worker.h b/components/download/internal/common/download_worker.h
index ec81471..6021c06 100644
--- a/components/download/internal/common/download_worker.h
+++ b/components/download/internal/common/download_worker.h
@@ -17,7 +17,11 @@
 
 namespace net {
 class URLRequestContextGetter;
-}
+}  // namespace net
+
+namespace service_manager {
+class Connector;
+}  // namespace service_manager
 
 namespace download {
 class DownloadURLLoaderFactoryGetter;
@@ -53,7 +57,8 @@
       std::unique_ptr<DownloadUrlParameters> params,
       scoped_refptr<download::DownloadURLLoaderFactoryGetter>
           url_loader_factory_getter,
-      scoped_refptr<net::URLRequestContextGetter> url_request_context_getter);
+      scoped_refptr<net::URLRequestContextGetter> url_request_context_getter,
+      service_manager::Connector* connector);
 
   // Download operations.
   void Pause();
diff --git a/components/download/internal/common/in_progress_download_manager.cc b/components/download/internal/common/in_progress_download_manager.cc
index 3298338e..0219413c 100644
--- a/components/download/internal/common/in_progress_download_manager.cc
+++ b/components/download/internal/common/in_progress_download_manager.cc
@@ -27,6 +27,7 @@
 #include "services/network/public/cpp/features.h"
 #include "services/network/public/cpp/resource_request.h"
 #include "services/network/public/cpp/resource_response.h"
+#include "services/service_manager/public/cpp/connector.h"
 
 #if defined(OS_ANDROID)
 #include "components/download/internal/common/android/download_collection_bridge.h"
@@ -86,13 +87,15 @@
     const GURL& site_url,
     const GURL& tab_url,
     const GURL& tab_referrer_url,
+    std::unique_ptr<service_manager::Connector> connector,
     const scoped_refptr<base::SingleThreadTaskRunner>& main_task_runner) {
   DCHECK(GetIOTaskRunner()->BelongsToCurrentThread());
   UrlDownloadHandler::UniqueUrlDownloadHandlerPtr downloader(
       ResourceDownloader::BeginDownload(
           download_manager, std::move(params), std::move(request),
           std::move(url_loader_factory_getter), url_security_policy, site_url,
-          tab_url, tab_referrer_url, is_new_download, false, main_task_runner)
+          tab_url, tab_referrer_url, is_new_download, false,
+          std::move(connector), main_task_runner)
           .release(),
       base::OnTaskRunnerDeleter(base::ThreadTaskRunnerHandle::Get()));
 
@@ -114,6 +117,7 @@
     network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints,
     scoped_refptr<DownloadURLLoaderFactoryGetter> url_loader_factory_getter,
     const URLSecurityPolicy& url_security_policy,
+    std::unique_ptr<service_manager::Connector> connector,
     const scoped_refptr<base::SingleThreadTaskRunner>& main_task_runner) {
   DCHECK(GetIOTaskRunner()->BelongsToCurrentThread());
   UrlDownloadHandler::UniqueUrlDownloadHandlerPtr downloader(
@@ -123,7 +127,7 @@
           std::move(url_chain), std::move(response), std::move(cert_status),
           std::move(url_loader_client_endpoints),
           std::move(url_loader_factory_getter), url_security_policy,
-          main_task_runner)
+          std::move(connector), main_task_runner)
           .release(),
       base::OnTaskRunnerDeleter(base::ThreadTaskRunnerHandle::Get()));
 
@@ -204,7 +208,6 @@
 
 bool InProgressDownloadManager::DownloadUrl(
     std::unique_ptr<DownloadUrlParameters> params) {
-  DCHECK(!delegate_);
   DCHECK(params->is_transient());
 
   if (!url_loader_factory_getter_)
@@ -248,13 +251,15 @@
     const GURL& tab_referrer_url) {
   std::unique_ptr<network::ResourceRequest> request =
       CreateResourceRequest(params.get());
+  auto connector = delegate_ ? delegate_->GetServiceConnector() : nullptr;
   GetIOTaskRunner()->PostTask(
       FROM_HERE,
       base::BindOnce(&BeginResourceDownload, std::move(params),
                      std::move(request), std::move(url_loader_factory_getter),
                      url_security_policy_, is_new_download,
                      weak_factory_.GetWeakPtr(), site_url, tab_url,
-                     tab_referrer_url, base::ThreadTaskRunnerHandle::Get()));
+                     tab_referrer_url, std::move(connector),
+                     base::ThreadTaskRunnerHandle::Get()));
 }
 
 void InProgressDownloadManager::InterceptDownloadFromNavigation(
@@ -269,16 +274,17 @@
     net::CertStatus cert_status,
     network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints,
     scoped_refptr<DownloadURLLoaderFactoryGetter> url_loader_factory_getter) {
+  auto connector = delegate_ ? delegate_->GetServiceConnector() : nullptr;
   GetIOTaskRunner()->PostTask(
       FROM_HERE,
-      base::BindOnce(&CreateDownloadHandlerForNavigation,
-                     weak_factory_.GetWeakPtr(), std::move(resource_request),
-                     render_process_id, render_frame_id, site_url, tab_url,
-                     tab_referrer_url, std::move(url_chain),
-                     std::move(response), std::move(cert_status),
-                     std::move(url_loader_client_endpoints),
-                     std::move(url_loader_factory_getter), url_security_policy_,
-                     base::ThreadTaskRunnerHandle::Get()));
+      base::BindOnce(
+          &CreateDownloadHandlerForNavigation, weak_factory_.GetWeakPtr(),
+          std::move(resource_request), render_process_id, render_frame_id,
+          site_url, tab_url, tab_referrer_url, std::move(url_chain),
+          std::move(response), std::move(cert_status),
+          std::move(url_loader_client_endpoints),
+          std::move(url_loader_factory_getter), url_security_policy_,
+          std::move(connector), base::ThreadTaskRunnerHandle::Get()));
 }
 
 void InProgressDownloadManager::Initialize(
diff --git a/components/download/internal/common/parallel_download_job.cc b/components/download/internal/common/parallel_download_job.cc
index 376700af3..1ac7dbbb 100644
--- a/components/download/internal/common/parallel_download_job.cc
+++ b/components/download/internal/common/parallel_download_job.cc
@@ -27,7 +27,8 @@
     const DownloadCreateInfo& create_info,
     scoped_refptr<download::DownloadURLLoaderFactoryGetter>
         url_loader_factory_getter,
-    net::URLRequestContextGetter* url_request_context_getter)
+    net::URLRequestContextGetter* url_request_context_getter,
+    service_manager::Connector* connector)
     : DownloadJobImpl(download_item, std::move(request_handle), true),
       initial_request_offset_(create_info.offset),
       initial_received_slices_(download_item->GetReceivedSlices()),
@@ -35,7 +36,8 @@
       requests_sent_(false),
       is_canceled_(false),
       url_loader_factory_getter_(std::move(url_loader_factory_getter)),
-      url_request_context_getter_(url_request_context_getter) {}
+      url_request_context_getter_(url_request_context_getter),
+      connector_(connector) {}
 
 ParallelDownloadJob::~ParallelDownloadJob() = default;
 
@@ -298,7 +300,7 @@
 
   // Send the request.
   worker->SendRequest(std::move(download_params), url_loader_factory_getter_,
-                      url_request_context_getter_);
+                      url_request_context_getter_, connector_);
   DCHECK(workers_.find(offset) == workers_.end());
   workers_[offset] = std::move(worker);
 }
diff --git a/components/download/internal/common/parallel_download_job.h b/components/download/internal/common/parallel_download_job.h
index 1c79129..71c45c86 100644
--- a/components/download/internal/common/parallel_download_job.h
+++ b/components/download/internal/common/parallel_download_job.h
@@ -19,7 +19,11 @@
 
 namespace net {
 class URLRequestContextGetter;
-}
+}  // namespace net
+
+namespace service_manager {
+class Connector;
+}  // namespace service_manager
 
 namespace download {
 
@@ -38,7 +42,8 @@
       const DownloadCreateInfo& create_info,
       scoped_refptr<download::DownloadURLLoaderFactoryGetter>
           url_loader_factory_getter,
-      net::URLRequestContextGetter* url_request_context_getter);
+      net::URLRequestContextGetter* url_request_context_getter,
+      service_manager::Connector* connector);
   ~ParallelDownloadJob() override;
 
   // DownloadJobImpl implementation.
@@ -122,6 +127,9 @@
   // is disabled.
   scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_;
 
+  // Connector used for establishing the connection to the ServiceManager.
+  service_manager::Connector* connector_;
+
   DISALLOW_COPY_AND_ASSIGN(ParallelDownloadJob);
 };
 
diff --git a/components/download/internal/common/parallel_download_job_unittest.cc b/components/download/internal/common/parallel_download_job_unittest.cc
index 7e66b75..d227cf42 100644
--- a/components/download/internal/common/parallel_download_job_unittest.cc
+++ b/components/download/internal/common/parallel_download_job_unittest.cc
@@ -69,6 +69,7 @@
                             std::move(request_handle),
                             create_info,
                             nullptr,
+                            nullptr,
                             nullptr),
         request_count_(request_count),
         min_slice_size_(min_slice_size),
diff --git a/components/download/internal/common/resource_downloader.cc b/components/download/internal/common/resource_downloader.cc
index b5b86b0..9d8d4fd 100644
--- a/components/download/internal/common/resource_downloader.cc
+++ b/components/download/internal/common/resource_downloader.cc
@@ -10,7 +10,10 @@
 #include "components/download/public/common/download_url_loader_factory_getter.h"
 #include "components/download/public/common/stream_handle_input_stream.h"
 #include "components/download/public/common/url_download_request_handle.h"
+#include "services/device/public/mojom/constants.mojom.h"
+#include "services/device/public/mojom/wake_lock_provider.mojom.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
+#include "services/service_manager/public/cpp/connector.h"
 
 namespace network {
 struct ResourceResponseHead;
@@ -67,12 +70,14 @@
     const GURL& tab_referrer_url,
     bool is_new_download,
     bool is_parallel_request,
+    std::unique_ptr<service_manager::Connector> connector,
     const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) {
   auto downloader = std::make_unique<ResourceDownloader>(
       delegate, std::move(request), params->render_process_host_id(),
       params->render_frame_host_routing_id(), site_url, tab_url,
       tab_referrer_url, is_new_download, task_runner,
-      std::move(url_loader_factory_getter), url_security_policy);
+      std::move(url_loader_factory_getter), url_security_policy,
+      std::move(connector));
 
   downloader->Start(std::move(params), is_parallel_request);
   return downloader;
@@ -95,11 +100,13 @@
     scoped_refptr<download::DownloadURLLoaderFactoryGetter>
         url_loader_factory_getter,
     const URLSecurityPolicy& url_security_policy,
+    std::unique_ptr<service_manager::Connector> connector,
     const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) {
   auto downloader = std::make_unique<ResourceDownloader>(
       delegate, std::move(resource_request), render_process_id, render_frame_id,
       site_url, tab_url, tab_referrer_url, true, task_runner,
-      std::move(url_loader_factory_getter), url_security_policy);
+      std::move(url_loader_factory_getter), url_security_policy,
+      std::move(connector));
   downloader->InterceptResponse(std::move(response), std::move(url_chain),
                                 cert_status,
                                 std::move(url_loader_client_endpoints));
@@ -118,7 +125,8 @@
     const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
     scoped_refptr<download::DownloadURLLoaderFactoryGetter>
         url_loader_factory_getter,
-    const URLSecurityPolicy& url_security_policy)
+    const URLSecurityPolicy& url_security_policy,
+    std::unique_ptr<service_manager::Connector> connector)
     : delegate_(delegate),
       resource_request_(std::move(resource_request)),
       is_new_download_(is_new_download),
@@ -130,7 +138,9 @@
       delegate_task_runner_(task_runner),
       url_loader_factory_getter_(std::move(url_loader_factory_getter)),
       url_security_policy_(url_security_policy),
-      weak_ptr_factory_(this) {}
+      weak_ptr_factory_(this) {
+  RequestWakeLock(connector.get());
+}
 
 ResourceDownloader::~ResourceDownloader() = default;
 
@@ -254,10 +264,27 @@
 }
 
 void ResourceDownloader::Destroy() {
+  if (wake_lock_)
+    wake_lock_->CancelWakeLock();
   delegate_task_runner_->PostTask(
       FROM_HERE,
       base::BindOnce(&UrlDownloadHandler::Delegate::OnUrlDownloadStopped,
                      delegate_, this));
 }
 
+void ResourceDownloader::RequestWakeLock(
+    service_manager::Connector* connector) {
+  if (!connector)
+    return;
+  device::mojom::WakeLockProviderPtr wake_lock_provider;
+  connector->BindInterface(device::mojom::kServiceName,
+                           mojo::MakeRequest(&wake_lock_provider));
+  wake_lock_provider->GetWakeLockWithoutContext(
+      device::mojom::WakeLockType::kPreventAppSuspension,
+      device::mojom::WakeLockReason::kOther, "Download in progress",
+      mojo::MakeRequest(&wake_lock_));
+
+  wake_lock_->RequestWakeLock();
+}
+
 }  // namespace download
diff --git a/components/download/internal/common/resource_downloader.h b/components/download/internal/common/resource_downloader.h
index 63664cf..b2f8ec7 100644
--- a/components/download/internal/common/resource_downloader.h
+++ b/components/download/internal/common/resource_downloader.h
@@ -12,9 +12,14 @@
 #include "components/download/public/common/url_download_handler.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "net/cert/cert_status_flags.h"
+#include "services/device/public/mojom/wake_lock.mojom.h"
 #include "services/network/public/cpp/resource_request.h"
 #include "services/network/public/mojom/url_loader.mojom.h"
 
+namespace service_manager {
+class Connector;
+}  // namespace service_manager
+
 namespace download {
 class DownloadURLLoaderFactoryGetter;
 
@@ -36,6 +41,7 @@
       const GURL& tab_referrer_url,
       bool is_new_download,
       bool is_parallel_request,
+      std::unique_ptr<service_manager::Connector> connector,
       const scoped_refptr<base::SingleThreadTaskRunner>& task_runner);
 
   // Create a ResourceDownloader from a navigation that turns to be a download.
@@ -56,6 +62,7 @@
       scoped_refptr<download::DownloadURLLoaderFactoryGetter>
           url_loader_factory_getter,
       const URLSecurityPolicy& url_security_policy,
+      std::unique_ptr<service_manager::Connector> connector,
       const scoped_refptr<base::SingleThreadTaskRunner>& task_runner);
 
   ResourceDownloader(
@@ -70,7 +77,8 @@
       const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
       scoped_refptr<download::DownloadURLLoaderFactoryGetter>
           url_loader_factory_getter,
-      const URLSecurityPolicy& url_security_policy);
+      const URLSecurityPolicy& url_security_policy,
+      std::unique_ptr<service_manager::Connector> connector);
   ~ResourceDownloader() override;
 
   // download::DownloadResponseHandler::Delegate
@@ -101,6 +109,9 @@
   // Ask the |delegate_| to destroy this object.
   void Destroy();
 
+  // Requests the wake lock using |connector|.
+  void RequestWakeLock(service_manager::Connector* connector);
+
   base::WeakPtr<download::UrlDownloadHandler::Delegate> delegate_;
 
   // The ResourceRequest for this object.
@@ -154,6 +165,11 @@
   // Used to check if the URL is safe to request.
   URLSecurityPolicy url_security_policy_;
 
+  // Used to keep the system from sleeping while a download is ongoing. If the
+  // system enters power saving mode while a download is alive, it can cause
+  // download to be interrupted.
+  device::mojom::WakeLockPtr wake_lock_;
+
   base::WeakPtrFactory<ResourceDownloader> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(ResourceDownloader);
diff --git a/components/download/internal/common/url_download_handler_factory.cc b/components/download/internal/common/url_download_handler_factory.cc
index b88c1ff..c295bc9 100644
--- a/components/download/internal/common/url_download_handler_factory.cc
+++ b/components/download/internal/common/url_download_handler_factory.cc
@@ -12,6 +12,7 @@
 #include "components/download/public/common/download_utils.h"
 #include "net/url_request/url_request_context_getter.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
+#include "services/service_manager/public/cpp/connector.h"
 
 namespace download {
 
@@ -31,6 +32,7 @@
           url_loader_factory_getter,
       const URLSecurityPolicy& url_security_policy,
       scoped_refptr<net::URLRequestContextGetter> url_request_context_getter,
+      std::unique_ptr<service_manager::Connector> connector,
       const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) override {
     std::unique_ptr<network::ResourceRequest> request =
         CreateResourceRequest(params.get());
@@ -38,7 +40,7 @@
         download::ResourceDownloader::BeginDownload(
             delegate, std::move(params), std::move(request),
             std::move(url_loader_factory_getter), url_security_policy, GURL(),
-            GURL(), GURL(), true, true, task_runner)
+            GURL(), GURL(), true, true, std::move(connector), task_runner)
             .release(),
         base::OnTaskRunnerDeleter(base::ThreadTaskRunnerHandle::Get()));
   }
@@ -66,6 +68,7 @@
         url_loader_factory_getter,
     const URLSecurityPolicy& url_security_policy,
     scoped_refptr<net::URLRequestContextGetter> url_request_context_getter,
+    std::unique_ptr<service_manager::Connector> connector,
     const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) {
   base::AutoLock auto_lock(GetURLDownloadHandlerFactoryLock());
   if (!g_url_download_handler_factory)
@@ -73,7 +76,7 @@
   return g_url_download_handler_factory->CreateUrlDownloadHandler(
       std::move(params), delegate, std::move(url_loader_factory_getter),
       std::move(url_security_policy), std::move(url_request_context_getter),
-      task_runner);
+      std::move(connector), task_runner);
 }
 
 // static
diff --git a/components/download/public/common/download_item_impl_delegate.h b/components/download/public/common/download_item_impl_delegate.h
index a6eb5429..e67be44 100644
--- a/components/download/public/common/download_item_impl_delegate.h
+++ b/components/download/public/common/download_item_impl_delegate.h
@@ -15,6 +15,10 @@
 #include "components/download/public/common/download_item.h"
 #include "components/download/public/common/download_url_parameters.h"
 
+namespace service_manager {
+class Connector;
+}  // namespace service_manager
+
 namespace download {
 struct DownloadEntry;
 class DownloadItemImpl;
@@ -113,6 +117,9 @@
   // Report extra bytes wasted during resumption.
   virtual void ReportBytesWasted(DownloadItemImpl* download);
 
+  // Gets the ServiceManager connector that can be used on UI thread.
+  virtual service_manager::Connector* GetServiceManagerConnector();
+
  private:
   // For "Outlives attached DownloadItemImpl" invariant assertion.
   int count_;
diff --git a/components/download/public/common/download_job_factory.h b/components/download/public/common/download_job_factory.h
index cd44f441..d6660c107 100644
--- a/components/download/public/common/download_job_factory.h
+++ b/components/download/public/common/download_job_factory.h
@@ -13,7 +13,11 @@
 
 namespace net {
 class URLRequestContextGetter;
-}
+}  // namespace net
+
+namespace service_manager {
+class Connector;
+}  // namespace service_manager
 
 namespace download {
 
@@ -32,7 +36,8 @@
       bool is_save_package_download,
       scoped_refptr<download::DownloadURLLoaderFactoryGetter>
           url_loader_factory_getter,
-      net::URLRequestContextGetter* url_request_context_getter);
+      net::URLRequestContextGetter* url_request_context_getter,
+      service_manager::Connector* connector);
 
  private:
   DISALLOW_COPY_AND_ASSIGN(DownloadJobFactory);
diff --git a/components/download/public/common/in_progress_download_manager.h b/components/download/public/common/in_progress_download_manager.h
index cebda480..feb59cd 100644
--- a/components/download/public/common/in_progress_download_manager.h
+++ b/components/download/public/common/in_progress_download_manager.h
@@ -24,11 +24,15 @@
 
 namespace net {
 class URLRequestContextGetter;
-}
+}  // namespace net
 
 namespace network {
 struct ResourceResponse;
-}
+}  // namespace network
+
+namespace service_manager {
+class Connector;
+}  // namespace service_manager
 
 namespace download {
 
@@ -77,6 +81,9 @@
     // TODO(qinmin): remove this once network service is fully enabled.
     virtual net::URLRequestContextGetter* GetURLRequestContextGetter(
         const DownloadCreateInfo& download_create_info);
+
+    virtual std::unique_ptr<service_manager::Connector>
+    GetServiceConnector() = 0;
   };
 
   using IsOriginSecureCallback = base::RepeatingCallback<bool(const GURL&)>;
diff --git a/components/download/public/common/url_download_handler_factory.h b/components/download/public/common/url_download_handler_factory.h
index bbe7195..8b30691e 100644
--- a/components/download/public/common/url_download_handler_factory.h
+++ b/components/download/public/common/url_download_handler_factory.h
@@ -11,7 +11,11 @@
 
 namespace net {
 class URLRequestContextGetter;
-}
+}  // namespace net
+
+namespace service_manager {
+class Connector;
+}  // namespace service_manager
 
 namespace download {
 class DownloadURLLoaderFactoryGetter;
@@ -35,6 +39,7 @@
           url_loader_factory_getter,
       const URLSecurityPolicy& url_security_policy,
       scoped_refptr<net::URLRequestContextGetter> url_request_context_getter,
+      std::unique_ptr<service_manager::Connector> connector,
       const scoped_refptr<base::SingleThreadTaskRunner>& task_runner);
 
   virtual ~UrlDownloadHandlerFactory();
@@ -52,6 +57,7 @@
           url_loader_factory_getter,
       const URLSecurityPolicy& url_security_policy,
       scoped_refptr<net::URLRequestContextGetter> url_request_context_getter,
+      std::unique_ptr<service_manager::Connector> connector,
       const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) = 0;
 };
 
diff --git a/components/feed/core/feed_content_database.cc b/components/feed/core/feed_content_database.cc
index fc0a630126..9d9c279 100644
--- a/components/feed/core/feed_content_database.cc
+++ b/components/feed/core/feed_content_database.cc
@@ -243,18 +243,20 @@
     ContentLoadCallback callback,
     bool success,
     std::unique_ptr<std::vector<ContentStorageProto>> content) {
-  std::vector<KeyAndData> results;
-  for (const auto& proto : *content) {
-    DCHECK(proto.has_key());
-    DCHECK(proto.has_content_data());
-
-    results.emplace_back(proto.key(), proto.content_data());
-  }
-
   base::TimeDelta load_time = base::TimeTicks::Now() - start_time;
   UMA_HISTOGRAM_TIMES("ContentSuggestions.Feed.ContentStorage.LoadTime",
                       load_time);
 
+  std::vector<KeyAndData> results;
+  if (success) {
+    for (const auto& proto : *content) {
+      DCHECK(proto.has_key());
+      DCHECK(proto.has_content_data());
+
+      results.emplace_back(proto.key(), proto.content_data());
+    }
+  }
+
   std::move(callback).Run(success, std::move(results));
 }
 
diff --git a/components/grpc_support/test/get_stream_engine.cc b/components/grpc_support/test/get_stream_engine.cc
index d5e2a55..2647abe 100644
--- a/components/grpc_support/test/get_stream_engine.cc
+++ b/components/grpc_support/test/get_stream_engine.cc
@@ -60,7 +60,7 @@
           "https", net::QuicSimpleTestServer::GetHost(), 443);
       server_properties_->SetQuicAlternativeService(
           quic_hint_server, alternative_service, base::Time::Max(),
-          quic::QuicTransportVersionVector());
+          quic::ParsedQuicVersionVector());
 
       request_context_->set_cert_verifier(mock_cert_verifier_.get());
       request_context_->set_host_resolver(host_resolver_.get());
diff --git a/components/network_session_configurator/browser/network_session_configurator.cc b/components/network_session_configurator/browser/network_session_configurator.cc
index 3b00fa2f..287bf91 100644
--- a/components/network_session_configurator/browser/network_session_configurator.cc
+++ b/components/network_session_configurator/browser/network_session_configurator.cc
@@ -429,7 +429,7 @@
   return 0;
 }
 
-quic::QuicTransportVersionVector GetQuicVersions(
+quic::ParsedQuicVersionVector GetQuicVersions(
     const VariationParameters& quic_trial_params) {
   return network_session_configurator::ParseQuicVersions(
       GetVariationParam(quic_trial_params, "quic_version"));
@@ -564,7 +564,7 @@
 
   params->quic_user_agent_id = quic_user_agent_id;
 
-  quic::QuicTransportVersionVector supported_versions =
+  quic::ParsedQuicVersionVector supported_versions =
       GetQuicVersions(quic_trial_params);
   if (!supported_versions.empty())
     params->quic_supported_versions = supported_versions;
@@ -574,9 +574,9 @@
 
 namespace network_session_configurator {
 
-quic::QuicTransportVersionVector ParseQuicVersions(
+quic::ParsedQuicVersionVector ParseQuicVersions(
     const std::string& quic_versions) {
-  quic::QuicTransportVersionVector supported_versions;
+  quic::ParsedQuicVersionVector supported_versions;
   quic::QuicTransportVersionVector all_supported_versions =
       quic::AllSupportedTransportVersions();
 
@@ -585,7 +585,8 @@
     auto it = all_supported_versions.begin();
     while (it != all_supported_versions.end()) {
       if (quic::QuicVersionToString(*it) == version) {
-        supported_versions.push_back(*it);
+        supported_versions.push_back(
+            quic::ParsedQuicVersion(quic::PROTOCOL_QUIC_CRYPTO, *it));
         // Remove the supported version to deduplicate versions extracted from
         // |quic_versions|.
         all_supported_versions.erase(it);
@@ -642,7 +643,7 @@
     }
 
     if (command_line.HasSwitch(switches::kQuicVersion)) {
-      quic::QuicTransportVersionVector supported_versions =
+      quic::ParsedQuicVersionVector supported_versions =
           network_session_configurator::ParseQuicVersions(
               command_line.GetSwitchValueASCII(switches::kQuicVersion));
       if (!supported_versions.empty())
diff --git a/components/network_session_configurator/browser/network_session_configurator.h b/components/network_session_configurator/browser/network_session_configurator.h
index f2b082d..ae50003c 100644
--- a/components/network_session_configurator/browser/network_session_configurator.h
+++ b/components/network_session_configurator/browser/network_session_configurator.h
@@ -20,7 +20,7 @@
 // trials and command line.
 
 // Parse serialized QUIC versions string.
-quic::QuicTransportVersionVector ParseQuicVersions(
+quic::ParsedQuicVersionVector ParseQuicVersions(
     const std::string& quic_versions);
 
 // Configure |params| based on field trials and command line,
diff --git a/components/network_session_configurator/browser/network_session_configurator_unittest.cc b/components/network_session_configurator/browser/network_session_configurator_unittest.cc
index 002628a..fae07a36 100644
--- a/components/network_session_configurator/browser/network_session_configurator_unittest.cc
+++ b/components/network_session_configurator/browser/network_session_configurator_unittest.cc
@@ -492,8 +492,8 @@
 
   ParseFieldTrials();
 
-  quic::QuicTransportVersionVector supported_versions;
-  supported_versions.push_back(quic::AllSupportedTransportVersions().back());
+  quic::ParsedQuicVersionVector supported_versions;
+  supported_versions.push_back(quic::AllSupportedVersions().back());
   EXPECT_EQ(supported_versions, params_.quic_supported_versions);
 }
 
@@ -511,9 +511,9 @@
 
   ParseFieldTrials();
 
-  quic::QuicTransportVersionVector supported_versions;
-  supported_versions.push_back(quic::AllSupportedTransportVersions().front());
-  supported_versions.push_back(quic::AllSupportedTransportVersions().back());
+  quic::ParsedQuicVersionVector supported_versions;
+  supported_versions.push_back(quic::AllSupportedVersions().front());
+  supported_versions.push_back(quic::AllSupportedVersions().back());
   EXPECT_EQ(supported_versions, params_.quic_supported_versions);
 }
 
@@ -530,8 +530,8 @@
 
   ParseFieldTrials();
 
-  quic::QuicTransportVersionVector supported_versions;
-  supported_versions.push_back(quic::AllSupportedTransportVersions().front());
+  quic::ParsedQuicVersionVector supported_versions;
+  supported_versions.push_back(quic::AllSupportedVersions().front());
   EXPECT_EQ(supported_versions, params_.quic_supported_versions);
 }
 
@@ -670,7 +670,7 @@
                                    quic::QuicVersionToString(version));
     ParseCommandLineAndFieldTrials(command_line);
     ASSERT_EQ(1u, params_.quic_supported_versions.size());
-    EXPECT_EQ(version, params_.quic_supported_versions[0]);
+    EXPECT_EQ(version, params_.quic_supported_versions[0].transport_version);
   }
 }
 
diff --git a/components/previews/content/previews_user_data.h b/components/previews/content/previews_user_data.h
index 8b43022..252232fd 100644
--- a/components/previews/content/previews_user_data.h
+++ b/components/previews/content/previews_user_data.h
@@ -126,7 +126,8 @@
     offline_preview_used_ = offline_preview_used;
   }
 
-  // The PreviewsState that was allowed for the navigation.
+  // The PreviewsState that was allowed for the navigation. This should be used
+  // for metrics only.
   content::PreviewsState allowed_previews_state() const {
     return allowed_previews_state_;
   }
diff --git a/components/safe_browsing/DEPS b/components/safe_browsing/DEPS
index d1948fa..53d7021 100644
--- a/components/safe_browsing/DEPS
+++ b/components/safe_browsing/DEPS
@@ -14,7 +14,7 @@
   "+net/log",
   "+net/traffic_annotation",
   "+net/url_request",
-  "+services/network/public/cpp",
+  "+services/network/public",
   "+services/service_manager/public",
   "+testing/gtest",
   "+third_party/protobuf",
diff --git a/components/safe_browsing/browser/BUILD.gn b/components/safe_browsing/browser/BUILD.gn
index 7d3a7b2..2fcd8c8 100644
--- a/components/safe_browsing/browser/BUILD.gn
+++ b/components/safe_browsing/browser/BUILD.gn
@@ -13,8 +13,6 @@
     "browser_url_loader_throttle.h",
     "mojo_safe_browsing_impl.cc",
     "mojo_safe_browsing_impl.h",
-    "safe_browsing_network_context.cc",
-    "safe_browsing_network_context.h",
     "safe_browsing_url_checker_impl.cc",
     "safe_browsing_url_checker_impl.h",
     "safe_browsing_url_request_context_getter.cc",
@@ -33,6 +31,7 @@
     "//components/safe_browsing:csd_proto",
     "//components/safe_browsing:features",
     "//components/safe_browsing:safe_browsing",
+    "//components/safe_browsing/browser:network_context",
     "//components/safe_browsing/browser:referrer_chain_provider",
     "//components/safe_browsing/common:common",
     "//components/safe_browsing/db:database_manager",
@@ -44,6 +43,19 @@
   ]
 }
 
+source_set("network_context") {
+  sources = [
+    "safe_browsing_network_context.cc",
+    "safe_browsing_network_context.h",
+  ]
+
+  deps = [
+    "//components/safe_browsing/common:common",
+    "//content/public/browser:browser",
+    "//net:extras",
+  ]
+}
+
 source_set("referrer_chain_provider") {
   sources = [
     "referrer_chain_provider.h",
diff --git a/components/safe_browsing/web_ui/BUILD.gn b/components/safe_browsing/web_ui/BUILD.gn
index 610ea4e..3221fc3 100644
--- a/components/safe_browsing/web_ui/BUILD.gn
+++ b/components/safe_browsing/web_ui/BUILD.gn
@@ -18,6 +18,7 @@
     "//components/resources:components_scaled_resources_grit",
     "//components/safe_browsing:csd_proto",
     "//components/safe_browsing:features",
+    "//components/safe_browsing/browser:network_context",
     "//components/safe_browsing/browser:referrer_chain_provider",
     "//components/safe_browsing/common:safe_browsing_prefs",
     "//components/safe_browsing/db:v4_local_database_manager",
diff --git a/components/safe_browsing/web_ui/resources/safe_browsing.html b/components/safe_browsing/web_ui/resources/safe_browsing.html
index cf480e6..023d459 100644
--- a/components/safe_browsing/web_ui/resources/safe_browsing.html
+++ b/components/safe_browsing/web_ui/resources/safe_browsing.html
@@ -38,6 +38,10 @@
           <div class="content">
             <p id="preferences-list"></p>
           </div>
+          <h2>Safe Browsing Cookie</h2>
+          <div class="content">
+            <p id="cookie-panel"></p>
+          </div>
         </tabpanel>
         <tabpanel>
           <h2>Database Manager</h2>
diff --git a/components/safe_browsing/web_ui/resources/safe_browsing.js b/components/safe_browsing/web_ui/resources/safe_browsing.js
index b9ce3266..17b86902 100644
--- a/components/safe_browsing/web_ui/resources/safe_browsing.js
+++ b/components/safe_browsing/web_ui/resources/safe_browsing.js
@@ -16,6 +16,7 @@
     cr.sendWithPromise('getExperiments', [])
         .then((experiments) => addExperiments(experiments));
     cr.sendWithPromise('getPrefs', []).then((prefs) => addPrefs(prefs));
+    cr.sendWithPromise('getCookie', []).then((cookie) => addCookie(cookie));
     cr.sendWithPromise('getSavedPasswords', []).then((passwords) =>
         addSavedPasswords(passwords));
     cr.sendWithPromise('getDatabaseManagerInfo', []).then(
@@ -126,6 +127,12 @@
     $('preferences-list').innerHTML = preferencesListFormatted;
   }
 
+  function addCookie(result) {
+    var cookieFormatted = '<b>Value:</b> ' + result[0] + '\n' +
+        '<b>Created:</b> ' + (new Date(result[1])).toLocaleString();
+    $('cookie-panel').innerHTML = cookieFormatted;
+  }
+
   function addSavedPasswords(result) {
     var resLength = result.length;
     var savedPasswordFormatted = "";
diff --git a/components/safe_browsing/web_ui/safe_browsing_ui.cc b/components/safe_browsing/web_ui/safe_browsing_ui.cc
index 7ae1808..378b89d 100644
--- a/components/safe_browsing/web_ui/safe_browsing_ui.cc
+++ b/components/safe_browsing/web_ui/safe_browsing_ui.cc
@@ -202,6 +202,30 @@
   }
 }
 
+network::mojom::CookieManager* WebUIInfoSingleton::GetCookieManager() {
+  if (!cookie_manager_ptr_)
+    InitializeCookieManager();
+
+  return cookie_manager_ptr_.get();
+}
+
+void WebUIInfoSingleton::InitializeCookieManager() {
+  DCHECK(network_context_);
+
+  // Reset |cookie_manager_ptr_|, and only re-initialize it if we have a
+  // listening SafeBrowsingUIHandler.
+  cookie_manager_ptr_ = nullptr;
+
+  if (HasListener()) {
+    network_context_->GetNetworkContext()->GetCookieManager(
+        mojo::MakeRequest(&cookie_manager_ptr_));
+
+    // base::Unretained is safe because |this| owns |cookie_manager_ptr_|.
+    cookie_manager_ptr_.set_connection_error_handler(base::BindOnce(
+        &WebUIInfoSingleton::InitializeCookieManager, base::Unretained(this)));
+  }
+}
+
 namespace {
 #if SAFE_BROWSING_DB_LOCAL
 
@@ -1027,8 +1051,7 @@
 SafeBrowsingUI::~SafeBrowsingUI() {}
 
 SafeBrowsingUIHandler::SafeBrowsingUIHandler(content::BrowserContext* context)
-    : browser_context_(context) {
-}
+    : browser_context_(context) {}
 
 SafeBrowsingUIHandler::~SafeBrowsingUIHandler() {
   WebUIInfoSingleton::GetInstance()->UnregisterWebUIInstance(this);
@@ -1064,6 +1087,35 @@
                                 user_prefs::UserPrefs::Get(browser_context_)));
 }
 
+void SafeBrowsingUIHandler::GetCookie(const base::ListValue* args) {
+  std::string callback_id;
+  args->GetString(0, &callback_id);
+
+  WebUIInfoSingleton::GetInstance()->GetCookieManager()->GetAllCookies(
+      base::BindOnce(&SafeBrowsingUIHandler::OnGetCookie,
+                     weak_factory_.GetWeakPtr(), std::move(callback_id)));
+}
+
+void SafeBrowsingUIHandler::OnGetCookie(
+    const std::string& callback_id,
+    const std::vector<net::CanonicalCookie>& cookies) {
+  DCHECK_GE(1u, cookies.size());
+
+  std::string cookie = "No cookie";
+  double time = 0.0;
+  if (!cookies.empty()) {
+    cookie = cookies[0].Value();
+    time = cookies[0].CreationDate().ToJsTime();
+  }
+
+  base::Value response(base::Value::Type::LIST);
+  response.GetList().push_back(base::Value(cookie));
+  response.GetList().push_back(base::Value(time));
+
+  AllowJavascript();
+  ResolveJavascriptCallback(base::Value(callback_id), std::move(response));
+}
+
 void SafeBrowsingUIHandler::GetSavedPasswords(const base::ListValue* args) {
   password_manager::HashPasswordManager hash_manager(
       user_prefs::UserPrefs::Get(browser_context_));
@@ -1340,6 +1392,9 @@
       "getPrefs", base::BindRepeating(&SafeBrowsingUIHandler::GetPrefs,
                                       base::Unretained(this)));
   web_ui()->RegisterMessageCallback(
+      "getCookie", base::BindRepeating(&SafeBrowsingUIHandler::GetCookie,
+                                       base::Unretained(this)));
+  web_ui()->RegisterMessageCallback(
       "getSavedPasswords",
       base::BindRepeating(&SafeBrowsingUIHandler::GetSavedPasswords,
                           base::Unretained(this)));
diff --git a/components/safe_browsing/web_ui/safe_browsing_ui.h b/components/safe_browsing/web_ui/safe_browsing_ui.h
index f803d72..95379fd8 100644
--- a/components/safe_browsing/web_ui/safe_browsing_ui.h
+++ b/components/safe_browsing/web_ui/safe_browsing_ui.h
@@ -5,13 +5,17 @@
 #ifndef COMPONENTS_SAFE_BROWSING_WEBUI_SAFE_BROWSING_UI_H_
 #define COMPONENTS_SAFE_BROWSING_WEBUI_SAFE_BROWSING_UI_H_
 
+#include "base/bind.h"
 #include "base/macros.h"
+#include "components/safe_browsing/browser/safe_browsing_network_context.h"
 #include "components/safe_browsing/proto/csd.pb.h"
 #include "components/safe_browsing/proto/webui.pb.h"
 #include "components/sync/protocol/user_event_specifics.pb.h"
 #include "content/public/browser/web_ui_controller.h"
 #include "content/public/browser/web_ui_data_source.h"
 #include "content/public/browser/web_ui_message_handler.h"
+#include "services/network/public/mojom/cookie_manager.mojom.h"
+#include "services/network/public/mojom/network_context.mojom.h"
 
 namespace base {
 class ListValue;
@@ -40,6 +44,9 @@
   // Get the Safe Browsing related preferences for the current user.
   void GetPrefs(const base::ListValue* args);
 
+  // Get the Safe Browsing cookie.
+  void GetCookie(const base::ListValue* args);
+
   // Get the current captured passwords.
   void GetSavedPasswords(const base::ListValue* args);
 
@@ -121,10 +128,17 @@
   void NotifyLogMessageJsListener(const base::Time& timestamp,
                                   const std::string& message);
 
+  // Callback when the CookieManager has returned the cookie.
+  void OnGetCookie(const std::string& callback_id,
+                   const std::vector<net::CanonicalCookie>& cookies);
+
   content::BrowserContext* browser_context_;
 
   // List that keeps all the WebUI listener objects.
   static std::vector<SafeBrowsingUIHandler*> webui_list_;
+
+  base::WeakPtrFactory<SafeBrowsingUIHandler> weak_factory_{this};
+
   DISALLOW_COPY_AND_ASSIGN(SafeBrowsingUIHandler);
 };
 
@@ -262,12 +276,20 @@
     return log_messages_;
   }
 
+  network::mojom::CookieManager* GetCookieManager();
+
+  void set_network_context(SafeBrowsingNetworkContext* network_context) {
+    network_context_ = network_context;
+  }
+
   void AddListenerForTesting() { has_test_listener_ = true; }
 
  private:
   WebUIInfoSingleton();
   ~WebUIInfoSingleton();
 
+  void InitializeCookieManager();
+
   friend struct base::DefaultSingletonTraits<WebUIInfoSingleton>;
 
   // List of ClientDownloadRequests sent since since the oldest currently open
@@ -314,6 +336,12 @@
   // The current referrer chain provider, if any. Can be nullptr.
   ReferrerChainProvider* referrer_chain_provider_ = nullptr;
 
+  // The current NetworkContext for Safe Browsing pings.
+  SafeBrowsingNetworkContext* network_context_ = nullptr;
+
+  // The current CookieManager for the Safe Browsing cookie.
+  network::mojom::CookieManagerPtr cookie_manager_ptr_ = nullptr;
+
   // Whether there is a test listener.
   bool has_test_listener_ = false;
 
diff --git a/components/viz/common/features.cc b/components/viz/common/features.cc
index 1643390..687fc68 100644
--- a/components/viz/common/features.cc
+++ b/components/viz/common/features.cc
@@ -64,11 +64,18 @@
 }
 
 bool IsVizDisplayCompositorEnabled() {
+#if defined(OS_MACOSX) || defined(OS_WIN)
+  // We can't remove the feature switch yet because OOP-D isn't enabled on all
+  // platforms but turning it off on Mac and Windows isn't supported. Don't
+  // check the feature switch for these platforms anymore.
+  return true;
+#else
 #if defined(OS_ANDROID)
   if (features::IsAndroidSurfaceControlEnabled())
     return true;
 #endif
   return base::FeatureList::IsEnabled(kVizDisplayCompositor);
+#endif
 }
 
 bool IsVizHitTestingDebugEnabled() {
diff --git a/components/viz/service/display_embedder/image_context.h b/components/viz/service/display_embedder/image_context.h
index 38ff4ce7..44f62e0 100644
--- a/components/viz/service/display_embedder/image_context.h
+++ b/components/viz/service/display_embedder/image_context.h
@@ -61,6 +61,9 @@
   // The promise image which is used on display thread.
   sk_sp<SkImage> image;
 
+  // Fallback SkImage in case we cannot produce a |representation|.
+  sk_sp<SkImage> fallback_image;
+
   // |sync_token| is only accessed on display thread.
   gpu::SyncToken sync_token;
 
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc
index ff2e916..bfa96e06 100644
--- a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc
+++ b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc
@@ -321,7 +321,6 @@
       context_lost_callback_(context_lost_callback),
       weak_ptr_factory_(this) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  fallback_promise_image_texture_.resize(kLastEnum_SkColorType + 1);
   weak_ptr_ = weak_ptr_factory_.GetWeakPtr();
 }
 
@@ -740,44 +739,35 @@
   }
 }
 
-sk_sp<SkPromiseImageTexture> SkiaOutputSurfaceImplOnGpu::FallbackPromiseImage(
-    ResourceFormat format) {
-  SkColorType color_type =
-      ResourceFormatToClosestSkColorType(true /* gpu_compositing */, format);
-  auto& promise_image_texture = fallback_promise_image_texture_[color_type];
-  if (!promise_image_texture) {
-    auto image_info = SkImageInfo::Make(1 /* width */, 1 /* height */,
-                                        color_type, kOpaque_SkAlphaType);
-    auto surface = SkSurface::MakeRenderTarget(
-        gr_context(), SkBudgeted::kNo, image_info, 0 /* sampleCount */,
-        kTopLeft_GrSurfaceOrigin, nullptr /* surfaceProps */);
-    // We don't have driver support for that particular color_type. Try again
-    // with well supported SkColorType. Reads from this may have unusual colors
-    // due to interpreting RGBA as |color_type|, but that's better than
-    // completely undefined.
-    if (!surface) {
-      image_info =
-          SkImageInfo::Make(1 /* width */, 1 /* height */,
-                            kRGBA_8888_SkColorType, kOpaque_SkAlphaType);
-      surface = SkSurface::MakeRenderTarget(
-          gr_context(), SkBudgeted::kNo, image_info, 0 /* sampleCount */,
-          kTopLeft_GrSurfaceOrigin, nullptr /* surfaceProps */);
+// TODO(backer): Add memory tracking.
+void SkiaOutputSurfaceImplOnGpu::CreateFallbackImage(ImageContext* context) {
+  SkColorType color_type = ResourceFormatToClosestSkColorType(
+      true /* gpu_compositing */, context->resource_format);
 
-      if (!surface)
-        return nullptr;
-    }
-    auto* canvas = surface->getCanvas();
+  // Don't use a fallback SkColorType because we may fail checks inside Skia
+  if (SkColorTypeBytesPerPixel(color_type) * 8 !=
+      BitsPerPixel(context->resource_format))
+    return;
+
+  auto image_info =
+      SkImageInfo::Make(context->size.width(), context->size.height(),
+                        color_type, kOpaque_SkAlphaType);
+  auto surface = SkSurface::MakeRenderTarget(
+      gr_context(), SkBudgeted::kNo, image_info, 0 /* sampleCount */,
+      kTopLeft_GrSurfaceOrigin, nullptr /* surfaceProps */);
+  if (!surface)
+    return;
+
+  auto* canvas = surface->getCanvas();
 #if DCHECK_IS_ON()
-    canvas->clear(SK_ColorRED);
+  canvas->clear(SK_ColorRED);
 #else
-    canvas->clear(SK_ColorWHITE);
+  canvas->clear(SK_ColorWHITE);
 #endif
-    fallback_promise_images_.push_back(surface->makeImageSnapshot());
-    auto gr_texture = fallback_promise_images_.back()->getBackendTexture(
-        false /* flushPendingGrContextIO */);
-    promise_image_texture = SkPromiseImageTexture::Make(gr_texture);
-  }
-  return promise_image_texture;
+  context->fallback_image = surface->makeImageSnapshot();
+  auto gr_texture = context->fallback_image->getBackendTexture(
+      false /* flushPendingGrContextIO */);
+  context->promise_image_texture = SkPromiseImageTexture::Make(gr_texture);
 }
 
 void SkiaOutputSurfaceImplOnGpu::BeginAccessImages(
@@ -800,8 +790,7 @@
         DLOG(ERROR) << "Failed to fulfill the promise texture created from "
                        "RenderPassId:"
                     << context->render_pass_id;
-        context->promise_image_texture =
-            FallbackPromiseImage(context->resource_format);
+        CreateFallbackImage(context);
       }
       continue;
     }
@@ -832,16 +821,14 @@
       if (!representation) {
         DLOG(ERROR) << "Failed to fulfill the promise texture - SharedImage "
                        "mailbox not found in SharedImageManager.";
-        context->promise_image_texture =
-            FallbackPromiseImage(context->resource_format);
+        CreateFallbackImage(context);
         continue;
       }
 
       if (!(representation->usage() & gpu::SHARED_IMAGE_USAGE_DISPLAY)) {
         DLOG(ERROR) << "Failed to fulfill the promise texture - SharedImage "
                        "was not created with display usage.";
-        context->promise_image_texture =
-            FallbackPromiseImage(context->resource_format);
+        CreateFallbackImage(context);
         continue;
       }
 
@@ -852,8 +839,7 @@
       if (!context->promise_image_texture) {
         DLOG(ERROR) << "Failed to fulfill the promise texture - SharedImage "
                        "begin read access failed..";
-        context->promise_image_texture =
-            FallbackPromiseImage(context->resource_format);
+        CreateFallbackImage(context);
         continue;
       }
       context->representation_is_being_accessed = true;
@@ -871,16 +857,14 @@
       DLOG(ERROR)
           << "Failed to fulfill the promise texture whose backend is not "
              "compitable with vulkan.";
-      context->promise_image_texture =
-          FallbackPromiseImage(context->resource_format);
+      CreateFallbackImage(context);
       continue;
     }
 
     auto* texture_base = mailbox_manager_->ConsumeTexture(context->mailbox);
     if (!texture_base) {
       DLOG(ERROR) << "Failed to fulfill the promise texture.";
-      context->promise_image_texture =
-          FallbackPromiseImage(context->resource_format);
+      CreateFallbackImage(context);
       continue;
     }
     BindOrCopyTextureIfNecessary(texture_base);
@@ -890,8 +874,7 @@
                              context->resource_format, &backend_texture);
     if (!backend_texture.isValid()) {
       DLOG(ERROR) << "Failed to fulfill the promise texture.";
-      context->promise_image_texture =
-          FallbackPromiseImage(context->resource_format);
+      CreateFallbackImage(context);
       continue;
     }
     context->promise_image_texture =
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h
index faad369..656e218 100644
--- a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h
+++ b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h
@@ -185,7 +185,7 @@
     return output_device_->draw_surface();
   }
 
-  sk_sp<SkPromiseImageTexture> FallbackPromiseImage(ResourceFormat format);
+  void CreateFallbackImage(ImageContext* context);
 
   const gpu::SurfaceHandle surface_handle_;
   scoped_refptr<gpu::gles2::FeatureInfo> feature_info_;
@@ -250,11 +250,6 @@
   gl::GLApi* api_ = nullptr;
   bool supports_alpha_ = false;
 
-  // What we display when the mailbox for a texture is invalid. Indexed by
-  // SkColorType.
-  std::vector<sk_sp<SkPromiseImageTexture>> fallback_promise_image_texture_;
-  std::vector<sk_sp<SkImage>> fallback_promise_images_;
-
   THREAD_CHECKER(thread_checker_);
 
   base::WeakPtr<SkiaOutputSurfaceImplOnGpu> weak_ptr_;
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index dd96224..644fdab 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -1348,8 +1348,6 @@
     "permissions/permission_service_context.h",
     "permissions/permission_service_impl.cc",
     "permissions/permission_service_impl.h",
-    "picture_in_picture/overlay_surface_embedder.cc",
-    "picture_in_picture/overlay_surface_embedder.h",
     "picture_in_picture/picture_in_picture_service_impl.cc",
     "picture_in_picture/picture_in_picture_service_impl.h",
     "picture_in_picture/picture_in_picture_window_controller_impl.cc",
diff --git a/content/browser/devtools/devtools_session.cc b/content/browser/devtools/devtools_session.cc
index 01da32b..1c47409 100644
--- a/content/browser/devtools/devtools_session.cc
+++ b/content/browser/devtools/devtools_session.cc
@@ -27,11 +27,12 @@
 
 bool ShouldSendOnIO(const std::string& method) {
   // Keep in sync with WebDevToolsAgent::ShouldInterruptForMethod.
-  // TODO(dgozman): find a way to share this.
+  // TODO(einbinder): find a way to share this.
   return method == "Debugger.pause" || method == "Debugger.setBreakpoint" ||
          method == "Debugger.setBreakpointByUrl" ||
          method == "Debugger.removeBreakpoint" ||
          method == "Debugger.setBreakpointsActive" ||
+         method == "Debugger.getStackTrace" ||
          method == "Performance.getMetrics" || method == "Page.crash" ||
          method == "Runtime.terminateExecution" ||
          method == "Emulation.setScriptExecutionDisabled";
diff --git a/content/browser/download/download_manager_impl.cc b/content/browser/download/download_manager_impl.cc
index 02d54e7..9d34dc1 100644
--- a/content/browser/download/download_manager_impl.cc
+++ b/content/browser/download/download_manager_impl.cc
@@ -81,6 +81,7 @@
 #include "services/metrics/public/cpp/ukm_source_id.h"
 #include "services/network/public/cpp/features.h"
 #include "services/network/public/cpp/wrapper_shared_url_loader_factory.h"
+#include "services/service_manager/public/cpp/connector.h"
 #include "storage/browser/blob/blob_url_loader_factory.h"
 #include "storage/browser/blob/blob_url_request_job_factory.h"
 #include "url/origin.h"
@@ -672,6 +673,23 @@
                            : nullptr;
 }
 
+std::unique_ptr<service_manager::Connector>
+DownloadManagerImpl::GetServiceConnector() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  service_manager::Connector* connector = GetServiceManagerConnector();
+  if (connector)
+    return connector->Clone();  // Clone for use on a different thread.
+  return nullptr;
+}
+
+service_manager::Connector* DownloadManagerImpl::GetServiceManagerConnector() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  if (auto* connection = ServiceManagerConnection::GetForProcess())
+    return connection->GetConnector();
+  return nullptr;
+}
+
 void DownloadManagerImpl::StartDownload(
     std::unique_ptr<download::DownloadCreateInfo> info,
     std::unique_ptr<download::InputStream> stream,
diff --git a/content/browser/download/download_manager_impl.h b/content/browser/download/download_manager_impl.h
index b6859f1..f2dd1e4 100644
--- a/content/browser/download/download_manager_impl.h
+++ b/content/browser/download/download_manager_impl.h
@@ -207,6 +207,7 @@
       override;
   net::URLRequestContextGetter* GetURLRequestContextGetter(
       const download::DownloadCreateInfo& info) override;
+  std::unique_ptr<service_manager::Connector> GetServiceConnector() override;
 
   // Creates a new download item and call |callback|.
   void CreateNewDownloadItemToStart(
@@ -257,6 +258,7 @@
       download::DownloadItemImpl* download) override;
   bool IsOffTheRecord() const override;
   void ReportBytesWasted(download::DownloadItemImpl* download) override;
+  service_manager::Connector* GetServiceManagerConnector() override;
 
   // Drops a download before it is created.
   void DropDownload();
diff --git a/content/browser/download/url_downloader_factory.cc b/content/browser/download/url_downloader_factory.cc
index 9d2c165..387b79dea 100644
--- a/content/browser/download/url_downloader_factory.cc
+++ b/content/browser/download/url_downloader_factory.cc
@@ -9,6 +9,7 @@
 #include "content/browser/download/download_request_core.h"
 #include "content/browser/download/url_downloader.h"
 #include "net/url_request/url_request_context_getter.h"
+#include "services/service_manager/public/cpp/connector.h"
 
 namespace content {
 
@@ -24,6 +25,7 @@
         url_loader_factory_getter,
     const download::URLSecurityPolicy& url_security_policy,
     scoped_refptr<net::URLRequestContextGetter> url_request_context_getter,
+    std::unique_ptr<service_manager::Connector> connector,
     const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) {
   std::unique_ptr<net::URLRequest> url_request =
       DownloadRequestCore::CreateRequestOnIOThread(
diff --git a/content/browser/download/url_downloader_factory.h b/content/browser/download/url_downloader_factory.h
index 23b287f..6c70cc8a 100644
--- a/content/browser/download/url_downloader_factory.h
+++ b/content/browser/download/url_downloader_factory.h
@@ -35,6 +35,7 @@
           shared_url_loader_factory,
       const download::URLSecurityPolicy& url_security_policy,
       scoped_refptr<net::URLRequestContextGetter> url_request_context_getter,
+      std::unique_ptr<service_manager::Connector> connector,
       const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) override;
 };
 
diff --git a/content/browser/frame_host/render_frame_host_manager_browsertest.cc b/content/browser/frame_host/render_frame_host_manager_browsertest.cc
index 251b1008..c82c536 100644
--- a/content/browser/frame_host/render_frame_host_manager_browsertest.cc
+++ b/content/browser/frame_host/render_frame_host_manager_browsertest.cc
@@ -5758,11 +5758,8 @@
     EXPECT_FALSE(instance1->HasWrongProcessForURL(url1));
   }
 
-  // TODO(creis): Enable the rest of the test when https://crbug.com/793127 is
-  // fixed, since this currently fails with a DCHECK in SiteProcessCountTracker.
-#if 0
-  // Go back to the chrome-native:// URL's entry, which should swap to a new
-  // SiteInstance with an unused site URL.
+  // Go back to url1's entry, which should swap to a new SiteInstance with an
+  // unused site URL.
   TestNavigationObserver observer(web_contents);
   web_contents->GetController().GoToOffset(-2);
   observer.Wait();
@@ -5785,7 +5782,6 @@
       policy->CanAccessDataForOrigin(new_process->GetID(), url1));
   EXPECT_TRUE(
       policy->CanAccessDataForOrigin(new_process->GetID(), url2));
-#endif
 
   SetBrowserClientForTesting(old_client);
 }
diff --git a/content/browser/gpu/compositor_util.cc b/content/browser/gpu/compositor_util.cc
index 8de933a..d7b9b1c 100644
--- a/content/browser/gpu/compositor_util.cc
+++ b/content/browser/gpu/compositor_util.cc
@@ -172,6 +172,14 @@
        "Out-of-process accelerated rasterization has been disabled, either "
        "via blacklist, about:flags or the command line.",
        false, true},
+      {"metal", gpu::kGpuFeatureStatusEnabled,
+#if defined(OS_MACOSX)
+       !base::FeatureList::IsEnabled(features::kMetal) /* disabled */,
+       "Metal is not enabled by default.",
+#else
+       true /* disabled */, "Metal only available on macOS.",
+#endif
+       false /* fallback_to_software */, false /* needs_gpu_access */},
       {"multiple_raster_threads", gpu::kGpuFeatureStatusEnabled,
        NumberOfRendererRasterThreads() == 1, "Raster is using a single thread.",
        false, true},
@@ -234,6 +242,12 @@
     std::string status;
     if (gpu_feature_data.name == "surface_synchronization") {
       status = (!gpu_feature_data.disabled ? "enabled_on" : "disabled_off");
+    } else if (gpu_feature_data.name == "metal") {
+#if defined(OS_MACOSX)
+      status = (!gpu_feature_data.disabled ? "enabled_on" : "disabled_off");
+#else
+      status = "unavailable_off";
+#endif
     } else if (gpu_feature_data.name == "viz_display_compositor") {
       status = (!gpu_feature_data.disabled ? "enabled_on" : "disabled_off");
     } else if (gpu_feature_data.disabled || gpu_access_blocked ||
diff --git a/content/browser/picture_in_picture/overlay_surface_embedder.cc b/content/browser/picture_in_picture/overlay_surface_embedder.cc
deleted file mode 100644
index 43bd092..0000000
--- a/content/browser/picture_in_picture/overlay_surface_embedder.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/browser/picture_in_picture/overlay_surface_embedder.h"
-
-#include "ui/compositor/layer.h"
-
-namespace content {
-
-OverlaySurfaceEmbedder::OverlaySurfaceEmbedder(OverlayWindow* window)
-    : window_(window) {
-  DCHECK(window_);
-  // Add window background.
-  window_background_layer_ = window_->GetWindowBackgroundLayer();
-  window_background_layer_->SetBounds(
-      gfx::Rect(gfx::Point(0, 0), window_->GetBounds().size()));
-
-  // Add |window_background_layer_| to |window_| and stack it at the bottom.
-  window_->GetLayer()->Add(window_background_layer_);
-  window_->GetLayer()->StackAtBottom(window_background_layer_);
-
-  video_layer_ = window_->GetVideoLayer();
-  video_layer_->SetMasksToBounds(true);
-
-  // The frame provided by the parent window's layer needs to show through
-  // |video_layer_|.
-  video_layer_->SetFillsBoundsOpaquely(false);
-  // |video_layer_| bounds are set with the (0, 0) origin point. The
-  // positioning of |window_| is dictated by itself.
-  video_layer_->SetBounds(
-      gfx::Rect(gfx::Point(0, 0), window_->GetBounds().size()));
-
-  // Add |video_layer_| to |window_| and stack it above
-  // |window_background_layer_|.
-  window_->GetLayer()->Add(video_layer_);
-  window_->GetLayer()->StackAbove(video_layer_, window_background_layer_);
-}
-
-OverlaySurfaceEmbedder::~OverlaySurfaceEmbedder() = default;
-
-void OverlaySurfaceEmbedder::SetSurfaceId(const viz::SurfaceId& surface_id) {
-  video_layer_ = window_->GetVideoLayer();
-  // SurfaceInfo has information about the embedded surface.
-  video_layer_->SetShowSurface(surface_id, window_->GetBounds().size(),
-                               SK_ColorBLACK,
-                               cc::DeadlinePolicy::UseDefaultDeadline(),
-                               true /* stretch_content_to_fill_bounds */);
-}
-
-void OverlaySurfaceEmbedder::UpdateLayerBounds() {
-  // Update the size of window background.
-  window_background_layer_ = window_->GetWindowBackgroundLayer();
-  window_background_layer_->SetBounds(
-      gfx::Rect(gfx::Point(0, 0), window_->GetBounds().size()));
-
-  // Update the size and position of the video to stretch on the entire window.
-  video_layer_ = window_->GetVideoLayer();
-  video_layer_->SetBounds(window_->GetVideoBounds());
-  video_layer_->SetSurfaceSize(window_->GetVideoBounds().size());
-}
-
-}  // namespace content
diff --git a/content/browser/picture_in_picture/overlay_surface_embedder.h b/content/browser/picture_in_picture/overlay_surface_embedder.h
deleted file mode 100644
index 9307f38..0000000
--- a/content/browser/picture_in_picture/overlay_surface_embedder.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_BROWSER_PICTURE_IN_PICTURE_OVERLAY_SURFACE_EMBEDDER_H_
-#define CONTENT_BROWSER_PICTURE_IN_PICTURE_OVERLAY_SURFACE_EMBEDDER_H_
-
-#include <memory>
-
-#include "content/public/browser/overlay_window.h"
-
-namespace viz {
-class SurfaceId;
-}
-
-namespace content {
-
-// Embed a surface into the OverlayWindow to show content. Responsible for
-// setting up the surface layers that contain content to show on the
-// OverlayWindow.
-class OverlaySurfaceEmbedder {
- public:
-  explicit OverlaySurfaceEmbedder(OverlayWindow* window);
-  ~OverlaySurfaceEmbedder();
-
-  void SetSurfaceId(const viz::SurfaceId&);
-  void UpdateLayerBounds();
-
- private:
-  // The window which embeds the client. Weak pointer since the
-  // PictureInPictureWindowController owns the window.
-  OverlayWindow* window_;
-
-  // Contains the client's content.
-  std::unique_ptr<ui::Layer> surface_layer_;
-
-  // Owned by the OverlayWindow implementation.
-  // These are set in the constructor.
-  ui::Layer* window_background_layer_ = nullptr;
-  ui::Layer* video_layer_ = nullptr;
-
-  DISALLOW_COPY_AND_ASSIGN(OverlaySurfaceEmbedder);
-};
-
-}  // namespace content
-
-#endif  // CONTENT_BROWSER_PICTURE_IN_PICTURE_OVERLAY_SURFACE_EMBEDDER_H_
diff --git a/content/browser/picture_in_picture/picture_in_picture_service_impl_unittest.cc b/content/browser/picture_in_picture/picture_in_picture_service_impl_unittest.cc
index 09decd2f..0f99ec23 100644
--- a/content/browser/picture_in_picture/picture_in_picture_service_impl_unittest.cc
+++ b/content/browser/picture_in_picture/picture_in_picture_service_impl_unittest.cc
@@ -48,18 +48,16 @@
   void Hide() override {}
   bool IsVisible() const override { return false; }
   bool IsAlwaysOnTop() const override { return false; }
-  ui::Layer* GetLayer() override { return nullptr; }
   gfx::Rect GetBounds() const override { return gfx::Rect(); }
   void UpdateVideoSize(const gfx::Size& natural_size) override {}
   void SetPlaybackState(PlaybackState playback_state) override {}
   void SetAlwaysHidePlayPauseButton(bool is_visible) override {}
-  ui::Layer* GetWindowBackgroundLayer() override { return nullptr; }
-  ui::Layer* GetVideoLayer() override { return nullptr; }
-  gfx::Rect GetVideoBounds() override { return gfx::Rect(); }
   void SetMutedState(MutedState muted_state) override {}
   void SetSkipAdButtonVisibility(bool is_visible) override {}
   void SetNextTrackButtonVisibility(bool is_visible) override {}
   void SetPreviousTrackButtonVisibility(bool is_visible) override {}
+  void SetSurfaceId(const viz::SurfaceId& surface_id) override {}
+  cc::Layer* GetLayerForTesting() override { return nullptr; }
 
  private:
   DISALLOW_COPY_AND_ASSIGN(TestOverlayWindow);
diff --git a/content/browser/picture_in_picture/picture_in_picture_window_controller_impl.cc b/content/browser/picture_in_picture/picture_in_picture_window_controller_impl.cc
index 0db14f5..dd91aa0 100644
--- a/content/browser/picture_in_picture/picture_in_picture_window_controller_impl.cc
+++ b/content/browser/picture_in_picture/picture_in_picture_window_controller_impl.cc
@@ -9,7 +9,6 @@
 #include "components/viz/common/surfaces/surface_id.h"
 #include "content/browser/media/media_web_contents_observer.h"
 #include "content/browser/media/session/media_session_impl.h"
-#include "content/browser/picture_in_picture/overlay_surface_embedder.h"
 #include "content/browser/picture_in_picture/picture_in_picture_service_impl.h"
 #include "content/browser/web_contents/web_contents_impl.h"
 #include "content/common/media/media_player_delegate_messages.h"
@@ -18,7 +17,6 @@
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/common/content_client.h"
-#include "ui/compositor/layer.h"
 
 namespace content {
 
@@ -113,7 +111,6 @@
 
 void PictureInPictureWindowControllerImpl::OnWindowDestroyed() {
   window_ = nullptr;
-  embedder_ = nullptr;
   CloseInternal(true /* should_pause_video */,
                 true /* should_reset_pip_player */);
 }
@@ -126,16 +123,6 @@
 
   DCHECK(surface_id.is_valid());
 
-  // TODO(https://crbug.com/925346): We also want to unregister the page that
-  // used to embed the video as its parent.
-  ui::Compositor* compositor = window_->GetLayer()->GetCompositor();
-  if (!surface_id_.is_valid()) {
-    compositor->AddChildFrameSink(surface_id.frame_sink_id());
-  } else if (surface_id_.frame_sink_id() != surface_id.frame_sink_id()) {
-    compositor->RemoveChildFrameSink(surface_id_.frame_sink_id());
-    compositor->AddChildFrameSink(surface_id.frame_sink_id());
-  }
-
   surface_id_ = surface_id;
 
   // Update the media player id in step with the video surface id. If the
@@ -145,10 +132,7 @@
   UpdateMediaPlayerId();
 
   window_->UpdateVideoSize(natural_size);
-
-  if (!embedder_)
-    embedder_.reset(new OverlaySurfaceEmbedder(window_.get()));
-  embedder_->SetSurfaceId(surface_id_);
+  window_->SetSurfaceId(surface_id_);
 }
 
 OverlayWindow* PictureInPictureWindowControllerImpl::GetWindowForTesting() {
@@ -160,9 +144,6 @@
       window_->IsVisible()) {
     service_->NotifyWindowResized(window_->GetBounds().size());
   }
-
-  if (embedder_)
-    embedder_->UpdateLayerBounds();
 }
 
 bool PictureInPictureWindowControllerImpl::IsPlayerActive() {
@@ -397,11 +378,6 @@
 void PictureInPictureWindowControllerImpl::OnLeavingPictureInPicture(
     bool should_pause_video,
     bool should_reset_pip_player) {
-  if (window_ && surface_id_.is_valid()) {
-    window_->GetLayer()->GetCompositor()->RemoveChildFrameSink(
-        surface_id_.frame_sink_id());
-  }
-
   if (IsPlayerActive() && should_pause_video) {
     // Pause the current video so there is only one video playing at a time.
     media_player_id_->render_frame_host->Send(new MediaPlayerDelegateMsg_Pause(
diff --git a/content/browser/picture_in_picture/picture_in_picture_window_controller_impl.h b/content/browser/picture_in_picture/picture_in_picture_window_controller_impl.h
index 3631ec6..2b070d9 100644
--- a/content/browser/picture_in_picture/picture_in_picture_window_controller_impl.h
+++ b/content/browser/picture_in_picture/picture_in_picture_window_controller_impl.h
@@ -19,7 +19,6 @@
 namespace content {
 
 class MediaWebContentsObserver;
-class OverlaySurfaceEmbedder;
 class PictureInPictureServiceImpl;
 class WebContents;
 class WebContentsImpl;
@@ -118,7 +117,7 @@
   bool RemoveMutedPlayerEntry(const MediaPlayerId& id);
 
   std::unique_ptr<OverlayWindow> window_;
-  std::unique_ptr<OverlaySurfaceEmbedder> embedder_;
+
   // TODO(929156): remove this as it should be accessible via `web_contents()`.
   WebContentsImpl* const initiator_;
 
diff --git a/content/browser/presentation/presentation_browsertest.cc b/content/browser/presentation/presentation_browsertest.cc
deleted file mode 100644
index 1295442..0000000
--- a/content/browser/presentation/presentation_browsertest.cc
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/public/browser/web_contents.h"
-#include "content/public/test/browser_test.h"
-#include "content/public/test/content_browser_test.h"
-#include "content/public/test/content_browser_test_utils.h"
-#include "content/public/test/test_navigation_observer.h"
-#include "content/shell/browser/shell.h"
-
-namespace content {
-
-using PresentationBrowserTest = ContentBrowserTest;
-
-// Regression test that verifies that calling getAvailability() twice on the
-// same PresentationRequest does not return an undefined object.
-// TODO(mlamouri,mfoltz), update the test after [SameObject] is used,
-// see https://crbug.com/653131
-// Broken; see https://crbug.com/940503 .
-IN_PROC_BROWSER_TEST_F(PresentationBrowserTest,
-                       DISABLED_AvailabilityNotUndefined) {
-  GURL test_url = GetTestUrl("", "hello.html");
-
-  TestNavigationObserver navigation_observer(shell()->web_contents(), 1);
-  shell()->LoadURL(test_url);
-
-  navigation_observer.Wait();
-
-  ExecuteScriptAndGetValue(shell()->web_contents()->GetMainFrame(),
-                           "const r = new PresentationRequest('foo.html')");
-
-  ExecuteScriptAndGetValue(shell()->web_contents()->GetMainFrame(),
-                           "const p1 = r.getAvailability();");
-
-  ExecuteScriptAndGetValue(shell()->web_contents()->GetMainFrame(),
-                           "const p2 = r.getAvailability()");
-
-  bool is_p1_undefined =
-      ExecuteScriptAndGetValue(shell()->web_contents()->GetMainFrame(),
-                               "p1 === undefined")
-          .GetBool();
-
-  bool is_p2_undefined =
-      ExecuteScriptAndGetValue(shell()->web_contents()->GetMainFrame(),
-                               "p2 === undefined")
-          .GetBool();
-
-  EXPECT_FALSE(is_p1_undefined);
-  EXPECT_FALSE(is_p2_undefined);
-}
-
-}  // namespace content
diff --git a/content/browser/resources/gpu/info_view.js b/content/browser/resources/gpu/info_view.js
index cbb3f87..fdbeca0 100644
--- a/content/browser/resources/gpu/info_view.js
+++ b/content/browser/resources/gpu/info_view.js
@@ -224,6 +224,7 @@
         'video_decode': 'Video Decode',
         'rasterization': 'Rasterization',
         'oop_rasterization': 'Out-of-process Rasterization',
+        'metal': 'Metal',
         'multiple_raster_threads': 'Multiple Raster Threads',
         'native_gpu_memory_buffers': 'Native GpuMemoryBuffers',
         'protected_video_decode': 'Hardware Protected Video Decode',
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc
index 832333b..93087b7 100644
--- a/content/child/runtime_features.cc
+++ b/content/child/runtime_features.cc
@@ -483,6 +483,9 @@
 
   WebRuntimeFeatures::EnableSkipTouchEventFilter(
       base::FeatureList::IsEnabled(features::kSkipTouchEventFilter));
+
+  WebRuntimeFeatures::EnableStaleWhileRevalidate(
+      base::FeatureList::IsEnabled(features::kStaleWhileRevalidate));
 }
 
 }  // namespace
diff --git a/content/common/service_manager/service_manager_connection_impl.cc b/content/common/service_manager/service_manager_connection_impl.cc
index f9f21934..494afe3c 100644
--- a/content/common/service_manager/service_manager_connection_impl.cc
+++ b/content/common/service_manager/service_manager_connection_impl.cc
@@ -295,8 +295,13 @@
   }
 
   // mojom::Child:
-  // Make sure this isn't inlined so it shows up in stack traces.
-  NOINLINE void CrashHungProcess() override { IMMEDIATE_CRASH(); }
+  // Make sure this isn't inlined so it shows up in stack traces, and also make
+  // the function body unique by adding a log line, so it doesn't get merged
+  // with other functions by link time optimizations (ICF).
+  NOINLINE void CrashHungProcess() override {
+    LOG(ERROR) << "Crashing because hung";
+    IMMEDIATE_CRASH();
+  }
 
   base::ThreadChecker io_thread_checker_;
   bool started_ = false;
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/NavigationHandle.java b/content/public/android/java/src/org/chromium/content_public/browser/NavigationHandle.java
index 829c9b1..1884bff6 100644
--- a/content/public/android/java/src/org/chromium/content_public/browser/NavigationHandle.java
+++ b/content/public/android/java/src/org/chromium/content_public/browser/NavigationHandle.java
@@ -6,6 +6,7 @@
 
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.net.NetError;
 
 /**
  * JNI bridge with content::NavigationHandle
@@ -23,7 +24,7 @@
     private boolean mIsErrorPage;
     private boolean mIsFragmentNavigation;
     private boolean mIsValidSearchFormUrl;
-    private int mErrorCode;
+    private @NetError int mErrorCode;
     private int mHttpStatusCode;
 
     @CalledByNative
@@ -51,7 +52,7 @@
     @CalledByNative
     public void didFinish(String url, boolean isErrorPage, boolean hasCommitted,
             boolean isFragmentNavigation, boolean isDownload, boolean isValidSearchFormUrl,
-            int transition, int errorCode, int httpStatuscode) {
+            int transition, @NetError int errorCode, int httpStatuscode) {
         mUrl = url;
         mIsErrorPage = isErrorPage;
         mHasCommitted = hasCommitted;
@@ -125,7 +126,7 @@
         return "";
     }
 
-    public int errorCode() {
+    public @NetError int errorCode() {
         return mErrorCode;
     }
 
diff --git a/content/public/browser/overlay_window.h b/content/public/browser/overlay_window.h
index 68d020c8..6e1a8e06 100644
--- a/content/public/browser/overlay_window.h
+++ b/content/public/browser/overlay_window.h
@@ -14,10 +14,14 @@
 class Size;
 }
 
-namespace ui {
+namespace cc {
 class Layer;
 }
 
+namespace viz {
+class SurfaceId;
+}
+
 namespace content {
 
 class PictureInPictureWindowController;
@@ -53,7 +57,6 @@
   virtual void Hide() = 0;
   virtual bool IsVisible() const = 0;
   virtual bool IsAlwaysOnTop() const = 0;
-  virtual ui::Layer* GetLayer() = 0;
   // Retrieves the window's current bounds, including its window.
   virtual gfx::Rect GetBounds() const = 0;
   virtual void UpdateVideoSize(const gfx::Size& natural_size) = 0;
@@ -63,13 +66,8 @@
   virtual void SetSkipAdButtonVisibility(bool is_visible) = 0;
   virtual void SetNextTrackButtonVisibility(bool is_visible) = 0;
   virtual void SetPreviousTrackButtonVisibility(bool is_visible) = 0;
-
-  // Retrieves the ui::Layers corresponding to the window and video.
-  virtual ui::Layer* GetWindowBackgroundLayer() = 0;
-  virtual ui::Layer* GetVideoLayer() = 0;
-
-  // Retrieves the bounds of the video.
-  virtual gfx::Rect GetVideoBounds() = 0;
+  virtual void SetSurfaceId(const viz::SurfaceId& surface_id) = 0;
+  virtual cc::Layer* GetLayerForTesting() = 0;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(OverlayWindow);
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index 2ed632c..3526e40 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -460,6 +460,11 @@
 const base::Feature kSpareRendererForSitePerProcess{
     "SpareRendererForSitePerProcess", base::FEATURE_ENABLED_BY_DEFAULT};
 
+// Enables StaleWhileRevalidate support.
+// https://www.chromestatus.com/features/5050913014153216
+const base::Feature kStaleWhileRevalidate{"StaleWhileRevalidate",
+                                          base::FEATURE_ENABLED_BY_DEFAULT};
+
 // Dispatch touch events to "SyntheticGestureController" for events from
 // Devtool Protocol Input.dispatchTouchEvent to simulate touch events close to
 // real OS events.
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index a54704c..c81bbef0 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -108,6 +108,7 @@
 CONTENT_EXPORT extern const base::Feature kSignedHTTPExchange;
 CONTENT_EXPORT extern const base::Feature kSignedHTTPExchangePingValidity;
 CONTENT_EXPORT extern const base::Feature kSpareRendererForSitePerProcess;
+CONTENT_EXPORT extern const base::Feature kStaleWhileRevalidate;
 CONTENT_EXPORT extern const base::Feature kSyntheticPointerActions;
 CONTENT_EXPORT extern const base::Feature kTimerThrottlingForHiddenFrames;
 CONTENT_EXPORT extern const base::Feature kTouchpadAsyncPinchEvents;
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn
index 97e7f0b..9fb4d72ca 100644
--- a/content/renderer/BUILD.gn
+++ b/content/renderer/BUILD.gn
@@ -604,7 +604,7 @@
     "//gpu/command_buffer/client:gles2_interface",
     "//gpu/command_buffer/client:raster_interface",
     "//gpu/command_buffer/client:webgpu_interface",
-    "//jingle:jingle_glue",
+    "//jingle:webrtc_glue",
     "//media",
     "//media:media_buildflags",
     "//media/blink",
diff --git a/content/shell/browser/web_test/web_test_content_browser_client.cc b/content/shell/browser/web_test/web_test_content_browser_client.cc
index a303b16..04149aa4 100644
--- a/content/shell/browser/web_test/web_test_content_browser_client.cc
+++ b/content/shell/browser/web_test/web_test_content_browser_client.cc
@@ -68,7 +68,6 @@
   void Hide() override {}
   bool IsVisible() const override { return false; }
   bool IsAlwaysOnTop() const override { return false; }
-  ui::Layer* GetLayer() override { return nullptr; }
   gfx::Rect GetBounds() const override { return gfx::Rect(); }
   void UpdateVideoSize(const gfx::Size& natural_size) override {}
   void SetPlaybackState(PlaybackState playback_state) override {}
@@ -77,9 +76,8 @@
   void SetSkipAdButtonVisibility(bool is_visible) override {}
   void SetNextTrackButtonVisibility(bool is_visible) override {}
   void SetPreviousTrackButtonVisibility(bool is_visible) override {}
-  ui::Layer* GetWindowBackgroundLayer() override { return nullptr; }
-  ui::Layer* GetVideoLayer() override { return nullptr; }
-  gfx::Rect GetVideoBounds() override { return gfx::Rect(); }
+  void SetSurfaceId(const viz::SurfaceId& surface_id) override {}
+  cc::Layer* GetLayerForTesting() override { return nullptr; }
 
  private:
   DISALLOW_COPY_AND_ASSIGN(TestOverlayWindow);
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 062209c9..93ce2151 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -863,7 +863,6 @@
     "../browser/pointer_lock_browsertest_mac.mm",
     "../browser/portal/portal_browsertest.cc",
     "../browser/power_monitor_browsertest.cc",
-    "../browser/presentation/presentation_browsertest.cc",
     "../browser/renderer_host/input/autoscroll_browsertest.cc",
     "../browser/renderer_host/input/composited_scrolling_browsertest.cc",
     "../browser/renderer_host/input/compositor_event_ack_browsertest.cc",
diff --git a/content/test/gpu/gpu_tests/gpu_integration_test_unittest.py b/content/test/gpu/gpu_tests/gpu_integration_test_unittest.py
index 6c65cc8..9468105 100644
--- a/content/test/gpu/gpu_tests/gpu_integration_test_unittest.py
+++ b/content/test/gpu/gpu_tests/gpu_integration_test_unittest.py
@@ -32,6 +32,19 @@
 path_util.AddDirToPathIfNeeded(path_util.GetChromiumSrcDir(), 'tools', 'perf')
 from chrome_telemetry_build import chromium_config
 
+WIN_CONDITIONS = ['xp', 'vista', 'win7', 'win8', 'win10']
+MAC_CONDITIONS = ['leopard', 'snowleopard', 'lion', 'mountainlion',
+                  'mavericks', 'yosemite', 'sierra', 'highsierra', 'mojave']
+# These aren't expanded out into "lollipop", "marshmallow", etc.
+ANDROID_CONDITIONS = ['l', 'm', 'n', 'o', 'p', 'q']
+
+_map_specific_to_generic = {sos:'win' for sos in WIN_CONDITIONS}
+_map_specific_to_generic.update({sos:'mac' for sos in MAC_CONDITIONS})
+_map_specific_to_generic.update({sos:'android' for sos in ANDROID_CONDITIONS})
+
+_get_generic = lambda tags: set(
+    [_map_specific_to_generic.get(tag, tag) for tag in tags])
+
 VENDOR_NVIDIA = 0x10DE
 VENDOR_AMD = 0x1002
 VENDOR_INTEL = 0x8086
@@ -185,7 +198,8 @@
       error_msg += ('\n\nFound conflicts for test %s in %s:\n' %
                     (pattern, file_name))
     for e1, e2 in itertools.combinations(exps, 2):
-      if e1.tags.issubset(e2.tags) or e2.tags.issubset(e1.tags):
+      if (e1.tags.issubset(_get_generic(e2.tags)) or
+          e2.tags.issubset(_get_generic(e1.tags))):
         conflicts_found = True
         error_msg += ('  line %d conflicts with line %d\n' %
                       (e1.lineno, e2.lineno))
@@ -250,6 +264,25 @@
     finally:
       temp_file.close()
 
+  def testCollisionInTestExpectationsWithGenericAndSpecificTags(self):
+    test_expectations = '''# tags: [ mac win linux xp ]
+    # tags: [ intel amd nvidia ]
+    # tags: [ debug release ]
+    [ intel win ] a/b/c/d [ Failure ]
+    [ intel xp debug ] a/b/c/d [ Skip ]
+    '''
+    with self.assertRaises(AssertionError):
+      _checkTestExpectationsForCollision(test_expectations, 'test.txt')
+
+  def testNoCollisionBetweenSpecificTags(self):
+    test_expectations = '''# tags: [ mac win linux xp win7 ]
+    # tags: [ intel amd nvidia ]
+    # tags: [ debug release ]
+    [ intel win7 ] a/b/c/d [ Failure ]
+    [ intel xp debug ] a/b/c/d [ Skip ]
+    '''
+    _checkTestExpectationsForCollision(test_expectations, 'test.txt')
+
   def testCollisionInTestExpectationCausesAssertion(self):
     test_expectations = '''# tags: [ mac win linux ]
     # tags: [ intel amd nvidia ]
diff --git a/docs/README.md b/docs/README.md
index 39a9a6b..a7642e43 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -165,9 +165,11 @@
     browser vendors
 *   [Using Crashpad with `content_shell`](testing/using_crashpad_with_content_shell.md) -
     Capture stack traces on layout test crashes without an attached debugger
-*   [Test Descriptions](test_descriptions.md) - Unit test targets that can be
+*   [Test Descriptions](testing/test_descriptions.md) - Unit test targets that can be
     built, with associated desciptions.
-*   [IPC Fuzzer](ipc_fuzzer.md) - Fuzz testing of Chromium IPC interfaces.
+*   [IPC Fuzzer](testing/ipc_fuzzer.md) - Fuzz testing of Chromium IPC interfaces.
+*   [Running Chrome tests with AddressSanitizer (asan) and LeakSanitizer (lsan)](testing/linux_running_asan_tests.md) -
+    Run Chrome tests with ASAN and LSAN builds to detect addressability issues and memory leaks.
 
 ### GPU-related docs
 *   [GPU Pixel Wrangling](gpu/pixel_wrangling.md) - Instructions for GPU
@@ -219,7 +221,7 @@
     isolate browser components with different privileges.
 *   [Zygote Process](linux_zygote.md) - How the Linux Zygote process, used to
     spawn new processes, works.
-*   [Running Web Tests on Linux](web_tests_linux.md) - Linux-specific
+*   [Running Web Tests on Linux](testing/web_tests_linux.md) - Linux-specific
     instructions for running web tests.
 *   [Linux Sysroot Images](linux_sysroot.md) - How builds use libraries on Linux
 *   [Linux Hardware Video Decoding](linux_hw_video_decode.md) - Enabling
@@ -247,7 +249,7 @@
     Setting up profiling for `content_shell` on Android
 *   [Working Remotely with Android](working_remotely_with_android.md) - Building
     on a remote machine for an Android device connected to your local machine
-*   [Android Test Instructions](android_test_instructions.md) - Running a build
+*   [Android Test Instructions](testing/android_test_instructions.md) - Running a build
     on an Android device or emulator.
 *   [Android Debugging](android_debugging_instructions.md) - Tools and tips for
     how to debug Java and/or C/C++ code running on Android.
diff --git a/docs/accessibility/tests.md b/docs/accessibility/tests.md
index 9376333..a5b5bb5 100644
--- a/docs/accessibility/tests.md
+++ b/docs/accessibility/tests.md
@@ -1,47 +1,47 @@
 # Accessibility
 
-Here's a quick overview of all of the locations in the codebase where
-you'll find accessibility tests, and a brief overview of the purpose of
-all of them.
+Here's a quick overview of all of the locations in the codebase where you'll
+find accessibility tests, and a brief overview of the purpose of all of them.
 
-## Layout Tests
+## Web Tests
 
-This is the primary place where we test accessibility code in Blink. This
-code should have no platform-specific code. Use this to test anything
-where there's any interesting web platform logic, or where you need to be
-able to query things synchronously from the renderer thread to test them.
+This is the primary place where we test accessibility code in Blink. This code
+should have no platform-specific code. Use this to test anything where there's
+any interesting web platform logic, or where you need to be able to query things
+synchronously from the renderer thread to test them.
 
-Don't add tests for trivial features like ARIA attributes that we just
-expose directly to the next layer up. In those cases the Blink tests are
-trivial and it's more valuable to test these features at a higher level
-where we can ensure they actually work.
+Don't add tests for trivial features like ARIA attributes that we just expose
+directly to the next layer up. In those cases the Blink tests are trivial and
+it's more valuable to test these features at a higher level where we can ensure
+they actually work.
 
-Note that many of these tests are inherited from WebKit and the coding style
-has evolved a lot since then. Look for more recent tests as a guide if writing
-a new one.
+Note that many of these tests are inherited from WebKit and the coding style has
+evolved a lot since then. Look for more recent tests as a guide if writing a new
+one.
 
 Test files:
-```
-third_party/blink/web_tests/accessibility
-```
+[third_party/blink/web_tests/accessibility](https://cs.chromium.org/chromium/src/third_party/blink/web_tests/accessibility/)
 
 Source code to AccessibilityController and WebAXObjectProxy:
-```
-content/shell/test_runner
-```
+[content/shell/test_runner](https://cs.chromium.org/chromium/src/content/shell/test_runner/)
 
 To run all accessibility web tests:
+
 ```
-autoninja -C out/release blink_tests
-third_party/blink/tools/run_web_tests.py --build-directory=out --target=release accessibility/
+autoninja -C out/release blink_tests third_party/blink/tools/run_web_tests.py \
+  --build-directory=out --target=release accessibility/
 ```
 
 To run just one test by itself without the script:
+
 ```
-autoninja -C out/release blink_tests
-out/release/content_shell --run-web-tests third_party/blink/web_tests/accessibility/name-calc-inputs.html
+autoninja -C out/release blink_tests && out/release/content_shell \
+  --run-web-tests third_party/blink/web_tests/accessibility/name-calc-inputs.html
 ```
 
+For information on modifying or adding web tests, see the main
+[web tests documentation](https://chromium.googlesource.com/chromium/src/+/master/docs/testing/web_tests.md).
+
 ## DumpAccessibilityTree tests
 
 This is the best way to write both cross-platform and platform-specific tests
@@ -53,32 +53,30 @@
 [More documentation on DumpAccessibilityTree](../../content/test/data/accessibility/readme.md)
 
 Test files:
-```
-content/test/data/accessibility
-```
+[content/test/data/accessibility](https://cs.chromium.org/chromium/src/content/test/data/accessibility/)
 
 Test runner:
-```
-content/browser/accessibility/dump_accessibility_tree_browsertest.cc
-```
+[content/browser/accessibility/dump_accessibility_tree_browsertest.cc](https://cs.chromium.org/chromium/src/content/browser/accessibility/dump_accessibility_tree_browsertest.cc)
 
 To run all tests:
+
 ```
-autoninja -C out/release content_browsertests
-out/release/content_browsertests --gtest_filter="DumpAccessibilityTree*"
+autoninja -C out/release content_browsertests && \
+  out/release/content_browsertests --gtest_filter="DumpAccessibilityTree*"
 ```
 
 ## Other content_browsertests
 
-There are many other tests in content/ that relate to accessibility.
-All of these tests work by launching a full multi-process browser shell,
-loading a web page in a renderer, then accessing the resulting accessibility
-tree from the browser process, and running some test from there.
+There are many other tests in content/ that relate to accessibility. All of
+these tests work by launching a full multi-process browser shell, loading a web
+page in a renderer, then accessing the resulting accessibility tree from the
+browser process, and running some test from there.
 
 To run all tests:
+
 ```
-autoninja -C out/release content_browsertests
-out/release/content_browsertests --gtest_filter="*ccessib*"
+autoninja -C out/release content_browsertests && \
+  out/release/content_browsertests --gtest_filter="*ccessib*"
 ```
 
 ## Accessibility unittests
@@ -87,33 +85,33 @@
 accessibility infrastructure.
 
 Code location:
-```
-ui/accessibility
-```
+[ui/accessibility](https://cs.chromium.org/chromium/src/ui/accessibility/)
 
 To run all tests:
+
 ```
-autoninja -C out/release accessibility_unittests
-out/release/accessibility_unittests
+autoninja -C out/release accessibility_unittests && \
+  out/release/accessibility_unittests
 ```
 
 ## ChromeVox tests
 
 ChromeVox tests are part of the browser_tests suite. You must build with
-```target_os = "chromeos"``` in your GN args.
+`target_os = "chromeos"` in your GN args.
 
 To run all tests:
+
 ```
-autoninja -C out/release browser_tests
-out/release/browser_tests --test-launcher-jobs=20 --gtest_filter=ChromeVox*
+autoninja -C out/release browser_tests && \
+  out/release/browser_tests --test-launcher-jobs=20 --gtest_filter=ChromeVox*
 ```
 
 ### Select-To-Speak tests
 
 ```
-autoninja -C out/release unit_tests browser_tests
-out/release/unit_tests --gtest_filter=*SelectToSpeak*
-out/release/browser_tests --gtest_filter=*SelectToSpeak*
+autoninja -C out/Default unit_tests browser_tests && \
+  out/Default/unit_tests --gtest_filter=*SelectToSpeak* && \
+  out/Default/browser_tests --gtest_filter=*SelectToSpeak*
 ```
 
 ## Performance tests
@@ -122,26 +120,21 @@
 
 ## Other locations of accessibility tests:
 
-Even this isn't a complete list. The tests described above cover more
-than 90% of the accessibility tests, and the remainder are scattered
-throughout the codebase. Here are a few other locations to check:
+Even this isn't a complete list. The tests described above cover more than 90%
+of the accessibility tests, and the remainder are scattered throughout the
+codebase. Here are a few other locations to check:
 
-```
-chrome/android/javatests/src/org/chromium/chrome/browser/accessibility
-chrome/browser/accessibility
-chrome/browser/chromeos/accessibility/
-ui/chromeos
-ui/views/accessibility
-```
+*   [chrome/android/javatests/src/org/chromium/chrome/browser/accessibility](https://cs.chromium.org/chromium/src/chrome/android/javatests/src/org/chromium/chrome/browser/accessibility/)
+*   [chrome/browser/accessibility](https://cs.chromium.org/chromium/src/chrome/browser/accessibility/)
+*   [chrome/browser/chromeos/accessibility/](https://cs.chromium.org/chromium/src/chrome/browser/chromeos/accessibility/)
+*   [ui/chromeos](https://cs.chromium.org/chromium/src/ui/chromeos/)
+*   [ui/views/accessibility](https://cs.chromium.org/chromium/src/ui/views/accessibility/)
 
 ## Helpful flags:
 
 Across all tests there are some helpful flags that will make testing easier.
 
-```
---test-launcher-jobs=10  # This will run stuff in parallel and make flakes more obvious
-```
+*   Run tests multiple times in parallel (useful for finding flakes):
+    `--test-launcher-jobs=10`
 
-```
---gtest_filter="*Cats*"  # Filter which tests run. Takes a wildcard (*) optionally.
-```
+*   Filter which tests to run: `--gtest_filter="*Cats*"`
diff --git a/docs/android_build_instructions.md b/docs/android_build_instructions.md
index 06332143e..96332a91 100644
--- a/docs/android_build_instructions.md
+++ b/docs/android_build_instructions.md
@@ -181,7 +181,7 @@
 
 The Google Play Store allows apps to send customized `.apk` files depending on
 the version of Android running on a device. Chrome uses this feature to target
-3 different versions using 3 different ninja targets:
+4 different versions using 4 different ninja targets:
 
 1. `chrome_public_apk` (ChromePublic.apk)
    * `minSdkVersion=19` (KitKat).
@@ -198,7 +198,14 @@
    * `minSdkVersion=24` (Nougat).
    * Contains both WebView and Chrome within the same APK.
      * This APK is even bigger, but much smaller than SystemWebView.apk + ChromePublic.apk.
-   * Stores libchrome.so uncompressed within the APK.
+   * Stores libmonochrome.so uncompressed within the APK.
+   * Does not use Crazy Linker (WebView requires system linker).
+     * But system linker supports crazy linker features now anyways.
+4. `trichrome_chrome_apk` and `trichrome_library_apk` (TrichromeChrome.apk and TrichromeLibrary.apk)
+   * `minSdkVersion=Q` (Q).
+   * TrichromeChrome contains only the Chrome code that is not shared with WebView.
+   * TrichromeLibrary contains the shared code and is a "static shared library APK", which must be installed prior to TrichromeChrome.
+   * Stores libmonochrome.so uncompressed within TrichromeLibrary.apk.
    * Does not use Crazy Linker (WebView requires system linker).
      * But system linker supports crazy linker features now anyways.
 
diff --git a/docs/android_native_libraries.md b/docs/android_native_libraries.md
index a2dfa972e7..9c13e39 100644
--- a/docs/android_native_libraries.md
+++ b/docs/android_native_libraries.md
@@ -9,8 +9,10 @@
  * Android L & M (ChromeModernPublic.apk):
    * `libchrome.so` is stored uncompressed within the apk (with the name `crazy.libchrome.so` to avoid extraction).
    * It is loaded directly from the apk (without extracting) by `mmap()`'ing it.
- * Android N+ (MonochromePublic.apk):
+ * Android N, O & P (MonochromePublic.apk):
    * `libmonochrome.so` is stored uncompressed (AndroidManifest.xml attribute disables extraction) and loaded directly from the apk (functionality now supported by the system linker).
+ * Android Q (TrichromeChrome.apk+TrichromeLibrary.apk):
+   * `libmonochrome.so` is stored in the shared library apk (TrichromeLibrary.apk) instead of in the Chrome apk, so that it can be shared with TrichromeWebView. It's stored uncompressed and loaded directly from the apk the same way as on N-P. Trichrome uses the same native library as Monochrome, so it's still called `libmonochrome.so`.
 
 ## Crashpad Packaging
  * Crashpad is a native library providing out-of-process crash dumping. When a
@@ -20,7 +22,7 @@
    * libcrashpad_handler.so is a standalone executable containing all of the
      crash dumping code. It is stored compressed and extracted automatically by
      the system, allowing it to be directly executed to produce a crash dump.
- * Monochrome (N through P), Trichrome (P), and SystemWebView (P-):
+ * Monochrome (N through P) and SystemWebView (L through P):
     * All of the Crashpad code is linked into the package's main native library
       (e.g. libmonochrome.so). When a dump is requested, /system/bin/app_process
       is executed, loading CrashpadMain.java which in turn uses JNI to call into
@@ -72,7 +74,7 @@
    * `JNI_OnLoad()` is the only exported symbol (enforced by a linker script).
    * Native methods registered explicitly during start-up by generated code.
      * Explicit generation is required because the Android runtime uses the system's `dlsym()`, which doesn't know about Crazy-Linker-opened libraries.
- * For MonochromePublic.apk:
+ * For MonochromePublic.apk and TrichromeChrome.apk:
    * `JNI_OnLoad()` and `Java_*` symbols are exported by linker script.
    * No manual JNI registration is done. Symbols are resolved lazily by the runtime.
 
@@ -107,17 +109,20 @@
       * Linker puts `GNU_RELRO` into private memory and applies relocations as per normal.
       * Afterwards, memory pages are compared against the shared memory and all identical pages are swapped out for ashmem ones (using `munmap()` & `mmap()`).
  * For a more detailed description, refer to comments in [Linker.java](https://cs.chromium.org/chromium/src/base/android/java/src/org/chromium/base/library_loader/Linker.java).
- * For Android N+:
+ * For Android N-P:
    * The OS maintains a RELRO file on disk with the contents of the GNU_RELRO segment.
    * All Android apps that contain a WebView load `libmonochrome.so` at the same virtual address and apply RELRO sharing against the memory-mapped RELRO file.
    * Chrome uses `MonochromeLibraryPreloader` to call into the same WebView library loading code.
      * When Monochrome is the WebView provider, `libmonochrome.so` is loaded with the system's cached RELRO's applied.
    * `System.loadLibrary()` is called afterwards.
      * When Monochrome is the WebView provider, this only calls JNI_OnLoad, since the library is already loaded. Otherwise, this loads the library and no RELRO sharing occurs.
- * For non-low-end Android O+ (where there's a WebView zygote):
+ * For non-low-end Android O-P (where there's a WebView zygote):
    * For non-renderer processes, the above Android N+ logic applies.
    * For renderer processes, the OS starts all Monochrome renderer processes by `fork()`ing the WebView zygote rather than the normal application zygote.
      * In this case, RELRO sharing would be redundant since the entire process' memory is shared with the zygote with copy-on-write semantics.
+ * For Android Q+ (Trichrome):
+   * TrichromeChrome no longer shares its RELRO data with WebView and no RELRO sharing occurs. TrichromeWebView works the same way as on Android N-P.
+   * TrichromeChrome's renderer processes are no longer `fork()`ed from the WebView zygote. TrichromeWebView works the same way as on Android N-P.
 
 ## Library Prefetching
  * During start-up, we `fork()` a process that reads a byte from each page of the library's memory (or just the ordered range of the library).
diff --git a/docs/infra/cq_builders.md b/docs/infra/cq_builders.md
index b3cd652..22dabe0 100644
--- a/docs/infra/cq_builders.md
+++ b/docs/infra/cq_builders.md
@@ -70,9 +70,9 @@
 
 * [win10_chromium_x64_rel_ng](https://ci.chromium.org/p/chromium/builders/luci.chromium.try/win10_chromium_x64_rel_ng) ([`commit-queue.cfg` entry](https://cs.chromium.org/search/?q=package:%5Echromium$+file:commit-queue.cfg+chromium/try/win10_chromium_x64_rel_ng)) ([matching builders](https://cs.chromium.org/search/?q=file:trybots.py+win10_chromium_x64_rel_ng))
 
-* [win_chromium_compile_dbg_ng](https://ci.chromium.org/p/chromium/builders/luci.chromium.try/win_chromium_compile_dbg_ng) ([`commit-queue.cfg` entry](https://cs.chromium.org/search/?q=package:%5Echromium$+file:commit-queue.cfg+chromium/try/win_chromium_compile_dbg_ng)) ([matching builders](https://cs.chromium.org/search/?q=file:trybots.py+win_chromium_compile_dbg_ng))
+* [win7-rel](https://ci.chromium.org/p/chromium/builders/luci.chromium.try/win7-rel) ([`commit-queue.cfg` entry](https://cs.chromium.org/search/?q=package:%5Echromium$+file:commit-queue.cfg+chromium/try/win7-rel)) ([matching builders](https://cs.chromium.org/search/?q=file:trybots.py+win7-rel))
 
-  TODO(crbug.com/948145): Re-add win7-rel once the bot has recovered.
+* [win_chromium_compile_dbg_ng](https://ci.chromium.org/p/chromium/builders/luci.chromium.try/win_chromium_compile_dbg_ng) ([`commit-queue.cfg` entry](https://cs.chromium.org/search/?q=package:%5Echromium$+file:commit-queue.cfg+chromium/try/win_chromium_compile_dbg_ng)) ([matching builders](https://cs.chromium.org/search/?q=file:trybots.py+win_chromium_compile_dbg_ng))
 
 
 ## Optional builders
diff --git a/docs/android_test_instructions.md b/docs/testing/android_test_instructions.md
similarity index 100%
rename from docs/android_test_instructions.md
rename to docs/testing/android_test_instructions.md
diff --git a/docs/ipc_fuzzer.md b/docs/testing/ipc_fuzzer.md
similarity index 100%
rename from docs/ipc_fuzzer.md
rename to docs/testing/ipc_fuzzer.md
diff --git a/docs/linux_running_asan_tests.md b/docs/testing/linux_running_asan_tests.md
similarity index 100%
rename from docs/linux_running_asan_tests.md
rename to docs/testing/linux_running_asan_tests.md
diff --git a/docs/test_descriptions.md b/docs/testing/test_descriptions.md
similarity index 100%
rename from docs/test_descriptions.md
rename to docs/testing/test_descriptions.md
diff --git a/docs/web_tests_linux.md b/docs/testing/web_tests_linux.md
similarity index 100%
rename from docs/web_tests_linux.md
rename to docs/testing/web_tests_linux.md
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h
index 9edb4dd..d6f0f7a1 100644
--- a/extensions/browser/extension_function_histogram_value.h
+++ b/extensions/browser/extension_function_histogram_value.h
@@ -1395,6 +1395,8 @@
   MANAGEMENT_INSTALLREPLACEMENTWEBAPP = 1332,
   FILEMANAGERPRIVATE_GETANDROIDPICKERAPPS = 1333,
   FILEMANAGERPRIVATE_SELECTANDROIDPICKERAPP = 1334,
+  AUTOTESTPRIVATE_GETSHELFALIGNMENT = 1335,
+  AUTOTESTPRIVATE_SETSHELFALIGNMENT = 1336,
   // Last entry: Add new entries above, then run:
   // python tools/metrics/histograms/update_extension_histograms.py
   ENUM_BOUNDARY
diff --git a/extensions/browser/extension_prefs.cc b/extensions/browser/extension_prefs.cc
index 1a3a25f..a7729c7 100644
--- a/extensions/browser/extension_prefs.cc
+++ b/extensions/browser/extension_prefs.cc
@@ -343,6 +343,9 @@
 }
 
 ExtensionPrefs::~ExtensionPrefs() {
+  for (auto& observer : observer_list_)
+    observer.OnExtensionPrefsWillBeDestroyed(this);
+  DCHECK(observer_list_.begin() == observer_list_.end());
 }
 
 // static
diff --git a/extensions/browser/extension_prefs_observer.h b/extensions/browser/extension_prefs_observer.h
index 6c52472e..83f6c21f 100644
--- a/extensions/browser/extension_prefs_observer.h
+++ b/extensions/browser/extension_prefs_observer.h
@@ -47,6 +47,12 @@
   // https://chromium-review.googlesource.com/c/chromium/src/+/1196107/3/chrome/browser/extensions/runtime_permissions_observer.h#26.
   virtual void OnExtensionRuntimePermissionsChanged(
       const std::string& extension_id) {}
+
+  // Called when the ExtensionPrefs object (the thing that this observer
+  // observes) will be destroyed. In response, the observer, |this|, should
+  // call "prefs->RemoveObserver(this)", whether directly or indirectly (e.g.
+  // via ScopedObserver::Remove).
+  virtual void OnExtensionPrefsWillBeDestroyed(ExtensionPrefs* prefs) {}
 };
 
 // An ExtensionPrefsObserver that's part of the GetEarlyExtensionPrefsObservers
diff --git a/fuchsia/runners/cast/cast_component.h b/fuchsia/runners/cast/cast_component.h
index 7b44f84..e8ee7ad 100644
--- a/fuchsia/runners/cast/cast_component.h
+++ b/fuchsia/runners/cast/cast_component.h
@@ -5,8 +5,6 @@
 #ifndef FUCHSIA_RUNNERS_CAST_CAST_COMPONENT_H_
 #define FUCHSIA_RUNNERS_CAST_CAST_COMPONENT_H_
 
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/sys/cpp/fidl.h>
 #include <lib/fidl/cpp/binding.h>
 #include <memory>
 
@@ -55,9 +53,6 @@
   std::unique_ptr<QueryableDataBindings> queryable_data_;
   std::unique_ptr<TouchInputBindings> touch_input_;
 
-  fuchsia::sys::ServiceProviderPtr agent_services_;
-  fuchsia::modular::AgentControllerPtr agent_controller_;
-
   fidl::Binding<fuchsia::web::NavigationEventListener>
       navigation_listener_binding_;
 
diff --git a/gpu/command_buffer/service/external_vk_image_factory.cc b/gpu/command_buffer/service/external_vk_image_factory.cc
index e0b7332..d8f3fe0 100644
--- a/gpu/command_buffer/service/external_vk_image_factory.cc
+++ b/gpu/command_buffer/service/external_vk_image_factory.cc
@@ -44,9 +44,8 @@
                         ->GetVulkanDevice();
 
   VkFormat vk_format = ToVkFormat(format);
-  VkResult result;
   VkImage image;
-  result = CreateExternalVkImage(vk_format, size, &image);
+  VkResult result = CreateExternalVkImage(vk_format, size, &image);
   if (result != VK_SUCCESS) {
     LOG(ERROR) << "Failed to create external VkImage: " << result;
     return nullptr;
@@ -218,14 +217,52 @@
     const Mailbox& mailbox,
     int client_id,
     gfx::GpuMemoryBufferHandle handle,
-    gfx::BufferFormat format,
+    gfx::BufferFormat buffer_format,
     SurfaceHandle surface_handle,
     const gfx::Size& size,
     const gfx::ColorSpace& color_space,
     uint32_t usage) {
-  // GpuMemoryBuffers supported is not implemented yet.
-  NOTIMPLEMENTED();
-  return nullptr;
+  DCHECK(CanImportGpuMemoryBuffer(handle.type));
+
+  if (!gpu::IsImageSizeValidForGpuMemoryBufferFormat(size, buffer_format)) {
+    LOG(ERROR) << "Invalid image size for format.";
+    return nullptr;
+  }
+
+  auto* vk_context_provider = context_state_->vk_context_provider();
+  VkDevice vk_device = vk_context_provider->GetDeviceQueue()->GetVulkanDevice();
+  VkImage vk_image = VK_NULL_HANDLE;
+  VkImageCreateInfo vk_image_info{};
+  VkDeviceMemory vk_device_memory = VK_NULL_HANDLE;
+  VkDeviceSize memory_size = 0;
+  if (!vk_context_provider->GetVulkanImplementation()
+           ->CreateImageFromGpuMemoryHandle(vk_device, std::move(handle), size,
+                                            &vk_image, &vk_image_info,
+                                            &vk_device_memory, &memory_size)) {
+    return nullptr;
+  }
+
+  VkFormat expected_format = ToVkFormat(viz::GetResourceFormat(buffer_format));
+  if (expected_format != vk_image_info.format) {
+    DLOG(ERROR) << "BufferFormat doesn't match the buffer";
+    vkFreeMemory(vk_device, vk_device_memory, nullptr);
+    vkDestroyImage(vk_device, vk_image, nullptr);
+    return nullptr;
+  }
+
+  TransitionToColorAttachment(vk_image);
+
+  return std::make_unique<ExternalVkImageBacking>(
+      mailbox, viz::GetResourceFormat(buffer_format), size, color_space, usage,
+      context_state_, vk_image, vk_device_memory, memory_size,
+      vk_image_info.format);
+}
+
+bool ExternalVkImageFactory::CanImportGpuMemoryBuffer(
+    gfx::GpuMemoryBufferType memory_buffer_type) {
+  return context_state_->vk_context_provider()
+      ->GetVulkanImplementation()
+      ->CanImportGpuMemoryBuffer(memory_buffer_type);
 }
 
 VkResult ExternalVkImageFactory::CreateExternalVkImage(VkFormat format,
diff --git a/gpu/command_buffer/service/external_vk_image_factory.h b/gpu/command_buffer/service/external_vk_image_factory.h
index d730a41..383b2df 100644
--- a/gpu/command_buffer/service/external_vk_image_factory.h
+++ b/gpu/command_buffer/service/external_vk_image_factory.h
@@ -48,6 +48,8 @@
       const gfx::Size& size,
       const gfx::ColorSpace& color_space,
       uint32_t usage) override;
+  bool CanImportGpuMemoryBuffer(
+      gfx::GpuMemoryBufferType memory_buffer_type) override;
 
  private:
   VkResult CreateExternalVkImage(VkFormat format,
diff --git a/gpu/command_buffer/service/shared_image_backing_factory.h b/gpu/command_buffer/service/shared_image_backing_factory.h
index 82ab25c2..406b13c 100644
--- a/gpu/command_buffer/service/shared_image_backing_factory.h
+++ b/gpu/command_buffer/service/shared_image_backing_factory.h
@@ -47,6 +47,11 @@
       const gfx::Size& size,
       const gfx::ColorSpace& color_space,
       uint32_t usage) = 0;
+
+  // Returns true if the specified GpuMemoryBufferType can be imported using
+  // this factory.
+  virtual bool CanImportGpuMemoryBuffer(
+      gfx::GpuMemoryBufferType memory_buffer_type) = 0;
 };
 
 }  // namespace gpu
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.cc b/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.cc
index 1d3f1a7..0d597bb0 100644
--- a/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.cc
+++ b/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.cc
@@ -1026,6 +1026,11 @@
   return nullptr;
 }
 
+bool SharedImageBackingFactoryAHB::CanImportGpuMemoryBuffer(
+    gfx::GpuMemoryBufferType memory_buffer_type) {
+  return false;
+}
+
 SharedImageBackingFactoryAHB::FormatInfo::FormatInfo() = default;
 SharedImageBackingFactoryAHB::FormatInfo::~FormatInfo() = default;
 
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.h b/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.h
index a1cec359..49cf7fea 100644
--- a/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.h
+++ b/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.h
@@ -55,6 +55,8 @@
       const gfx::Size& size,
       const gfx::ColorSpace& color_space,
       uint32_t usage) override;
+  bool CanImportGpuMemoryBuffer(
+      gfx::GpuMemoryBufferType memory_buffer_type) override;
 
  private:
   struct FormatInfo {
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_gl_texture.cc b/gpu/command_buffer/service/shared_image_backing_factory_gl_texture.cc
index a0d54bc..0126a74c 100644
--- a/gpu/command_buffer/service/shared_image_backing_factory_gl_texture.cc
+++ b/gpu/command_buffer/service/shared_image_backing_factory_gl_texture.cc
@@ -1045,6 +1045,14 @@
       std::move(handle), size, format, client_id, surface_handle);
 }
 
+bool SharedImageBackingFactoryGLTexture::CanImportGpuMemoryBuffer(
+    gfx::GpuMemoryBufferType memory_buffer_type) {
+  // SharedImageFactory may call CanImportGpuMemoryBuffer() in all other
+  // SharedImageBackingFactory implementations except this one.
+  NOTREACHED();
+  return true;
+}
+
 std::unique_ptr<SharedImageBacking>
 SharedImageBackingFactoryGLTexture::MakeBacking(
     bool passthrough,
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_gl_texture.h b/gpu/command_buffer/service/shared_image_backing_factory_gl_texture.h
index 7dba8b7..d077ef449 100644
--- a/gpu/command_buffer/service/shared_image_backing_factory_gl_texture.h
+++ b/gpu/command_buffer/service/shared_image_backing_factory_gl_texture.h
@@ -71,6 +71,8 @@
       const gfx::Size& size,
       const gfx::ColorSpace& color_space,
       uint32_t usage) override;
+  bool CanImportGpuMemoryBuffer(
+      gfx::GpuMemoryBufferType memory_buffer_type) override;
 
   static std::unique_ptr<SharedImageBacking> CreateSharedImageForTest(
       const Mailbox& mailbox,
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_iosurface.h b/gpu/command_buffer/service/shared_image_backing_factory_iosurface.h
index 68caa0a..c59b4c91 100644
--- a/gpu/command_buffer/service/shared_image_backing_factory_iosurface.h
+++ b/gpu/command_buffer/service/shared_image_backing_factory_iosurface.h
@@ -58,6 +58,8 @@
       const gfx::Size& size,
       const gfx::ColorSpace& color_space,
       uint32_t usage) override;
+  bool CanImportGpuMemoryBuffer(
+      gfx::GpuMemoryBufferType memory_buffer_type) override;
 
  private:
   void CollectGLFormatInfo(const GpuDriverBugWorkarounds& workarounds,
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_iosurface.mm b/gpu/command_buffer/service/shared_image_backing_factory_iosurface.mm
index fb4b283..2d7ee33 100644
--- a/gpu/command_buffer/service/shared_image_backing_factory_iosurface.mm
+++ b/gpu/command_buffer/service/shared_image_backing_factory_iosurface.mm
@@ -652,4 +652,9 @@
   return nullptr;
 }
 
+bool SharedImageBackingFactoryIOSurface::CanImportGpuMemoryBuffer(
+    gfx::GpuMemoryBufferType memory_buffer_type) {
+  return false;
+}
+
 }  // namespace gpu
diff --git a/gpu/command_buffer/service/shared_image_factory.cc b/gpu/command_buffer/service/shared_image_factory.cc
index e4b12bb..1040019b 100644
--- a/gpu/command_buffer/service/shared_image_factory.cc
+++ b/gpu/command_buffer/service/shared_image_factory.cc
@@ -176,15 +176,7 @@
   // TODO(piman): depending on handle.type, choose platform-specific backing
   // factory, e.g. SharedImageBackingFactoryAHB.
   bool allow_legacy_mailbox = false;
-  SharedImageBackingFactory* factory = nullptr;
-  if (!using_vulkan_) {
-    // GMB is only supported by gl backing factory when gl is being used.
-    allow_legacy_mailbox = true;
-    factory = gl_backing_factory_.get();
-  } else {
-    // TODO(penghuang): support GMB for vulkan.
-    NOTIMPLEMENTED() << "GMB is not supported for vulkan.";
-  }
+  auto* factory = GetFactoryByUsage(usage, &allow_legacy_mailbox, handle.type);
   if (!factory)
     return false;
   auto backing =
@@ -273,7 +265,8 @@
 
 SharedImageBackingFactory* SharedImageFactory::GetFactoryByUsage(
     uint32_t usage,
-    bool* allow_legacy_mailbox) {
+    bool* allow_legacy_mailbox,
+    gfx::GpuMemoryBufferType gmb_type) {
   bool using_dawn = usage & SHARED_IMAGE_USAGE_WEBGPU;
   bool vulkan_usage = using_vulkan_ && (usage & SHARED_IMAGE_USAGE_DISPLAY);
   bool gl_usage = usage & SHARED_IMAGE_USAGE_GLES2;
@@ -292,6 +285,23 @@
                                 !using_interop_factory;
   using_interop_factory |= vulkan_usage && !using_wrapped_sk_image;
 
+  if (gmb_type != gfx::EMPTY_BUFFER) {
+    bool interop_factory_supports_gmb =
+        interop_backing_factory_ &&
+        interop_backing_factory_->CanImportGpuMemoryBuffer(gmb_type);
+
+    if (using_wrapped_sk_image ||
+        (using_interop_factory && !interop_backing_factory_)) {
+      LOG(ERROR) << "Unable to screate SharedImage backing: no support for the "
+                    "requested GpuMemoryBufferType.";
+      return nullptr;
+    }
+
+    // If |interop_backing_factory_| supports supplied GMB type then use it
+    // instead of |gl_backing_factory_|.
+    using_interop_factory |= interop_factory_supports_gmb;
+  }
+
   *allow_legacy_mailbox =
       !using_wrapped_sk_image && !using_interop_factory && !using_vulkan_;
 
diff --git a/gpu/command_buffer/service/shared_image_factory.h b/gpu/command_buffer/service/shared_image_factory.h
index c4370e2..06d4b61 100644
--- a/gpu/command_buffer/service/shared_image_factory.h
+++ b/gpu/command_buffer/service/shared_image_factory.h
@@ -98,8 +98,10 @@
 
  private:
   bool IsSharedBetweenThreads(uint32_t usage);
-  SharedImageBackingFactory* GetFactoryByUsage(uint32_t usage,
-                                               bool* allow_legacy_mailbox);
+  SharedImageBackingFactory* GetFactoryByUsage(
+      uint32_t usage,
+      bool* allow_legacy_mailbox,
+      gfx::GpuMemoryBufferType gmb_type = gfx::EMPTY_BUFFER);
   MailboxManager* mailbox_manager_;
   SharedImageManager* shared_image_manager_;
   std::unique_ptr<MemoryTypeTracker> memory_tracker_;
diff --git a/gpu/command_buffer/service/wrapped_sk_image.cc b/gpu/command_buffer/service/wrapped_sk_image.cc
index 1d52e077..7bba6ac 100644
--- a/gpu/command_buffer/service/wrapped_sk_image.cc
+++ b/gpu/command_buffer/service/wrapped_sk_image.cc
@@ -12,6 +12,7 @@
 #include "base/trace_event/trace_event.h"
 #include "components/viz/common/resources/resource_format_utils.h"
 #include "gpu/command_buffer/common/shared_image_trace_utils.h"
+#include "gpu/command_buffer/service/feature_info.h"
 #include "gpu/command_buffer/service/mailbox_manager.h"
 #include "gpu/command_buffer/service/shared_context_state.h"
 #include "gpu/command_buffer/service/shared_image_backing.h"
@@ -22,6 +23,7 @@
 #include "third_party/skia/include/gpu/GrBackendSurface.h"
 #include "third_party/skia/include/gpu/GrTypes.h"
 #include "ui/gl/gl_context.h"
+#include "ui/gl/gl_gl_api_implementation.h"
 #include "ui/gl/trace_util.h"
 
 namespace gpu {
@@ -44,8 +46,8 @@
   }
 
   void Destroy() override {
-    DCHECK(!!image_);
-    image_.reset();
+    DCHECK(!!surface_);
+    surface_.reset();
   }
 
   bool IsCleared() const override { return cleared_; }
@@ -70,22 +72,38 @@
   }
 
   sk_sp<SkSurface> GetSkSurface(int final_msaa_count,
-                                SkColorType color_type,
-                                sk_sp<SkColorSpace> color_space,
                                 const SkSurfaceProps& surface_props) {
     if (context_state_->context_lost())
       return nullptr;
     DCHECK(context_state_->IsCurrent(nullptr));
-    GrBackendTexture gr_texture =
-        image_->getBackendTexture(/*flushPendingGrContextIO=*/true);
-    DCHECK(gr_texture.isValid());
+    SkColorType sk_color_type = viz::ResourceFormatToClosestSkColorType(
+        /*gpu_compositing=*/true, format());
+
     return SkSurface::MakeFromBackendTexture(
-        context_state_->gr_context(), gr_texture, kTopLeft_GrSurfaceOrigin,
-        final_msaa_count, color_type, color_space, &surface_props);
+        context_state_->gr_context(), promise_texture_->backendTexture(),
+        kTopLeft_GrSurfaceOrigin, final_msaa_count, sk_color_type,
+        color_space().ToSkColorSpace(), &surface_props);
   }
 
   sk_sp<SkPromiseImageTexture> promise_texture() { return promise_texture_; }
 
+  // TODO(backer): Check if we can remove this once Skia gives us an API to
+  // explicitly allocate GPU memory and we can remove surface_.
+  void ApplyUnbindWorkaround() {
+    if (!context_state_->GrContextIsGL())
+      return;
+
+    // This seems like https://crbug.com/457027 because it only affects Adreno
+    // 4XX and happens just before a glDeleteFramebuffer (triggered by
+    // ~SkSurface). Unfortunately, it does not seem to be enough to just clear
+    // the FBO attachments (which Skia does downstream). The other workaround
+    // listed in https://crbug.com/457027 is a glFlush() and it does work.
+    if (context_state_->feature_info()
+            ->workarounds()
+            .unbind_attachments_on_bound_render_fbo_delete)
+      gl::g_current_gl_context->glFlushFn();
+  }
+
  protected:
   std::unique_ptr<SharedImageRepresentationSkia> ProduceSkia(
       SharedImageManager* manager,
@@ -120,36 +138,27 @@
 
     context_state_->set_need_context_state_reset(true);
 
-    if (data.empty()) {
-      auto surface = SkSurface::MakeRenderTarget(context_state_->gr_context(),
-                                                 SkBudgeted::kNo, info);
-      if (!surface)
-        return false;
+    surface_ = SkSurface::MakeRenderTarget(context_state_->gr_context(),
+                                           SkBudgeted::kNo, info);
+    if (!surface_)
+      return false;
 
 #if DCHECK_IS_ON()
-      auto* canvas = surface->getCanvas();
-      canvas->clear(SK_ColorGREEN);
+    auto* canvas = surface_->getCanvas();
+    canvas->clear(SK_ColorGREEN);
 #endif
 
-      image_ = surface->makeImageSnapshot();
-    } else {
+    if (!data.empty()) {
       SkBitmap bitmap;
       if (!bitmap.installPixels(info, const_cast<uint8_t*>(data.data()),
                                 info.minRowBytes())) {
         return false;
       }
-      sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);
-      if (!image)
-        return false;
-      image_ = image->makeTextureImage(context_state_->gr_context(),
-                                       image->colorSpace());
+      surface_->writePixels(bitmap, /*dstX=*/0, /*dstY=*/0);
     }
 
-    if (!image_ || !image_->isTextureBacked())
-      return false;
-
     auto gr_texture =
-        image_->getBackendTexture(/*flushPendingGrContextIO=*/false);
+        surface_->getBackendTexture(SkSurface::kFlushWrite_BackendHandleAccess);
     if (!gr_texture.isValid())
       return false;
     promise_texture_ = SkPromiseImageTexture::Make(gr_texture);
@@ -176,7 +185,7 @@
 
   SharedContextState* const context_state_;
 
-  sk_sp<SkImage> image_;
+  sk_sp<SkSurface> surface_;
   sk_sp<SkPromiseImageTexture> promise_texture_;
 
   bool cleared_ = false;
@@ -200,12 +209,8 @@
       const SkSurfaceProps& surface_props,
       std::vector<GrBackendSemaphore>* begin_semaphores,
       std::vector<GrBackendSemaphore>* end_semaphores) override {
-    SkColorType sk_color_type = viz::ResourceFormatToClosestSkColorType(
-        /*gpu_compositing=*/true, format());
-
-    auto surface = wrapped_sk_image()->GetSkSurface(
-        final_msaa_count, sk_color_type,
-        backing()->color_space().ToSkColorSpace(), surface_props);
+    auto surface =
+        wrapped_sk_image()->GetSkSurface(final_msaa_count, surface_props);
     write_surface_ = surface.get();
     return surface;
   }
@@ -213,16 +218,19 @@
   void EndWriteAccess(sk_sp<SkSurface> surface) override {
     DCHECK_EQ(surface.get(), write_surface_);
     DCHECK(surface->unique());
+    wrapped_sk_image()->ApplyUnbindWorkaround();
     write_surface_ = nullptr;
   }
 
   sk_sp<SkPromiseImageTexture> BeginReadAccess(
       std::vector<GrBackendSemaphore>* begin_semaphores,
       std::vector<GrBackendSemaphore>* end_semaphores) override {
+    DCHECK(!write_surface_);
     return wrapped_sk_image()->promise_texture();
   }
 
   void EndReadAccess() override {
+    DCHECK(!write_surface_);
     // TODO(ericrk): Handle begin/end correctness checks.
   }
 
@@ -286,6 +294,11 @@
   return nullptr;
 }
 
+bool WrappedSkImageFactory::CanImportGpuMemoryBuffer(
+    gfx::GpuMemoryBufferType memory_buffer_type) {
+  return false;
+}
+
 std::unique_ptr<SharedImageRepresentationSkia> WrappedSkImage::ProduceSkia(
     SharedImageManager* manager,
     MemoryTypeTracker* tracker,
diff --git a/gpu/command_buffer/service/wrapped_sk_image.h b/gpu/command_buffer/service/wrapped_sk_image.h
index 8529d9b2..b549965f 100644
--- a/gpu/command_buffer/service/wrapped_sk_image.h
+++ b/gpu/command_buffer/service/wrapped_sk_image.h
@@ -51,6 +51,8 @@
       const gfx::Size& size,
       const gfx::ColorSpace& color_space,
       uint32_t usage) override;
+  bool CanImportGpuMemoryBuffer(
+      gfx::GpuMemoryBufferType memory_buffer_type) override;
 
  private:
   SharedContextState* const context_state_;
diff --git a/gpu/ipc/common/gpu_memory_buffer_impl_native_pixmap_unittest.cc b/gpu/ipc/common/gpu_memory_buffer_impl_native_pixmap_unittest.cc
index e2070dc..f6da0a87 100644
--- a/gpu/ipc/common/gpu_memory_buffer_impl_native_pixmap_unittest.cc
+++ b/gpu/ipc/common/gpu_memory_buffer_impl_native_pixmap_unittest.cc
@@ -12,15 +12,11 @@
 
 // On Fuchsia NativePixmap depends on Vulkan, which is not initialized in tests.
 // See crbug.com/957700
-#if defined(OS_FUCHSIA)
-#define MAYBE_GpuMemoryBufferImplNativePixmap \
-  DISABLED_GpuMemoryBufferImplNativePixmap
-#else
-#define MAYBE_GpuMemoryBufferImplNativePixmap GpuMemoryBufferImplNativePixmap
-#endif
-INSTANTIATE_TYPED_TEST_SUITE_P(MAYBE_GpuMemoryBufferImplNativePixmap,
+#if !defined(OS_FUCHSIA)
+INSTANTIATE_TYPED_TEST_SUITE_P(GpuMemoryBufferImplNativePixmap,
                                GpuMemoryBufferImplTest,
                                GpuMemoryBufferImplNativePixmap);
+#endif
 
 }  // namespace
 }  // namespace gpu
diff --git a/gpu/ipc/service/gpu_memory_buffer_factory_native_pixmap_unittest.cc b/gpu/ipc/service/gpu_memory_buffer_factory_native_pixmap_unittest.cc
index 84f1792f..8af3ce4 100644
--- a/gpu/ipc/service/gpu_memory_buffer_factory_native_pixmap_unittest.cc
+++ b/gpu/ipc/service/gpu_memory_buffer_factory_native_pixmap_unittest.cc
@@ -12,16 +12,11 @@
 
 // On Fuchsia NativePixmap depends on Vulkan, which is not initialized in tests.
 // See crbug.com/957700
-#if defined(OS_FUCHSIA)
-#define MAYBE_GpuMemoryBufferFactoryNativePixmap \
-  DISABLED_GpuMemoryBufferFactoryNativePixmap
-#else
-#define MAYBE_GpuMemoryBufferFactoryNativePixmap \
-  GpuMemoryBufferFactoryNativePixmap
-#endif
-INSTANTIATE_TYPED_TEST_SUITE_P(MAYBE_GpuMemoryBufferFactoryNativePixmap,
+#if !defined(OS_FUCHSIA)
+INSTANTIATE_TYPED_TEST_SUITE_P(GpuMemoryBufferFactoryNativePixmap,
                                GpuMemoryBufferFactoryTest,
                                GpuMemoryBufferFactoryNativePixmap);
+#endif
 
 }  // namespace
 }  // namespace gpu
diff --git a/gpu/vulkan/android/vulkan_implementation_android.cc b/gpu/vulkan/android/vulkan_implementation_android.cc
index 2a7ef88f..50f8cf4 100644
--- a/gpu/vulkan/android/vulkan_implementation_android.cc
+++ b/gpu/vulkan/android/vulkan_implementation_android.cc
@@ -15,6 +15,7 @@
 #include "gpu/vulkan/vulkan_surface.h"
 #include "gpu/vulkan/vulkan_util.h"
 #include "ui/gfx/gpu_fence.h"
+#include "ui/gfx/gpu_memory_buffer.h"
 
 namespace gpu {
 
@@ -134,6 +135,25 @@
   return VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
 }
 
+bool VulkanImplementationAndroid::CanImportGpuMemoryBuffer(
+    gfx::GpuMemoryBufferType memory_buffer_type) {
+  return false;
+}
+
+bool VulkanImplementationAndroid::CreateImageFromGpuMemoryHandle(
+    VkDevice vk_device,
+    gfx::GpuMemoryBufferHandle gmb_handle,
+    gfx::Size size,
+    VkImage* vk_image,
+    VkImageCreateInfo* vk_image_info,
+    VkDeviceMemory* vk_device_memory,
+    VkDeviceSize* mem_allocation_size) {
+  // TODO(sergeyu): Move code from CreateVkImageAndImportAHB() here and remove
+  // CreateVkImageAndImportAHB().
+  NOTIMPLEMENTED();
+  return false;
+}
+
 bool VulkanImplementationAndroid::CreateVkImageAndImportAHB(
     const VkDevice& vk_device,
     const VkPhysicalDevice& vk_physical_device,
diff --git a/gpu/vulkan/android/vulkan_implementation_android.h b/gpu/vulkan/android/vulkan_implementation_android.h
index 6657900..ee0add3a 100644
--- a/gpu/vulkan/android/vulkan_implementation_android.h
+++ b/gpu/vulkan/android/vulkan_implementation_android.h
@@ -41,6 +41,16 @@
   SemaphoreHandle GetSemaphoreHandle(VkDevice vk_device,
                                      VkSemaphore vk_semaphore) override;
   VkExternalMemoryHandleTypeFlagBits GetExternalImageHandleType() override;
+  bool CanImportGpuMemoryBuffer(
+      gfx::GpuMemoryBufferType memory_buffer_type) override;
+  bool CreateImageFromGpuMemoryHandle(
+      VkDevice vk_device,
+      gfx::GpuMemoryBufferHandle gmb_handle,
+      gfx::Size size,
+      VkImage* vk_image,
+      VkImageCreateInfo* vk_image_info,
+      VkDeviceMemory* vk_device_memory,
+      VkDeviceSize* mem_allocation_size) override;
   bool CreateVkImageAndImportAHB(
       const VkDevice& vk_device,
       const VkPhysicalDevice& vk_physical_device,
diff --git a/gpu/vulkan/vulkan_implementation.h b/gpu/vulkan/vulkan_implementation.h
index 4bd584aa..a86b7a0 100644
--- a/gpu/vulkan/vulkan_implementation.h
+++ b/gpu/vulkan/vulkan_implementation.h
@@ -14,6 +14,9 @@
 #include "build/build_config.h"
 #include "gpu/vulkan/semaphore_handle.h"
 #include "gpu/vulkan/vulkan_export.h"
+#include "ui/gfx/buffer_types.h"
+#include "ui/gfx/geometry/size.h"
+#include "ui/gfx/gpu_memory_buffer.h"
 #include "ui/gfx/native_widget_types.h"
 
 #if defined(OS_ANDROID)
@@ -23,7 +26,8 @@
 
 namespace gfx {
 class GpuFence;
-}
+struct GpuMemoryBufferHandle;
+}  // namespace gfx
 
 namespace gpu {
 
@@ -85,9 +89,29 @@
   // external images and memory.
   virtual VkExternalMemoryHandleTypeFlagBits GetExternalImageHandleType() = 0;
 
+  // Returns true if the GpuMemoryBuffer of the specified type can be imported
+  // into VkImage using CreateImageFromGpuMemoryHandle().
+  virtual bool CanImportGpuMemoryBuffer(
+      gfx::GpuMemoryBufferType memory_buffer_type) = 0;
+
+  // Creates a VkImage from a GpuMemoryBuffer. If successful it initializes
+  // |vk_image|, |vk_image_info|, |vk_device_memory| and |mem_allocation_size|.
+  // Implementation must verify that the specified |size| fits in the size
+  // specified when |gmb_handle| was allocated.
+  virtual bool CreateImageFromGpuMemoryHandle(
+      VkDevice vk_device,
+      gfx::GpuMemoryBufferHandle gmb_handle,
+      gfx::Size size,
+      VkImage* vk_image,
+      VkImageCreateInfo* vk_image_info,
+      VkDeviceMemory* vk_device_memory,
+      VkDeviceSize* mem_allocation_size) = 0;
+
 #if defined(OS_ANDROID)
   // Create a VkImage, import Android AHardwareBuffer object created outside of
   // the Vulkan device into Vulkan memory object and bind it to the VkImage.
+  // TODO(sergeyu): Remove this method and use
+  // CreateVkImageFromGpuMemoryHandle() instead.
   virtual bool CreateVkImageAndImportAHB(
       const VkDevice& vk_device,
       const VkPhysicalDevice& vk_physical_device,
diff --git a/gpu/vulkan/win32/vulkan_implementation_win32.cc b/gpu/vulkan/win32/vulkan_implementation_win32.cc
index fc14a80..61b5a44 100644
--- a/gpu/vulkan/win32/vulkan_implementation_win32.cc
+++ b/gpu/vulkan/win32/vulkan_implementation_win32.cc
@@ -12,6 +12,7 @@
 #include "gpu/vulkan/vulkan_instance.h"
 #include "gpu/vulkan/vulkan_surface.h"
 #include "ui/gfx/gpu_fence.h"
+#include "ui/gfx/gpu_memory_buffer.h"
 
 namespace gpu {
 
@@ -129,4 +130,21 @@
   return VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT;
 }
 
+bool VulkanImplementationWin32::CanImportGpuMemoryBuffer(
+    gfx::GpuMemoryBufferType memory_buffer_type) {
+  return false;
+}
+
+bool VulkanImplementationWin32::CreateImageFromGpuMemoryHandle(
+    VkDevice vk_device,
+    gfx::GpuMemoryBufferHandle gmb_handle,
+    gfx::Size size,
+    VkImage* vk_image,
+    VkImageCreateInfo* vk_image_info,
+    VkDeviceMemory* vk_device_memory,
+    VkDeviceSize* mem_allocation_size) {
+  NOTIMPLEMENTED();
+  return false;
+}
+
 }  // namespace gpu
diff --git a/gpu/vulkan/win32/vulkan_implementation_win32.h b/gpu/vulkan/win32/vulkan_implementation_win32.h
index d49134b..bbce467d 100644
--- a/gpu/vulkan/win32/vulkan_implementation_win32.h
+++ b/gpu/vulkan/win32/vulkan_implementation_win32.h
@@ -39,6 +39,16 @@
   SemaphoreHandle GetSemaphoreHandle(VkDevice vk_device,
                                      VkSemaphore vk_semaphore) override;
   VkExternalMemoryHandleTypeFlagBits GetExternalImageHandleType() override;
+  bool CanImportGpuMemoryBuffer(
+      gfx::GpuMemoryBufferType memory_buffer_type) override;
+  bool CreateImageFromGpuMemoryHandle(
+      VkDevice vk_device,
+      gfx::GpuMemoryBufferHandle gmb_handle,
+      gfx::Size size,
+      VkImage* vk_image,
+      VkImageCreateInfo* vk_image_info,
+      VkDeviceMemory* vk_device_memory,
+      VkDeviceSize* mem_allocation_size) override;
 
  private:
   VulkanInstance vulkan_instance_;
diff --git a/gpu/vulkan/x/vulkan_implementation_x11.cc b/gpu/vulkan/x/vulkan_implementation_x11.cc
index 69ef970..6c27fb7 100644
--- a/gpu/vulkan/x/vulkan_implementation_x11.cc
+++ b/gpu/vulkan/x/vulkan_implementation_x11.cc
@@ -15,6 +15,7 @@
 #include "gpu/vulkan/vulkan_util.h"
 #include "gpu/vulkan/x/vulkan_surface_x11.h"
 #include "ui/gfx/gpu_fence.h"
+#include "ui/gfx/gpu_memory_buffer.h"
 
 namespace gpu {
 
@@ -135,4 +136,21 @@
   return VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT;
 }
 
+bool VulkanImplementationX11::CanImportGpuMemoryBuffer(
+    gfx::GpuMemoryBufferType memory_buffer_type) {
+  return false;
+}
+
+bool VulkanImplementationX11::CreateImageFromGpuMemoryHandle(
+    VkDevice vk_device,
+    gfx::GpuMemoryBufferHandle gmb_handle,
+    gfx::Size size,
+    VkImage* vk_image,
+    VkImageCreateInfo* vk_image_info,
+    VkDeviceMemory* vk_device_memory,
+    VkDeviceSize* mem_allocation_size) {
+  NOTIMPLEMENTED();
+  return false;
+}
+
 }  // namespace gpu
diff --git a/gpu/vulkan/x/vulkan_implementation_x11.h b/gpu/vulkan/x/vulkan_implementation_x11.h
index 0d3116f..d0837b8 100644
--- a/gpu/vulkan/x/vulkan_implementation_x11.h
+++ b/gpu/vulkan/x/vulkan_implementation_x11.h
@@ -40,6 +40,16 @@
   SemaphoreHandle GetSemaphoreHandle(VkDevice vk_device,
                                      VkSemaphore vk_semaphore) override;
   VkExternalMemoryHandleTypeFlagBits GetExternalImageHandleType() override;
+  bool CanImportGpuMemoryBuffer(
+      gfx::GpuMemoryBufferType memory_buffer_type) override;
+  bool CreateImageFromGpuMemoryHandle(
+      VkDevice vk_device,
+      gfx::GpuMemoryBufferHandle gmb_handle,
+      gfx::Size size,
+      VkImage* vk_image,
+      VkImageCreateInfo* vk_image_info,
+      VkDeviceMemory* vk_device_memory,
+      VkDeviceSize* mem_allocation_size) override;
 
  private:
   bool using_surface_ = true;
diff --git a/infra/config/commit-queue.cfg b/infra/config/commit-queue.cfg
index b088380..a337143 100644
--- a/infra/config/commit-queue.cfg
+++ b/infra/config/commit-queue.cfg
@@ -140,7 +140,9 @@
       builders {
         name: "chromium/try/win10_chromium_x64_rel_ng"
       }
-      # TODO(crbug.com/948145): Re-add win7-rel once the bot has recovered.
+      builders {
+        name: "chromium/try/win7-rel"
+      }
       builders {
         name: "chromium/try/win_chromium_compile_dbg_ng"
       }
diff --git a/ios/chrome/app/main_controller.mm b/ios/chrome/app/main_controller.mm
index de2c98bd..cf940f9 100644
--- a/ios/chrome/app/main_controller.mm
+++ b/ios/chrome/app/main_controller.mm
@@ -965,10 +965,13 @@
 - (void)stopChromeMain {
   // The UI should be stopped before the models they observe are stopped.
   [_mainCoordinator stop];
+  _mainCoordinator = nil;
 
   [_spotlightManager shutdown];
   _spotlightManager = nil;
 
+  // Invariant: The UI is stopped before the model is shutdown.
+  DCHECK(!_mainCoordinator);
   [_browserViewWrangler shutdown];
   _browserViewWrangler = nil;
 
diff --git a/ios/chrome/browser/about_flags.mm b/ios/chrome/browser/about_flags.mm
index 432d595..1f524fa 100644
--- a/ios/chrome/browser/about_flags.mm
+++ b/ios/chrome/browser/about_flags.mm
@@ -581,6 +581,10 @@
      flags_ui::kOsIos,
      FEATURE_VALUE_TYPE(
          autofill::features::kAutofillUseMobileLabelDisambiguation)},
+    {"enable-autofill-prune-suggestions",
+     flag_descriptions::kAutofillPruneSuggestionsName,
+     flag_descriptions::kAutofillPruneSuggestionsDescription, flags_ui::kOsIos,
+     FEATURE_VALUE_TYPE(autofill::features::kAutofillPruneSuggestions)},
 };
 
 // Add all switches from experimental flags to |command_line|.
diff --git a/ios/chrome/browser/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/ios_chrome_flag_descriptions.cc
index 437d8fc3..158b894 100644
--- a/ios/chrome/browser/ios_chrome_flag_descriptions.cc
+++ b/ios/chrome/browser/ios_chrome_flag_descriptions.cc
@@ -42,15 +42,19 @@
     "When enabled, shows the Google Pay logo animation when showing payments"
     "credit card suggestions in downstream keyboard accessory";
 
+const char kAutofillPruneSuggestionsName[] = "Autofill Prune Suggestions";
+const char kAutofillPruneSuggestionsDescription[] =
+    "Further limits the number of suggestions in the Autofill dropdown.";
+
 const char kAutofillUseMobileLabelDisambiguationName[] =
     "Autofill Uses Mobile Label Disambiguation";
 const char kAutofillUseMobileLabelDisambiguationDescription[] =
     "When enabled, Autofill suggestions' labels are displayed using a "
     "mobile-friendly format.";
 
-extern const char kBreakpadNoDelayInitialUploadName[] =
+const char kBreakpadNoDelayInitialUploadName[] =
     "Remove delay on initial crash upload";
-extern const char kBreakpadNoDelayInitialUploadDescription[] =
+const char kBreakpadNoDelayInitialUploadDescription[] =
     "When enabled, the initial crash uploading will not be delayed. When "
     "disabled, initial upload is delayed until deferred initialization. This "
     "does not affect recovery mode.";
diff --git a/ios/chrome/browser/ios_chrome_flag_descriptions.h b/ios/chrome/browser/ios_chrome_flag_descriptions.h
index af9543e..9860ab3 100644
--- a/ios/chrome/browser/ios_chrome_flag_descriptions.h
+++ b/ios/chrome/browser/ios_chrome_flag_descriptions.h
@@ -29,6 +29,11 @@
 extern const char kAutofillDownstreamUseGooglePayBrandingOniOSName[];
 extern const char kAutofillDownstreamUseGooglePayBrandingOniOSDescription[];
 
+// Title and description for the flag that controls whether the maximum number
+// of Autofill suggestions shown to the user is further limited.
+extern const char kAutofillPruneSuggestionsName[];
+extern const char kAutofillPruneSuggestionsDescription[];
+
 // Title and description for the flag that controls whether Autofill's
 // suggestions' labels are formatting with a mobile-friendly approach.
 extern const char kAutofillUseMobileLabelDisambiguationName[];
diff --git a/ios/chrome/browser/ntp_tiles/ntp_tiles_egtest.mm b/ios/chrome/browser/ntp_tiles/ntp_tiles_egtest.mm
index 0ef11ec..809773b 100644
--- a/ios/chrome/browser/ntp_tiles/ntp_tiles_egtest.mm
+++ b/ios/chrome/browser/ntp_tiles/ntp_tiles_egtest.mm
@@ -5,7 +5,6 @@
 #import <EarlGrey/EarlGrey.h>
 
 #import "ios/chrome/test/app/chrome_test_util.h"
-#import "ios/chrome/test/app/history_test_util.h"
 #import "ios/chrome/test/app/tab_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
@@ -36,9 +35,7 @@
 @implementation NTPTilesTest
 
 - (void)tearDown {
-  GREYAssertTrue(chrome_test_util::ClearBrowsingHistory(),
-                 @"Clearing Browsing History timed out");
-  [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey clearBrowsingHistory]);
   [super tearDown];
 }
 
@@ -52,9 +49,7 @@
   web::test::SetUpSimpleHttpServer(responses);
 
   // Clear history and verify that the tile does not exist.
-  GREYAssertTrue(chrome_test_util::ClearBrowsingHistory(),
-                 @"Clearing Browsing History timed out");
-  [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey clearBrowsingHistory]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
 
   [[EarlGrey selectElementWithMatcher:
@@ -98,9 +93,7 @@
   web::test::SetUpHttpServer(std::move(provider));
 
   // Clear history and verify that the tile does not exist.
-  GREYAssertTrue(chrome_test_util::ClearBrowsingHistory(),
-                 @"Clearing Browsing History timed out");
-  [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey clearBrowsingHistory]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   [[EarlGrey selectElementWithMatcher:
                  chrome_test_util::StaticTextWithAccessibilityLabel(@"title2")]
diff --git a/ios/chrome/browser/passwords/BUILD.gn b/ios/chrome/browser/passwords/BUILD.gn
index be41cf8..9104cc8 100644
--- a/ios/chrome/browser/passwords/BUILD.gn
+++ b/ios/chrome/browser/passwords/BUILD.gn
@@ -85,7 +85,7 @@
     "//ios/public/provider/chrome/browser",
     "//ios/public/provider/chrome/browser/ui",
     "//ios/third_party/material_components_ios:material_components_ios",
-    "//ios/web",
+    "//ios/web/common",
     "//net",
     "//third_party/material_design_icons:ic_account_circle",
     "//ui/base",
diff --git a/ios/chrome/browser/passwords/credential_manager_util.mm b/ios/chrome/browser/passwords/credential_manager_util.mm
index 21e965a..ee6108c9 100644
--- a/ios/chrome/browser/passwords/credential_manager_util.mm
+++ b/ios/chrome/browser/passwords/credential_manager_util.mm
@@ -6,7 +6,7 @@
 
 #include "components/security_state/core/security_state.h"
 #include "ios/chrome/browser/ssl/ios_security_state_tab_helper.h"
-#import "ios/web/public/origin_util.h"
+#import "ios/web/common/origin_util.h"
 #include "url/origin.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/passwords/password_controller.mm b/ios/chrome/browser/passwords/password_controller.mm
index a875afb..3c60f74 100644
--- a/ios/chrome/browser/passwords/password_controller.mm
+++ b/ios/chrome/browser/passwords/password_controller.mm
@@ -60,7 +60,7 @@
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #include "ios/chrome/browser/web/tab_id_tab_helper.h"
 #include "ios/chrome/grit/ios_strings.h"
-#import "ios/web/public/origin_util.h"
+#import "ios/web/common/origin_util.h"
 #include "ios/web/public/url_scheme_util.h"
 #import "ios/web/public/web_state/js/crw_js_injection_receiver.h"
 #include "ios/web/public/web_state/web_frame.h"
diff --git a/ios/chrome/browser/prerender/prerender_egtest.mm b/ios/chrome/browser/prerender/prerender_egtest.mm
index 3c9e443f..09f00b5 100644
--- a/ios/chrome/browser/prerender/prerender_egtest.mm
+++ b/ios/chrome/browser/prerender/prerender_egtest.mm
@@ -12,7 +12,6 @@
 #import "ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.h"
 #import "ios/chrome/browser/ui/omnibox/popup/omnibox_popup_truncating_label.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
-#import "ios/chrome/test/app/history_test_util.h"
 #import "ios/chrome/test/app/tab_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_error_util.h"
@@ -62,9 +61,7 @@
         @"Disabled for iPad due to alternate letters educational screen.");
   }
 
-  GREYAssertTrue(chrome_test_util::ClearBrowsingHistory(),
-                 @"Clearing Browsing History timed out");
-  [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey clearBrowsingHistory]);
   // Set server up.
   self.testServer->RegisterRequestHandler(
       base::BindRepeating(&StandardResponse));
diff --git a/ios/chrome/browser/ssl/BUILD.gn b/ios/chrome/browser/ssl/BUILD.gn
index 57b72b0..5bbbbaccd 100644
--- a/ios/chrome/browser/ssl/BUILD.gn
+++ b/ios/chrome/browser/ssl/BUILD.gn
@@ -39,7 +39,8 @@
     "//ios/chrome/browser/tabs",
     "//ios/chrome/browser/ui/util",
     "//ios/public/provider/chrome/browser",
-    "//ios/web",
+    "//ios/web/common",
+    "//ios/web/public",
     "//net",
     "//ui/base",
     "//url",
diff --git a/ios/chrome/browser/ssl/insecure_input_tab_helper.mm b/ios/chrome/browser/ssl/insecure_input_tab_helper.mm
index c80e47d..c20f36f8 100644
--- a/ios/chrome/browser/ssl/insecure_input_tab_helper.mm
+++ b/ios/chrome/browser/ssl/insecure_input_tab_helper.mm
@@ -12,9 +12,9 @@
 #include "components/autofill/ios/form_util/form_activity_params.h"
 #include "components/autofill/ios/form_util/form_activity_tab_helper.h"
 #include "components/security_state/ios/ssl_status_input_event_data.h"
+#import "ios/web/common/origin_util.h"
 #import "ios/web/public/navigation_item.h"
 #import "ios/web/public/navigation_manager.h"
-#import "ios/web/public/origin_util.h"
 #import "ios/web/public/web_state/navigation_context.h"
 #import "ios/web/public/web_state/web_state.h"
 #import "ios/web/public/web_state/web_state_user_data.h"
diff --git a/ios/chrome/browser/ssl/ios_security_state_tab_helper.mm b/ios/chrome/browser/ssl/ios_security_state_tab_helper.mm
index 61d499a..8b37a53 100644
--- a/ios/chrome/browser/ssl/ios_security_state_tab_helper.mm
+++ b/ios/chrome/browser/ssl/ios_security_state_tab_helper.mm
@@ -10,10 +10,10 @@
 #include "base/metrics/histogram_macros.h"
 #include "components/security_state/core/security_state.h"
 #include "components/security_state/ios/ssl_status_input_event_data.h"
+#import "ios/web/common/origin_util.h"
 #include "ios/web/public/browser_state.h"
 #include "ios/web/public/navigation_item.h"
 #import "ios/web/public/navigation_manager.h"
-#import "ios/web/public/origin_util.h"
 #include "ios/web/public/security_style.h"
 #include "ios/web/public/ssl_status.h"
 #import "ios/web/public/web_state/web_state.h"
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_egtest.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_egtest.mm
index 98d87e3a..23831e3 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_egtest.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_egtest.mm
@@ -34,7 +34,6 @@
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
-#import "ios/chrome/test/app/history_test_util.h"
 #import "ios/chrome/test/app/tab_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
@@ -185,9 +184,7 @@
 - (void)tearDown {
   self.provider->FireCategoryStatusChanged(
       self.category, CategoryStatus::ALL_SUGGESTIONS_EXPLICITLY_DISABLED);
-  GREYAssertTrue(chrome_test_util::ClearBrowsingHistory(),
-                 @"Clearing Browsing History timed out");
-  [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey clearBrowsingHistory]);
   [super tearDown];
 }
 
@@ -493,9 +490,7 @@
   NSString* pageTitle = base::SysUTF8ToNSString(kPageTitle);
 
   // Clear history and verify that the tile does not exist.
-  GREYAssertTrue(chrome_test_util::ClearBrowsingHistory(),
-                 @"Clearing Browsing History timed out");
-  [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey clearBrowsingHistory]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:pageURL]);
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey waitForWebViewContainingText:kPageLoadedString]);
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
index 95de9ad..e78c997 100644
--- a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
+++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
@@ -38,7 +38,6 @@
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
-#import "ios/chrome/test/app/history_test_util.h"
 #import "ios/chrome/test/app/tab_test_util.h"
 #include "ios/chrome/test/base/scoped_block_swizzler.h"
 #include "ios/chrome/test/earl_grey/accessibility_util.h"
@@ -723,9 +722,7 @@
   const GURL pageURL = self.testServer->GetURL(kPageURL);
 
   // Clear history to ensure the tile will be shown.
-  GREYAssertTrue(chrome_test_util::ClearBrowsingHistory(),
-                 @"Clearing Browsing History timed out");
-  [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey clearBrowsingHistory]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:pageURL]);
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey waitForWebViewContainingText:kPageLoadedString]);
diff --git a/ios/chrome/browser/ui/payments/BUILD.gn b/ios/chrome/browser/ui/payments/BUILD.gn
index 57a483d..e13adcdf 100644
--- a/ios/chrome/browser/ui/payments/BUILD.gn
+++ b/ios/chrome/browser/ui/payments/BUILD.gn
@@ -90,7 +90,8 @@
     "//ios/chrome/browser/ui/payments/cells",
     "//ios/chrome/browser/ui/util",
     "//ios/third_party/material_roboto_font_loader_ios",
-    "//ios/web",
+    "//ios/web/common",
+    "//ios/web/public",
     "//third_party/libaddressinput",
     "//third_party/libaddressinput:strings_grit",
     "//ui/base",
diff --git a/ios/chrome/browser/ui/payments/payment_request_manager.mm b/ios/chrome/browser/ui/payments/payment_request_manager.mm
index 17f0c6c..f2396aa1 100644
--- a/ios/chrome/browser/ui/payments/payment_request_manager.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_manager.mm
@@ -56,10 +56,10 @@
 #import "ios/chrome/browser/ui/payments/js_payment_request_manager.h"
 #import "ios/chrome/browser/ui/payments/payment_request_coordinator.h"
 #import "ios/chrome/browser/ui/payments/payment_request_error_coordinator.h"
+#include "ios/web/common/origin_util.h"
 #include "ios/web/public/favicon_status.h"
 #include "ios/web/public/navigation_item.h"
 #include "ios/web/public/navigation_manager.h"
-#include "ios/web/public/origin_util.h"
 #include "ios/web/public/ssl_status.h"
 #import "ios/web/public/url_scheme_util.h"
 #import "ios/web/public/web_state/js/crw_js_injection_receiver.h"
diff --git a/ios/chrome/browser/ui/settings/sync/utils/sync_fake_server_egtest.mm b/ios/chrome/browser/ui/settings/sync/utils/sync_fake_server_egtest.mm
index 700a8e0..06738c4 100644
--- a/ios/chrome/browser/ui/settings/sync/utils/sync_fake_server_egtest.mm
+++ b/ios/chrome/browser/ui/settings/sync/utils/sync_fake_server_egtest.mm
@@ -21,7 +21,6 @@
 #import "ios/chrome/browser/ui/settings/settings_table_view_controller.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
-#import "ios/chrome/test/app/history_test_util.h"
 #import "ios/chrome/test/app/sync_test_util.h"
 #import "ios/chrome/test/app/tab_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
@@ -387,12 +386,9 @@
 - (void)testSyncTypedURLUpload {
   const GURL mockURL("http://not-a-real-site/");
 
-  GREYAssertTrue(chrome_test_util::ClearBrowsingHistory(),
-                 @"Clearing Browsing History timed out");
-
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey clearBrowsingHistory]);
   [self setTearDownHandler:^{
-    GREYAssertTrue(chrome_test_util::ClearBrowsingHistory(),
-                   @"Clearing Browsing History timed out");
+    CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey clearBrowsingHistory]);
   }];
   chrome_test_util::AddTypedURLOnClient(mockURL);
 
@@ -426,11 +422,9 @@
 - (void)testSyncTypedUrlDownload {
   const GURL mockURL("http://not-a-real-site/");
 
-  GREYAssertTrue(chrome_test_util::ClearBrowsingHistory(),
-                 @"Clearing Browsing History timed out");
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey clearBrowsingHistory]);
   [self setTearDownHandler:^{
-    GREYAssertTrue(chrome_test_util::ClearBrowsingHistory(),
-                   @"Clearing Browsing History timed out");
+    CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey clearBrowsingHistory]);
   }];
 
   // Inject typed url on server.
@@ -463,12 +457,9 @@
 - (void)testSyncTypedURLDeleteFromClient {
   const GURL mockURL("http://not-a-real-site/");
 
-  GREYAssertTrue(chrome_test_util::ClearBrowsingHistory(),
-                 @"Clearing Browsing History timed out");
-
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey clearBrowsingHistory]);
   [self setTearDownHandler:^{
-    GREYAssertTrue(chrome_test_util::ClearBrowsingHistory(),
-                   @"Clearing Browsing History timed out");
+    CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey clearBrowsingHistory]);
   }];
 
   // Inject typed url on server.
@@ -511,12 +502,9 @@
 - (void)testSyncTypedURLDeleteFromServer {
   const GURL mockURL("http://not-a-real-site/");
 
-  GREYAssertTrue(chrome_test_util::ClearBrowsingHistory(),
-                 @"Clearing Browsing History timed out");
-
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey clearBrowsingHistory]);
   [self setTearDownHandler:^{
-    GREYAssertTrue(chrome_test_util::ClearBrowsingHistory(),
-                   @"Clearing Browsing History timed out");
+    CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey clearBrowsingHistory]);
   }];
   chrome_test_util::AddTypedURLOnClient(mockURL);
 
diff --git a/ios/chrome/browser/web/cache_egtest.mm b/ios/chrome/browser/web/cache_egtest.mm
index d91cdf5..2418aabf 100644
--- a/ios/chrome/browser/web/cache_egtest.mm
+++ b/ios/chrome/browser/web/cache_egtest.mm
@@ -10,7 +10,6 @@
 #include "base/strings/stringprintf.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
-#include "ios/chrome/test/app/history_test_util.h"
 #include "ios/chrome/test/app/navigation_test_util.h"
 #import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
@@ -210,8 +209,7 @@
   web::test::SetUpHttpServer(std::make_unique<CacheTestResponseProvider>());
 
   // Clear the history to ensure expected omnibox autocomplete results.
-  GREYAssertTrue(chrome_test_util::ClearBrowsingHistory(),
-                 @"Clearing Browsing History timed out");
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey clearBrowsingHistory]);
 
   const GURL cacheTestFirstPageURL =
       HttpServer::MakeUrl(kCacheTestFirstPageURL);
diff --git a/ios/web/BUILD.gn b/ios/web/BUILD.gn
index 5aacaa54..1c53046 100644
--- a/ios/web/BUILD.gn
+++ b/ios/web/BUILD.gn
@@ -386,7 +386,6 @@
 
   sources = [
     "public/crw_session_certificate_policy_cache_storage_unittest.mm",
-    "public/origin_util_unittest.mm",
     "public/serializable_user_data_manager_unittest.mm",
     "public/ssl_status_unittest.cc",
     "public/user_agent_unittest.mm",
diff --git a/ios/web/common/BUILD.gn b/ios/web/common/BUILD.gn
index 536f97b..a156164 100644
--- a/ios/web/common/BUILD.gn
+++ b/ios/web/common/BUILD.gn
@@ -11,6 +11,8 @@
     "crw_web_view_content_view.mm",
     "features.h",
     "features.mm",
+    "origin_util.h",
+    "origin_util.mm",
     "referrer_util.cc",
     "referrer_util.h",
     "url_util.cc",
@@ -42,6 +44,7 @@
   ]
 
   sources = [
+    "origin_util_unittest.mm",
     "referrer_util_unittest.cc",
     "url_util_unittest.cc",
   ]
diff --git a/ios/web/public/origin_util.h b/ios/web/common/origin_util.h
similarity index 81%
rename from ios/web/public/origin_util.h
rename to ios/web/common/origin_util.h
index 1701ee4..a2ece23 100644
--- a/ios/web/public/origin_util.h
+++ b/ios/web/common/origin_util.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_WEB_PUBLIC_ORIGIN_UTIL_H_
-#define IOS_WEB_PUBLIC_ORIGIN_UTIL_H_
+#ifndef IOS_WEB_COMMON_ORIGIN_UTIL_H_
+#define IOS_WEB_COMMON_ORIGIN_UTIL_H_
 
 class GURL;
 
@@ -18,4 +18,4 @@
 
 }  // namespace web
 
-#endif  // IOS_WEB_PUBLIC_ORIGIN_UTIL_H_
+#endif  // IOS_WEB_COMMON_ORIGIN_UTIL_H_
diff --git a/ios/web/public/origin_util.mm b/ios/web/common/origin_util.mm
similarity index 96%
rename from ios/web/public/origin_util.mm
rename to ios/web/common/origin_util.mm
index 47ad181..2b993b8ef 100644
--- a/ios/web/public/origin_util.mm
+++ b/ios/web/common/origin_util.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/web/public/origin_util.h"
+#import "ios/web/common/origin_util.h"
 
 #include "base/stl_util.h"
 #include "net/base/url_util.h"
diff --git a/ios/web/public/origin_util_unittest.mm b/ios/web/common/origin_util_unittest.mm
similarity index 95%
rename from ios/web/public/origin_util_unittest.mm
rename to ios/web/common/origin_util_unittest.mm
index 1b702d0..5bed38c 100644
--- a/ios/web/public/origin_util_unittest.mm
+++ b/ios/web/common/origin_util_unittest.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/web/public/origin_util.h"
+#import "ios/web/common/origin_util.h"
 
 #import <WebKit/WebKit.h>
 
@@ -14,7 +14,6 @@
 #error "This file requires ARC support."
 #endif
 
-
 namespace web {
 
 using OriginUtilTest = PlatformTest;
@@ -32,5 +31,4 @@
   EXPECT_FALSE(IsOriginSecure(GURL("bogus://bogus")));
 }
 
-
 }  // namespace web
diff --git a/ios/web/navigation/history_state_operations_inttest.mm b/ios/web/navigation/history_state_operations_inttest.mm
index 0f780e2..5bab0888 100644
--- a/ios/web/navigation/history_state_operations_inttest.mm
+++ b/ios/web/navigation/history_state_operations_inttest.mm
@@ -477,10 +477,6 @@
 
 // Regression test for crbug.com/788464.
 TEST_P(HistoryStateOperationsTest, ReplaceStateThenReload) {
-  if (web::GetWebClient()->IsSlimNavigationManagerEnabled()) {
-    // TODO(crbug.com/950263): Investigate culprit and reenable.
-    return;
-  }
   GURL url = web::test::HttpServer::MakeUrl(
       "http://ios/testing/data/http_server_files/"
       "onload_replacestate_reload.html");
diff --git a/ios/web/public/BUILD.gn b/ios/web/public/BUILD.gn
index 1b894afe..065cf15 100644
--- a/ios/web/public/BUILD.gn
+++ b/ios/web/public/BUILD.gn
@@ -43,8 +43,6 @@
     "navigation_item_list.h",
     "navigation_item_list.mm",
     "navigation_manager.h",
-    "origin_util.h",
-    "origin_util.mm",
     "reload_type.h",
     "security_style.h",
     "serializable_user_data_manager.h",
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm
index 5670754f..0f0325e 100644
--- a/ios/web/web_state/ui/crw_web_controller.mm
+++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -4858,13 +4858,14 @@
     }
 
     if (!IsWKInternalUrl(currentWKItemURL) && currentWKItemURL == webViewURL &&
-        currentWKItemURL != context->GetUrl()) {
+        currentWKItemURL != context->GetUrl() &&
+        item == self.navigationManagerImpl->GetLastCommittedItem()) {
       // WKWebView sometimes changes URL on the same navigation, likely due to
-      // location.replace() in onload handler that only changes page fragment.
-      // It's safe to update |item| and |context| URL because they are both
-      // associated to WKNavigation*, which is a stable ID for the navigation.
-      // See https://crbug.com/869540 for a real-world case.
-      DCHECK(item->GetURL().EqualsIgnoringRef(currentWKItemURL));
+      // location.replace() or history.replaceState in onload handler that does
+      // not change the origin. It's safe to update |item| and |context| URL
+      // because they are both associated to WKNavigation*, which is a stable ID
+      // for the navigation. See https://crbug.com/869540 for a real-world case.
+      DCHECK_EQ(item->GetURL().GetOrigin(), currentWKItemURL.GetOrigin());
       item->SetURL(currentWKItemURL);
       context->SetUrl(currentWKItemURL);
     }
diff --git a/ios/web_view/BUILD.gn b/ios/web_view/BUILD.gn
index 0df6787f..3e47d85 100644
--- a/ios/web_view/BUILD.gn
+++ b/ios/web_view/BUILD.gn
@@ -308,6 +308,7 @@
   "//ios/components/io_thread",
   "//ios/net",
   "//ios/web",
+  "//ios/web/common",
   "//ios/web/public",
   "//ios/web/public/app",
   "//ios/web/public/global_state",
diff --git a/ios/web_view/internal/DEPS b/ios/web_view/internal/DEPS
index 76ed62f..51ed0531 100644
--- a/ios/web_view/internal/DEPS
+++ b/ios/web_view/internal/DEPS
@@ -41,6 +41,7 @@
   "+google_apis",
   "+ios/components/io_thread",
   "+ios/net",
+  "+ios/web/common",
   "+ios/web/public",
   "+ios/web_view",
   "+net",
diff --git a/ios/web_view/internal/passwords/cwv_password_controller.mm b/ios/web_view/internal/passwords/cwv_password_controller.mm
index ab5d5150..ee05bce 100644
--- a/ios/web_view/internal/passwords/cwv_password_controller.mm
+++ b/ios/web_view/internal/passwords/cwv_password_controller.mm
@@ -16,7 +16,7 @@
 #include "components/password_manager/ios/account_select_fill_data.h"
 #import "components/password_manager/ios/password_form_helper.h"
 #import "components/password_manager/ios/password_suggestion_helper.h"
-#import "ios/web/public/origin_util.h"
+#import "ios/web/common/origin_util.h"
 #include "ios/web/public/url_scheme_util.h"
 #include "ios/web/public/web_state/web_frame.h"
 #include "ios/web/public/web_state/web_frame_util.h"
diff --git a/jingle/BUILD.gn b/jingle/BUILD.gn
index f08ce64e..cf3f11d 100644
--- a/jingle/BUILD.gn
+++ b/jingle/BUILD.gn
@@ -5,6 +5,23 @@
 import("//build/config/features.gni")
 import("//testing/test.gni")
 
+source_set("webrtc_glue") {
+  sources = [
+    "glue/thread_wrapper.cc",
+    "glue/thread_wrapper.h",
+    "glue/utils.cc",
+    "glue/utils.h",
+  ]
+  public_deps = [
+    "//third_party/webrtc/rtc_base",
+  ]
+  deps = [
+    "//base",
+    "//net",
+    "//third_party/webrtc/api:libjingle_peerconnection_api",
+  ]
+}
+
 static_library("jingle_glue") {
   sources = [
     "glue/network_service_async_socket.cc",
@@ -13,25 +30,16 @@
     "glue/network_service_config.h",
     "glue/task_pump.cc",
     "glue/task_pump.h",
-    "glue/thread_wrapper.cc",
-    "glue/thread_wrapper.h",
-    "glue/utils.cc",
-    "glue/utils.h",
   ]
   public_deps = [
     "//services/network/public/mojom",
-    "//third_party/webrtc_overrides",
   ]
   deps = [
-    ":jingle_fake_socket",
     "//base",
-    "//base/third_party/dynamic_annotations",
     "//net",
     "//third_party/libjingle_xmpp:rtc_task_runner",
   ]
 
-  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
-
   if (is_nacl) {
     sources -= [
       "glue/network_service_async_socket.cc",
@@ -43,7 +51,7 @@
 
 # These files are separated into their own target to avoid a circular dependency
 # since services/network depends on this.
-static_library("jingle_fake_socket") {
+source_set("fake_ssl_socket") {
   sources = [
     "glue/fake_ssl_client_socket.cc",
     "glue/fake_ssl_client_socket.h",
@@ -189,15 +197,12 @@
 
   configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
 
-  public_deps = [
-    "//third_party/libjingle_xmpp",
-    "//third_party/webrtc_overrides",
-    "//third_party/webrtc_overrides:init_webrtc",
-  ]
   deps = [
+    ":fake_ssl_socket",
     ":jingle_glue",
     ":notifier",
     ":notifier_test_util",
+    ":webrtc_glue",
     "//base",
     "//base/test:test_support",
     "//mojo/core/embedder",
@@ -210,5 +215,7 @@
     "//testing/gmock",
     "//testing/gtest",
     "//third_party/libjingle_xmpp:rtc_task_runner",
+    "//third_party/webrtc_overrides",
+    "//third_party/webrtc_overrides:init_webrtc",
   ]
 }
diff --git a/media/gpu/vaapi/BUILD.gn b/media/gpu/vaapi/BUILD.gn
index 1c61e63..ebbd540d 100644
--- a/media/gpu/vaapi/BUILD.gn
+++ b/media/gpu/vaapi/BUILD.gn
@@ -41,6 +41,8 @@
     "vaapi_dmabuf_video_frame_mapper.h",
     "vaapi_h264_accelerator.cc",
     "vaapi_h264_accelerator.h",
+    "vaapi_jpeg_decode_accelerator_worker.cc",
+    "vaapi_jpeg_decode_accelerator_worker.h",
     "vaapi_jpeg_decoder.cc",
     "vaapi_jpeg_decoder.h",
     "vaapi_jpeg_encode_accelerator.cc",
@@ -80,6 +82,7 @@
     "//media",
     "//media/gpu:common",
     "//media/gpu:video_frame_mapper_common",
+    "//mojo/public/cpp/bindings",
     "//third_party/libyuv",
     "//ui/gfx/geometry",
   ]
diff --git a/media/gpu/vaapi/vaapi_jpeg_decode_accelerator_worker.cc b/media/gpu/vaapi/vaapi_jpeg_decode_accelerator_worker.cc
new file mode 100644
index 0000000..b8a99d03
--- /dev/null
+++ b/media/gpu/vaapi/vaapi_jpeg_decode_accelerator_worker.cc
@@ -0,0 +1,107 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "media/gpu/vaapi/vaapi_jpeg_decode_accelerator_worker.h"
+
+#include <utility>
+
+#include <va/va.h>
+
+#include "base/bind.h"
+#include "base/containers/span.h"
+#include "base/location.h"
+#include "base/logging.h"
+#include "base/metrics/histogram_macros.h"
+#include "base/sequenced_task_runner.h"
+#include "base/task/post_task.h"
+#include "base/trace_event/trace_event.h"
+#include "media/gpu/macros.h"
+#include "media/gpu/vaapi/vaapi_jpeg_decoder.h"
+#include "media/gpu/vaapi/vaapi_utils.h"
+#include "mojo/public/cpp/bindings/callback_helpers.h"
+#include "ui/gfx/geometry/size.h"
+
+namespace media {
+
+namespace {
+
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class VAJDAWorkerDecoderFailure {
+  kVaapiError = 0,
+  kMaxValue = kVaapiError,
+};
+
+void ReportToVAJDAWorkerDecoderFailureUMA(VAJDAWorkerDecoderFailure failure) {
+  UMA_HISTOGRAM_ENUMERATION("Media.VAJDAWorker.DecoderFailure", failure);
+}
+
+// Uses |decoder| to decode the JPEG corresponding to |encoded_data|.
+// |decode_cb| is called when finished or when an error is encountered. We don't
+// support decoding to scale, so |output_size| is only used for tracing.
+void DecodeTask(
+    VaapiJpegDecoder* decoder,
+    std::vector<uint8_t> encoded_data,
+    const gfx::Size& output_size,
+    gpu::ImageDecodeAcceleratorWorker::CompletedDecodeCB decode_cb) {
+  TRACE_EVENT2("jpeg", "VaapiJpegDecodeAcceleratorWorker::DecodeTask",
+               "encoded_bytes", encoded_data.size(), "output_size",
+               output_size.ToString());
+  gpu::ImageDecodeAcceleratorWorker::CompletedDecodeCB scoped_decode_callback =
+      mojo::WrapCallbackWithDefaultInvokeIfNotRun(std::move(decode_cb),
+                                                  nullptr);
+  VaapiJpegDecodeStatus status;
+  std::unique_ptr<ScopedVAImage> scoped_image = decoder->DoDecode(
+      base::make_span<const uint8_t>(encoded_data.data(), encoded_data.size()),
+      VA_FOURCC_RGBX /* preferred_image_fourcc */, &status);
+  if (status != VaapiJpegDecodeStatus::kSuccess) {
+    VLOGF(1) << "Failed to decode image - status = "
+             << static_cast<uint32_t>(status);
+    return;
+  }
+
+  // TODO(crbug.com/868400): output the decoded data.
+  DCHECK(scoped_image);
+  std::move(scoped_decode_callback).Run(nullptr);
+}
+
+}  // namespace
+
+VaapiJpegDecodeAcceleratorWorker::VaapiJpegDecodeAcceleratorWorker()
+    : decoder_(std::make_unique<VaapiJpegDecoder>()) {
+  if (!decoder_->Initialize(
+          base::BindRepeating(&ReportToVAJDAWorkerDecoderFailureUMA,
+                              VAJDAWorkerDecoderFailure::kVaapiError))) {
+    return;
+  }
+  decoder_task_runner_ = base::CreateSequencedTaskRunnerWithTraits({});
+  DCHECK(decoder_task_runner_);
+}
+
+VaapiJpegDecodeAcceleratorWorker::~VaapiJpegDecodeAcceleratorWorker() {
+  if (decoder_task_runner_)
+    decoder_task_runner_->DeleteSoon(FROM_HERE, std::move(decoder_));
+}
+
+bool VaapiJpegDecodeAcceleratorWorker::IsValid() const {
+  // If |decoder_task_runner_| is nullptr, it means that the initialization of
+  // |decoder_| failed.
+  return !!decoder_task_runner_;
+}
+
+void VaapiJpegDecodeAcceleratorWorker::Decode(std::vector<uint8_t> encoded_data,
+                                              const gfx::Size& output_size,
+                                              CompletedDecodeCB decode_cb) {
+  if (!IsValid()) {
+    NOTREACHED();
+    return;
+  }
+  DCHECK(!decoder_task_runner_->RunsTasksInCurrentSequence());
+  decoder_task_runner_->PostTask(
+      FROM_HERE,
+      base::BindOnce(&DecodeTask, decoder_.get(), std::move(encoded_data),
+                     output_size, std::move(decode_cb)));
+}
+
+}  // namespace media
diff --git a/media/gpu/vaapi/vaapi_jpeg_decode_accelerator_worker.h b/media/gpu/vaapi/vaapi_jpeg_decode_accelerator_worker.h
new file mode 100644
index 0000000..86e45fa64
--- /dev/null
+++ b/media/gpu/vaapi/vaapi_jpeg_decode_accelerator_worker.h
@@ -0,0 +1,61 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MEDIA_GPU_VAAPI_VAAPI_JPEG_DECODE_ACCELERATOR_WORKER_H_
+#define MEDIA_GPU_VAAPI_VAAPI_JPEG_DECODE_ACCELERATOR_WORKER_H_
+
+#include <stdint.h>
+
+#include <memory>
+#include <vector>
+
+#include "base/macros.h"
+#include "base/memory/scoped_refptr.h"
+#include "gpu/ipc/service/image_decode_accelerator_worker.h"
+
+namespace base {
+class SequencedTaskRunner;
+}
+
+namespace gfx {
+class Size;
+}
+
+namespace media {
+
+class VaapiJpegDecoder;
+
+// This class uses the VAAPI to provide JPEG decode acceleration. The
+// interaction with the VAAPI is done on |decoder_task_runner_|. Objects of this
+// class can be created/destroyed on any thread, and the public interface of
+// this class is thread-safe.
+class VaapiJpegDecodeAcceleratorWorker
+    : public gpu::ImageDecodeAcceleratorWorker {
+ public:
+  VaapiJpegDecodeAcceleratorWorker();
+  ~VaapiJpegDecodeAcceleratorWorker() override;
+
+  // Returns true if the internal state was initialized correctly. If false,
+  // clients should not call Decode().
+  bool IsValid() const;
+
+  // gpu::ImageDecodeAcceleratorWorker implementation.
+  void Decode(std::vector<uint8_t> encoded_data,
+              const gfx::Size& output_size,
+              CompletedDecodeCB decode_cb) override;
+
+ private:
+  // We delegate the decoding to |decoder_| which is constructed on the ctor and
+  // then used and destroyed on |decoder_task_runner_| (unless initialization
+  // failed, in which case it doesn't matter where it's destroyed since no tasks
+  // using |decoder_| should have been posted to |decoder_task_runner_|).
+  std::unique_ptr<VaapiJpegDecoder> decoder_;
+  scoped_refptr<base::SequencedTaskRunner> decoder_task_runner_;
+
+  DISALLOW_COPY_AND_ASSIGN(VaapiJpegDecodeAcceleratorWorker);
+};
+
+}  // namespace media
+
+#endif  // MEDIA_GPU_VAAPI_VAAPI_JPEG_DECODE_ACCELERATOR_WORKER_H_
diff --git a/media/gpu/vaapi/vaapi_jpeg_decoder.h b/media/gpu/vaapi/vaapi_jpeg_decoder.h
index 2b544f6e..c28662f 100644
--- a/media/gpu/vaapi/vaapi_jpeg_decoder.h
+++ b/media/gpu/vaapi/vaapi_jpeg_decoder.h
@@ -25,7 +25,7 @@
 class ScopedVAImage;
 class VaapiWrapper;
 
-enum class VaapiJpegDecodeStatus {
+enum class VaapiJpegDecodeStatus : uint32_t {
   kSuccess,
   kParseJpegFailed,
   kUnsupportedJpeg,
@@ -49,6 +49,10 @@
 // or 4:4:4, returns kInvalidVaRtFormat.
 unsigned int VaSurfaceFormatForJpeg(const JpegFrameHeader& frame_header);
 
+// Encapsulates a VaapiWrapper for the purpose of performing
+// hardware-accelerated JPEG decodes. Objects of this class are not thread-safe,
+// but they are also not thread-affine, i.e., the caller is free to call the
+// methods on any thread, but calls must be synchronized externally.
 class VaapiJpegDecoder final {
  public:
   VaapiJpegDecoder();
diff --git a/mojo/public/cpp/bindings/BUILD.gn b/mojo/public/cpp/bindings/BUILD.gn
index f79360d0..a01d226 100644
--- a/mojo/public/cpp/bindings/BUILD.gn
+++ b/mojo/public/cpp/bindings/BUILD.gn
@@ -187,6 +187,7 @@
     "sync_handle_watcher.h",
     "thread_safe_interface_ptr.h",
     "unique_ptr_impl_ref_traits.h",
+    "unique_receiver_set.h",
   ]
 
   if (enable_random_mojo_delays) {
diff --git a/mojo/public/cpp/bindings/interface_ptr.h b/mojo/public/cpp/bindings/interface_ptr.h
index 0d7d6ff..f0610da3 100644
--- a/mojo/public/cpp/bindings/interface_ptr.h
+++ b/mojo/public/cpp/bindings/interface_ptr.h
@@ -107,7 +107,7 @@
   // result will be returned as the input of |callback|. The version number of
   // this interface pointer will also be updated.
   void QueryVersion(const base::Callback<void(uint32_t)>& callback) {
-    internal_state_.QueryVersion(callback);
+    internal_state_.QueryVersionDeprecated(callback);
   }
 
   // If the remote side doesn't support the specified version, it will close its
diff --git a/mojo/public/cpp/bindings/lib/interface_ptr_state.cc b/mojo/public/cpp/bindings/lib/interface_ptr_state.cc
index 9ac8911c..7d49fa3 100644
--- a/mojo/public/cpp/bindings/lib/interface_ptr_state.cc
+++ b/mojo/public/cpp/bindings/lib/interface_ptr_state.cc
@@ -18,12 +18,12 @@
 }
 
 void InterfacePtrStateBase::QueryVersion(
-    const base::Callback<void(uint32_t)>& callback) {
+    base::OnceCallback<void(uint32_t)> callback) {
   // It is safe to capture |this| because the callback won't be run after this
   // object goes away.
   endpoint_client_->QueryVersion(
-      base::Bind(&InterfacePtrStateBase::OnQueryVersion, base::Unretained(this),
-                 callback));
+      base::BindRepeating(&InterfacePtrStateBase::OnQueryVersion,
+                          base::Unretained(this), base::Passed(&callback)));
 }
 
 void InterfacePtrStateBase::RequireVersion(uint32_t version) {
@@ -60,10 +60,10 @@
 }
 
 void InterfacePtrStateBase::OnQueryVersion(
-    const base::Callback<void(uint32_t)>& callback,
+    base::OnceCallback<void(uint32_t)> callback,
     uint32_t version) {
   version_ = version;
-  callback.Run(version);
+  std::move(callback).Run(version);
 }
 
 bool InterfacePtrStateBase::InitializeEndpointClient(
diff --git a/mojo/public/cpp/bindings/lib/interface_ptr_state.h b/mojo/public/cpp/bindings/lib/interface_ptr_state.h
index 03000df..fa1e469 100644
--- a/mojo/public/cpp/bindings/lib/interface_ptr_state.h
+++ b/mojo/public/cpp/bindings/lib/interface_ptr_state.h
@@ -72,7 +72,7 @@
   }
   MultiplexRouter* router() const { return router_.get(); }
 
-  void QueryVersion(const base::Callback<void(uint32_t)>& callback);
+  void QueryVersion(base::OnceCallback<void(uint32_t)> callback);
   void RequireVersion(uint32_t version);
   void Swap(InterfacePtrStateBase* other);
   void Bind(ScopedMessagePipeHandle handle,
@@ -91,7 +91,7 @@
       const char* interface_name);
 
  private:
-  void OnQueryVersion(const base::Callback<void(uint32_t)>& callback,
+  void OnQueryVersion(base::OnceCallback<void(uint32_t)> callback,
                       uint32_t version);
 
   scoped_refptr<MultiplexRouter> router_;
@@ -131,9 +131,13 @@
 #endif
   }
 
-  void QueryVersion(const base::Callback<void(uint32_t)>& callback) {
+  void QueryVersionDeprecated(const base::Callback<void(uint32_t)>& callback) {
+    QueryVersion(base::BindOnce(callback));
+  }
+
+  void QueryVersion(base::OnceCallback<void(uint32_t)> callback) {
     ConfigureProxyIfNecessary();
-    InterfacePtrStateBase::QueryVersion(callback);
+    InterfacePtrStateBase::QueryVersion(std::move(callback));
   }
 
   void RequireVersion(uint32_t version) {
diff --git a/mojo/public/cpp/bindings/pending_receiver.h b/mojo/public/cpp/bindings/pending_receiver.h
index f2f4c49..9d02333 100644
--- a/mojo/public/cpp/bindings/pending_receiver.h
+++ b/mojo/public/cpp/bindings/pending_receiver.h
@@ -73,6 +73,12 @@
   // effectively be dropped.
   void reset() { pipe_.reset(); }
 
+  // Like above but provides a reason for the disconnection.
+  void ResetWithReason(uint32_t reason, const std::string& description) {
+    InterfaceRequest<Interface>(PassPipe())
+        .ResetWithReason(reason, description);
+  }
+
   // Passes ownership of this PendingReceiver's message pipe handle. After this
   // call, the PendingReceiver is no longer in a valid state and can no longer
   // be used to bind a Receiver.
diff --git a/mojo/public/cpp/bindings/pending_remote.h b/mojo/public/cpp/bindings/pending_remote.h
index bdeee63..4141633 100644
--- a/mojo/public/cpp/bindings/pending_remote.h
+++ b/mojo/public/cpp/bindings/pending_remote.h
@@ -121,6 +121,17 @@
   }
 };
 
+// Fuses a PendingReceiver<T> endpoint with a PendingRemote<T> endpoint. The
+// endpoints must belong to two different message pipes, and this effectively
+// fuses two pipes into a single pipe. Returns |true| on success or |false| on
+// failure.
+template <typename Interface>
+bool FusePipes(PendingReceiver<Interface> receiver,
+               PendingRemote<Interface> remote) {
+  MojoResult result = FuseMessagePipes(receiver.PassPipe(), remote.PassPipe());
+  return result == MOJO_RESULT_OK;
+}
+
 }  // namespace mojo
 
 #endif  // MOJO_PUBLIC_CPP_BINDINGS_PENDING_REMOTE_H_
diff --git a/mojo/public/cpp/bindings/receiver.h b/mojo/public/cpp/bindings/receiver.h
index 0223525..d30c5d15 100644
--- a/mojo/public/cpp/bindings/receiver.h
+++ b/mojo/public/cpp/bindings/receiver.h
@@ -107,6 +107,12 @@
   // which were scheduled prior to unbinding are effectively cancelled.
   void reset() { internal_state_.Close(); }
 
+  // Similar to the method above, but also specifies a disconnect reason.
+  void ResetWithReason(uint32_t custom_reason_code,
+                       const std::string& description) {
+    internal_state_.CloseWithReason(custom_reason_code, description);
+  }
+
   // Binds this Receiver, connecting it to a new PendingRemote which is
   // returned for transmission elsewhere (typically to a Remote who will consume
   // it to start making calls).
@@ -182,6 +188,49 @@
     internal_state_.AddFilter(std::move(filter));
   }
 
+  // Pause and resume message dispatch.
+  void Pause() {
+    CHECK(!internal_state_.HasAssociatedInterfaces());
+    internal_state_.PauseIncomingMethodCallProcessing();
+  }
+
+  void Resume() { internal_state_.ResumeIncomingMethodCallProcessing(); }
+
+  // Blocks the calling thread until a new message arrives and is dispatched
+  // to the bound implementation.
+  bool WaitForIncomingCall() {
+    return internal_state_.WaitForIncomingMethodCall(MOJO_DEADLINE_INDEFINITE);
+  }
+
+  // Flushes any replies previously sent by the Receiver, only unblocking once
+  // acknowledgement from the Remote is received.
+  void FlushForTesting() { internal_state_.FlushForTesting(); }
+
+  // Reports the currently dispatching message as bad and resets this receiver.
+  // Note that this is only legal to call from within the stack frame of a
+  // message dispatch. If you need to do asynchronous work before determining
+  // the legitimacy of a message, use GetBadMessageCallback() and retain its
+  // result until ready to invoke or discard it.
+  void ReportBadMessage(const std::string& error) {
+    GetBadMessageCallback().Run(error);
+  }
+
+  // Acquires a callback which may be run to report the currently dispatching
+  // message as bad and reset this receiver. Note that this is only legal to
+  // call from directly within stack frame of a message dispatch, but the
+  // returned callback may be called exactly once any time thereafter to report
+  // the message as bad. |GetBadMessageCallback()| may only be called once per
+  // message, and the returned callback must be run on the same sequence to
+  // which this Receiver is bound.
+  ReportBadMessageCallback GetBadMessageCallback() {
+    return internal_state_.GetBadMessageCallback();
+  }
+
+  // DO NOT USE. Exposed only for internal use and for testing.
+  internal::BindingState<Interface, ImplRefTraits>* internal_state() {
+    return &internal_state_;
+  }
+
  private:
   internal::BindingState<Interface, ImplRefTraits> internal_state_;
 
diff --git a/mojo/public/cpp/bindings/receiver_set.h b/mojo/public/cpp/bindings/receiver_set.h
index ca7db3c..5019554 100644
--- a/mojo/public/cpp/bindings/receiver_set.h
+++ b/mojo/public/cpp/bindings/receiver_set.h
@@ -103,6 +103,14 @@
   // ContextType is not void.
   void set_disconnect_handler(base::RepeatingClosure handler) {
     disconnect_handler_ = std::move(handler);
+    disconnect_with_reason_handler_.Reset();
+  }
+
+  // Like above but also provides the reason given for disconnection, if any.
+  void set_disconnect_with_reason_handler(
+      RepeatingConnectionErrorWithReasonCallback handler) {
+    disconnect_with_reason_handler_ = std::move(handler);
+    disconnect_handler_.Reset();
   }
 
   // Adds a new receiver to the set, binding |receiver| to |impl| with no
@@ -216,7 +224,7 @@
            const std::string& error) {
           std::move(error_callback).Run(error);
           if (receiver_set)
-            receiver_set->RemoveBinding(receiver_id);
+            receiver_set->Remove(receiver_id);
         },
         mojo::GetBadMessageCallback(), weak_ptr_factory_.GetWeakPtr(),
         current_receiver());
@@ -240,7 +248,7 @@
           receiver_id_(receiver_id),
           context_(std::move(context)) {
       receiver_.AddFilter(std::make_unique<DispatchFilter>(this));
-      receiver_.set_disconnect_handler(
+      receiver_.set_disconnect_with_reason_handler(
           base::BindOnce(&Entry::OnDisconnect, base::Unretained(this)));
     }
 
@@ -266,9 +274,11 @@
       receiver_set_->SetDispatchContext(&context_, receiver_id_);
     }
 
-    void OnDisconnect() {
+    void OnDisconnect(uint32_t custom_reason_code,
+                      const std::string& description) {
       WillDispatch();
-      receiver_set_->OnDisconnect(receiver_id_);
+      receiver_set_->OnDisconnect(receiver_id_, custom_reason_code,
+                                  description);
     }
 
     ReceiverType receiver_;
@@ -297,7 +307,9 @@
     return id;
   }
 
-  void OnDisconnect(ReceiverId id) {
+  void OnDisconnect(ReceiverId id,
+                    uint32_t custom_reason_code,
+                    const std::string& description) {
     auto it = receivers_.find(id);
     DCHECK(it != receivers_.end());
 
@@ -307,9 +319,12 @@
 
     if (disconnect_handler_)
       disconnect_handler_.Run();
+    else if (disconnect_with_reason_handler_)
+      disconnect_with_reason_handler_.Run(custom_reason_code, description);
   }
 
   base::RepeatingClosure disconnect_handler_;
+  RepeatingConnectionErrorWithReasonCallback disconnect_with_reason_handler_;
   ReceiverId next_receiver_id_ = 0;
   std::map<ReceiverId, std::unique_ptr<Entry>> receivers_;
   const Context* current_context_ = nullptr;
diff --git a/mojo/public/cpp/bindings/remote.h b/mojo/public/cpp/bindings/remote.h
index 32430637..f709d03 100644
--- a/mojo/public/cpp/bindings/remote.h
+++ b/mojo/public/cpp/bindings/remote.h
@@ -143,6 +143,14 @@
       internal_state_.set_connection_error_handler(std::move(handler));
   }
 
+  // Like above but also receives extra user-defined metadata about why the
+  // receiving endpoint was closed.
+  void set_disconnect_with_reason_handler(
+      ConnectionErrorWithReasonCallback handler) {
+    internal_state_.set_connection_error_with_reason_handler(
+        std::move(handler));
+  }
+
   // Resets this Remote to an unbound state. To reset the Remote and recover an
   // PendingRemote that can be bound again later, use |Unbind()| instead.
   void reset() {
@@ -157,6 +165,11 @@
     reset();
   }
 
+  // Returns the version of Interface used by this Remote. Defaults to 0 but can
+  // be adjusted either at binding time, or by invoking either |QueryVersion()|
+  // or |RequireVersion()|.
+  uint32_t version() const { return internal_state_.version(); }
+
   // Binds this Remote, connecting it to a new PendingReceiver which is
   // returned for transmission to some Receiver which can bind it. The Remote
   // will schedule any response callbacks or disconnection notifications on the
@@ -231,12 +244,32 @@
     return PendingRemote<Interface>(info.PassHandle(), info.version());
   }
 
+  // Queries the max version that the receiving endpoint supports. Once a
+  // response is received, |callback| will be invoked with the version number
+  // and the version number of this Remote object will also be updated.
+  void QueryVersion(base::OnceCallback<void(uint32_t)> callback) {
+    internal_state_.QueryVersion(std::move(callback));
+  }
+
+  // Requires the receiving endpoint to support at least the specified
+  // |version|. If it does not, it will close its end of the connection
+  // immediately.
+  void RequireVersion(uint32_t version) {
+    internal_state_.RequireVersion(version);
+  }
+
   // Sends a no-op message on the underlying message pipe and runs the current
   // message loop until its response is received. This can be used in tests to
   // verify that no message was sent on a message pipe in response to some
   // stimulus.
   void FlushForTesting() { internal_state_.FlushForTesting(); }
 
+  // Same as |FlushForTesting()| but will call |callback| when the flush is
+  // complete.
+  void FlushAsyncForTesting(base::OnceClosure callback) {
+    internal_state_.FlushAsyncForTesting(std::move(callback));
+  }
+
   // DO NOT USE. Exposed only for internal use and for testing.
   internal::InterfacePtrState<Interface>* internal_state() {
     return &internal_state_;
diff --git a/mojo/public/cpp/bindings/shared_remote.h b/mojo/public/cpp/bindings/shared_remote.h
index e34481f..104192eb 100644
--- a/mojo/public/cpp/bindings/shared_remote.h
+++ b/mojo/public/cpp/bindings/shared_remote.h
@@ -190,6 +190,11 @@
   Interface* operator->() const { return get(); }
   Interface& operator*() const { return *get(); }
 
+  // Clears this SharedRemote. Note that this does *not* necessarily close the
+  // remote's endpoint as other SharedRemote instances may reference the same
+  // underlying endpoint.
+  void reset() { remote_.reset(); }
+
  private:
   scoped_refptr<SharedRemoteBase<Remote<Interface>>> remote_;
 };
diff --git a/mojo/public/cpp/bindings/tests/bind_task_runner_unittest.cc b/mojo/public/cpp/bindings/tests/bind_task_runner_unittest.cc
index 5d50f62..1f401c0 100644
--- a/mojo/public/cpp/bindings/tests/bind_task_runner_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/bind_task_runner_unittest.cc
@@ -11,12 +11,14 @@
 #include "base/sequenced_task_runner.h"
 #include "base/synchronization/lock.h"
 #include "base/synchronization/waitable_event.h"
+#include "base/test/bind_test_util.h"
 #include "base/threading/platform_thread.h"
-#include "mojo/public/cpp/bindings/associated_binding.h"
-#include "mojo/public/cpp/bindings/associated_interface_ptr.h"
-#include "mojo/public/cpp/bindings/associated_interface_ptr_info.h"
-#include "mojo/public/cpp/bindings/associated_interface_request.h"
-#include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/associated_receiver.h"
+#include "mojo/public/cpp/bindings/associated_remote.h"
+#include "mojo/public/cpp/bindings/pending_associated_receiver.h"
+#include "mojo/public/cpp/bindings/pending_associated_remote.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/interfaces/bindings/tests/test_associated_interfaces.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -118,14 +120,14 @@
   DISALLOW_COPY_AND_ASSIGN(TestTaskRunner);
 };
 
-template <typename BindingType, typename RequestType>
+template <typename ReceiverType, typename PendingReceiverType>
 class IntegerSenderImpl : public IntegerSender {
  public:
-  IntegerSenderImpl(RequestType request,
+  IntegerSenderImpl(PendingReceiverType receiver,
                     scoped_refptr<base::SequencedTaskRunner> runner)
-      : binding_(this, std::move(request), std::move(runner)) {}
+      : receiver_(this, std::move(receiver), std::move(runner)) {}
 
-  ~IntegerSenderImpl() override {}
+  ~IntegerSenderImpl() override = default;
 
   using EchoHandler = base::RepeatingCallback<void(int32_t, EchoCallback)>;
 
@@ -139,256 +141,234 @@
   }
   void Send(int32_t value) override { NOTREACHED(); }
 
-  BindingType* binding() { return &binding_; }
+  ReceiverType* receiver() { return &receiver_; }
 
  private:
-  BindingType binding_;
+  ReceiverType receiver_;
   EchoHandler echo_handler_;
 };
 
 class IntegerSenderConnectionImpl : public IntegerSenderConnection {
  public:
-  using SenderType = IntegerSenderImpl<AssociatedBinding<IntegerSender>,
-                                       IntegerSenderAssociatedRequest>;
+  using SenderType =
+      IntegerSenderImpl<AssociatedReceiver<IntegerSender>,
+                        PendingAssociatedReceiver<IntegerSender>>;
 
   explicit IntegerSenderConnectionImpl(
-      IntegerSenderConnectionRequest request,
+      PendingReceiver<IntegerSenderConnection> receiver,
       scoped_refptr<base::SequencedTaskRunner> runner,
       scoped_refptr<base::SequencedTaskRunner> sender_runner)
-      : binding_(this, std::move(request), std::move(runner)),
+      : receiver_(this, std::move(receiver), std::move(runner)),
         sender_runner_(std::move(sender_runner)) {}
 
-  ~IntegerSenderConnectionImpl() override {}
+  ~IntegerSenderConnectionImpl() override = default;
 
-  void set_get_sender_notification(const base::Closure& notification) {
-    get_sender_notification_ = notification;
+  void set_get_sender_notification(base::OnceClosure notification) {
+    get_sender_notification_ = std::move(notification);
   }
-  void GetSender(IntegerSenderAssociatedRequest sender) override {
-    sender_impl_.reset(new SenderType(std::move(sender), sender_runner_));
-    get_sender_notification_.Run();
+  void GetSender(IntegerSenderAssociatedRequest request) override {
+    sender_impl_ =
+        std::make_unique<SenderType>(std::move(request), sender_runner_);
+    std::move(get_sender_notification_).Run();
   }
 
   void AsyncGetSender(AsyncGetSenderCallback callback) override {
     NOTREACHED();
   }
 
-  Binding<IntegerSenderConnection>* binding() { return &binding_; }
+  Receiver<IntegerSenderConnection>* receiver() { return &receiver_; }
 
   SenderType* sender_impl() { return sender_impl_.get(); }
 
  private:
-  Binding<IntegerSenderConnection> binding_;
+  Receiver<IntegerSenderConnection> receiver_;
   std::unique_ptr<SenderType> sender_impl_;
   scoped_refptr<base::SequencedTaskRunner> sender_runner_;
-  base::Closure get_sender_notification_;
+  base::OnceClosure get_sender_notification_;
 };
 
 class BindTaskRunnerTest : public testing::Test {
  protected:
   void SetUp() override {
-    binding_task_runner_ = scoped_refptr<TestTaskRunner>(new TestTaskRunner);
-    ptr_task_runner_ = scoped_refptr<TestTaskRunner>(new TestTaskRunner);
+    receiver_task_runner_ = scoped_refptr<TestTaskRunner>(new TestTaskRunner);
+    remote_task_runner_ = scoped_refptr<TestTaskRunner>(new TestTaskRunner);
 
-    auto request = MakeRequest(&ptr_, ptr_task_runner_);
-    impl_.reset(new ImplType(std::move(request), binding_task_runner_));
+    auto receiver = remote_.BindNewPipeAndPassReceiver(remote_task_runner_);
+    impl_.reset(new ImplType(std::move(receiver), receiver_task_runner_));
   }
 
   base::MessageLoop loop_;
-  scoped_refptr<TestTaskRunner> binding_task_runner_;
-  scoped_refptr<TestTaskRunner> ptr_task_runner_;
+  scoped_refptr<TestTaskRunner> receiver_task_runner_;
+  scoped_refptr<TestTaskRunner> remote_task_runner_;
 
-  IntegerSenderPtr ptr_;
-  using ImplType =
-      IntegerSenderImpl<Binding<IntegerSender>, IntegerSenderRequest>;
+  Remote<IntegerSender> remote_;
+  using ImplType = IntegerSenderImpl<Receiver<IntegerSender>,
+                                     PendingReceiver<IntegerSender>>;
   std::unique_ptr<ImplType> impl_;
 };
 
 class AssociatedBindTaskRunnerTest : public testing::Test {
  protected:
   void SetUp() override {
-    connection_binding_task_runner_ =
+    connection_receiver_task_runner_ =
         scoped_refptr<TestTaskRunner>(new TestTaskRunner);
-    connection_ptr_task_runner_ =
+    connection_remote_task_runner_ =
         scoped_refptr<TestTaskRunner>(new TestTaskRunner);
-    sender_binding_task_runner_ =
+    sender_receiver_task_runner_ =
         scoped_refptr<TestTaskRunner>(new TestTaskRunner);
-    sender_ptr_task_runner_ = scoped_refptr<TestTaskRunner>(new TestTaskRunner);
+    sender_remote_task_runner_ =
+        scoped_refptr<TestTaskRunner>(new TestTaskRunner);
 
-    auto connection_request =
-        MakeRequest(&connection_ptr_, connection_ptr_task_runner_);
+    auto connection_receiver = connection_remote_.BindNewPipeAndPassReceiver(
+        connection_remote_task_runner_);
     connection_impl_.reset(new IntegerSenderConnectionImpl(
-        std::move(connection_request), connection_binding_task_runner_,
-        sender_binding_task_runner_));
+        std::move(connection_receiver), connection_receiver_task_runner_,
+        sender_receiver_task_runner_));
 
-    connection_impl_->set_get_sender_notification(
-        base::Bind(&AssociatedBindTaskRunnerTest::QuitTaskRunner,
-                   base::Unretained(this)));
+    connection_impl_->set_get_sender_notification(base::BindOnce(
+        &AssociatedBindTaskRunnerTest::QuitTaskRunner, base::Unretained(this)));
 
-    connection_ptr_->GetSender(
-        MakeRequest(&sender_ptr_, sender_ptr_task_runner_));
-    connection_binding_task_runner_->Run();
+    connection_remote_->GetSender(sender_remote_.BindNewEndpointAndPassReceiver(
+        sender_remote_task_runner_));
+    connection_receiver_task_runner_->Run();
   }
 
-  void QuitTaskRunner() {
-    connection_binding_task_runner_->Quit();
-  }
+  void QuitTaskRunner() { connection_receiver_task_runner_->Quit(); }
 
   base::MessageLoop loop_;
-  scoped_refptr<TestTaskRunner> connection_binding_task_runner_;
-  scoped_refptr<TestTaskRunner> connection_ptr_task_runner_;
-  scoped_refptr<TestTaskRunner> sender_binding_task_runner_;
-  scoped_refptr<TestTaskRunner> sender_ptr_task_runner_;
+  scoped_refptr<TestTaskRunner> connection_receiver_task_runner_;
+  scoped_refptr<TestTaskRunner> connection_remote_task_runner_;
+  scoped_refptr<TestTaskRunner> sender_receiver_task_runner_;
+  scoped_refptr<TestTaskRunner> sender_remote_task_runner_;
 
-  IntegerSenderConnectionPtr connection_ptr_;
+  Remote<IntegerSenderConnection> connection_remote_;
   std::unique_ptr<IntegerSenderConnectionImpl> connection_impl_;
-  IntegerSenderAssociatedPtr sender_ptr_;
+  AssociatedRemote<IntegerSender> sender_remote_;
 };
 
-void DoSetFlagAndQuitTaskRunner(bool* flag,
-                                scoped_refptr<TestTaskRunner> task_runner) {
-  *flag = true;
-  if (task_runner)
-    task_runner->Quit();
-}
-
-void DoExpectValueSetFlagAndQuitTaskRunner(
-    int32_t expected_value,
-    bool* flag,
-    scoped_refptr<TestTaskRunner> task_runner,
-    int32_t value) {
-  EXPECT_EQ(expected_value, value);
-  DoSetFlagAndQuitTaskRunner(flag, task_runner);
-}
-
-void DoExpectValueSetFlagForwardValueAndQuitTaskRunner(
-    int32_t expected_value,
-    bool* flag,
-    scoped_refptr<TestTaskRunner> task_runner,
-    int32_t value,
-    IntegerSender::EchoCallback callback) {
-  EXPECT_EQ(expected_value, value);
-  *flag = true;
-  std::move(callback).Run(value);
-  task_runner->Quit();
-}
-
-base::Closure SetFlagAndQuitTaskRunner(
-    bool* flag,
-    scoped_refptr<TestTaskRunner> task_runner) {
-  return base::Bind(&DoSetFlagAndQuitTaskRunner, flag, task_runner);
-}
-
-base::Callback<void(int32_t)> ExpectValueSetFlagAndQuitTaskRunner(
-    int32_t expected_value,
-    bool* flag,
-    scoped_refptr<TestTaskRunner> task_runner) {
-  return base::Bind(&DoExpectValueSetFlagAndQuitTaskRunner, expected_value,
-                    flag, task_runner);
-}
-
 TEST_F(BindTaskRunnerTest, MethodCall) {
   bool echo_called = false;
-  impl_->set_echo_handler(
-      base::Bind(&DoExpectValueSetFlagForwardValueAndQuitTaskRunner,
-                 1024, &echo_called, binding_task_runner_));
+  impl_->set_echo_handler(base::BindLambdaForTesting(
+      [&](int32_t value, IntegerSender::EchoCallback callback) {
+        EXPECT_EQ(1024, value);
+        echo_called = true;
+        std::move(callback).Run(value);
+        receiver_task_runner_->Quit();
+      }));
+
   bool echo_replied = false;
-  ptr_->Echo(1024, ExpectValueSetFlagAndQuitTaskRunner(1024, &echo_replied,
-                                                       ptr_task_runner_));
-  binding_task_runner_->Run();
+  remote_->Echo(1024, base::BindLambdaForTesting([&](int32_t value) {
+                  EXPECT_EQ(1024, value);
+                  echo_replied = true;
+                  remote_task_runner_->Quit();
+                }));
+  receiver_task_runner_->Run();
   EXPECT_TRUE(echo_called);
-  ptr_task_runner_->Run();
+  remote_task_runner_->Run();
   EXPECT_TRUE(echo_replied);
 }
 
-TEST_F(BindTaskRunnerTest, BindingConnectionError) {
-  bool connection_error_called = false;
-  impl_->binding()->set_connection_error_handler(
-      SetFlagAndQuitTaskRunner(&connection_error_called, binding_task_runner_));
-  ptr_.reset();
-  binding_task_runner_->Run();
-  EXPECT_TRUE(connection_error_called);
+TEST_F(BindTaskRunnerTest, ReceiverDisconnectHandler) {
+  bool disconnected = false;
+  impl_->receiver()->set_disconnect_handler(base::BindLambdaForTesting([&] {
+    disconnected = true;
+    receiver_task_runner_->Quit();
+  }));
+  remote_.reset();
+  receiver_task_runner_->Run();
+  EXPECT_TRUE(disconnected);
 }
 
-TEST_F(BindTaskRunnerTest, PtrConnectionError) {
-  bool connection_error_called = false;
-  ptr_.set_connection_error_handler(
-      SetFlagAndQuitTaskRunner(&connection_error_called, ptr_task_runner_));
-  impl_->binding()->Close();
-  ptr_task_runner_->Run();
-  EXPECT_TRUE(connection_error_called);
-}
-
-void ExpectValueSetFlagAndForward(int32_t expected_value,
-                                  bool* flag,
-                                  int32_t value,
-                                  IntegerSender::EchoCallback callback) {
-  EXPECT_EQ(expected_value, value);
-  *flag = true;
-  std::move(callback).Run(value);
+TEST_F(BindTaskRunnerTest, RemoteDisconnectHandler) {
+  bool disconnected = false;
+  remote_.set_disconnect_handler(base::BindLambdaForTesting([&] {
+    disconnected = true;
+    remote_task_runner_->Quit();
+  }));
+  impl_->receiver()->reset();
+  remote_task_runner_->Run();
+  EXPECT_TRUE(disconnected);
 }
 
 TEST_F(AssociatedBindTaskRunnerTest, MethodCall) {
   bool echo_called = false;
-  connection_impl_->sender_impl()->set_echo_handler(
-      base::Bind(&ExpectValueSetFlagAndForward, 1024, &echo_called));
+  connection_impl_->sender_impl()->set_echo_handler(base::BindLambdaForTesting(
+      [&](int32_t value, IntegerSender::EchoCallback callback) {
+        EXPECT_EQ(1024, value);
+        echo_called = true;
+        std::move(callback).Run(value);
+      }));
 
   bool echo_replied = false;
-  sender_ptr_->Echo(
-      1024, ExpectValueSetFlagAndQuitTaskRunner(1024, &echo_replied, nullptr));
+  sender_remote_->Echo(1024, base::BindLambdaForTesting([&](int32_t value) {
+                         EXPECT_EQ(1024, value);
+                         echo_replied = true;
+                       }));
 
   // The Echo request first arrives at the master endpoint's task runner, and
   // then is forwarded to the associated endpoint's task runner.
-  connection_binding_task_runner_->RunOneTask();
-  sender_binding_task_runner_->RunOneTask();
+  connection_receiver_task_runner_->RunOneTask();
+  sender_receiver_task_runner_->RunOneTask();
   EXPECT_TRUE(echo_called);
 
   // Similarly, the Echo response arrives at the master endpoint's task runner
   // and then is forwarded to the associated endpoint's task runner.
-  connection_ptr_task_runner_->RunOneTask();
-  sender_ptr_task_runner_->RunOneTask();
+  connection_remote_task_runner_->RunOneTask();
+  sender_remote_task_runner_->RunOneTask();
   EXPECT_TRUE(echo_replied);
 }
 
-TEST_F(AssociatedBindTaskRunnerTest, BindingConnectionError) {
-  bool sender_impl_error = false;
-  connection_impl_->sender_impl()->binding()->set_connection_error_handler(
-      SetFlagAndQuitTaskRunner(&sender_impl_error,
-                               sender_binding_task_runner_));
-  bool connection_impl_error = false;
-  connection_impl_->binding()->set_connection_error_handler(
-      SetFlagAndQuitTaskRunner(&connection_impl_error,
-                               connection_binding_task_runner_));
-  bool sender_ptr_error = false;
-  sender_ptr_.set_connection_error_handler(
-      SetFlagAndQuitTaskRunner(&sender_ptr_error, sender_ptr_task_runner_));
-  connection_ptr_.reset();
-  sender_ptr_task_runner_->Run();
-  EXPECT_TRUE(sender_ptr_error);
-  connection_binding_task_runner_->Run();
-  EXPECT_TRUE(connection_impl_error);
-  sender_binding_task_runner_->Run();
-  EXPECT_TRUE(sender_impl_error);
+TEST_F(AssociatedBindTaskRunnerTest, ReceiverDisconnectHandler) {
+  bool sender_impl_disconnected = false;
+  connection_impl_->sender_impl()->receiver()->set_disconnect_handler(
+      base::BindLambdaForTesting([&] {
+        sender_impl_disconnected = true;
+        sender_receiver_task_runner_->Quit();
+      }));
+  bool connection_impl_disconnected = false;
+  connection_impl_->receiver()->set_disconnect_handler(
+      base::BindLambdaForTesting([&] {
+        connection_impl_disconnected = true;
+        connection_receiver_task_runner_->Quit();
+      }));
+  bool sender_remote_disconnected = false;
+  sender_remote_.set_disconnect_handler(base::BindLambdaForTesting([&] {
+    sender_remote_disconnected = true;
+    sender_remote_task_runner_->Quit();
+  }));
+  connection_remote_.reset();
+  sender_remote_task_runner_->Run();
+  EXPECT_TRUE(sender_remote_disconnected);
+  connection_receiver_task_runner_->Run();
+  EXPECT_TRUE(connection_impl_disconnected);
+  sender_receiver_task_runner_->Run();
+  EXPECT_TRUE(sender_impl_disconnected);
 }
 
-TEST_F(AssociatedBindTaskRunnerTest, PtrConnectionError) {
-  bool sender_impl_error = false;
-  connection_impl_->sender_impl()->binding()->set_connection_error_handler(
-      SetFlagAndQuitTaskRunner(&sender_impl_error,
-                               sender_binding_task_runner_));
-  bool connection_ptr_error = false;
-  connection_ptr_.set_connection_error_handler(
-      SetFlagAndQuitTaskRunner(&connection_ptr_error,
-                               connection_ptr_task_runner_));
-  bool sender_ptr_error = false;
-  sender_ptr_.set_connection_error_handler(
-      SetFlagAndQuitTaskRunner(&sender_ptr_error, sender_ptr_task_runner_));
-  connection_impl_->binding()->Close();
-  sender_binding_task_runner_->Run();
-  EXPECT_TRUE(sender_impl_error);
-  connection_ptr_task_runner_->Run();
-  EXPECT_TRUE(connection_ptr_error);
-  sender_ptr_task_runner_->Run();
-  EXPECT_TRUE(sender_ptr_error);
+TEST_F(AssociatedBindTaskRunnerTest, RemoteDisconnectHandler) {
+  bool sender_impl_disconnected = false;
+  connection_impl_->sender_impl()->receiver()->set_disconnect_handler(
+      base::BindLambdaForTesting([&] {
+        sender_impl_disconnected = true;
+        sender_receiver_task_runner_->Quit();
+      }));
+  bool connection_remote_disconnected = false;
+  connection_remote_.set_disconnect_handler(base::BindLambdaForTesting([&] {
+    connection_remote_disconnected = true;
+    connection_remote_task_runner_->Quit();
+  }));
+  bool sender_remote_disconnected = false;
+  sender_remote_.set_disconnect_handler(base::BindLambdaForTesting([&] {
+    sender_remote_disconnected = true;
+    sender_remote_task_runner_->Quit();
+  }));
+  connection_impl_->receiver()->reset();
+  sender_receiver_task_runner_->Run();
+  EXPECT_TRUE(sender_impl_disconnected);
+  connection_remote_task_runner_->Run();
+  EXPECT_TRUE(connection_remote_disconnected);
+  sender_remote_task_runner_->Run();
+  EXPECT_TRUE(sender_remote_disconnected);
 }
 
 }  // namespace
diff --git a/mojo/public/cpp/bindings/tests/bindings_perftest.cc b/mojo/public/cpp/bindings/tests/bindings_perftest.cc
index fb79f87..c5b5047 100644
--- a/mojo/public/cpp/bindings/tests/bindings_perftest.cc
+++ b/mojo/public/cpp/bindings/tests/bindings_perftest.cc
@@ -10,10 +10,11 @@
 #include "base/run_loop.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
-#include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/bindings/interface_endpoint_client.h"
 #include "mojo/public/cpp/bindings/lib/multiplex_router.h"
 #include "mojo/public/cpp/bindings/message.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/test_support/test_support.h"
 #include "mojo/public/cpp/test_support/test_utils.h"
 #include "mojo/public/interfaces/bindings/tests/ping_service.mojom.h"
@@ -32,30 +33,45 @@
 
 class PingServiceImpl : public test::PingService {
  public:
-  PingServiceImpl() {}
-  ~PingServiceImpl() override {}
+  PingServiceImpl() = default;
+  ~PingServiceImpl() override = default;
 
   // |PingService| methods:
-  void Ping(PingCallback callback) override;
+  void Ping(PingCallback callback) override { std::move(callback).Run(); }
 
  private:
   DISALLOW_COPY_AND_ASSIGN(PingServiceImpl);
 };
 
-void PingServiceImpl::Ping(PingCallback callback) {
-  std::move(callback).Run();
-}
-
 class PingPongTest {
  public:
-  explicit PingPongTest(test::PingServicePtr service);
+  explicit PingPongTest(PendingRemote<test::PingService> remote)
+      : remote_(std::move(remote)) {}
 
-  void Run(unsigned int iterations);
+  void Run(unsigned int iterations) {
+    iterations_to_run_ = iterations;
+    current_iterations_ = 0;
+
+    base::RunLoop run_loop;
+    quit_closure_ = run_loop.QuitClosure();
+    remote_->Ping(
+        base::BindOnce(&PingPongTest::OnPingDone, base::Unretained(this)));
+    run_loop.Run();
+  }
 
  private:
-  void OnPingDone();
+  void OnPingDone() {
+    current_iterations_++;
+    if (current_iterations_ >= iterations_to_run_) {
+      quit_closure_.Run();
+      return;
+    }
 
-  test::PingServicePtr service_;
+    remote_->Ping(
+        base::BindOnce(&PingPongTest::OnPingDone, base::Unretained(this)));
+  }
+
+  Remote<test::PingService> remote_;
   unsigned int iterations_to_run_;
   unsigned int current_iterations_;
 
@@ -64,50 +80,28 @@
   DISALLOW_COPY_AND_ASSIGN(PingPongTest);
 };
 
-PingPongTest::PingPongTest(test::PingServicePtr service)
-    : service_(std::move(service)) {}
-
-void PingPongTest::Run(unsigned int iterations) {
-  iterations_to_run_ = iterations;
-  current_iterations_ = 0;
-
-  base::RunLoop run_loop;
-  quit_closure_ = run_loop.QuitClosure();
-  service_->Ping(base::Bind(&PingPongTest::OnPingDone, base::Unretained(this)));
-  run_loop.Run();
-}
-
-void PingPongTest::OnPingDone() {
-  current_iterations_++;
-  if (current_iterations_ >= iterations_to_run_) {
-    quit_closure_.Run();
-    return;
-  }
-
-  service_->Ping(base::Bind(&PingPongTest::OnPingDone, base::Unretained(this)));
-}
-
 struct BoundPingService {
-  BoundPingService() : binding(&impl) { binding.Bind(MakeRequest(&service)); }
+  BoundPingService() : receiver(&impl, remote.BindNewPipeAndPassReceiver()) {}
 
   PingServiceImpl impl;
-  test::PingServicePtr service;
-  Binding<test::PingService> binding;
+  Remote<test::PingService> remote;
+  Receiver<test::PingService> receiver;
 };
 
 class MojoBindingsPerftest : public testing::Test {
  public:
-  MojoBindingsPerftest() {}
+  MojoBindingsPerftest() = default;
 
  protected:
   base::MessageLoop loop_;
 };
 
 TEST_F(MojoBindingsPerftest, InProcessPingPong) {
-  test::PingServicePtr service;
+  PendingRemote<test::PingService> remote;
   PingServiceImpl impl;
-  Binding<test::PingService> binding(&impl, MakeRequest(&service));
-  PingPongTest test(std::move(service));
+  Receiver<test::PingService> receiver(&impl,
+                                       remote.InitWithNewPipeAndPassReceiver());
+  PingPongTest test(std::move(remote));
 
   {
     const unsigned int kIterations = 100000;
diff --git a/mojo/public/cpp/bindings/tests/data_view_unittest.cc b/mojo/public/cpp/bindings/tests/data_view_unittest.cc
index 3d7f50b..97c0353 100644
--- a/mojo/public/cpp/bindings/tests/data_view_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/data_view_unittest.cc
@@ -8,9 +8,11 @@
 #include <vector>
 
 #include "base/message_loop/message_loop.h"
-#include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/bindings/lib/fixed_buffer.h"
 #include "mojo/public/cpp/bindings/lib/serialization.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/interfaces/bindings/tests/test_data_view.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -43,8 +45,8 @@
 
 class TestInterfaceImpl : public TestInterface {
  public:
-  explicit TestInterfaceImpl(TestInterfaceRequest request)
-      : binding_(this, std::move(request)) {}
+  explicit TestInterfaceImpl(PendingReceiver<TestInterface> receiver)
+      : receiver_(this, std::move(receiver)) {}
   ~TestInterfaceImpl() override {}
 
   // TestInterface implementation:
@@ -53,7 +55,7 @@
   }
 
  private:
-  Binding<TestInterface> binding_;
+  Receiver<TestInterface> receiver_;
 };
 
 }  // namespace
@@ -165,11 +167,11 @@
 }
 
 TEST_F(DataViewTest, InterfaceArray) {
-  TestInterfacePtrInfo ptr_info;
-  TestInterfaceImpl impl(MakeRequest(&ptr_info));
+  PendingRemote<TestInterface> pending_remote;
+  TestInterfaceImpl impl(pending_remote.InitWithNewPipeAndPassReceiver());
 
   TestStructPtr obj(TestStruct::New());
-  obj->f_interface_array.push_back(std::move(ptr_info));
+  obj->f_interface_array.push_back(std::move(pending_remote));
 
   auto data_view_holder = SerializeTestStruct(std::move(obj));
   auto& data_view = *data_view_holder->data_view;
@@ -180,10 +182,12 @@
   ASSERT_FALSE(array_data_view.is_null());
   ASSERT_EQ(1u, array_data_view.size());
 
-  TestInterfacePtr ptr2 = array_data_view.Take<TestInterfacePtr>(0);
-  ASSERT_TRUE(ptr2);
+  pending_remote = array_data_view.Take<PendingRemote<TestInterface>>(0);
+  ASSERT_TRUE(pending_remote);
   int32_t result = 0;
-  ASSERT_TRUE(ptr2->Echo(42, &result));
+
+  Remote<TestInterface> remote(std::move(pending_remote));
+  ASSERT_TRUE(remote->Echo(42, &result));
   EXPECT_EQ(42, result);
 }
 
diff --git a/mojo/public/cpp/bindings/tests/e2e_perftest.cc b/mojo/public/cpp/bindings/tests/e2e_perftest.cc
index b32b4c0..3fae17f5 100644
--- a/mojo/public/cpp/bindings/tests/e2e_perftest.cc
+++ b/mojo/public/cpp/bindings/tests/e2e_perftest.cc
@@ -16,7 +16,8 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "mojo/core/embedder/embedder.h"
 #include "mojo/core/test/mojo_test_base.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/interfaces/bindings/tests/ping_service.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -25,31 +26,34 @@
 
 class EchoServiceImpl : public test::EchoService {
  public:
-  explicit EchoServiceImpl(const base::Closure& quit_closure);
-  ~EchoServiceImpl() override;
+  EchoServiceImpl(PendingReceiver<test::EchoService> receiver,
+                  base::OnceClosure quit_closure)
+      : receiver_(this, std::move(receiver)),
+        quit_closure_(std::move(quit_closure)) {
+    receiver_.set_disconnect_handler(
+        base::BindOnce(&EchoServiceImpl::OnDisconnect, base::Unretained(this)));
+  }
 
-  // |EchoService| methods:
-  void Echo(const std::string& test_data, EchoCallback callback) override;
+  ~EchoServiceImpl() override { std::move(quit_closure_).Run(); }
+
+  // EchoService:
+  void Echo(const std::string& test_data, EchoCallback callback) override {
+    std::move(callback).Run(test_data);
+  }
 
  private:
-  const base::Closure quit_closure_;
+  void OnDisconnect() { delete this; }
+
+  Receiver<test::EchoService> receiver_;
+  base::OnceClosure quit_closure_;
 };
 
-EchoServiceImpl::EchoServiceImpl(const base::Closure& quit_closure)
-    : quit_closure_(quit_closure) {}
-
-EchoServiceImpl::~EchoServiceImpl() {
-  quit_closure_.Run();
-}
-
-void EchoServiceImpl::Echo(const std::string& test_data,
-                           EchoCallback callback) {
-  std::move(callback).Run(test_data);
-}
-
 class PingPongTest {
  public:
-  explicit PingPongTest(test::EchoServicePtr service);
+  explicit PingPongTest(PendingRemote<test::EchoService> service)
+      : service_(std::move(service)),
+        ping_done_callback_(base::BindRepeating(&PingPongTest::OnPingDone,
+                                                base::Unretained(this))) {}
 
   void RunTest(int iterations, int batch_size, int message_size);
 
@@ -57,8 +61,8 @@
   void DoPing();
   void OnPingDone(const std::string& reply);
 
-  test::EchoServicePtr service_;
-  const base::Callback<void(const std::string&)> ping_done_callback_;
+  Remote<test::EchoService> service_;
+  const base::RepeatingCallback<void(const std::string&)> ping_done_callback_;
 
   int iterations_;
   int batch_size_;
@@ -67,14 +71,9 @@
   int current_iterations_;
   int calls_outstanding_;
 
-  base::Closure quit_closure_;
+  base::OnceClosure quit_closure_;
 };
 
-PingPongTest::PingPongTest(test::EchoServicePtr service)
-    : service_(std::move(service)),
-      ping_done_callback_(
-          base::Bind(&PingPongTest::OnPingDone, base::Unretained(this))) {}
-
 void PingPongTest::RunTest(int iterations, int batch_size, int message_size) {
   iterations_ = iterations;
   batch_size_ = batch_size;
@@ -94,7 +93,7 @@
   DCHECK_EQ(0, calls_outstanding_);
   current_iterations_++;
   if (current_iterations_ > iterations_) {
-    quit_closure_.Run();
+    std::move(quit_closure_).Run();
     return;
   }
 
@@ -139,10 +138,8 @@
     const int kBatchSizes[] = {1, 10, 100};
     const int kMessageSizes[] = {8, 64, 512, 4096, 65536};
 
-    test::EchoServicePtr service;
-    service.Bind(InterfacePtrInfo<test::EchoService>(
-        ScopedMessagePipeHandle(MessagePipeHandle(client_mp)),
-        service.version()));
+    PendingRemote<test::EchoService> service(
+        ScopedMessagePipeHandle(MessagePipeHandle(client_mp)), 0);
     PingPongTest test(std::move(service));
 
     for (int batch_size : kBatchSizes) {
@@ -160,24 +157,26 @@
   }
 };
 
-void CreateAndRunService(InterfaceRequest<test::EchoService> request,
-                         const base::Closure& cb) {
-  MakeStrongBinding(std::make_unique<EchoServiceImpl>(cb), std::move(request));
+void CreateAndRunService(PendingReceiver<test::EchoService> receiver,
+                         base::OnceClosure quit_closure) {
+  // Self-owned.
+  new EchoServiceImpl(std::move(receiver), std::move(quit_closure));
 }
 
 DEFINE_TEST_CLIENT_TEST_WITH_PIPE(PingService, MojoE2EPerftest, mp) {
   MojoHandle service_mp;
   EXPECT_EQ("hello", ReadMessageWithHandles(mp, &service_mp, 1));
 
-  auto request = InterfaceRequest<test::EchoService>(
+  auto receiver = PendingReceiver<test::EchoService>(
       ScopedMessagePipeHandle(MessagePipeHandle(service_mp)));
   base::RunLoop run_loop;
   core::GetIOTaskRunner()->PostTask(
       FROM_HERE,
-      base::BindOnce(&CreateAndRunService, std::move(request),
-                     base::Bind(base::IgnoreResult(&base::TaskRunner::PostTask),
-                                message_loop_.task_runner(), FROM_HERE,
-                                run_loop.QuitClosure())));
+      base::BindOnce(
+          &CreateAndRunService, std::move(receiver),
+          base::BindOnce(base::IgnoreResult(&base::TaskRunner::PostTask),
+                         message_loop_.task_runner(), FROM_HERE,
+                         run_loop.QuitClosure())));
   run_loop.Run();
 }
 
diff --git a/mojo/public/cpp/bindings/tests/equals_unittest.cc b/mojo/public/cpp/bindings/tests/equals_unittest.cc
index 6483baf8..f91aede 100644
--- a/mojo/public/cpp/bindings/tests/equals_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/equals_unittest.cc
@@ -76,47 +76,5 @@
   EXPECT_TRUE(n1.Equals(n2));
 }
 
-TEST_F(EqualsTest, InterfacePtr) {
-  base::MessageLoop message_loop;
-
-  SomeInterfacePtr inf1;
-  SomeInterfacePtr inf2;
-
-  EXPECT_TRUE(inf1.Equals(inf1));
-  EXPECT_TRUE(inf1.Equals(inf2));
-
-  auto inf1_request = MakeRequest(&inf1);
-  ALLOW_UNUSED_LOCAL(inf1_request);
-
-  EXPECT_TRUE(inf1.Equals(inf1));
-  EXPECT_FALSE(inf1.Equals(inf2));
-
-  auto inf2_request = MakeRequest(&inf2);
-  ALLOW_UNUSED_LOCAL(inf2_request);
-
-  EXPECT_FALSE(inf1.Equals(inf2));
-}
-
-TEST_F(EqualsTest, InterfaceRequest) {
-  base::MessageLoop message_loop;
-
-  InterfaceRequest<SomeInterface> req1;
-  InterfaceRequest<SomeInterface> req2;
-
-  EXPECT_TRUE(req1.Equals(req1));
-  EXPECT_TRUE(req1.Equals(req2));
-
-  SomeInterfacePtr inf1;
-  req1 = MakeRequest(&inf1);
-
-  EXPECT_TRUE(req1.Equals(req1));
-  EXPECT_FALSE(req1.Equals(req2));
-
-  SomeInterfacePtr inf2;
-  req2 = MakeRequest(&inf2);
-
-  EXPECT_FALSE(req1.Equals(req2));
-}
-
 }  // test
 }  // mojo
diff --git a/mojo/public/cpp/bindings/tests/handle_passing_unittest.cc b/mojo/public/cpp/bindings/tests/handle_passing_unittest.cc
index f55312ad1..4d5210d 100644
--- a/mojo/public/cpp/bindings/tests/handle_passing_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/handle_passing_unittest.cc
@@ -8,9 +8,9 @@
 #include "base/bind.h"
 #include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
+#include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/tests/bindings_test_base.h"
+#include "mojo/public/cpp/bindings/unique_receiver_set.h"
 #include "mojo/public/cpp/system/wait.h"
 #include "mojo/public/cpp/test_support/test_utils.h"
 #include "mojo/public/interfaces/bindings/tests/sample_factory.mojom.h"
@@ -38,22 +38,21 @@
 
 class ImportedInterfaceImpl : public imported::ImportedInterface {
  public:
-  ImportedInterfaceImpl(
-      InterfaceRequest<imported::ImportedInterface> request,
-      const base::Closure& closure)
-      : binding_(this, std::move(request)), closure_(closure) {}
+  ImportedInterfaceImpl(PendingReceiver<imported::ImportedInterface> receiver,
+                        base::OnceClosure closure)
+      : receiver_(this, std::move(receiver)), closure_(std::move(closure)) {}
 
   void DoSomething() override {
     do_something_count_++;
-    closure_.Run();
+    std::move(closure_).Run();
   }
 
   static int do_something_count() { return do_something_count_; }
 
  private:
   static int do_something_count_;
-  Binding<ImportedInterface> binding_;
-  base::Closure closure_;
+  Receiver<ImportedInterface> receiver_;
+  base::OnceClosure closure_;
 };
 int ImportedInterfaceImpl::do_something_count_ = 0;
 
@@ -73,8 +72,8 @@
 
 class SampleFactoryImpl : public sample::Factory {
  public:
-  explicit SampleFactoryImpl(InterfaceRequest<sample::Factory> request)
-      : binding_(this, std::move(request)) {}
+  explicit SampleFactoryImpl(PendingReceiver<sample::Factory> receiver)
+      : receiver_(this, std::move(receiver)) {}
 
   void DoStuff(sample::RequestPtr request,
                ScopedMessagePipeHandle pipe,
@@ -101,7 +100,7 @@
     std::move(callback).Run(std::move(response), text1);
 
     if (request->obj) {
-      imported::ImportedInterfacePtr proxy(std::move(request->obj));
+      Remote<imported::ImportedInterface> proxy(std::move(request->obj));
       proxy->DoSomething();
     }
   }
@@ -129,24 +128,26 @@
   }
 
   void CreateNamedObject(
-      InterfaceRequest<sample::NamedObject> object_request) override {
-    EXPECT_TRUE(object_request.is_pending());
-    MakeStrongBinding(std::make_unique<SampleNamedObjectImpl>(),
-                      std::move(object_request));
+      PendingReceiver<sample::NamedObject> object_receiver) override {
+    EXPECT_TRUE(object_receiver.is_valid());
+    object_receivers_.Add(std::make_unique<SampleNamedObjectImpl>(),
+                          std::move(object_receiver));
   }
 
   // These aren't called or implemented, but exist here to test that the
   // methods are generated with the correct argument types for imported
   // interfaces.
   void RequestImportedInterface(
-      InterfaceRequest<imported::ImportedInterface> imported,
+      PendingReceiver<imported::ImportedInterface> imported,
       RequestImportedInterfaceCallback callback) override {}
-  void TakeImportedInterface(imported::ImportedInterfacePtr imported,
-                             TakeImportedInterfaceCallback callback) override {}
+  void TakeImportedInterface(
+      PendingRemote<imported::ImportedInterface> imported,
+      TakeImportedInterfaceCallback callback) override {}
 
  private:
   ScopedMessagePipeHandle pipe1_;
-  Binding<sample::Factory> binding_;
+  Receiver<sample::Factory> receiver_;
+  UniqueReceiverSet<sample::NamedObject> object_receivers_;
 };
 
 class HandlePassingTest : public BindingsTestBase {
@@ -195,8 +196,8 @@
 }
 
 TEST_P(HandlePassingTest, Basic) {
-  sample::FactoryPtr factory;
-  SampleFactoryImpl factory_impl(MakeRequest(&factory));
+  Remote<sample::Factory> factory;
+  SampleFactoryImpl factory_impl(factory.BindNewPipeAndPassReceiver());
 
   MessagePipe pipe0;
   EXPECT_TRUE(WriteTextMessage(pipe0.handle1.get(), kText1));
@@ -204,9 +205,9 @@
   MessagePipe pipe1;
   EXPECT_TRUE(WriteTextMessage(pipe1.handle1.get(), kText2));
 
-  imported::ImportedInterfacePtrInfo imported;
+  PendingRemote<imported::ImportedInterface> imported;
   base::RunLoop run_loop;
-  ImportedInterfaceImpl imported_impl(MakeRequest(&imported),
+  ImportedInterfaceImpl imported_impl(imported.InitWithNewPipeAndPassReceiver(),
                                       run_loop.QuitClosure());
 
   sample::RequestPtr request(sample::Request::New(
@@ -230,11 +231,11 @@
 }
 
 TEST_P(HandlePassingTest, PassInvalid) {
-  sample::FactoryPtr factory;
-  SampleFactoryImpl factory_impl(MakeRequest(&factory));
+  Remote<sample::Factory> factory;
+  SampleFactoryImpl factory_impl(factory.BindNewPipeAndPassReceiver());
 
   sample::RequestPtr request(sample::Request::New(1, ScopedMessagePipeHandle(),
-                                                  base::nullopt, nullptr));
+                                                  base::nullopt, NullRemote()));
 
   bool got_response = false;
   std::string got_text_reply;
@@ -252,8 +253,8 @@
 
 // Verifies DataPipeConsumer can be passed and read from.
 TEST_P(HandlePassingTest, DataPipe) {
-  sample::FactoryPtr factory;
-  SampleFactoryImpl factory_impl(MakeRequest(&factory));
+  Remote<sample::Factory> factory;
+  SampleFactoryImpl factory_impl(factory.BindNewPipeAndPassReceiver());
 
   // Writes a string to a data pipe and passes the data pipe (consumer) to the
   // factory.
@@ -287,22 +288,22 @@
 }
 
 TEST_P(HandlePassingTest, CreateNamedObject) {
-  sample::FactoryPtr factory;
-  SampleFactoryImpl factory_impl(MakeRequest(&factory));
+  Remote<sample::Factory> factory;
+  SampleFactoryImpl factory_impl(factory.BindNewPipeAndPassReceiver());
 
-  sample::NamedObjectPtr object1;
+  Remote<sample::NamedObject> object1;
   EXPECT_FALSE(object1);
 
-  auto object1_request = mojo::MakeRequest(&object1);
-  EXPECT_TRUE(object1_request.is_pending());
-  factory->CreateNamedObject(std::move(object1_request));
-  EXPECT_FALSE(object1_request.is_pending());  // We've passed the request.
+  auto object1_receiver = object1.BindNewPipeAndPassReceiver();
+  EXPECT_TRUE(object1_receiver);
+  factory->CreateNamedObject(std::move(object1_receiver));
+  EXPECT_FALSE(object1_receiver);
 
   ASSERT_TRUE(object1);
   object1->SetName("object1");
 
-  sample::NamedObjectPtr object2;
-  factory->CreateNamedObject(MakeRequest(&object2));
+  Remote<sample::NamedObject> object2;
+  factory->CreateNamedObject(object2.BindNewPipeAndPassReceiver());
   object2->SetName("object2");
 
   base::RunLoop run_loop, run_loop2;
diff --git a/mojo/public/cpp/bindings/tests/lazy_serialization_unittest.cc b/mojo/public/cpp/bindings/tests/lazy_serialization_unittest.cc
index 3fe075bd..424e47d23 100644
--- a/mojo/public/cpp/bindings/tests/lazy_serialization_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/lazy_serialization_unittest.cc
@@ -7,7 +7,8 @@
 #include "base/run_loop.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/scoped_task_environment.h"
-#include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/bindings/tests/bindings_test_base.h"
 #include "mojo/public/interfaces/bindings/tests/struct_with_traits.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -17,8 +18,8 @@
 
 class LazySerializationTest : public testing::Test {
  public:
-  LazySerializationTest() {}
-  ~LazySerializationTest() override {}
+  LazySerializationTest() = default;
+  ~LazySerializationTest() override = default;
 
  private:
   base::test::ScopedTaskEnvironment task_environment_;
@@ -29,9 +30,9 @@
 class TestUnserializedStructImpl : public test::TestUnserializedStruct {
  public:
   explicit TestUnserializedStructImpl(
-      test::TestUnserializedStructRequest request)
-      : binding_(this, std::move(request)) {}
-  ~TestUnserializedStructImpl() override {}
+      PendingReceiver<test::TestUnserializedStruct> receiver)
+      : receiver_(this, std::move(receiver)) {}
+  ~TestUnserializedStructImpl() override = default;
 
   // test::TestUnserializedStruct:
   void PassUnserializedStruct(
@@ -41,15 +42,15 @@
   }
 
  private:
-  mojo::Binding<test::TestUnserializedStruct> binding_;
+  Receiver<test::TestUnserializedStruct> receiver_;
 
   DISALLOW_COPY_AND_ASSIGN(TestUnserializedStructImpl);
 };
 
 class ForceSerializeTesterImpl : public test::ForceSerializeTester {
  public:
-  ForceSerializeTesterImpl(test::ForceSerializeTesterRequest request)
-      : binding_(this, std::move(request)) {}
+  ForceSerializeTesterImpl(PendingReceiver<test::ForceSerializeTester> receiver)
+      : receiver_(this, std::move(receiver)) {}
   ~ForceSerializeTesterImpl() override = default;
 
   // test::ForceSerializeTester:
@@ -66,7 +67,7 @@
   }
 
  private:
-  Binding<test::ForceSerializeTester> binding_;
+  Receiver<test::ForceSerializeTester> receiver_;
 
   DISALLOW_COPY_AND_ASSIGN(ForceSerializeTesterImpl);
 };
@@ -77,8 +78,8 @@
   // supports lazy serialization, and where both ends of the interface are in
   // the same process.
 
-  test::TestUnserializedStructPtr ptr;
-  TestUnserializedStructImpl impl(MakeRequest(&ptr));
+  Remote<test::TestUnserializedStruct> remote;
+  TestUnserializedStructImpl impl(remote.BindNewPipeAndPassReceiver());
 
   const int32_t kTestMagicNumber = 42;
 
@@ -89,18 +90,14 @@
   // Send our data over the pipe and wait for it to come back. The value should
   // be preserved. We know the data was never serialized because the
   // StructTraits for this type will DCHECK if executed in any capacity.
-  int received_number = 0;
   base::RunLoop loop;
-  ptr->PassUnserializedStruct(
-      data, base::Bind(
-                [](base::RunLoop* loop, int* received_number,
-                   const test::StructWithUnreachableTraitsImpl& passed) {
-                  *received_number = passed.magic_number;
-                  loop->Quit();
-                },
-                &loop, &received_number));
+  remote->PassUnserializedStruct(
+      data, base::BindLambdaForTesting(
+                [&](const test::StructWithUnreachableTraitsImpl& passed) {
+                  EXPECT_EQ(kTestMagicNumber, passed.magic_number);
+                  loop.Quit();
+                }));
   loop.Run();
-  EXPECT_EQ(kTestMagicNumber, received_number);
 }
 
 TEST_F(LazySerializationTest, ForceSerialize) {
@@ -108,8 +105,8 @@
   // with lazy serialization enabled, messages which carry a force-serialized
   // type will always serialize at call time.
 
-  test::ForceSerializeTesterPtr tester;
-  ForceSerializeTesterImpl impl(mojo::MakeRequest(&tester));
+  Remote<test::ForceSerializeTester> tester;
+  ForceSerializeTesterImpl impl(tester.BindNewPipeAndPassReceiver());
 
   constexpr int32_t kTestValue = 42;
 
@@ -138,8 +135,8 @@
   // context, i.e. when a force-serialized type is contained within a
   // non-force-serialized type,
 
-  test::ForceSerializeTesterPtr tester;
-  ForceSerializeTesterImpl impl(mojo::MakeRequest(&tester));
+  Remote<test::ForceSerializeTester> tester;
+  ForceSerializeTesterImpl impl(tester.BindNewPipeAndPassReceiver());
 
   constexpr int32_t kTestValue = 42;
 
diff --git a/mojo/public/cpp/bindings/tests/native_struct_unittest.cc b/mojo/public/cpp/bindings/tests/native_struct_unittest.cc
index 95a549d..92d1976d 100644
--- a/mojo/public/cpp/bindings/tests/native_struct_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/native_struct_unittest.cc
@@ -11,7 +11,8 @@
 #include "base/run_loop.h"
 #include "base/test/scoped_task_environment.h"
 #include "ipc/ipc_param_traits.h"
-#include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/bindings/tests/bindings_test_base.h"
 #include "mojo/public/cpp/system/message_pipe.h"
 #include "mojo/public/cpp/system/wait.h"
@@ -23,10 +24,10 @@
 class NativeStructTest : public BindingsTestBase,
                          public test::NativeTypeTester {
  public:
-  NativeStructTest() : binding_(this, mojo::MakeRequest(&proxy_)) {}
+  NativeStructTest() : receiver_(this, remote_.BindNewPipeAndPassReceiver()) {}
   ~NativeStructTest() override = default;
 
-  test::NativeTypeTester* proxy() { return proxy_.get(); }
+  test::NativeTypeTester* remote() { return remote_.get(); }
 
  private:
   // test::NativeTypeTester:
@@ -41,8 +42,8 @@
     std::move(callback).Run(std::move(s));
   }
 
-  test::NativeTypeTesterPtr proxy_;
-  Binding<test::NativeTypeTester> binding_;
+  Remote<test::NativeTypeTester> remote_;
+  Receiver<test::NativeTypeTester> receiver_;
 
   DISALLOW_COPY_AND_ASSIGN(NativeStructTest);
 };
@@ -50,7 +51,7 @@
 TEST_P(NativeStructTest, NativeStruct) {
   test::TestNativeStruct s("hello world", 5, 42);
   base::RunLoop loop;
-  proxy()->PassNativeStruct(
+  remote()->PassNativeStruct(
       s, base::Bind(
              [](test::TestNativeStruct* expected_struct, base::RunLoop* loop,
                 const test::TestNativeStruct& passed) {
@@ -69,7 +70,7 @@
   test::TestNativeStructWithAttachments s(kTestMessage,
                                           std::move(pipe.handle0));
   base::RunLoop loop;
-  proxy()->PassNativeStructWithAttachments(
+  remote()->PassNativeStructWithAttachments(
       std::move(s),
       base::Bind(
           [](const std::string& expected_message,
diff --git a/mojo/public/cpp/bindings/tests/pickle_unittest.cc b/mojo/public/cpp/bindings/tests/pickle_unittest.cc
index 217fa6a5..8049c54 100644
--- a/mojo/public/cpp/bindings/tests/pickle_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/pickle_unittest.cc
@@ -10,8 +10,9 @@
 #include "base/logging.h"
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
-#include "mojo/public/cpp/bindings/interface_request.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver_set.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/bindings/tests/pickled_types_blink.h"
 #include "mojo/public/cpp/bindings/tests/pickled_types_chromium.h"
 #include "mojo/public/cpp/bindings/tests/variant_test_util.h"
@@ -68,8 +69,8 @@
 }
 
 template <typename T>
-void ExpectError(InterfacePtr<T>* proxy, const base::Closure& callback) {
-  proxy->set_connection_error_handler(callback);
+void ExpectError(Remote<T>* proxy, base::OnceClosure callback) {
+  proxy->set_disconnect_handler(std::move(callback));
 }
 
 template <typename Func, typename Arg>
@@ -153,20 +154,20 @@
   PickleTest() {}
 
   template <typename ProxyType = PicklePasser>
-  InterfacePtr<ProxyType> ConnectToChromiumService() {
-    InterfacePtr<ProxyType> proxy;
-    chromium_bindings_.AddBinding(
-        &chromium_service_,
-        ConvertInterfaceRequest<PicklePasser>(mojo::MakeRequest(&proxy)));
+  Remote<ProxyType> ConnectToChromiumService() {
+    Remote<ProxyType> proxy;
+    chromium_receivers_.Add(&chromium_service_,
+                            ConvertPendingReceiver<PicklePasser>(
+                                proxy.BindNewPipeAndPassReceiver()));
     return proxy;
   }
 
   template <typename ProxyType = blink::PicklePasser>
-  InterfacePtr<ProxyType> ConnectToBlinkService() {
-    InterfacePtr<ProxyType> proxy;
-    blink_bindings_.AddBinding(&blink_service_,
-                               ConvertInterfaceRequest<blink::PicklePasser>(
-                                   mojo::MakeRequest(&proxy)));
+  Remote<ProxyType> ConnectToBlinkService() {
+    Remote<ProxyType> proxy;
+    blink_receivers_.Add(&blink_service_,
+                         ConvertPendingReceiver<blink::PicklePasser>(
+                             proxy.BindNewPipeAndPassReceiver()));
     return proxy;
   }
 
@@ -192,9 +193,9 @@
  private:
   base::MessageLoop loop_;
   ChromiumPicklePasserImpl chromium_service_;
-  BindingSet<PicklePasser> chromium_bindings_;
+  ReceiverSet<PicklePasser> chromium_receivers_;
   BlinkPicklePasserImpl blink_service_;
-  BindingSet<blink::PicklePasser> blink_bindings_;
+  ReceiverSet<blink::PicklePasser> blink_receivers_;
 };
 
 }  // namespace
diff --git a/mojo/public/cpp/bindings/tests/receiver_callback_unittest.cc b/mojo/public/cpp/bindings/tests/receiver_callback_unittest.cc
index d944bd06..38880d1 100644
--- a/mojo/public/cpp/bindings/tests/receiver_callback_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/receiver_callback_unittest.cc
@@ -9,10 +9,11 @@
 #include "base/logging.h"
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
+#include "base/test/bind_test_util.h"
 #include "base/test/gtest_util.h"
 #include "build/build_config.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/bindings/interface_ptr.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/system/message_pipe.h"
 #include "mojo/public/cpp/test_support/test_support.h"
 #include "mojo/public/interfaces/bindings/tests/sample_interfaces.mojom.h"
@@ -21,11 +22,11 @@
 ///////////////////////////////////////////////////////////////////////////////
 //
 // The tests in this file are designed to test the interaction between a
-// Callback and its associated Binding. If a Callback is deleted before
-// being used we DCHECK fail--unless the associated Binding has already
+// Callback and its associated Receiver. If a Callback is deleted before
+// being used we DCHECK fail--unless the associated Receiver has already
 // been closed or deleted. This contract must be explained to the Mojo
 // application developer. For example it is the developer's responsibility to
-// ensure that the Binding is destroyed before an unused Callback is destroyed.
+// ensure that the Receiver is destroyed before an unused Callback is destroyed.
 //
 ///////////////////////////////////////////////////////////////////////////////
 
@@ -33,17 +34,6 @@
 namespace test {
 namespace {
 
-void SaveValue(int32_t* storage, const base::Closure& closure, int32_t value) {
-  *storage = value;
-  if (!closure.is_null())
-    closure.Run();
-}
-
-base::Callback<void(int32_t)> BindValueSaver(int32_t* last_value_seen,
-                                             const base::Closure& closure) {
-  return base::Bind(&SaveValue, last_value_seen, closure);
-}
-
 // An implementation of sample::Provider used on the server side.
 // It only implements one of the methods: EchoInt().
 // All it does is save the values and Callbacks it sees.
@@ -72,10 +62,8 @@
   void EchoInt(int32_t x, EchoIntCallback callback) override {
     last_server_value_seen_ = x;
     callback_saved_ = std::move(callback);
-    if (!closure_.is_null()) {
-      closure_.Run();
-      closure_.Reset();
-    }
+    if (closure_)
+      std::move(closure_).Run();
   }
 
   void EchoString(const std::string& a, EchoStringCallback callback) override {
@@ -97,26 +85,26 @@
     CHECK(false) << "Not implemented.";
   }
 
-  void resetLastServerValueSeen() { last_server_value_seen_ = 0; }
+  void ResetLastServerValueSeen() { last_server_value_seen_ = 0; }
 
   int32_t last_server_value_seen() const { return last_server_value_seen_; }
 
-  void set_closure(const base::Closure& closure) { closure_ = closure; }
+  void set_closure(base::OnceClosure closure) { closure_ = std::move(closure); }
 
  private:
   int32_t last_server_value_seen_;
   EchoIntCallback callback_saved_;
-  base::Closure closure_;
+  base::OnceClosure closure_;
 };
 
-class BindingCallbackTest : public testing::Test {
+class ReceiverCallbackTest : public testing::Test {
  public:
-  BindingCallbackTest() {}
-  ~BindingCallbackTest() override {}
+  ReceiverCallbackTest() {}
+  ~ReceiverCallbackTest() override {}
 
  protected:
   int32_t last_client_callback_value_seen_;
-  sample::ProviderPtr interface_ptr_;
+  Remote<sample::Provider> remote_;
 
   void PumpMessages() { base::RunLoop().RunUntilIdle(); }
 
@@ -124,24 +112,25 @@
   base::MessageLoop loop_;
 };
 
-// Tests that the InterfacePtr and the Binding can communicate with each
-// other normally.
-TEST_F(BindingCallbackTest, Basic) {
-  // Create the ServerImpl and the Binding.
+// Tests that the Remote and the Receiver can communicate with each other
+// normally.
+TEST_F(ReceiverCallbackTest, Basic) {
+  // Create the ServerImpl and the Receiver.
   InterfaceImpl server_impl;
-  Binding<sample::Provider> binding(&server_impl, MakeRequest(&interface_ptr_));
+  Receiver<sample::Provider> receiver(&server_impl,
+                                      remote_.BindNewPipeAndPassReceiver());
 
   // Initialize the test values.
-  server_impl.resetLastServerValueSeen();
+  server_impl.ResetLastServerValueSeen();
   last_client_callback_value_seen_ = 0;
 
   // Invoke the Echo method.
   base::RunLoop run_loop, run_loop2;
   server_impl.set_closure(run_loop.QuitClosure());
-  interface_ptr_->EchoInt(
-      7,
-      BindValueSaver(&last_client_callback_value_seen_,
-                     run_loop2.QuitClosure()));
+  remote_->EchoInt(7, base::BindLambdaForTesting([&](int32_t value) {
+                     last_client_callback_value_seen_ = value;
+                     run_loop2.Quit();
+                   }));
   run_loop.Run();
 
   // Check that server saw the correct value, but the client has not yet.
@@ -156,16 +145,16 @@
   EXPECT_EQ(7, last_client_callback_value_seen_);
 
   // Initialize the test values again.
-  server_impl.resetLastServerValueSeen();
+  server_impl.ResetLastServerValueSeen();
   last_client_callback_value_seen_ = 0;
 
   // Invoke the Echo method again.
   base::RunLoop run_loop3, run_loop4;
   server_impl.set_closure(run_loop3.QuitClosure());
-  interface_ptr_->EchoInt(
-      13,
-      BindValueSaver(&last_client_callback_value_seen_,
-                     run_loop4.QuitClosure()));
+  remote_->EchoInt(13, base::BindLambdaForTesting([&](int32_t value) {
+                     last_client_callback_value_seen_ = value;
+                     run_loop4.Quit();
+                   }));
   run_loop3.Run();
 
   // Check that server saw the correct value, but the client has not yet.
@@ -180,31 +169,31 @@
   EXPECT_EQ(13, last_client_callback_value_seen_);
 }
 
-// Tests that running the Callback after the Binding has been deleted
+// Tests that running the Callback after the Receiver has been deleted
 // results in a clean failure.
-TEST_F(BindingCallbackTest, DeleteBindingThenRunCallback) {
+TEST_F(ReceiverCallbackTest, DeleteReceiverThenRunCallback) {
   // Create the ServerImpl.
   InterfaceImpl server_impl;
   base::RunLoop run_loop;
   {
-    // Create the binding in an inner scope so it can be deleted first.
-    Binding<sample::Provider> binding(&server_impl,
-                                      MakeRequest(&interface_ptr_));
-    interface_ptr_.set_connection_error_handler(run_loop.QuitClosure());
+    // Create the receiver in an inner scope so it can be deleted first.
+    Receiver<sample::Provider> receiver(&server_impl,
+                                        remote_.BindNewPipeAndPassReceiver());
+    remote_.set_disconnect_handler(run_loop.QuitClosure());
 
     // Initialize the test values.
-    server_impl.resetLastServerValueSeen();
+    server_impl.ResetLastServerValueSeen();
     last_client_callback_value_seen_ = 0;
 
     // Invoke the Echo method.
     base::RunLoop run_loop2;
     server_impl.set_closure(run_loop2.QuitClosure());
-    interface_ptr_->EchoInt(
-        7,
-        BindValueSaver(&last_client_callback_value_seen_, base::Closure()));
+    remote_->EchoInt(7, base::BindLambdaForTesting([&](int32_t value) {
+                       last_client_callback_value_seen_ = value;
+                     }));
     run_loop2.Run();
   }
-  // The binding has now been destroyed and the pipe is closed.
+  // The receiver has now been destroyed and its pipe endpoint is closed.
 
   // Check that server saw the correct value, but the client has not yet.
   EXPECT_EQ(7, server_impl.last_server_value_seen());
@@ -220,76 +209,78 @@
 
   // Attempt to invoke the method again and confirm that an error was
   // encountered.
-  interface_ptr_->EchoInt(
-      13,
-      BindValueSaver(&last_client_callback_value_seen_, base::Closure()));
+  remote_->EchoInt(13, base::BindLambdaForTesting([&](int32_t value) {
+                     last_client_callback_value_seen_ = value;
+                     run_loop.Quit();
+                   }));
   run_loop.Run();
-  EXPECT_TRUE(interface_ptr_.encountered_error());
+  EXPECT_FALSE(remote_.is_connected());
 }
 
 // Tests that deleting a Callback without running it after the corresponding
-// binding has already been deleted does not result in a crash.
-TEST_F(BindingCallbackTest, DeleteBindingThenDeleteCallback) {
+// Receiver has already been deleted does not result in a crash.
+TEST_F(ReceiverCallbackTest, DeleteReceiverThenDeleteCallback) {
   // Create the ServerImpl.
   InterfaceImpl server_impl;
   {
-    // Create the binding in an inner scope so it can be deleted first.
-    Binding<sample::Provider> binding(&server_impl,
-                                      MakeRequest(&interface_ptr_));
+    // Create the receiver in an inner scope so it can be deleted first.
+    Receiver<sample::Provider> receiver(&server_impl,
+                                        remote_.BindNewPipeAndPassReceiver());
 
     // Initialize the test values.
-    server_impl.resetLastServerValueSeen();
+    server_impl.ResetLastServerValueSeen();
     last_client_callback_value_seen_ = 0;
 
     // Invoke the Echo method.
     base::RunLoop run_loop;
     server_impl.set_closure(run_loop.QuitClosure());
-    interface_ptr_->EchoInt(
-        7,
-        BindValueSaver(&last_client_callback_value_seen_, base::Closure()));
+    remote_->EchoInt(7, base::BindLambdaForTesting([&](int32_t value) {
+                       last_client_callback_value_seen_ = value;
+                     }));
     run_loop.Run();
   }
-  // The binding has now been destroyed and the pipe is closed.
+  // The receiver has now been destroyed and its pipe endpoint is closed.
 
   // Check that server saw the correct value, but the client has not yet.
   EXPECT_EQ(7, server_impl.last_server_value_seen());
   EXPECT_EQ(0, last_client_callback_value_seen_);
 
   // Delete the callback without running it. This should not
-  // cause a problem because the insfrastructure can detect that the
-  // binding has already been destroyed and the pipe is closed.
+  // cause a problem because the infrastructure can detect that the
+  // receiver has already been destroyed.
   server_impl.DeleteCallback();
 }
 
-// Tests that closing a Binding allows us to delete a callback
+// Tests that closing a Receiver allows us to delete a callback
 // without running it without encountering a crash.
-TEST_F(BindingCallbackTest, CloseBindingBeforeDeletingCallback) {
-  // Create the ServerImpl and the Binding.
+TEST_F(ReceiverCallbackTest, ResetReceiverBeforeDeletingCallback) {
+  // Create the ServerImpl and the Receiver.
   InterfaceImpl server_impl;
-  Binding<sample::Provider> binding(&server_impl, MakeRequest(&interface_ptr_));
+  Receiver<sample::Provider> receiver(&server_impl,
+                                      remote_.BindNewPipeAndPassReceiver());
 
   // Initialize the test values.
-  server_impl.resetLastServerValueSeen();
+  server_impl.ResetLastServerValueSeen();
   last_client_callback_value_seen_ = 0;
 
   // Invoke the Echo method.
   base::RunLoop run_loop;
   server_impl.set_closure(run_loop.QuitClosure());
-  interface_ptr_->EchoInt(
-      7,
-      BindValueSaver(&last_client_callback_value_seen_, base::Closure()));
+  remote_->EchoInt(7, base::BindLambdaForTesting([&](int32_t value) {
+                     last_client_callback_value_seen_ = value;
+                   }));
   run_loop.Run();
 
   // Check that server saw the correct value, but the client has not yet.
   EXPECT_EQ(7, server_impl.last_server_value_seen());
   EXPECT_EQ(0, last_client_callback_value_seen_);
 
-  // Now close the Binding.
-  binding.Close();
+  // Now disconnect the Receiver.
+  receiver.reset();
 
   // Delete the callback without running it. This should not
-  // cause a crash because the insfrastructure can detect that the
-  // binding has already been closed.
+  // cause a crash because the infrastructure can detect that the
+  // receiver has already been closed.
   server_impl.DeleteCallback();
 
   // Check that the client has still not seen the correct value.
@@ -297,22 +288,23 @@
 }
 
 // Tests that deleting a Callback without using it before the
-// Binding has been destroyed or closed results in a DCHECK.
-TEST_F(BindingCallbackTest, DeleteCallbackBeforeBindingDeathTest) {
-  // Create the ServerImpl and the Binding.
+// Receiver has been destroyed or closed results in a DCHECK.
+TEST_F(ReceiverCallbackTest, DeleteCallbackBeforeReceiverDeathTest) {
+  // Create the ServerImpl and the Receiver.
   InterfaceImpl server_impl;
-  Binding<sample::Provider> binding(&server_impl, MakeRequest(&interface_ptr_));
+  Receiver<sample::Provider> receiver(&server_impl,
+                                      remote_.BindNewPipeAndPassReceiver());
 
   // Initialize the test values.
-  server_impl.resetLastServerValueSeen();
+  server_impl.ResetLastServerValueSeen();
   last_client_callback_value_seen_ = 0;
 
   // Invoke the Echo method.
   base::RunLoop run_loop;
   server_impl.set_closure(run_loop.QuitClosure());
-  interface_ptr_->EchoInt(
-      7,
-      BindValueSaver(&last_client_callback_value_seen_, base::Closure()));
+  remote_->EchoInt(7, base::BindLambdaForTesting([&](int32_t value) {
+                     last_client_callback_value_seen_ = value;
+                   }));
   run_loop.Run();
 
   // Check that server saw the correct value, but the client has not yet.
diff --git a/mojo/public/cpp/bindings/tests/receiver_set_unittest.cc b/mojo/public/cpp/bindings/tests/receiver_set_unittest.cc
index 0377f82..c8829d4 100644
--- a/mojo/public/cpp/bindings/tests/receiver_set_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/receiver_set_unittest.cc
@@ -7,11 +7,12 @@
 
 #include "base/bind.h"
 #include "base/run_loop.h"
+#include "base/test/bind_test_util.h"
 #include "mojo/core/embedder/embedder.h"
-#include "mojo/public/cpp/bindings/associated_binding_set.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
-#include "mojo/public/cpp/bindings/strong_binding_set.h"
+#include "mojo/public/cpp/bindings/associated_receiver_set.h"
+#include "mojo/public/cpp/bindings/receiver_set.h"
 #include "mojo/public/cpp/bindings/tests/bindings_test_base.h"
+#include "mojo/public/cpp/bindings/unique_receiver_set.h"
 #include "mojo/public/interfaces/bindings/tests/ping_service.mojom.h"
 #include "mojo/public/interfaces/bindings/tests/test_associated_interfaces.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -20,74 +21,75 @@
 namespace test {
 namespace {
 
-using BindingSetTest = BindingsTestBase;
+using ReceiverSetTest = BindingsTestBase;
 
-template <typename BindingSetType, typename ContextType>
-void ExpectContextHelper(BindingSetType* binding_set,
+template <typename ReceiverSetType, typename ContextType>
+void ExpectContextHelper(ReceiverSetType* receiver_set,
                          ContextType expected_context) {
-  EXPECT_EQ(expected_context, binding_set->dispatch_context());
+  EXPECT_EQ(expected_context, receiver_set->current_context());
 }
 
-template <typename BindingSetType, typename ContextType>
-base::Closure ExpectContext(BindingSetType* binding_set,
-                            ContextType expected_context) {
-  return base::Bind(
-      &ExpectContextHelper<BindingSetType, ContextType>, binding_set,
-      expected_context);
+template <typename ReceiverSetType, typename ContextType>
+base::RepeatingClosure ExpectContext(ReceiverSetType* receiver_set,
+                                     ContextType expected_context) {
+  return base::BindRepeating(&ExpectContextHelper<ReceiverSetType, ContextType>,
+                             receiver_set, expected_context);
 }
 
-template <typename BindingSetType>
-void ExpectBindingIdHelper(BindingSetType* binding_set,
-                           BindingId expected_binding_id) {
-  EXPECT_EQ(expected_binding_id, binding_set->dispatch_binding());
+template <typename ReceiverSetType>
+void ExpectReceiverIdHelper(ReceiverSetType* receiver_set,
+                            ReceiverId expected_receiver_id) {
+  EXPECT_EQ(expected_receiver_id, receiver_set->current_receiver());
 }
 
-template <typename BindingSetType>
-base::Closure ExpectBindingId(BindingSetType* binding_set,
-                              BindingId expected_binding_id) {
-  return base::Bind(&ExpectBindingIdHelper<BindingSetType>, binding_set,
-                    expected_binding_id);
+template <typename ReceiverSetType>
+base::RepeatingClosure ExpectReceiverId(ReceiverSetType* receiver_set,
+                                        ReceiverId expected_receiver_id) {
+  return base::BindRepeating(&ExpectReceiverIdHelper<ReceiverSetType>,
+                             receiver_set, expected_receiver_id);
 }
 
-template <typename BindingSetType>
-void ReportBadMessageHelper(BindingSetType* binding_set,
+template <typename ReceiverSetType>
+void ReportBadMessageHelper(ReceiverSetType* receiver_set,
                             const std::string& error) {
-  binding_set->ReportBadMessage(error);
+  receiver_set->ReportBadMessage(error);
 }
 
-template <typename BindingSetType>
-base::Closure ReportBadMessage(BindingSetType* binding_set,
-                               const std::string& error) {
-  return base::Bind(&ReportBadMessageHelper<BindingSetType>, binding_set,
-                    error);
+template <typename ReceiverSetType>
+base::RepeatingClosure ReportBadMessage(ReceiverSetType* receiver_set,
+                                        const std::string& error) {
+  return base::BindRepeating(&ReportBadMessageHelper<ReceiverSetType>,
+                             receiver_set, error);
 }
 
-template <typename BindingSetType>
-void SaveBadMessageCallbackHelper(BindingSetType* binding_set,
+template <typename ReceiverSetType>
+void SaveBadMessageCallbackHelper(ReceiverSetType* receiver_set,
                                   ReportBadMessageCallback* callback) {
-  *callback = binding_set->GetBadMessageCallback();
+  *callback = receiver_set->GetBadMessageCallback();
 }
 
-template <typename BindingSetType>
-base::Closure SaveBadMessageCallback(BindingSetType* binding_set,
-                                     ReportBadMessageCallback* callback) {
-  return base::Bind(&SaveBadMessageCallbackHelper<BindingSetType>, binding_set,
-                    callback);
+template <typename ReceiverSetType>
+base::RepeatingClosure SaveBadMessageCallback(
+    ReceiverSetType* receiver_set,
+    ReportBadMessageCallback* callback) {
+  return base::BindRepeating(&SaveBadMessageCallbackHelper<ReceiverSetType>,
+                             receiver_set, callback);
 }
 
-base::Closure Sequence(const base::Closure& first,
-                       const base::Closure& second) {
-  return base::Bind(
-      [] (const base::Closure& first, const base::Closure& second) {
+base::RepeatingClosure Sequence(base::RepeatingClosure first,
+                                base::RepeatingClosure second) {
+  return base::BindRepeating(
+      [](base::RepeatingClosure first, base::RepeatingClosure second) {
         first.Run();
         second.Run();
-      }, first, second);
+      },
+      first, second);
 }
 
 class PingImpl : public PingService {
  public:
-  PingImpl() {}
-  ~PingImpl() override {}
+  PingImpl() = default;
+  ~PingImpl() override = default;
 
   void set_ping_handler(const base::RepeatingClosure& handler) {
     ping_handler_ = handler;
@@ -104,23 +106,23 @@
   base::RepeatingClosure ping_handler_;
 };
 
-TEST_P(BindingSetTest, BindingSetContext) {
+TEST_P(ReceiverSetTest, ReceiverSetContext) {
   PingImpl impl;
 
-  BindingSet<PingService, int> bindings;
-  PingServicePtr ping_a, ping_b;
-  bindings.AddBinding(&impl, MakeRequest(&ping_a), 1);
-  bindings.AddBinding(&impl, MakeRequest(&ping_b), 2);
+  ReceiverSet<PingService, int> receivers;
+  Remote<PingService> ping_a, ping_b;
+  receivers.Add(&impl, ping_a.BindNewPipeAndPassReceiver(), 1);
+  receivers.Add(&impl, ping_b.BindNewPipeAndPassReceiver(), 2);
 
   {
-    impl.set_ping_handler(ExpectContext(&bindings, 1));
+    impl.set_ping_handler(ExpectContext(&receivers, 1));
     base::RunLoop loop;
     ping_a->Ping(loop.QuitClosure());
     loop.Run();
   }
 
   {
-    impl.set_ping_handler(ExpectContext(&bindings, 2));
+    impl.set_ping_handler(ExpectContext(&receivers, 2));
     base::RunLoop loop;
     ping_b->Ping(loop.QuitClosure());
     loop.Run();
@@ -128,40 +130,42 @@
 
   {
     base::RunLoop loop;
-    bindings.set_connection_error_handler(
-        Sequence(ExpectContext(&bindings, 1), loop.QuitClosure()));
+    receivers.set_disconnect_handler(
+        Sequence(ExpectContext(&receivers, 1), loop.QuitClosure()));
     ping_a.reset();
     loop.Run();
   }
 
   {
     base::RunLoop loop;
-    bindings.set_connection_error_handler(
-        Sequence(ExpectContext(&bindings, 2), loop.QuitClosure()));
+    receivers.set_disconnect_handler(
+        Sequence(ExpectContext(&receivers, 2), loop.QuitClosure()));
     ping_b.reset();
     loop.Run();
   }
 
-  EXPECT_TRUE(bindings.empty());
+  EXPECT_TRUE(receivers.empty());
 }
 
-TEST_P(BindingSetTest, BindingSetDispatchBinding) {
+TEST_P(ReceiverSetTest, ReceiverSetDispatchReceiver) {
   PingImpl impl;
 
-  BindingSet<PingService, int> bindings;
-  PingServicePtr ping_a, ping_b;
-  BindingId id_a = bindings.AddBinding(&impl, MakeRequest(&ping_a), 1);
-  BindingId id_b = bindings.AddBinding(&impl, MakeRequest(&ping_b), 2);
+  ReceiverSet<PingService, int> receivers;
+  Remote<PingService> ping_a, ping_b;
+  ReceiverId id_a =
+      receivers.Add(&impl, ping_a.BindNewPipeAndPassReceiver(), 1);
+  ReceiverId id_b =
+      receivers.Add(&impl, ping_b.BindNewPipeAndPassReceiver(), 2);
 
   {
-    impl.set_ping_handler(ExpectBindingId(&bindings, id_a));
+    impl.set_ping_handler(ExpectReceiverId(&receivers, id_a));
     base::RunLoop loop;
     ping_a->Ping(loop.QuitClosure());
     loop.Run();
   }
 
   {
-    impl.set_ping_handler(ExpectBindingId(&bindings, id_b));
+    impl.set_ping_handler(ExpectReceiverId(&receivers, id_b));
     base::RunLoop loop;
     ping_b->Ping(loop.QuitClosure());
     loop.Run();
@@ -169,43 +173,41 @@
 
   {
     base::RunLoop loop;
-    bindings.set_connection_error_handler(
-        Sequence(ExpectBindingId(&bindings, id_a), loop.QuitClosure()));
+    receivers.set_disconnect_handler(
+        Sequence(ExpectReceiverId(&receivers, id_a), loop.QuitClosure()));
     ping_a.reset();
     loop.Run();
   }
 
   {
     base::RunLoop loop;
-    bindings.set_connection_error_handler(
-        Sequence(ExpectBindingId(&bindings, id_b), loop.QuitClosure()));
+    receivers.set_disconnect_handler(
+        Sequence(ExpectReceiverId(&receivers, id_b), loop.QuitClosure()));
     ping_b.reset();
     loop.Run();
   }
 
-  EXPECT_TRUE(bindings.empty());
+  EXPECT_TRUE(receivers.empty());
 }
 
-TEST_P(BindingSetTest, BindingSetConnectionErrorWithReason) {
+TEST_P(ReceiverSetTest, ReceiverSetConnectionErrorWithReason) {
   PingImpl impl;
-  PingServicePtr ptr;
-  BindingSet<PingService> bindings;
-  bindings.AddBinding(&impl, MakeRequest(&ptr));
+  Remote<PingService> remote;
+  ReceiverSet<PingService> receivers;
+  receivers.Add(&impl, remote.BindNewPipeAndPassReceiver());
 
   base::RunLoop run_loop;
-  bindings.set_connection_error_with_reason_handler(base::Bind(
-      [](const base::Closure& quit_closure, uint32_t custom_reason,
-         const std::string& description) {
+  receivers.set_disconnect_with_reason_handler(base::BindLambdaForTesting(
+      [&](uint32_t custom_reason, const std::string& description) {
         EXPECT_EQ(1024u, custom_reason);
         EXPECT_EQ("bye", description);
-        quit_closure.Run();
-      },
-      run_loop.QuitClosure()));
+        run_loop.Quit();
+      }));
 
-  ptr.ResetWithReason(1024u, "bye");
+  remote.ResetWithReason(1024u, "bye");
 }
 
-TEST_P(BindingSetTest, BindingSetReportBadMessage) {
+TEST_P(ReceiverSetTest, ReceiverSetReportBadMessage) {
   PingImpl impl;
 
   std::string last_received_error;
@@ -214,35 +216,35 @@
                     const std::string& error) { *out_error = error; },
                  &last_received_error));
 
-  BindingSet<PingService, int> bindings;
-  PingServicePtr ping_a, ping_b;
-  bindings.AddBinding(&impl, MakeRequest(&ping_a), 1);
-  bindings.AddBinding(&impl, MakeRequest(&ping_b), 2);
+  ReceiverSet<PingService, int> receivers;
+  Remote<PingService> ping_a, ping_b;
+  receivers.Add(&impl, ping_a.BindNewPipeAndPassReceiver(), 1);
+  receivers.Add(&impl, ping_b.BindNewPipeAndPassReceiver(), 2);
 
   {
-    impl.set_ping_handler(ReportBadMessage(&bindings, "message 1"));
+    impl.set_ping_handler(ReportBadMessage(&receivers, "message 1"));
     base::RunLoop loop;
-    ping_a.set_connection_error_handler(loop.QuitClosure());
+    ping_a.set_disconnect_handler(loop.QuitClosure());
     ping_a->Ping(base::Bind([] {}));
     loop.Run();
     EXPECT_EQ("message 1", last_received_error);
   }
 
   {
-    impl.set_ping_handler(ReportBadMessage(&bindings, "message 2"));
+    impl.set_ping_handler(ReportBadMessage(&receivers, "message 2"));
     base::RunLoop loop;
-    ping_b.set_connection_error_handler(loop.QuitClosure());
+    ping_b.set_disconnect_handler(loop.QuitClosure());
     ping_b->Ping(base::Bind([] {}));
     loop.Run();
     EXPECT_EQ("message 2", last_received_error);
   }
 
-  EXPECT_TRUE(bindings.empty());
+  EXPECT_TRUE(receivers.empty());
 
   core::SetDefaultProcessErrorCallback(mojo::core::ProcessErrorCallback());
 }
 
-TEST_P(BindingSetTest, BindingSetGetBadMessageCallback) {
+TEST_P(ReceiverSetTest, ReceiverSetGetBadMessageCallback) {
   PingImpl impl;
 
   std::string last_received_error;
@@ -251,17 +253,17 @@
                     const std::string& error) { *out_error = error; },
                  &last_received_error));
 
-  BindingSet<PingService, int> bindings;
-  PingServicePtr ping_a, ping_b;
-  bindings.AddBinding(&impl, MakeRequest(&ping_a), 1);
-  bindings.AddBinding(&impl, MakeRequest(&ping_b), 2);
+  ReceiverSet<PingService, int> receivers;
+  Remote<PingService> ping_a, ping_b;
+  receivers.Add(&impl, ping_a.BindNewPipeAndPassReceiver(), 1);
+  receivers.Add(&impl, ping_b.BindNewPipeAndPassReceiver(), 2);
 
   ReportBadMessageCallback bad_message_callback_a;
   ReportBadMessageCallback bad_message_callback_b;
 
   {
     impl.set_ping_handler(
-        SaveBadMessageCallback(&bindings, &bad_message_callback_a));
+        SaveBadMessageCallback(&receivers, &bad_message_callback_a));
     base::RunLoop loop;
     ping_a->Ping(loop.QuitClosure());
     loop.Run();
@@ -270,7 +272,7 @@
 
   {
     impl.set_ping_handler(
-        SaveBadMessageCallback(&bindings, &bad_message_callback_b));
+        SaveBadMessageCallback(&receivers, &bad_message_callback_b));
     base::RunLoop loop;
     ping_b->Ping(loop.QuitClosure());
     loop.Run();
@@ -281,18 +283,18 @@
 
   {
     base::RunLoop loop;
-    ping_b.set_connection_error_handler(loop.QuitClosure());
+    ping_b.set_disconnect_handler(loop.QuitClosure());
     std::move(bad_message_callback_b).Run("message 2");
     EXPECT_EQ("message 2", last_received_error);
     loop.Run();
   }
 
-  EXPECT_TRUE(bindings.empty());
+  EXPECT_TRUE(receivers.empty());
 
   core::SetDefaultProcessErrorCallback(mojo::core::ProcessErrorCallback());
 }
 
-TEST_P(BindingSetTest, BindingSetGetBadMessageCallbackOutlivesBindingSet) {
+TEST_P(ReceiverSetTest, ReceiverSetGetBadMessageCallbackOutlivesReceiverSet) {
   PingImpl impl;
 
   std::string last_received_error;
@@ -303,12 +305,12 @@
 
   ReportBadMessageCallback bad_message_callback;
   {
-    BindingSet<PingService, int> bindings;
-    PingServicePtr ping_a;
-    bindings.AddBinding(&impl, MakeRequest(&ping_a), 1);
+    ReceiverSet<PingService, int> receivers;
+    Remote<PingService> ping_a;
+    receivers.Add(&impl, ping_a.BindNewPipeAndPassReceiver(), 1);
 
     impl.set_ping_handler(
-        SaveBadMessageCallback(&bindings, &bad_message_callback));
+        SaveBadMessageCallback(&receivers, &bad_message_callback));
     base::RunLoop loop;
     ping_a->Ping(loop.QuitClosure());
     loop.Run();
@@ -322,27 +324,27 @@
 
 class PingProviderImpl : public AssociatedPingProvider, public PingService {
  public:
-  PingProviderImpl() {}
-  ~PingProviderImpl() override {}
+  PingProviderImpl() = default;
+  ~PingProviderImpl() override = default;
 
   void set_new_ping_context(int context) { new_ping_context_ = context; }
 
-  void set_new_ping_handler(const base::Closure& handler) {
+  void set_new_ping_handler(const base::RepeatingClosure& handler) {
     new_ping_handler_ = handler;
   }
 
-  void set_ping_handler(const base::Closure& handler) {
+  void set_ping_handler(const base::RepeatingClosure& handler) {
     ping_handler_ = handler;
   }
 
-  AssociatedBindingSet<PingService, int>& ping_bindings() {
-    return ping_bindings_;
+  AssociatedReceiverSet<PingService, int>& ping_receivers() {
+    return ping_receivers_;
   }
 
  private:
   // AssociatedPingProvider:
-  void GetPing(PingServiceAssociatedRequest request) override {
-    ping_bindings_.AddBinding(this, std::move(request), new_ping_context_);
+  void GetPing(AssociatedInterfaceRequest<PingService> receiver) override {
+    ping_receivers_.Add(this, std::move(receiver), new_ping_context_);
     if (!new_ping_handler_.is_null())
       new_ping_handler_.Run();
   }
@@ -354,44 +356,45 @@
     std::move(callback).Run();
   }
 
-  AssociatedBindingSet<PingService, int> ping_bindings_;
+  AssociatedReceiverSet<PingService, int> ping_receivers_;
   int new_ping_context_ = -1;
   base::Closure ping_handler_;
   base::Closure new_ping_handler_;
 };
 
-TEST_P(BindingSetTest, AssociatedBindingSetContext) {
-  AssociatedPingProviderPtr provider;
+TEST_P(ReceiverSetTest, AssociatedReceiverSetContext) {
+  Remote<AssociatedPingProvider> provider;
   PingProviderImpl impl;
-  Binding<AssociatedPingProvider> binding(&impl, MakeRequest(&provider));
+  Receiver<AssociatedPingProvider> receiver(
+      &impl, provider.BindNewPipeAndPassReceiver());
 
-  PingServiceAssociatedPtr ping_a;
+  AssociatedRemote<PingService> ping_a;
   {
     base::RunLoop loop;
     impl.set_new_ping_context(1);
     impl.set_new_ping_handler(loop.QuitClosure());
-    provider->GetPing(MakeRequest(&ping_a));
+    provider->GetPing(ping_a.BindNewEndpointAndPassReceiver());
     loop.Run();
   }
 
-  PingServiceAssociatedPtr ping_b;
+  AssociatedRemote<PingService> ping_b;
   {
     base::RunLoop loop;
     impl.set_new_ping_context(2);
     impl.set_new_ping_handler(loop.QuitClosure());
-    provider->GetPing(MakeRequest(&ping_b));
+    provider->GetPing(ping_b.BindNewEndpointAndPassReceiver());
     loop.Run();
   }
 
   {
-    impl.set_ping_handler(ExpectContext(&impl.ping_bindings(), 1));
+    impl.set_ping_handler(ExpectContext(&impl.ping_receivers(), 1));
     base::RunLoop loop;
     ping_a->Ping(loop.QuitClosure());
     loop.Run();
   }
 
   {
-    impl.set_ping_handler(ExpectContext(&impl.ping_bindings(), 2));
+    impl.set_ping_handler(ExpectContext(&impl.ping_receivers(), 2));
     base::RunLoop loop;
     ping_b->Ping(loop.QuitClosure());
     loop.Run();
@@ -399,134 +402,134 @@
 
   {
     base::RunLoop loop;
-    impl.ping_bindings().set_connection_error_handler(
-        Sequence(ExpectContext(&impl.ping_bindings(), 1), loop.QuitClosure()));
+    impl.ping_receivers().set_disconnect_handler(
+        Sequence(ExpectContext(&impl.ping_receivers(), 1), loop.QuitClosure()));
     ping_a.reset();
     loop.Run();
   }
 
   {
     base::RunLoop loop;
-    impl.ping_bindings().set_connection_error_handler(
-        Sequence(ExpectContext(&impl.ping_bindings(), 2), loop.QuitClosure()));
+    impl.ping_receivers().set_disconnect_handler(
+        Sequence(ExpectContext(&impl.ping_receivers(), 2), loop.QuitClosure()));
     ping_b.reset();
     loop.Run();
   }
 
-  EXPECT_TRUE(impl.ping_bindings().empty());
+  EXPECT_TRUE(impl.ping_receivers().empty());
 }
 
-TEST_P(BindingSetTest, MasterInterfaceBindingSetContext) {
-  AssociatedPingProviderPtr provider_a, provider_b;
+TEST_P(ReceiverSetTest, MasterInterfaceReceiverSetContext) {
+  Remote<AssociatedPingProvider> provider_a, provider_b;
   PingProviderImpl impl;
-  BindingSet<AssociatedPingProvider, int> bindings;
+  ReceiverSet<AssociatedPingProvider, int> receivers;
 
-  bindings.AddBinding(&impl, MakeRequest(&provider_a), 1);
-  bindings.AddBinding(&impl, MakeRequest(&provider_b), 2);
+  receivers.Add(&impl, provider_a.BindNewPipeAndPassReceiver(), 1);
+  receivers.Add(&impl, provider_b.BindNewPipeAndPassReceiver(), 2);
 
   {
-    PingServiceAssociatedPtr ping;
+    AssociatedRemote<PingService> ping;
     base::RunLoop loop;
     impl.set_new_ping_handler(
-        Sequence(ExpectContext(&bindings, 1), loop.QuitClosure()));
-    provider_a->GetPing(MakeRequest(&ping));
+        Sequence(ExpectContext(&receivers, 1), loop.QuitClosure()));
+    provider_a->GetPing(ping.BindNewEndpointAndPassReceiver());
     loop.Run();
   }
 
   {
-    PingServiceAssociatedPtr ping;
+    AssociatedRemote<PingService> ping;
     base::RunLoop loop;
     impl.set_new_ping_handler(
-        Sequence(ExpectContext(&bindings, 2), loop.QuitClosure()));
-    provider_b->GetPing(MakeRequest(&ping));
+        Sequence(ExpectContext(&receivers, 2), loop.QuitClosure()));
+    provider_b->GetPing(ping.BindNewEndpointAndPassReceiver());
     loop.Run();
   }
 
   {
     base::RunLoop loop;
-    bindings.set_connection_error_handler(
-        Sequence(ExpectContext(&bindings, 1), loop.QuitClosure()));
+    receivers.set_disconnect_handler(
+        Sequence(ExpectContext(&receivers, 1), loop.QuitClosure()));
     provider_a.reset();
     loop.Run();
   }
 
   {
     base::RunLoop loop;
-    bindings.set_connection_error_handler(
-        Sequence(ExpectContext(&bindings, 2), loop.QuitClosure()));
+    receivers.set_disconnect_handler(
+        Sequence(ExpectContext(&receivers, 2), loop.QuitClosure()));
     provider_b.reset();
     loop.Run();
   }
 
-  EXPECT_TRUE(bindings.empty());
+  EXPECT_TRUE(receivers.empty());
 }
 
-TEST_P(BindingSetTest, MasterInterfaceBindingSetDispatchBinding) {
-  AssociatedPingProviderPtr provider_a, provider_b;
+TEST_P(ReceiverSetTest, MasterInterfaceReceiverSetDispatchReceiver) {
+  Remote<AssociatedPingProvider> provider_a, provider_b;
   PingProviderImpl impl;
-  BindingSet<AssociatedPingProvider, int> bindings;
+  ReceiverSet<AssociatedPingProvider, int> receivers;
 
-  BindingId id_a = bindings.AddBinding(&impl, MakeRequest(&provider_a), 1);
-  BindingId id_b = bindings.AddBinding(&impl, MakeRequest(&provider_b), 2);
+  ReceiverId id_a =
+      receivers.Add(&impl, provider_a.BindNewPipeAndPassReceiver(), 1);
+  ReceiverId id_b =
+      receivers.Add(&impl, provider_b.BindNewPipeAndPassReceiver(), 2);
 
   {
-    PingServiceAssociatedPtr ping;
+    AssociatedRemote<PingService> ping;
     base::RunLoop loop;
     impl.set_new_ping_handler(
-        Sequence(ExpectBindingId(&bindings, id_a), loop.QuitClosure()));
-    provider_a->GetPing(MakeRequest(&ping));
+        Sequence(ExpectReceiverId(&receivers, id_a), loop.QuitClosure()));
+    provider_a->GetPing(ping.BindNewEndpointAndPassReceiver());
     loop.Run();
   }
 
   {
-    PingServiceAssociatedPtr ping;
+    AssociatedRemote<PingService> ping;
     base::RunLoop loop;
     impl.set_new_ping_handler(
-        Sequence(ExpectBindingId(&bindings, id_b), loop.QuitClosure()));
-    provider_b->GetPing(MakeRequest(&ping));
+        Sequence(ExpectReceiverId(&receivers, id_b), loop.QuitClosure()));
+    provider_b->GetPing(ping.BindNewEndpointAndPassReceiver());
     loop.Run();
   }
 
   {
     base::RunLoop loop;
-    bindings.set_connection_error_handler(
-        Sequence(ExpectBindingId(&bindings, id_a), loop.QuitClosure()));
+    receivers.set_disconnect_handler(
+        Sequence(ExpectReceiverId(&receivers, id_a), loop.QuitClosure()));
     provider_a.reset();
     loop.Run();
   }
 
   {
     base::RunLoop loop;
-    bindings.set_connection_error_handler(
-        Sequence(ExpectBindingId(&bindings, id_b), loop.QuitClosure()));
+    receivers.set_disconnect_handler(
+        Sequence(ExpectReceiverId(&receivers, id_b), loop.QuitClosure()));
     provider_b.reset();
     loop.Run();
   }
 
-  EXPECT_TRUE(bindings.empty());
+  EXPECT_TRUE(receivers.empty());
 }
 
-TEST_P(BindingSetTest, AssociatedBindingSetConnectionErrorWithReason) {
-  AssociatedPingProviderPtr master_ptr;
+TEST_P(ReceiverSetTest, AssociatedReceiverSetConnectionErrorWithReason) {
+  Remote<AssociatedPingProvider> remote_master;
   PingProviderImpl master_impl;
-  Binding<AssociatedPingProvider> master_binding(&master_impl,
-                                                 MakeRequest(&master_ptr));
+  Receiver<AssociatedPingProvider> master_receiver(
+      &master_impl, remote_master.BindNewPipeAndPassReceiver());
 
   base::RunLoop run_loop;
-  master_impl.ping_bindings().set_connection_error_with_reason_handler(
-      base::Bind(
-          [](const base::Closure& quit_closure, uint32_t custom_reason,
-             const std::string& description) {
+  master_impl.ping_receivers().set_disconnect_with_reason_handler(
+      base::BindLambdaForTesting(
+          [&](uint32_t custom_reason, const std::string& description) {
             EXPECT_EQ(2048u, custom_reason);
             EXPECT_EQ("bye", description);
-            quit_closure.Run();
-          },
-          run_loop.QuitClosure()));
+            run_loop.Quit();
+          }));
 
-  PingServiceAssociatedPtr ptr;
-  master_ptr->GetPing(MakeRequest(&ptr));
+  AssociatedRemote<PingService> remote_ping;
+  remote_master->GetPing(remote_ping.BindNewEndpointAndPassReceiver());
 
-  ptr.ResetWithReason(2048u, "bye");
+  remote_ping.ResetWithReason(2048u, "bye");
 
   run_loop.Run();
 }
@@ -542,29 +545,29 @@
 };
 int PingInstanceCounter::instance_count = 0;
 
-TEST_P(BindingSetTest, StrongBinding_Destructor) {
-  PingServicePtr ping_a, ping_b;
-  auto bindings = std::make_unique<StrongBindingSet<PingService>>();
+TEST_P(ReceiverSetTest, UniqueReceiverSetDestruction) {
+  Remote<PingService> ping_a, ping_b;
+  auto receivers = std::make_unique<UniqueReceiverSet<PingService>>();
 
-  bindings->AddBinding(std::make_unique<PingInstanceCounter>(),
-                       mojo::MakeRequest(&ping_a));
+  receivers->Add(std::make_unique<PingInstanceCounter>(),
+                 ping_a.BindNewPipeAndPassReceiver());
   EXPECT_EQ(1, PingInstanceCounter::instance_count);
 
-  bindings->AddBinding(std::make_unique<PingInstanceCounter>(),
-                       mojo::MakeRequest(&ping_b));
+  receivers->Add(std::make_unique<PingInstanceCounter>(),
+                 ping_b.BindNewPipeAndPassReceiver());
   EXPECT_EQ(2, PingInstanceCounter::instance_count);
 
-  bindings.reset();
+  receivers.reset();
   EXPECT_EQ(0, PingInstanceCounter::instance_count);
 }
 
-TEST_P(BindingSetTest, StrongBinding_ConnectionError) {
-  PingServicePtr ping_a, ping_b;
-  StrongBindingSet<PingService> bindings;
-  bindings.AddBinding(std::make_unique<PingInstanceCounter>(),
-                      mojo::MakeRequest(&ping_a));
-  bindings.AddBinding(std::make_unique<PingInstanceCounter>(),
-                      mojo::MakeRequest(&ping_b));
+TEST_P(ReceiverSetTest, UniqueReceiverSetDisconnect) {
+  Remote<PingService> ping_a, ping_b;
+  UniqueReceiverSet<PingService> receivers;
+  receivers.Add(std::make_unique<PingInstanceCounter>(),
+                ping_a.BindNewPipeAndPassReceiver());
+  receivers.Add(std::make_unique<PingInstanceCounter>(),
+                ping_b.BindNewPipeAndPassReceiver());
   EXPECT_EQ(2, PingInstanceCounter::instance_count);
 
   ping_a.reset();
@@ -576,23 +579,25 @@
   EXPECT_EQ(0, PingInstanceCounter::instance_count);
 }
 
-TEST_P(BindingSetTest, StrongBinding_RemoveBinding) {
-  PingServicePtr ping_a, ping_b;
-  StrongBindingSet<PingService> bindings;
-  BindingId binding_id_a = bindings.AddBinding(
-      std::make_unique<PingInstanceCounter>(), mojo::MakeRequest(&ping_a));
-  BindingId binding_id_b = bindings.AddBinding(
-      std::make_unique<PingInstanceCounter>(), mojo::MakeRequest(&ping_b));
+TEST_P(ReceiverSetTest, UniqueReceiverSetRemoveEntry) {
+  Remote<PingService> ping_a, ping_b;
+  UniqueReceiverSet<PingService> receivers;
+  ReceiverId receiver_id_a =
+      receivers.Add(std::make_unique<PingInstanceCounter>(),
+                    ping_a.BindNewPipeAndPassReceiver());
+  ReceiverId receiver_id_b =
+      receivers.Add(std::make_unique<PingInstanceCounter>(),
+                    ping_b.BindNewPipeAndPassReceiver());
   EXPECT_EQ(2, PingInstanceCounter::instance_count);
 
-  EXPECT_TRUE(bindings.RemoveBinding(binding_id_a));
+  EXPECT_TRUE(receivers.Remove(receiver_id_a));
   EXPECT_EQ(1, PingInstanceCounter::instance_count);
 
-  EXPECT_TRUE(bindings.RemoveBinding(binding_id_b));
+  EXPECT_TRUE(receivers.Remove(receiver_id_b));
   EXPECT_EQ(0, PingInstanceCounter::instance_count);
 }
 
-INSTANTIATE_MOJO_BINDINGS_TEST_SUITE_P(BindingSetTest);
+INSTANTIATE_MOJO_BINDINGS_TEST_SUITE_P(ReceiverSetTest);
 
 }  // namespace
 }  // namespace test
diff --git a/mojo/public/cpp/bindings/tests/receiver_unittest.cc b/mojo/public/cpp/bindings/tests/receiver_unittest.cc
index b9d620b..d49efe8 100644
--- a/mojo/public/cpp/bindings/tests/receiver_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/receiver_unittest.cc
@@ -2,20 +2,21 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// Note: This file tests both binding.h (mojo::Binding) and strong_binding.h
-// (mojo::StrongBinding).
-
-#include "mojo/public/cpp/bindings/binding.h"
-
 #include <stdint.h>
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/weak_ptr.h"
 #include "base/run_loop.h"
+#include "base/test/bind_test_util.h"
 #include "mojo/core/embedder/embedder.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "mojo/public/cpp/bindings/tests/bindings_test_base.h"
 #include "mojo/public/interfaces/bindings/tests/ping_service.mojom.h"
@@ -28,80 +29,76 @@
 
 class ServiceImpl : public sample::Service {
  public:
-  explicit ServiceImpl(bool* was_deleted = nullptr)
-      : was_deleted_(was_deleted) {}
+  ServiceImpl() = default;
+  explicit ServiceImpl(bool* was_deleted)
+      : destruction_callback_(base::BindLambdaForTesting(
+            [was_deleted] { *was_deleted = true; })) {}
+  explicit ServiceImpl(base::OnceClosure destruction_callback)
+      : destruction_callback_(std::move(destruction_callback)) {}
+
   ~ServiceImpl() override {
-    if (was_deleted_)
-      *was_deleted_ = true;
+    if (destruction_callback_)
+      std::move(destruction_callback_).Run();
   }
 
  private:
   // sample::Service implementation
   void Frobinate(sample::FooPtr foo,
                  BazOptions options,
-                 sample::PortPtr port,
+                 PendingRemote<sample::Port> port,
                  FrobinateCallback callback) override {
     std::move(callback).Run(1);
   }
-  void GetPort(InterfaceRequest<sample::Port> port) override {}
+  void GetPort(PendingReceiver<sample::Port> port) override {}
 
-  bool* const was_deleted_;
+  base::OnceClosure destruction_callback_;
 
   DISALLOW_COPY_AND_ASSIGN(ServiceImpl);
 };
 
-template <typename... Args>
-void DoSetFlagAndRunClosure(bool* flag,
-                            const base::Closure& closure,
-                            Args... args) {
-  *flag = true;
-  if (!closure.is_null())
-    closure.Run();
-}
+using ReceiverTest = BindingsTestBase;
 
-template <typename... Args>
-base::Callback<void(Args...)> SetFlagAndRunClosure(
-    bool* flag,
-    const base::Closure& callback = base::Closure()) {
-  return base::Bind(&DoSetFlagAndRunClosure<Args...>, flag, callback);
-}
-
-// BindingTest -----------------------------------------------------------------
-
-using BindingTest = BindingsTestBase;
-
-TEST_P(BindingTest, Close) {
+TEST_P(ReceiverTest, Reset) {
   bool called = false;
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
-  base::RunLoop run_loop;
-  ptr.set_connection_error_handler(
-      SetFlagAndRunClosure(&called, run_loop.QuitClosure()));
-  ServiceImpl impl;
-  Binding<sample::Service> binding(&impl, std::move(request));
+  Remote<sample::Service> remote;
 
-  binding.Close();
+  ServiceImpl impl;
+  Receiver<sample::Service> receiver(&impl,
+                                     remote.BindNewPipeAndPassReceiver());
+
+  base::RunLoop run_loop;
+  remote.set_disconnect_handler(base::BindLambdaForTesting([&] {
+    run_loop.Quit();
+    called = true;
+  }));
+
+  receiver.reset();
   EXPECT_FALSE(called);
   run_loop.Run();
   EXPECT_TRUE(called);
 }
 
 // Tests that destroying a mojo::Binding closes the bound message pipe handle.
-TEST_P(BindingTest, DestroyClosesMessagePipe) {
+TEST_P(ReceiverTest, DestroyClosesMessagePipe) {
   bool encountered_error = false;
   ServiceImpl impl;
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
+  Remote<sample::Service> remote;
+  auto pending_receiver = remote.BindNewPipeAndPassReceiver();
   base::RunLoop run_loop;
-  ptr.set_connection_error_handler(
-      SetFlagAndRunClosure(&encountered_error, run_loop.QuitClosure()));
+  remote.set_disconnect_handler(base::BindLambdaForTesting([&] {
+    run_loop.Quit();
+    encountered_error = true;
+  }));
+
   bool called = false;
   base::RunLoop run_loop2;
   {
-    Binding<sample::Service> binding(&impl, std::move(request));
-    ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-                   SetFlagAndRunClosure<int32_t>(&called,
-                                                 run_loop2.QuitClosure()));
+    Receiver<sample::Service> binding(&impl, std::move(pending_receiver));
+    remote->Frobinate(nullptr, sample::Service::BazOptions::REGULAR,
+                      NullRemote(), base::BindLambdaForTesting([&](int32_t) {
+                        run_loop2.Quit();
+                        called = true;
+                      }));
     run_loop2.Run();
     EXPECT_TRUE(called);
     EXPECT_FALSE(encountered_error);
@@ -113,25 +110,28 @@
 
   // And calls should fail.
   called = false;
-  ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-                 SetFlagAndRunClosure<int32_t>(&called,
-                                               run_loop2.QuitClosure()));
+  remote->Frobinate(
+      nullptr, sample::Service::BazOptions::REGULAR, NullRemote(),
+      base::BindLambdaForTesting([&](int32_t) { called = true; }));
   base::RunLoop().RunUntilIdle();
   EXPECT_FALSE(called);
 }
 
 // Tests that the binding's connection error handler gets called when the other
 // end is closed.
-TEST_P(BindingTest, ConnectionError) {
+TEST_P(ReceiverTest, Disconnect) {
   bool called = false;
   {
     ServiceImpl impl;
-    sample::ServicePtr ptr;
-    Binding<sample::Service> binding(&impl, MakeRequest(&ptr));
+    Remote<sample::Service> remote;
+    Receiver<sample::Service> receiver(&impl,
+                                       remote.BindNewPipeAndPassReceiver());
     base::RunLoop run_loop;
-    binding.set_connection_error_handler(
-        SetFlagAndRunClosure(&called, run_loop.QuitClosure()));
-    ptr.reset();
+    receiver.set_disconnect_handler(base::BindLambdaForTesting([&] {
+      called = true;
+      run_loop.Quit();
+    }));
+    remote.reset();
     EXPECT_FALSE(called);
     run_loop.Run();
     EXPECT_TRUE(called);
@@ -143,103 +143,114 @@
 
 // Tests that calling Close doesn't result in the connection error handler being
 // called.
-TEST_P(BindingTest, CloseDoesntCallConnectionErrorHandler) {
+TEST_P(ReceiverTest, ResetDoesntCallDisconnectHandler) {
   ServiceImpl impl;
-  sample::ServicePtr ptr;
-  Binding<sample::Service> binding(&impl, MakeRequest(&ptr));
+  Remote<sample::Service> remote;
+  Receiver<sample::Service> receiver(&impl,
+                                     remote.BindNewPipeAndPassReceiver());
   bool called = false;
-  binding.set_connection_error_handler(SetFlagAndRunClosure(&called));
-  binding.Close();
+  receiver.set_disconnect_handler(
+      base::BindLambdaForTesting([&] { called = true; }));
+  receiver.reset();
   base::RunLoop().RunUntilIdle();
   EXPECT_FALSE(called);
 
   // We can also close the other end, and the error handler still won't be
   // called.
-  ptr.reset();
+  remote.reset();
   base::RunLoop().RunUntilIdle();
   EXPECT_FALSE(called);
 }
 
-class ServiceImplWithBinding : public ServiceImpl {
+class ServiceImplWithReceiver : public ServiceImpl {
  public:
-  ServiceImplWithBinding(bool* was_deleted,
-                         const base::Closure& closure,
-                         InterfaceRequest<sample::Service> request)
+  ServiceImplWithReceiver(bool* was_deleted,
+                          base::OnceClosure closure,
+                          PendingReceiver<sample::Service> receiver)
       : ServiceImpl(was_deleted),
-        binding_(this, std::move(request)),
-        closure_(closure) {
-    binding_.set_connection_error_handler(
-        base::Bind(&ServiceImplWithBinding::OnConnectionError,
-                   base::Unretained(this)));
+        receiver_(this, std::move(receiver)),
+        closure_(std::move(closure)) {
+    receiver_.set_disconnect_handler(base::BindOnce(
+        &ServiceImplWithReceiver::OnDisconnect, base::Unretained(this)));
   }
 
  private:
-  ~ServiceImplWithBinding() override{
-    closure_.Run();
-  }
+  ~ServiceImplWithReceiver() override { std::move(closure_).Run(); }
 
-  void OnConnectionError() { delete this; }
+  void OnDisconnect() { delete this; }
 
-  Binding<sample::Service> binding_;
-  base::Closure closure_;
+  Receiver<sample::Service> receiver_;
+  base::OnceClosure closure_;
 
-  DISALLOW_COPY_AND_ASSIGN(ServiceImplWithBinding);
+  DISALLOW_COPY_AND_ASSIGN(ServiceImplWithReceiver);
 };
 
-// Tests that the binding may be deleted in the connection error handler.
-TEST_P(BindingTest, SelfDeleteOnConnectionError) {
+// Tests that the receiver may be deleted in its disconnect handler.
+TEST_P(ReceiverTest, SelfDeleteOnDisconnect) {
   bool was_deleted = false;
-  sample::ServicePtr ptr;
-  // This should delete itself on connection error.
+  Remote<sample::Service> remote;
   base::RunLoop run_loop;
-  new ServiceImplWithBinding(&was_deleted, run_loop.QuitClosure(),
-                             MakeRequest(&ptr));
-  ptr.reset();
+  // This will delete itself on disconnect.
+  new ServiceImplWithReceiver(&was_deleted, run_loop.QuitClosure(),
+                              remote.BindNewPipeAndPassReceiver());
+  remote.reset();
   EXPECT_FALSE(was_deleted);
   run_loop.Run();
   EXPECT_TRUE(was_deleted);
 }
 
 // Tests that explicitly calling Unbind followed by rebinding works.
-TEST_P(BindingTest, Unbind) {
+TEST_P(ReceiverTest, Unbind) {
   ServiceImpl impl;
-  sample::ServicePtr ptr;
-  Binding<sample::Service> binding(&impl, MakeRequest(&ptr));
+  Remote<sample::Service> remote;
+  Receiver<sample::Service> receiver(&impl,
+                                     remote.BindNewPipeAndPassReceiver());
 
   bool called = false;
   base::RunLoop run_loop;
-  ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-                 SetFlagAndRunClosure<int32_t>(&called,
-                                               run_loop.QuitClosure()));
+  remote->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, NullRemote(),
+                    base::BindLambdaForTesting([&](int32_t) {
+                      called = true;
+                      run_loop.Quit();
+                    }));
   run_loop.Run();
   EXPECT_TRUE(called);
 
   called = false;
-  auto request = binding.Unbind();
-  EXPECT_FALSE(binding.is_bound());
-  // All calls should fail when not bound...
-  ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-                 SetFlagAndRunClosure<int32_t>(&called,
-                                               run_loop.QuitClosure()));
+  auto pending_receiver = receiver.Unbind();
+  EXPECT_FALSE(receiver.is_bound());
+  EXPECT_TRUE(pending_receiver);
+
+  // All calls should be withheld when the receiver is not bound...
+  remote->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, NullRemote(),
+                    base::BindLambdaForTesting([&](int32_t) {
+                      called = true;
+                      run_loop.Quit();
+                    }));
   base::RunLoop().RunUntilIdle();
   EXPECT_FALSE(called);
 
   called = false;
-  binding.Bind(std::move(request));
-  EXPECT_TRUE(binding.is_bound());
-  // ...and should succeed again when the rebound.
+  receiver.Bind(std::move(pending_receiver));
+  EXPECT_TRUE(receiver.is_bound());
+  EXPECT_FALSE(pending_receiver);
+
+  // ...and calls should resume again when the receiver is
+  // rebound.
   base::RunLoop run_loop2;
-  ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-                 SetFlagAndRunClosure<int32_t>(&called,
-                                               run_loop2.QuitClosure()));
+  remote->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, NullRemote(),
+                    base::BindLambdaForTesting([&](int32_t) {
+                      called = true;
+                      run_loop2.Quit();
+                    }));
   run_loop2.Run();
   EXPECT_TRUE(called);
 }
 
 class IntegerAccessorImpl : public sample::IntegerAccessor {
  public:
-  IntegerAccessorImpl() {}
-  ~IntegerAccessorImpl() override {}
+  IntegerAccessorImpl() = default;
+  ~IntegerAccessorImpl() override = default;
 
  private:
   // sample::IntegerAccessor implementation.
@@ -251,80 +262,86 @@
   DISALLOW_COPY_AND_ASSIGN(IntegerAccessorImpl);
 };
 
-TEST_P(BindingTest, PauseResume) {
+TEST_P(ReceiverTest, PauseResume) {
   bool called = false;
   base::RunLoop run_loop;
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
+  Remote<sample::Service> remote;
   ServiceImpl impl;
-  Binding<sample::Service> binding(&impl, std::move(request));
-  binding.PauseIncomingMethodCallProcessing();
-  ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-                 SetFlagAndRunClosure<int32_t>(&called,
-                                               run_loop.QuitClosure()));
+  Receiver<sample::Service> receiver(&impl,
+                                     remote.BindNewPipeAndPassReceiver());
+  receiver.Pause();
+  remote->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, NullRemote(),
+                    base::BindLambdaForTesting([&](int32_t) {
+                      called = true;
+                      run_loop.Quit();
+                    }));
+
   EXPECT_FALSE(called);
   base::RunLoop().RunUntilIdle();
-  // Frobinate() should not be called as the binding is paused.
+  // Frobinate() should not be called as the receiver is paused.
   EXPECT_FALSE(called);
 
-  // Resume the binding, which should trigger processing.
-  binding.ResumeIncomingMethodCallProcessing();
+  // Resume the receiver, which should trigger processing.
+  receiver.Resume();
   run_loop.Run();
   EXPECT_TRUE(called);
 }
 
-// Verifies the connection error handler is not run while a binding is paused.
-TEST_P(BindingTest, ErrorHandleNotRunWhilePaused) {
+// Verifies the disconnect handler is not run while a receiver is paused.
+TEST_P(ReceiverTest, ErrorHandleNotRunWhilePaused) {
   bool called = false;
   base::RunLoop run_loop;
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
+  Remote<sample::Service> remote;
   ServiceImpl impl;
-  Binding<sample::Service> binding(&impl, std::move(request));
-  binding.set_connection_error_handler(
-      SetFlagAndRunClosure(&called, run_loop.QuitClosure()));
-  binding.PauseIncomingMethodCallProcessing();
+  Receiver<sample::Service> receiver(&impl,
+                                     remote.BindNewPipeAndPassReceiver());
+  receiver.set_disconnect_handler(base::BindLambdaForTesting([&] {
+    called = true;
+    run_loop.Quit();
+  }));
+  receiver.Pause();
 
-  ptr.reset();
+  remote.reset();
   base::RunLoop().RunUntilIdle();
-  // The connection error handle should not be called as the binding is paused.
+  // The disconnect handler should not be called as the receiver is paused.
   EXPECT_FALSE(called);
 
-  // Resume the binding, which should trigger the error handler.
-  binding.ResumeIncomingMethodCallProcessing();
+  // Resume the receiver, which should trigger the disconnect handler.
+  receiver.Resume();
   run_loop.Run();
   EXPECT_TRUE(called);
 }
 
 class PingServiceImpl : public test::PingService {
  public:
-  PingServiceImpl() {}
-  ~PingServiceImpl() override {}
+  PingServiceImpl() = default;
+  ~PingServiceImpl() override = default;
 
   // test::PingService:
   void Ping(PingCallback callback) override {
-    if (!ping_handler_.is_null())
+    if (ping_handler_)
       ping_handler_.Run();
     std::move(callback).Run();
   }
 
-  void set_ping_handler(const base::Closure& handler) {
-    ping_handler_ = handler;
+  void set_ping_handler(base::RepeatingClosure handler) {
+    ping_handler_ = std::move(handler);
   }
 
  private:
-  base::Closure ping_handler_;
+  base::RepeatingClosure ping_handler_;
 
   DISALLOW_COPY_AND_ASSIGN(PingServiceImpl);
 };
 
 class CallbackFilter : public MessageReceiver {
  public:
-  explicit CallbackFilter(const base::Closure& callback)
+  explicit CallbackFilter(const base::RepeatingClosure& callback)
       : callback_(callback) {}
   ~CallbackFilter() override {}
 
-  static std::unique_ptr<CallbackFilter> Wrap(const base::Closure& callback) {
+  static std::unique_ptr<CallbackFilter> Wrap(
+      const base::RepeatingClosure& callback) {
     return std::make_unique<CallbackFilter>(callback);
   }
 
@@ -335,33 +352,37 @@
   }
 
  private:
-  const base::Closure callback_;
+  const base::RepeatingClosure callback_;
 };
 
 // Verifies that message filters are notified in the order they were added and
 // are always notified before a message is dispatched.
-TEST_P(BindingTest, MessageFilter) {
-  test::PingServicePtr ptr;
+TEST_P(ReceiverTest, MessageFilter) {
+  Remote<test::PingService> remote;
   PingServiceImpl impl;
-  mojo::Binding<test::PingService> binding(&impl, MakeRequest(&ptr));
+  Receiver<test::PingService> receiver(&impl,
+                                       remote.BindNewPipeAndPassReceiver());
 
   int status = 0;
-  auto handler_helper = [] (int* status, int expected_status, int new_status) {
-    EXPECT_EQ(expected_status, *status);
-    *status = new_status;
-  };
-  auto create_handler = [&] (int expected_status, int new_status) {
-    return base::Bind(handler_helper, &status, expected_status, new_status);
-  };
+  receiver.AddFilter(CallbackFilter::Wrap(base::BindLambdaForTesting([&] {
+    EXPECT_EQ(0, status);
+    status = 1;
+  })));
 
-  binding.AddFilter(CallbackFilter::Wrap(create_handler(0, 1)));
-  binding.AddFilter(CallbackFilter::Wrap(create_handler(1, 2)));
-  impl.set_ping_handler(create_handler(2, 3));
+  receiver.AddFilter(CallbackFilter::Wrap(base::BindLambdaForTesting([&] {
+    EXPECT_EQ(1, status);
+    status = 2;
+  })));
+
+  impl.set_ping_handler(base::BindLambdaForTesting([&] {
+    EXPECT_EQ(2, status);
+    status = 3;
+  }));
 
   for (int i = 0; i < 10; ++i) {
     status = 0;
     base::RunLoop loop;
-    ptr->Ping(loop.QuitClosure());
+    remote->Ping(loop.QuitClosure());
     loop.Run();
     EXPECT_EQ(3, status);
   }
@@ -371,58 +392,57 @@
   FAIL() << "Unexpected connection error";
 }
 
-TEST_P(BindingTest, FlushForTesting) {
+TEST_P(ReceiverTest, FlushForTesting) {
   bool called = false;
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
+  Remote<sample::Service> remote;
   ServiceImpl impl;
-  Binding<sample::Service> binding(&impl, std::move(request));
-  binding.set_connection_error_handler(base::Bind(&Fail));
+  Receiver<sample::Service> receiver(&impl,
+                                     remote.BindNewPipeAndPassReceiver());
+  receiver.set_disconnect_handler(base::BindOnce(&Fail));
 
-  ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-                 SetFlagAndRunClosure<int32_t>(&called));
+  remote->Frobinate(
+      nullptr, sample::Service::BazOptions::REGULAR, NullRemote(),
+      base::BindLambdaForTesting([&](int32_t) { called = true; }));
   EXPECT_FALSE(called);
-  // Because the flush is sent from the binding, it only guarantees that the
-  // request has been received, not the response. The second flush waits for the
-  // response to be received.
-  binding.FlushForTesting();
-  binding.FlushForTesting();
+  // Because the flush is sent from the receiver, it only guarantees that the
+  // request has been received, not the response. The second flush waits for
+  // the response to be received.
+  receiver.FlushForTesting();
+  receiver.FlushForTesting();
   EXPECT_TRUE(called);
 }
 
-TEST_P(BindingTest, FlushForTestingWithClosedPeer) {
+TEST_P(ReceiverTest, FlushForTestingWithClosedPeer) {
   bool called = false;
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
+  Remote<sample::Service> remote;
   ServiceImpl impl;
-  Binding<sample::Service> binding(&impl, std::move(request));
-  binding.set_connection_error_handler(SetFlagAndRunClosure(&called));
-  ptr.reset();
+  Receiver<sample::Service> receiver(&impl,
+                                     remote.BindNewPipeAndPassReceiver());
+  receiver.set_disconnect_handler(
+      base::BindLambdaForTesting([&] { called = true; }));
+  remote.reset();
 
   EXPECT_FALSE(called);
-  binding.FlushForTesting();
+  receiver.FlushForTesting();
   EXPECT_TRUE(called);
-  binding.FlushForTesting();
+  receiver.FlushForTesting();
 }
 
-TEST_P(BindingTest, ConnectionErrorWithReason) {
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
+TEST_P(ReceiverTest, DisconnectWithReason) {
+  Remote<sample::Service> remote;
   ServiceImpl impl;
-  Binding<sample::Service> binding(&impl, std::move(request));
+  Receiver<sample::Service> receiver(&impl,
+                                     remote.BindNewPipeAndPassReceiver());
 
   base::RunLoop run_loop;
-  binding.set_connection_error_with_reason_handler(base::Bind(
-      [](const base::Closure& quit_closure, uint32_t custom_reason,
-         const std::string& description) {
+  receiver.set_disconnect_with_reason_handler(base::BindLambdaForTesting(
+      [&](uint32_t custom_reason, const std::string& description) {
         EXPECT_EQ(1234u, custom_reason);
         EXPECT_EQ("hello", description);
-        quit_closure.Run();
-      },
-      run_loop.QuitClosure()));
+        run_loop.Quit();
+      }));
 
-  ptr.ResetWithReason(1234u, "hello");
-
+  remote.ResetWithReason(1234u, "hello");
   run_loop.Run();
 }
 
@@ -435,90 +455,80 @@
 };
 
 template <typename T>
-using WeakBinding = Binding<T, WeakPtrImplRefTraits<T>>;
+using WeakReceiver = Receiver<T, WeakPtrImplRefTraits<T>>;
 
-TEST_P(BindingTest, CustomImplPointerType) {
+TEST_P(ReceiverTest, CustomImplPointerType) {
   PingServiceImpl impl;
   base::WeakPtrFactory<test::PingService> weak_factory(&impl);
 
-  test::PingServicePtr proxy;
-  WeakBinding<test::PingService> binding(weak_factory.GetWeakPtr(),
-                                         MakeRequest(&proxy));
+  Remote<test::PingService> remote;
+  WeakReceiver<test::PingService> receiver(weak_factory.GetWeakPtr(),
+                                           remote.BindNewPipeAndPassReceiver());
 
   {
-    // Ensure the binding is functioning.
+    // Ensure the receiver is functioning.
     base::RunLoop run_loop;
-    proxy->Ping(run_loop.QuitClosure());
+    remote->Ping(run_loop.QuitClosure());
     run_loop.Run();
   }
 
   {
     // Attempt to dispatch another message after the WeakPtr is invalidated.
-    base::Closure assert_not_reached = base::Bind([] { NOTREACHED(); });
-    impl.set_ping_handler(assert_not_reached);
-    proxy->Ping(assert_not_reached);
+    impl.set_ping_handler(base::BindRepeating([] { NOTREACHED(); }));
+    remote->Ping(base::BindOnce([] { NOTREACHED(); }));
 
-    // The binding will close its end of the pipe which will trigger a
-    // connection error on |proxy|.
+    // The receiver will close its end of the pipe which will trigger a
+    // disconnect on |remote|.
     base::RunLoop run_loop;
-    proxy.set_connection_error_handler(run_loop.QuitClosure());
+    remote.set_disconnect_handler(run_loop.QuitClosure());
     weak_factory.InvalidateWeakPtrs();
     run_loop.Run();
   }
 }
 
-TEST_P(BindingTest, ReportBadMessage) {
+TEST_P(ReceiverTest, ReportBadMessage) {
   bool called = false;
-  test::PingServicePtr ptr;
-  auto request = MakeRequest(&ptr);
+  Remote<test::PingService> remote;
+  auto pending_receiver = remote.BindNewPipeAndPassReceiver();
   base::RunLoop run_loop;
-  ptr.set_connection_error_handler(
-      SetFlagAndRunClosure(&called, run_loop.QuitClosure()));
+  remote.set_disconnect_handler(base::BindLambdaForTesting([&] {
+    called = true;
+    run_loop.Quit();
+  }));
   PingServiceImpl impl;
-  Binding<test::PingService> binding(&impl, std::move(request));
-  impl.set_ping_handler(base::Bind(
-      [](Binding<test::PingService>* binding) {
-        binding->ReportBadMessage("received bad message");
-      },
-      &binding));
+  Receiver<test::PingService> receiver(&impl, std::move(pending_receiver));
+  impl.set_ping_handler(base::BindLambdaForTesting(
+      [&] { receiver.ReportBadMessage("received bad message"); }));
 
   std::string received_error;
-  core::SetDefaultProcessErrorCallback(
-      base::Bind([](std::string* out_error,
-                    const std::string& error) { *out_error = error; },
-                 &received_error));
+  core::SetDefaultProcessErrorCallback(base::BindLambdaForTesting(
+      [&](const std::string& error) { received_error = error; }));
 
-  ptr->Ping(base::Bind([] {}));
+  remote->Ping(base::DoNothing());
   EXPECT_FALSE(called);
   run_loop.Run();
   EXPECT_TRUE(called);
   EXPECT_EQ("received bad message", received_error);
 
-  core::SetDefaultProcessErrorCallback(mojo::core::ProcessErrorCallback());
+  core::SetDefaultProcessErrorCallback(base::NullCallback());
 }
 
-TEST_P(BindingTest, GetBadMessageCallback) {
-  test::PingServicePtr ptr;
-  auto request = MakeRequest(&ptr);
+TEST_P(ReceiverTest, GetBadMessageCallback) {
+  Remote<test::PingService> remote;
   base::RunLoop run_loop;
   PingServiceImpl impl;
   ReportBadMessageCallback bad_message_callback;
 
   std::string received_error;
-  core::SetDefaultProcessErrorCallback(
-      base::Bind([](std::string* out_error,
-                    const std::string& error) { *out_error = error; },
-                 &received_error));
+  core::SetDefaultProcessErrorCallback(base::BindLambdaForTesting(
+      [&](const std::string& error) { received_error = error; }));
 
   {
-    Binding<test::PingService> binding(&impl, std::move(request));
-    impl.set_ping_handler(base::Bind(
-        [](Binding<test::PingService>* binding,
-           ReportBadMessageCallback* out_callback) {
-          *out_callback = binding->GetBadMessageCallback();
-        },
-        &binding, &bad_message_callback));
-    ptr->Ping(run_loop.QuitClosure());
+    Receiver<test::PingService> receiver(&impl,
+                                         remote.BindNewPipeAndPassReceiver());
+    impl.set_ping_handler(base::BindLambdaForTesting(
+        [&] { bad_message_callback = receiver.GetBadMessageCallback(); }));
+    remote->Ping(run_loop.QuitClosure());
     run_loop.Run();
     EXPECT_TRUE(received_error.empty());
     EXPECT_TRUE(bad_message_callback);
@@ -527,133 +537,78 @@
   std::move(bad_message_callback).Run("delayed bad message");
   EXPECT_EQ("delayed bad message", received_error);
 
-  core::SetDefaultProcessErrorCallback(mojo::core::ProcessErrorCallback());
+  core::SetDefaultProcessErrorCallback(base::NullCallback());
 }
 
-// StrongBindingTest -----------------------------------------------------------
+TEST_P(ReceiverTest, InvalidPendingReceivers) {
+  PendingReceiver<sample::Service> uninitialized_pending;
+  EXPECT_FALSE(uninitialized_pending);
+
+  // A "null" receiver is just a generic helper for an uninitialized
+  // PendingReceiver. Verify that it's equivalent to above.
+  PendingReceiver<sample::Service> null_pending{NullReceiver()};
+  EXPECT_FALSE(null_pending);
+}
 
 using StrongBindingTest = BindingsTestBase;
 
-// Tests that destroying a mojo::StrongBinding closes the bound message pipe
-// handle but does *not* destroy the implementation object.
-TEST_P(StrongBindingTest, DestroyClosesMessagePipe) {
+TEST_P(StrongBindingTest, CloseDestroysImplAndPipe) {
   base::RunLoop run_loop;
-  bool encountered_error = false;
+  bool disconnected = false;
   bool was_deleted = false;
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
-  ptr.set_connection_error_handler(
-      SetFlagAndRunClosure(&encountered_error, run_loop.QuitClosure()));
+  Remote<sample::Service> remote;
+  auto receiver = remote.BindNewPipeAndPassReceiver();
+  remote.set_disconnect_handler(base::BindLambdaForTesting([&] {
+    disconnected = true;
+    run_loop.Quit();
+  }));
   bool called = false;
   base::RunLoop run_loop2;
 
-  auto binding = MakeStrongBinding(std::make_unique<ServiceImpl>(&was_deleted),
-                                   std::move(request));
-  ptr->Frobinate(
-      nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-      SetFlagAndRunClosure<int32_t>(&called, run_loop2.QuitClosure()));
+  auto binding = MakeStrongBinding<sample::Service>(
+      std::make_unique<ServiceImpl>(&was_deleted), std::move(receiver));
+  remote->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, NullRemote(),
+                    base::BindLambdaForTesting([&](int32_t) {
+                      called = true;
+                      run_loop2.Quit();
+                    }));
   run_loop2.Run();
   EXPECT_TRUE(called);
-  EXPECT_FALSE(encountered_error);
+  EXPECT_FALSE(disconnected);
   binding->Close();
 
   // Now that the StrongBinding is closed we should detect an error on the other
   // end of the pipe.
   run_loop.Run();
-  EXPECT_TRUE(encountered_error);
+  EXPECT_TRUE(disconnected);
 
   // Destroying the StrongBinding also destroys the impl.
   ASSERT_TRUE(was_deleted);
 }
 
-// Tests the typical case, where the implementation object owns the
-// StrongBinding (and should be destroyed on connection error).
-TEST_P(StrongBindingTest, ConnectionErrorDestroysImpl) {
-  sample::ServicePtr ptr;
+TEST_P(StrongBindingTest, DisconnectDestroysImplAndPipe) {
+  Remote<sample::Service> remote;
   bool was_deleted = false;
-  // Will delete itself.
   base::RunLoop run_loop;
-  new ServiceImplWithBinding(&was_deleted, run_loop.QuitClosure(),
-                             MakeRequest(&ptr));
+
+  MakeStrongBinding<sample::Service>(
+      std::make_unique<ServiceImpl>(base::BindLambdaForTesting([&] {
+        was_deleted = true;
+        run_loop.Quit();
+      })),
+      remote.BindNewPipeAndPassReceiver());
 
   base::RunLoop().RunUntilIdle();
   EXPECT_FALSE(was_deleted);
 
-  ptr.reset();
+  remote.reset();
   EXPECT_FALSE(was_deleted);
   run_loop.Run();
   EXPECT_TRUE(was_deleted);
 }
 
-TEST_P(StrongBindingTest, FlushForTesting) {
-  bool called = false;
-  bool was_deleted = false;
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
-  auto binding = MakeStrongBinding(std::make_unique<ServiceImpl>(&was_deleted),
-                                   std::move(request));
-  binding->set_connection_error_handler(base::Bind(&Fail));
-
-  ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-                 SetFlagAndRunClosure<int32_t>(&called));
-  EXPECT_FALSE(called);
-  // Because the flush is sent from the binding, it only guarantees that the
-  // request has been received, not the response. The second flush waits for the
-  // response to be received.
-  ASSERT_TRUE(binding);
-  binding->FlushForTesting();
-  ASSERT_TRUE(binding);
-  binding->FlushForTesting();
-  EXPECT_TRUE(called);
-  EXPECT_FALSE(was_deleted);
-  ptr.reset();
-  ASSERT_TRUE(binding);
-  binding->set_connection_error_handler(base::Closure());
-  binding->FlushForTesting();
-  EXPECT_TRUE(was_deleted);
-}
-
-TEST_P(StrongBindingTest, FlushForTestingWithClosedPeer) {
-  bool called = false;
-  bool was_deleted = false;
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
-  auto binding = MakeStrongBinding(std::make_unique<ServiceImpl>(&was_deleted),
-                                   std::move(request));
-  binding->set_connection_error_handler(SetFlagAndRunClosure(&called));
-  ptr.reset();
-
-  EXPECT_FALSE(called);
-  EXPECT_FALSE(was_deleted);
-  ASSERT_TRUE(binding);
-  binding->FlushForTesting();
-  EXPECT_TRUE(called);
-  EXPECT_TRUE(was_deleted);
-  ASSERT_FALSE(binding);
-}
-
-TEST_P(StrongBindingTest, ConnectionErrorWithReason) {
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
-  auto binding =
-      MakeStrongBinding(std::make_unique<ServiceImpl>(), std::move(request));
-  base::RunLoop run_loop;
-  binding->set_connection_error_with_reason_handler(base::Bind(
-      [](const base::Closure& quit_closure, uint32_t custom_reason,
-         const std::string& description) {
-        EXPECT_EQ(5678u, custom_reason);
-        EXPECT_EQ("hello", description);
-        quit_closure.Run();
-      },
-      run_loop.QuitClosure()));
-
-  ptr.ResetWithReason(5678u, "hello");
-
-  run_loop.Run();
-}
-
-INSTANTIATE_MOJO_BINDINGS_TEST_SUITE_P(BindingTest);
+INSTANTIATE_MOJO_BINDINGS_TEST_SUITE_P(ReceiverTest);
 INSTANTIATE_MOJO_BINDINGS_TEST_SUITE_P(StrongBindingTest);
 
 }  // namespace
-}  // mojo
+}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/remote_unittest.cc b/mojo/public/cpp/bindings/tests/remote_unittest.cc
index 4fdaeb3..1d82458 100644
--- a/mojo/public/cpp/bindings/tests/remote_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/remote_unittest.cc
@@ -1,4 +1,3 @@
-
 // Copyright 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
@@ -14,14 +13,17 @@
 #include "base/run_loop.h"
 #include "base/sequenced_task_runner.h"
 #include "base/task/post_task.h"
+#include "base/test/bind_test_util.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
+#include "mojo/public/cpp/bindings/shared_remote.h"
 #include "mojo/public/cpp/bindings/tests/bindings_test_base.h"
-#include "mojo/public/cpp/bindings/thread_safe_interface_ptr.h"
+#include "mojo/public/cpp/bindings/unique_receiver_set.h"
+#include "mojo/public/cpp/system/wait.h"
 #include "mojo/public/interfaces/bindings/tests/math_calculator.mojom.h"
 #include "mojo/public/interfaces/bindings/tests/sample_interfaces.mojom.h"
 #include "mojo/public/interfaces/bindings/tests/sample_service.mojom.h"
@@ -34,9 +36,9 @@
 
 class MathCalculatorImpl : public math::Calculator {
  public:
-  explicit MathCalculatorImpl(InterfaceRequest<math::Calculator> request)
-      : total_(0.0), binding_(this, std::move(request)) {}
-  ~MathCalculatorImpl() override {}
+  explicit MathCalculatorImpl(PendingReceiver<math::Calculator> receiver)
+      : total_(0.0), receiver_(this, std::move(receiver)) {}
+  ~MathCalculatorImpl() override = default;
 
   void Clear(ClearCallback callback) override {
     total_ = 0.0;
@@ -53,78 +55,75 @@
     std::move(callback).Run(total_);
   }
 
-  Binding<math::Calculator>* binding() { return &binding_; }
+  Receiver<math::Calculator>& receiver() { return receiver_; }
 
  private:
   double total_;
-  Binding<math::Calculator> binding_;
+  Receiver<math::Calculator> receiver_;
 };
 
 class MathCalculatorUI {
  public:
-  explicit MathCalculatorUI(math::CalculatorPtr calculator)
-      : calculator_(std::move(calculator)),
-        output_(0.0) {}
+  explicit MathCalculatorUI(PendingRemote<math::Calculator> calculator)
+      : calculator_(std::move(calculator)), output_(0.0) {}
 
-  bool encountered_error() const { return calculator_.encountered_error(); }
-  void set_connection_error_handler(const base::Closure& closure) {
-    calculator_.set_connection_error_handler(closure);
+  bool is_connected() const { return calculator_.is_connected(); }
+  void set_disconnect_handler(base::OnceClosure closure) {
+    calculator_.set_disconnect_handler(std::move(closure));
   }
 
-  void Add(double value, const base::Closure& closure) {
+  void Add(double value, base::OnceClosure closure) {
     calculator_->Add(
-        value,
-        base::Bind(&MathCalculatorUI::Output, base::Unretained(this), closure));
+        value, base::BindOnce(&MathCalculatorUI::Output, base::Unretained(this),
+                              std::move(closure)));
   }
 
-  void Multiply(double value, const base::Closure& closure) {
+  void Multiply(double value, base::OnceClosure closure) {
     calculator_->Multiply(
-        value,
-        base::Bind(&MathCalculatorUI::Output, base::Unretained(this), closure));
+        value, base::BindOnce(&MathCalculatorUI::Output, base::Unretained(this),
+                              std::move(closure)));
   }
 
   double GetOutput() const { return output_; }
 
-  math::CalculatorPtr& GetInterfacePtr() { return calculator_; }
+  Remote<math::Calculator>& remote() { return calculator_; }
 
  private:
-  void Output(const base::Closure& closure, double output) {
+  void Output(base::OnceClosure closure, double output) {
     output_ = output;
-    if (!closure.is_null())
-      closure.Run();
+    if (closure)
+      std::move(closure).Run();
   }
 
-  math::CalculatorPtr calculator_;
+  Remote<math::Calculator> calculator_;
   double output_;
-  base::Closure closure_;
 };
 
 class SelfDestructingMathCalculatorUI {
  public:
-  explicit SelfDestructingMathCalculatorUI(math::CalculatorPtr calculator)
+  explicit SelfDestructingMathCalculatorUI(
+      PendingRemote<math::Calculator> calculator)
       : calculator_(std::move(calculator)), nesting_level_(0) {
     ++num_instances_;
   }
 
-  void BeginTest(bool nested, const base::Closure& closure) {
+  void BeginTest(bool nested, base::OnceClosure closure) {
     nesting_level_ = nested ? 2 : 1;
     calculator_->Add(
-        1.0,
-        base::Bind(&SelfDestructingMathCalculatorUI::Output,
-                   base::Unretained(this), closure));
+        1.0, base::BindOnce(&SelfDestructingMathCalculatorUI::Output,
+                            base::Unretained(this), std::move(closure)));
   }
 
   static int num_instances() { return num_instances_; }
 
-  void Output(const base::Closure& closure, double value) {
+  void Output(base::OnceClosure closure, double value) {
     if (--nesting_level_ > 0) {
       // Add some more and wait for re-entrant call to Output!
       calculator_->Add(
-          1.0,
-          base::Bind(&SelfDestructingMathCalculatorUI::Output,
-                     base::Unretained(this), closure));
+          1.0, base::BindOnce(&SelfDestructingMathCalculatorUI::Output,
+                              base::Unretained(this), std::move(closure)));
     } else {
-      closure.Run();
+      std::move(closure).Run();
       delete this;
     }
   }
@@ -132,7 +131,7 @@
  private:
   ~SelfDestructingMathCalculatorUI() { --num_instances_; }
 
-  math::CalculatorPtr calculator_;
+  Remote<math::Calculator> calculator_;
   int nesting_level_;
   static int num_instances_;
 };
@@ -142,43 +141,43 @@
 
 class ReentrantServiceImpl : public sample::Service {
  public:
-  ~ReentrantServiceImpl() override {}
+  ~ReentrantServiceImpl() override = default;
 
-  explicit ReentrantServiceImpl(InterfaceRequest<sample::Service> request)
+  explicit ReentrantServiceImpl(PendingReceiver<sample::Service> receiver)
       : call_depth_(0),
         max_call_depth_(0),
-        binding_(this, std::move(request)) {}
+        receiver_(this, std::move(receiver)) {}
 
   int max_call_depth() { return max_call_depth_; }
 
   void Frobinate(sample::FooPtr foo,
                  sample::Service::BazOptions baz,
-                 sample::PortPtr port,
+                 PendingRemote<sample::Port> port,
                  sample::Service::FrobinateCallback callback) override {
     max_call_depth_ = std::max(++call_depth_, max_call_depth_);
     if (call_depth_ == 1) {
-      EXPECT_TRUE(binding_.WaitForIncomingMethodCall());
+      EXPECT_TRUE(receiver_.WaitForIncomingCall());
     }
     call_depth_--;
     std::move(callback).Run(5);
   }
 
-  void GetPort(mojo::InterfaceRequest<sample::Port> port) override {}
+  void GetPort(PendingReceiver<sample::Port> receiver) override {}
 
  private:
   int call_depth_;
   int max_call_depth_;
-  Binding<sample::Service> binding_;
+  Receiver<sample::Service> receiver_;
 };
 
 class IntegerAccessorImpl : public sample::IntegerAccessor {
  public:
   IntegerAccessorImpl() : integer_(0) {}
-  ~IntegerAccessorImpl() override {}
+  ~IntegerAccessorImpl() override = default;
 
   int64_t integer() const { return integer_; }
 
-  void set_closure(const base::Closure& closure) { closure_ = closure; }
+  void set_closure(base::OnceClosure closure) { closure_ = std::move(closure); }
 
  private:
   // sample::IntegerAccessor implementation.
@@ -187,69 +186,51 @@
   }
   void SetInteger(int64_t data, sample::Enum type) override {
     integer_ = data;
-    if (!closure_.is_null()) {
-      closure_.Run();
-      closure_.Reset();
-    }
+    if (closure_)
+      std::move(closure_).Run();
   }
 
   int64_t integer_;
-  base::Closure closure_;
+  base::OnceClosure closure_;
 };
 
-class InterfacePtrTest : public BindingsTestBase {
+class RemoteTest : public BindingsTestBase {
  public:
-  InterfacePtrTest() {}
-  ~InterfacePtrTest() override { base::RunLoop().RunUntilIdle(); }
+  RemoteTest() = default;
+  ~RemoteTest() override { base::RunLoop().RunUntilIdle(); }
 
   void PumpMessages() { base::RunLoop().RunUntilIdle(); }
 };
 
-void SetFlagAndRunClosure(bool* flag, const base::Closure& closure) {
-  *flag = true;
-  closure.Run();
+TEST_P(RemoteTest, IsBound) {
+  Remote<math::Calculator> calc;
+  EXPECT_FALSE(calc);
+  MathCalculatorImpl calc_impl(calc.BindNewPipeAndPassReceiver());
+  EXPECT_TRUE(calc);
 }
 
-void IgnoreValueAndRunClosure(const base::Closure& closure, int32_t value) {
-  closure.Run();
-}
-
-void ExpectValueAndRunClosure(uint32_t expected_value,
-                              const base::Closure& closure,
-                              uint32_t value) {
-  EXPECT_EQ(expected_value, value);
-  closure.Run();
-}
-
-TEST_P(InterfacePtrTest, IsBound) {
-  math::CalculatorPtr calc;
-  EXPECT_FALSE(calc.is_bound());
-  MathCalculatorImpl calc_impl(MakeRequest(&calc));
-  EXPECT_TRUE(calc.is_bound());
-}
-
-class EndToEndInterfacePtrTest : public InterfacePtrTest {
+class EndToEndRemoteTest : public RemoteTest {
  public:
   void RunTest(const scoped_refptr<base::SequencedTaskRunner> runner) {
     base::RunLoop run_loop;
     done_closure_ = run_loop.QuitClosure();
     done_runner_ = base::ThreadTaskRunnerHandle::Get();
-    runner->PostTask(FROM_HERE,
-                     base::BindOnce(&EndToEndInterfacePtrTest::RunTestImpl,
-                                    base::Unretained(this)));
+    runner->PostTask(FROM_HERE, base::BindOnce(&EndToEndRemoteTest::RunTestImpl,
+                                               base::Unretained(this)));
     run_loop.Run();
   }
 
  private:
   void RunTestImpl() {
-    math::CalculatorPtr calc;
-    calc_impl_ = std::make_unique<MathCalculatorImpl>(MakeRequest(&calc));
+    PendingRemote<math::Calculator> calc;
+    calc_impl_ = std::make_unique<MathCalculatorImpl>(
+        calc.InitWithNewPipeAndPassReceiver());
     calculator_ui_ = std::make_unique<MathCalculatorUI>(std::move(calc));
-    calculator_ui_->Add(2.0, base::Bind(&EndToEndInterfacePtrTest::AddDone,
-                                        base::Unretained(this)));
+    calculator_ui_->Add(2.0, base::BindOnce(&EndToEndRemoteTest::AddDone,
+                                            base::Unretained(this)));
     calculator_ui_->Multiply(5.0,
-                             base::Bind(&EndToEndInterfacePtrTest::MultiplyDone,
-                                        base::Unretained(this)));
+                             base::BindOnce(&EndToEndRemoteTest::MultiplyDone,
+                                            base::Unretained(this)));
     EXPECT_EQ(0.0, calculator_ui_->GetOutput());
   }
 
@@ -262,24 +243,24 @@
     done_runner_->PostTask(FROM_HERE, std::move(done_closure_));
   }
 
-  base::Closure done_closure_;
+  base::OnceClosure done_closure_;
   scoped_refptr<base::SequencedTaskRunner> done_runner_;
   std::unique_ptr<MathCalculatorUI> calculator_ui_;
   std::unique_ptr<MathCalculatorImpl> calc_impl_;
 };
 
-TEST_P(EndToEndInterfacePtrTest, EndToEnd) {
+TEST_P(EndToEndRemoteTest, EndToEnd) {
   RunTest(base::ThreadTaskRunnerHandle::Get());
 }
 
-TEST_P(EndToEndInterfacePtrTest, EndToEndOnSequence) {
+TEST_P(EndToEndRemoteTest, EndToEndOnSequence) {
   RunTest(base::CreateSequencedTaskRunnerWithTraits({}));
 }
 
-TEST_P(InterfacePtrTest, Movable) {
-  math::CalculatorPtr a;
-  math::CalculatorPtr b;
-  MathCalculatorImpl calc_impl(MakeRequest(&b));
+TEST_P(RemoteTest, Movable) {
+  Remote<math::Calculator> a;
+  Remote<math::Calculator> b;
+  MathCalculatorImpl calc_impl(b.BindNewPipeAndPassReceiver());
 
   EXPECT_TRUE(!a);
   EXPECT_FALSE(!b);
@@ -290,114 +271,112 @@
   EXPECT_TRUE(!b);
 }
 
-TEST_P(InterfacePtrTest, Resettable) {
-  math::CalculatorPtr a;
+TEST_P(RemoteTest, Resettable) {
+  Remote<math::Calculator> a;
 
-  EXPECT_TRUE(!a);
+  EXPECT_FALSE(a);
 
   MessagePipe pipe;
 
   // Save this so we can test it later.
   Handle handle = pipe.handle0.get();
 
-  a = MakeProxy(
-      InterfacePtrInfo<math::Calculator>(std::move(pipe.handle0), 0u));
+  a.Bind(PendingRemote<math::Calculator>(std::move(pipe.handle0), 0u));
 
-  EXPECT_FALSE(!a);
+  EXPECT_TRUE(a);
 
   a.reset();
 
-  EXPECT_TRUE(!a);
-  EXPECT_FALSE(a.internal_state()->is_bound());
+  EXPECT_FALSE(a);
 
-  // Test that handle was closed.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, CloseRaw(handle));
+  // Test that handle was closed by waiting for its peer to signal.
+  Wait(pipe.handle1.get(), MOJO_HANDLE_SIGNAL_PEER_CLOSED);
 }
 
-TEST_P(InterfacePtrTest, BindInvalidHandle) {
-  math::CalculatorPtr ptr;
-  EXPECT_FALSE(ptr.get());
-  EXPECT_FALSE(ptr);
+TEST_P(RemoteTest, InvalidPendingRemotes) {
+  PendingRemote<math::Calculator> invalid_remote;
+  EXPECT_FALSE(invalid_remote);
 
-  ptr.Bind(InterfacePtrInfo<math::Calculator>());
-  EXPECT_FALSE(ptr.get());
-  EXPECT_FALSE(ptr);
+  // A "null" remote is just a generic helper for an uninitialized
+  // PendingRemote. Verify that it's equivalent to above.
+  PendingRemote<math::Calculator> null_remote{NullRemote()};
+  EXPECT_FALSE(null_remote);
 }
 
-TEST_P(InterfacePtrTest, EncounteredError) {
-  math::CalculatorPtr proxy;
-  MathCalculatorImpl calc_impl(MakeRequest(&proxy));
+TEST_P(RemoteTest, IsConnected) {
+  PendingRemote<math::Calculator> remote;
+  MathCalculatorImpl calc_impl(remote.InitWithNewPipeAndPassReceiver());
 
-  MathCalculatorUI calculator_ui(std::move(proxy));
+  MathCalculatorUI calculator_ui(std::move(remote));
 
   base::RunLoop run_loop;
   calculator_ui.Add(2.0, run_loop.QuitClosure());
   run_loop.Run();
   EXPECT_EQ(2.0, calculator_ui.GetOutput());
-  EXPECT_FALSE(calculator_ui.encountered_error());
+  EXPECT_TRUE(calculator_ui.is_connected());
 
   calculator_ui.Multiply(5.0, base::Closure());
-  EXPECT_FALSE(calculator_ui.encountered_error());
+  EXPECT_TRUE(calculator_ui.is_connected());
 
-  // Close the server.
-  calc_impl.binding()->Close();
+  calc_impl.receiver().reset();
+
+  base::RunLoop run_loop2;
+  calculator_ui.set_disconnect_handler(run_loop2.QuitClosure());
 
   // The state change isn't picked up locally yet.
-  base::RunLoop run_loop2;
-  calculator_ui.set_connection_error_handler(run_loop2.QuitClosure());
-  EXPECT_FALSE(calculator_ui.encountered_error());
+  EXPECT_TRUE(calculator_ui.is_connected());
 
   run_loop2.Run();
 
-  // OK, now we see the error.
-  EXPECT_TRUE(calculator_ui.encountered_error());
+  // OK, now we see the disconnection.
+  EXPECT_FALSE(calculator_ui.is_connected());
 }
 
-TEST_P(InterfacePtrTest, EncounteredErrorCallback) {
-  math::CalculatorPtr proxy;
-  MathCalculatorImpl calc_impl(MakeRequest(&proxy));
+TEST_P(RemoteTest, DisconnectCallback) {
+  PendingRemote<math::Calculator> remote;
+  MathCalculatorImpl calc_impl(remote.InitWithNewPipeAndPassReceiver());
 
-  bool encountered_error = false;
+  MathCalculatorUI calculator_ui(std::move(remote));
+
+  bool connected = true;
   base::RunLoop run_loop;
-  proxy.set_connection_error_handler(
-      base::Bind(&SetFlagAndRunClosure, &encountered_error,
-                 run_loop.QuitClosure()));
-
-  MathCalculatorUI calculator_ui(std::move(proxy));
+  calculator_ui.remote().set_disconnect_handler(base::BindLambdaForTesting([&] {
+    connected = false;
+    run_loop.Quit();
+  }));
 
   base::RunLoop run_loop2;
   calculator_ui.Add(2.0, run_loop2.QuitClosure());
   run_loop2.Run();
   EXPECT_EQ(2.0, calculator_ui.GetOutput());
-  EXPECT_FALSE(calculator_ui.encountered_error());
+  EXPECT_TRUE(calculator_ui.is_connected());
 
   calculator_ui.Multiply(5.0, base::Closure());
-  EXPECT_FALSE(calculator_ui.encountered_error());
+  EXPECT_TRUE(calculator_ui.is_connected());
 
-  // Close the server.
-  calc_impl.binding()->Close();
+  calc_impl.receiver().reset();
 
   // The state change isn't picked up locally yet.
-  EXPECT_FALSE(calculator_ui.encountered_error());
+  EXPECT_TRUE(calculator_ui.is_connected());
 
   run_loop.Run();
 
-  // OK, now we see the error.
-  EXPECT_TRUE(calculator_ui.encountered_error());
+  // OK, now we see the disconnection.
+  EXPECT_FALSE(calculator_ui.is_connected());
 
   // We should have also been able to observe the error through the error
   // handler.
-  EXPECT_TRUE(encountered_error);
+  EXPECT_FALSE(connected);
 }
 
-TEST_P(InterfacePtrTest, DestroyInterfacePtrOnMethodResponse) {
-  math::CalculatorPtr proxy;
-  MathCalculatorImpl calc_impl(MakeRequest(&proxy));
+TEST_P(RemoteTest, DestroyRemoteOnMethodResponse) {
+  PendingRemote<math::Calculator> remote;
+  MathCalculatorImpl calc_impl(remote.InitWithNewPipeAndPassReceiver());
 
   EXPECT_EQ(0, SelfDestructingMathCalculatorUI::num_instances());
 
   SelfDestructingMathCalculatorUI* impl =
-      new SelfDestructingMathCalculatorUI(std::move(proxy));
+      new SelfDestructingMathCalculatorUI(std::move(remote));
   base::RunLoop run_loop;
   impl->BeginTest(false, run_loop.QuitClosure());
   run_loop.Run();
@@ -405,14 +384,14 @@
   EXPECT_EQ(0, SelfDestructingMathCalculatorUI::num_instances());
 }
 
-TEST_P(InterfacePtrTest, NestedDestroyInterfacePtrOnMethodResponse) {
-  math::CalculatorPtr proxy;
-  MathCalculatorImpl calc_impl(MakeRequest(&proxy));
+TEST_P(RemoteTest, NestedDestroyRemoteOnMethodResponse) {
+  PendingRemote<math::Calculator> remote;
+  MathCalculatorImpl calc_impl(remote.InitWithNewPipeAndPassReceiver());
 
   EXPECT_EQ(0, SelfDestructingMathCalculatorUI::num_instances());
 
   SelfDestructingMathCalculatorUI* impl =
-      new SelfDestructingMathCalculatorUI(std::move(proxy));
+      new SelfDestructingMathCalculatorUI(std::move(remote));
   base::RunLoop run_loop;
   impl->BeginTest(true, run_loop.QuitClosure());
   run_loop.Run();
@@ -420,17 +399,15 @@
   EXPECT_EQ(0, SelfDestructingMathCalculatorUI::num_instances());
 }
 
-TEST_P(InterfacePtrTest, ReentrantWaitForIncomingMethodCall) {
-  sample::ServicePtr proxy;
-  ReentrantServiceImpl impl(MakeRequest(&proxy));
+TEST_P(RemoteTest, ReentrantWaitForIncomingCall) {
+  Remote<sample::Service> remote;
+  ReentrantServiceImpl impl(remote.BindNewPipeAndPassReceiver());
 
   base::RunLoop run_loop, run_loop2;
-  proxy->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-                   base::Bind(&IgnoreValueAndRunClosure,
-                              run_loop.QuitClosure()));
-  proxy->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-                   base::Bind(&IgnoreValueAndRunClosure,
-                              run_loop2.QuitClosure()));
+  remote->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, NullRemote(),
+                    base::BindLambdaForTesting([&](int) { run_loop.Quit(); }));
+  remote->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, NullRemote(),
+                    base::BindLambdaForTesting([&](int) { run_loop2.Quit(); }));
 
   run_loop.Run();
   run_loop2.Run();
@@ -438,55 +415,59 @@
   EXPECT_EQ(2, impl.max_call_depth());
 }
 
-TEST_P(InterfacePtrTest, QueryVersion) {
+TEST_P(RemoteTest, QueryVersion) {
   IntegerAccessorImpl impl;
-  sample::IntegerAccessorPtr ptr;
-  Binding<sample::IntegerAccessor> binding(&impl, MakeRequest(&ptr));
+  Remote<sample::IntegerAccessor> remote;
+  Receiver<sample::IntegerAccessor> receiver(
+      &impl, remote.BindNewPipeAndPassReceiver());
 
-  EXPECT_EQ(0u, ptr.version());
+  EXPECT_EQ(0u, remote.version());
 
   base::RunLoop run_loop;
-  ptr.QueryVersion(base::Bind(&ExpectValueAndRunClosure, 3u,
-                              run_loop.QuitClosure()));
+  remote.QueryVersion(base::BindLambdaForTesting([&](uint32_t version) {
+    EXPECT_EQ(3u, version);
+    run_loop.Quit();
+  }));
   run_loop.Run();
 
-  EXPECT_EQ(3u, ptr.version());
+  EXPECT_EQ(3u, remote.version());
 }
 
-TEST_P(InterfacePtrTest, RequireVersion) {
+TEST_P(RemoteTest, RequireVersion) {
   IntegerAccessorImpl impl;
-  sample::IntegerAccessorPtr ptr;
-  Binding<sample::IntegerAccessor> binding(&impl, MakeRequest(&ptr));
+  Remote<sample::IntegerAccessor> remote;
+  Receiver<sample::IntegerAccessor> receiver(
+      &impl, remote.BindNewPipeAndPassReceiver());
 
-  EXPECT_EQ(0u, ptr.version());
+  EXPECT_EQ(0u, remote.version());
 
-  ptr.RequireVersion(1u);
-  EXPECT_EQ(1u, ptr.version());
+  remote.RequireVersion(1u);
+  EXPECT_EQ(1u, remote.version());
   base::RunLoop run_loop;
   impl.set_closure(run_loop.QuitClosure());
-  ptr->SetInteger(123, sample::Enum::VALUE);
+  remote->SetInteger(123, sample::Enum::VALUE);
   run_loop.Run();
-  EXPECT_FALSE(ptr.encountered_error());
+  EXPECT_TRUE(remote.is_connected());
   EXPECT_EQ(123, impl.integer());
 
-  ptr.RequireVersion(3u);
-  EXPECT_EQ(3u, ptr.version());
+  remote.RequireVersion(3u);
+  EXPECT_EQ(3u, remote.version());
   base::RunLoop run_loop2;
   impl.set_closure(run_loop2.QuitClosure());
-  ptr->SetInteger(456, sample::Enum::VALUE);
+  remote->SetInteger(456, sample::Enum::VALUE);
   run_loop2.Run();
-  EXPECT_FALSE(ptr.encountered_error());
+  EXPECT_TRUE(remote.is_connected());
   EXPECT_EQ(456, impl.integer());
 
   // Require a version that is not supported by the impl side.
-  ptr.RequireVersion(4u);
+  remote.RequireVersion(4u);
   // This value is set to the input of RequireVersion() synchronously.
-  EXPECT_EQ(4u, ptr.version());
+  EXPECT_EQ(4u, remote.version());
   base::RunLoop run_loop3;
-  ptr.set_connection_error_handler(run_loop3.QuitClosure());
-  ptr->SetInteger(789, sample::Enum::VALUE);
+  remote.set_disconnect_handler(run_loop3.QuitClosure());
+  remote->SetInteger(789, sample::Enum::VALUE);
   run_loop3.Run();
-  EXPECT_TRUE(ptr.encountered_error());
+  EXPECT_FALSE(remote.is_connected());
   // The call to SetInteger() after RequireVersion(4u) is ignored.
   EXPECT_EQ(456, impl.integer());
 }
@@ -519,20 +500,20 @@
 TEST(StrongConnectorTest, Math) {
   base::MessageLoop loop;
 
-  bool error_received = false;
+  bool disconnected = false;
   bool destroyed = false;
-  math::CalculatorPtr calc;
+  PendingRemote<math::Calculator> calc;
   base::RunLoop run_loop;
 
-  auto binding =
-      MakeStrongBinding(std::make_unique<StrongMathCalculatorImpl>(&destroyed),
-                        MakeRequest(&calc));
-  binding->set_connection_error_handler(base::Bind(
-      &SetFlagAndRunClosure, &error_received, run_loop.QuitClosure()));
+  UniqueReceiverSet<math::Calculator> receivers;
+  receivers.Add(std::make_unique<StrongMathCalculatorImpl>(&destroyed),
+                calc.InitWithNewPipeAndPassReceiver());
+  receivers.set_disconnect_handler(base::BindLambdaForTesting([&] {
+    disconnected = true;
+    run_loop.Quit();
+  }));
 
   {
-    // Suppose this is instantiated in a process that has the other end of the
-    // message pipe.
     MathCalculatorUI calculator_ui(std::move(calc));
 
     base::RunLoop run_loop, run_loop2;
@@ -542,30 +523,31 @@
     run_loop2.Run();
 
     EXPECT_EQ(10.0, calculator_ui.GetOutput());
-    EXPECT_FALSE(error_received);
+    EXPECT_FALSE(disconnected);
     EXPECT_FALSE(destroyed);
   }
-  // Destroying calculator_ui should close the pipe and generate an error on the
-  // other
-  // end which will destroy the instance since it is strongly bound.
 
+  // Destroying calculator_ui should close the pipe and signal disconnection on
+  // the receiving end, which will in turn destroy the impl since it's in a
+  // UniqueReceiverSet.
   run_loop.Run();
-  EXPECT_TRUE(error_received);
+  EXPECT_TRUE(disconnected);
   EXPECT_TRUE(destroyed);
 }
 
 class WeakMathCalculatorImpl : public math::Calculator {
  public:
-  WeakMathCalculatorImpl(math::CalculatorRequest request,
-                         bool* error_received,
+  WeakMathCalculatorImpl(PendingReceiver<math::Calculator> receiver,
+                         bool* disconnected,
                          bool* destroyed,
-                         const base::Closure& closure)
-      : error_received_(error_received),
-        destroyed_(destroyed),
-        closure_(closure),
-        binding_(this, std::move(request)) {
-    binding_.set_connection_error_handler(
-        base::Bind(&SetFlagAndRunClosure, error_received_, closure_));
+                         base::OnceClosure closure)
+      : destroyed_(destroyed), receiver_(this, std::move(receiver)) {
+    receiver_.set_disconnect_handler(base::BindOnce(
+        [](bool* disconnected, base::OnceClosure closure) {
+          *disconnected = true;
+          std::move(closure).Run();
+        },
+        disconnected, std::move(closure)));
   }
   ~WeakMathCalculatorImpl() override { *destroyed_ = true; }
 
@@ -585,31 +567,26 @@
 
  private:
   double total_ = 0.0;
-  bool* error_received_;
   bool* destroyed_;
-  base::Closure closure_;
+  base::OnceClosure closure_;
 
-  Binding<math::Calculator> binding_;
+  Receiver<math::Calculator> receiver_;
 };
 
 TEST(WeakConnectorTest, Math) {
   base::MessageLoop loop;
 
-  bool error_received = false;
+  bool disconnected = false;
   bool destroyed = false;
   MessagePipe pipe;
   base::RunLoop run_loop;
-  WeakMathCalculatorImpl impl(math::CalculatorRequest(std::move(pipe.handle0)),
-                              &error_received, &destroyed,
-                              run_loop.QuitClosure());
-
-  math::CalculatorPtr calc;
-  calc.Bind(InterfacePtrInfo<math::Calculator>(std::move(pipe.handle1), 0u));
+  WeakMathCalculatorImpl impl(
+      PendingReceiver<math::Calculator>(std::move(pipe.handle0)), &disconnected,
+      &destroyed, run_loop.QuitClosure());
 
   {
-    // Suppose this is instantiated in a process that has the other end of the
-    // message pipe.
-    MathCalculatorUI calculator_ui(std::move(calc));
+    MathCalculatorUI calculator_ui(
+        PendingRemote<math::Calculator>(std::move(pipe.handle1), 0u));
 
     base::RunLoop run_loop, run_loop2;
     calculator_ui.Add(2.0, run_loop.QuitClosure());
@@ -618,87 +595,92 @@
     run_loop2.Run();
 
     EXPECT_EQ(10.0, calculator_ui.GetOutput());
-    EXPECT_FALSE(error_received);
+    EXPECT_FALSE(disconnected);
     EXPECT_FALSE(destroyed);
-    // Destroying calculator_ui should close the pipe and generate an error on
-    // the other
-    // end which will destroy the instance since it is strongly bound.
   }
 
   run_loop.Run();
-  EXPECT_TRUE(error_received);
+  EXPECT_TRUE(disconnected);
   EXPECT_FALSE(destroyed);
 }
 
 class CImpl : public C {
  public:
-  CImpl(bool* d_called, const base::Closure& closure)
-      : d_called_(d_called), closure_(closure) {}
-  ~CImpl() override {}
+  CImpl(bool* d_called, base::OnceClosure closure)
+      : d_called_(d_called), closure_(std::move(closure)) {}
+  ~CImpl() override = default;
+
+  void Bind(PendingReceiver<C> receiver) {
+    receiver_.Bind(std::move(receiver));
+  }
 
  private:
   void D() override {
     *d_called_ = true;
-    closure_.Run();
+    std::move(closure_).Run();
   }
 
+  Receiver<C> receiver_{this};
   bool* d_called_;
-  base::Closure closure_;
+  base::OnceClosure closure_;
 };
 
 class BImpl : public B {
  public:
-  BImpl(bool* d_called, const base::Closure& closure)
-      : d_called_(d_called), closure_(closure) {}
-  ~BImpl() override {}
+  BImpl(bool* d_called, base::OnceClosure closure)
+      : c_(d_called, std::move(closure)) {}
+  ~BImpl() override = default;
 
- private:
-  void GetC(InterfaceRequest<C> c) override {
-    MakeStrongBinding(std::make_unique<CImpl>(d_called_, closure_),
-                      std::move(c));
+  void Bind(PendingReceiver<B> receiver) {
+    receiver_.Bind(std::move(receiver));
   }
 
-  bool* d_called_;
-  base::Closure closure_;
+ private:
+  void GetC(PendingReceiver<C> receiver) override {
+    c_.Bind(std::move(receiver));
+  }
+
+  Receiver<B> receiver_{this};
+  CImpl c_;
 };
 
 class AImpl : public A {
  public:
-  AImpl(InterfaceRequest<A> request, const base::Closure& closure)
-      : d_called_(false), binding_(this, std::move(request)),
-        closure_(closure) {}
-  ~AImpl() override {}
+  AImpl(PendingReceiver<A> receiver, base::OnceClosure closure)
+      : d_called_(false),
+        receiver_(this, std::move(receiver)),
+        b_(&d_called_, std::move(closure)) {}
+  ~AImpl() override = default;
 
   bool d_called() const { return d_called_; }
 
  private:
-  void GetB(InterfaceRequest<B> b) override {
-    MakeStrongBinding(std::make_unique<BImpl>(&d_called_, closure_),
-                      std::move(b));
+  void GetB(PendingReceiver<B> receiver) override {
+    b_.Bind(std::move(receiver));
   }
 
   bool d_called_;
-  Binding<A> binding_;
-  base::Closure closure_;
+  Receiver<A> receiver_;
+  BImpl b_;
 };
 
-TEST_P(InterfacePtrTest, Scoping) {
-  APtr a;
+TEST_P(RemoteTest, Scoping) {
+  Remote<A> a;
   base::RunLoop run_loop;
-  AImpl a_impl(MakeRequest(&a), run_loop.QuitClosure());
+  AImpl a_impl(a.BindNewPipeAndPassReceiver(), run_loop.QuitClosure());
 
   EXPECT_FALSE(a_impl.d_called());
 
   {
-    BPtr b;
-    a->GetB(MakeRequest(&b));
-    CPtr c;
-    b->GetC(MakeRequest(&c));
+    Remote<B> b;
+    a->GetB(b.BindNewPipeAndPassReceiver());
+    Remote<C> c;
+    b->GetC(c.BindNewPipeAndPassReceiver());
     c->D();
   }
 
-  // While B & C have fallen out of scope, the pipes will remain until they are
-  // flushed.
+  // While B & C have fallen out of scope, the receiving endpoints will continue
+  // to operate, and any messages sent prior to destruction will be delivered.
   EXPECT_FALSE(a_impl.d_called());
   run_loop.Run();
   EXPECT_TRUE(a_impl.d_called());
@@ -706,30 +688,34 @@
 
 class PingTestImpl : public sample::PingTest {
  public:
-  explicit PingTestImpl(InterfaceRequest<sample::PingTest> request)
-      : binding_(this, std::move(request)) {}
-  ~PingTestImpl() override {}
+  explicit PingTestImpl(PendingReceiver<sample::PingTest> receiver)
+      : receiver_(this, std::move(receiver)) {}
+  ~PingTestImpl() override = default;
 
  private:
   // sample::PingTest:
   void Ping(PingCallback callback) override { std::move(callback).Run(); }
 
-  Binding<sample::PingTest> binding_;
+  Receiver<sample::PingTest> receiver_;
 };
 
 // Tests that FuseProxy does what it's supposed to do.
-TEST_P(InterfacePtrTest, Fusion) {
-  sample::PingTestPtrInfo proxy_info;
-  PingTestImpl impl(MakeRequest(&proxy_info));
+TEST_P(RemoteTest, Fusion) {
+  PendingRemote<sample::PingTest> pending_remote;
+  PingTestImpl impl(pending_remote.InitWithNewPipeAndPassReceiver());
 
   // Create another PingTest pipe and fuse it to the one hanging off |impl|.
-  sample::PingTestPtr ptr;
-  EXPECT_TRUE(FuseInterface(mojo::MakeRequest(&ptr), std::move(proxy_info)));
+  Remote<sample::PingTest> remote;
+  EXPECT_TRUE(FusePipes(remote.BindNewPipeAndPassReceiver(),
+                        std::move(pending_remote)));
 
   // Ping!
   bool called = false;
   base::RunLoop loop;
-  ptr->Ping(base::Bind(&SetFlagAndRunClosure, &called, loop.QuitClosure()));
+  remote->Ping(base::BindLambdaForTesting([&] {
+    called = true;
+    loop.Quit();
+  }));
   loop.Run();
   EXPECT_TRUE(called);
 }
@@ -738,63 +724,61 @@
   FAIL() << "Unexpected connection error";
 }
 
-TEST_P(InterfacePtrTest, FlushForTesting) {
-  math::CalculatorPtr calc;
-  MathCalculatorImpl calc_impl(MakeRequest(&calc));
-  calc.set_connection_error_handler(base::Bind(&Fail));
+TEST_P(RemoteTest, FlushForTesting) {
+  PendingRemote<math::Calculator> remote;
+  MathCalculatorImpl calc_impl(remote.InitWithNewPipeAndPassReceiver());
 
-  MathCalculatorUI calculator_ui(std::move(calc));
+  MathCalculatorUI calculator_ui(std::move(remote));
+  calculator_ui.remote().set_disconnect_handler(base::BindOnce(&Fail));
 
   calculator_ui.Add(2.0, base::DoNothing());
-  calculator_ui.GetInterfacePtr().FlushForTesting();
+  calculator_ui.remote().FlushForTesting();
   EXPECT_EQ(2.0, calculator_ui.GetOutput());
 
   calculator_ui.Multiply(5.0, base::DoNothing());
-  calculator_ui.GetInterfacePtr().FlushForTesting();
+  calculator_ui.remote().FlushForTesting();
 
   EXPECT_EQ(10.0, calculator_ui.GetOutput());
 }
 
-TEST_P(InterfacePtrTest, FlushAsyncForTesting) {
-  math::CalculatorPtr calc;
-  MathCalculatorImpl calc_impl(MakeRequest(&calc));
-  calc.set_connection_error_handler(base::BindOnce(&Fail));
+TEST_P(RemoteTest, FlushAsyncForTesting) {
+  PendingRemote<math::Calculator> remote;
+  MathCalculatorImpl calc_impl(remote.InitWithNewPipeAndPassReceiver());
 
-  MathCalculatorUI calculator_ui(std::move(calc));
+  MathCalculatorUI calculator_ui(std::move(remote));
+  calculator_ui.remote().set_disconnect_handler(base::BindOnce(&Fail));
 
   calculator_ui.Add(2.0, base::DoNothing());
   base::RunLoop run_loop;
-  calculator_ui.GetInterfacePtr().FlushAsyncForTesting(run_loop.QuitClosure());
+  calculator_ui.remote().FlushAsyncForTesting(run_loop.QuitClosure());
   run_loop.Run();
   EXPECT_EQ(2.0, calculator_ui.GetOutput());
 
   calculator_ui.Multiply(5.0, base::DoNothing());
   base::RunLoop run_loop2;
-  calculator_ui.GetInterfacePtr().FlushAsyncForTesting(run_loop2.QuitClosure());
+  calculator_ui.remote().FlushAsyncForTesting(run_loop2.QuitClosure());
   run_loop2.Run();
 
   EXPECT_EQ(10.0, calculator_ui.GetOutput());
 }
 
-void SetBool(bool* value) {
-  *value = true;
-}
-
-TEST_P(InterfacePtrTest, FlushForTestingWithClosedPeer) {
-  math::CalculatorPtr calc;
-  MakeRequest(&calc);
+TEST_P(RemoteTest, FlushForTestingWithClosedPeer) {
+  Remote<math::Calculator> calc;
+  ignore_result(calc.BindNewPipeAndPassReceiver());
   bool called = false;
-  calc.set_connection_error_handler(base::Bind(&SetBool, &called));
+  calc.set_disconnect_handler(
+      base::BindLambdaForTesting([&] { called = true; }));
   calc.FlushForTesting();
   EXPECT_TRUE(called);
   calc.FlushForTesting();
 }
 
-TEST_P(InterfacePtrTest, FlushAsyncForTestingWithClosedPeer) {
-  math::CalculatorPtr calc;
-  MakeRequest(&calc);
+TEST_P(RemoteTest, FlushAsyncForTestingWithClosedPeer) {
+  Remote<math::Calculator> calc;
+  ignore_result(calc.BindNewPipeAndPassReceiver());
   bool called = false;
-  calc.set_connection_error_handler(base::BindOnce(&SetBool, &called));
+  calc.set_disconnect_handler(
+      base::BindLambdaForTesting([&] { called = true; }));
   base::RunLoop run_loop;
   calc.FlushAsyncForTesting(run_loop.QuitClosure());
   run_loop.Run();
@@ -805,178 +789,147 @@
   run_loop2.Run();
 }
 
-TEST_P(InterfacePtrTest, ConnectionErrorWithReason) {
-  math::CalculatorPtr calc;
-  MathCalculatorImpl calc_impl(MakeRequest(&calc));
+TEST_P(RemoteTest, DisconnectWithReason) {
+  Remote<math::Calculator> calc;
+  MathCalculatorImpl calc_impl(calc.BindNewPipeAndPassReceiver());
 
   base::RunLoop run_loop;
-  calc.set_connection_error_with_reason_handler(base::Bind(
-      [](const base::Closure& quit_closure, uint32_t custom_reason,
-         const std::string& description) {
+  calc.set_disconnect_with_reason_handler(base::BindLambdaForTesting(
+      [&](uint32_t custom_reason, const std::string& description) {
         EXPECT_EQ(42u, custom_reason);
         EXPECT_EQ("hey", description);
-        quit_closure.Run();
-      },
-      run_loop.QuitClosure()));
+        run_loop.Quit();
+      }));
 
-  calc_impl.binding()->CloseWithReason(42u, "hey");
+  calc_impl.receiver().ResetWithReason(42u, "hey");
 
   run_loop.Run();
 }
 
-TEST_P(InterfacePtrTest, InterfaceRequestResetWithReason) {
-  math::CalculatorPtr calc;
-  auto request = MakeRequest(&calc);
+TEST_P(RemoteTest, PendingReceiverResetWithReason) {
+  Remote<math::Calculator> calc;
+  auto pending_receiver = calc.BindNewPipeAndPassReceiver();
 
   base::RunLoop run_loop;
-  calc.set_connection_error_with_reason_handler(base::Bind(
-      [](const base::Closure& quit_closure, uint32_t custom_reason,
-         const std::string& description) {
+  calc.set_disconnect_with_reason_handler(base::BindLambdaForTesting(
+      [&](uint32_t custom_reason, const std::string& description) {
         EXPECT_EQ(88u, custom_reason);
         EXPECT_EQ("greetings", description);
-        quit_closure.Run();
-      },
-      run_loop.QuitClosure()));
+        run_loop.Quit();
+      }));
 
-  request.ResetWithReason(88u, "greetings");
+  pending_receiver.ResetWithReason(88u, "greetings");
 
   run_loop.Run();
 }
 
-TEST_P(InterfacePtrTest, CallbackIsPassedInterfacePtr) {
-  sample::PingTestPtr ptr;
-  auto request = mojo::MakeRequest(&ptr);
+TEST_P(RemoteTest, CallbackIsPassedRemote) {
+  Remote<sample::PingTest> remote;
+  auto pending_receiver = remote.BindNewPipeAndPassReceiver();
 
   base::RunLoop run_loop;
 
   // Make a call with the proxy's lifetime bound to the response callback.
-  sample::PingTest* raw_proxy = ptr.get();
-  ptr.set_connection_error_handler(run_loop.QuitClosure());
-  raw_proxy->Ping(base::Bind(base::DoNothing::Repeatedly<sample::PingTestPtr>(),
-                             base::Passed(&ptr)));
+  sample::PingTest* raw_proxy = remote.get();
+  remote.set_disconnect_handler(run_loop.QuitClosure());
+  raw_proxy->Ping(
+      base::BindOnce([](Remote<sample::PingTest>) {}, std::move(remote)));
 
-  // Trigger an error on |ptr|. This will ultimately lead to the proxy's
+  // Signal disconnection on |remote|. This will ultimately lead to the proxy's
   // response callbacks being destroyed, which will in turn lead to the proxy
   // being destroyed. This should not crash.
-  request.PassMessagePipe();
+  pending_receiver.reset();
   run_loop.Run();
 }
 
-TEST_P(InterfacePtrTest, ConnectionErrorHandlerOwnsInterfacePtr) {
-  sample::PingTestPtr* ptr = new sample::PingTestPtr;
-  auto request = mojo::MakeRequest(ptr);
+TEST_P(RemoteTest, DisconnectHandlerOwnsRemote) {
+  Remote<sample::PingTest>* remote = new Remote<sample::PingTest>;
+  auto pending_receiver = remote->BindNewPipeAndPassReceiver();
 
   base::RunLoop run_loop;
 
-  // Make a call with |ptr|'s lifetime bound to the connection error handler
-  // callback.
-  ptr->set_connection_error_handler(base::Bind(
-      [](const base::Closure& quit, sample::PingTestPtr* ptr) {
-        ptr->reset();
-        quit.Run();
+  // Make a call with |remote|'s lifetime bound to the disconnect handler.
+  remote->set_disconnect_handler(base::BindOnce(
+      [](base::OnceClosure quit, Remote<sample::PingTest>* owned_remote) {
+        owned_remote->reset();
+        std::move(quit).Run();
       },
-      run_loop.QuitClosure(), base::Owned(ptr)));
+      run_loop.QuitClosure(), base::Owned(remote)));
 
-  // Trigger an error on |ptr|. In the error handler |ptr| is reset. This
-  // shouldn't immediately destroy the callback (and |ptr| that it owns), before
-  // the callback is completed.
-  request.PassMessagePipe();
+  // Signal disconnection on |remote|. In the disconnect handler |remote| is
+  // reset. This shouldn't immediately destroy the callback (and |remote| that
+  // it owns), before the callback is completed.
+  pending_receiver.reset();
   run_loop.Run();
 }
 
-TEST_P(InterfacePtrTest, ThreadSafeInterfacePointer) {
-  math::CalculatorPtr ptr;
-  MathCalculatorImpl calc_impl(MakeRequest(&ptr));
-  scoped_refptr<math::ThreadSafeCalculatorPtr> thread_safe_ptr =
-      math::ThreadSafeCalculatorPtr::Create(std::move(ptr));
+TEST_P(RemoteTest, SharedRemote) {
+  PendingRemote<math::Calculator> pending_remote;
+  MathCalculatorImpl calc_impl(pending_remote.InitWithNewPipeAndPassReceiver());
+  SharedRemote<math::Calculator> shared_remote(std::move(pending_remote));
 
   base::RunLoop run_loop;
+  base::OnceClosure quit_closure = run_loop.QuitClosure();
 
-  auto run_method = base::Bind(
-      [](const scoped_refptr<base::TaskRunner>& main_task_runner,
-         const base::Closure& quit_closure,
-         const scoped_refptr<math::ThreadSafeCalculatorPtr>& thread_safe_ptr) {
-        auto calc_callback = base::Bind(
-            [](const scoped_refptr<base::TaskRunner>& main_task_runner,
-               const base::Closure& quit_closure,
-               scoped_refptr<base::SequencedTaskRunner> sender_sequence_runner,
-               double result) {
+  // Send a message on |thread_safe_remote| from a different sequence.
+  auto main_task_runner = base::SequencedTaskRunnerHandle::Get();
+  auto sender_task_runner = base::CreateSequencedTaskRunnerWithTraits({});
+  sender_task_runner->PostTask(
+      FROM_HERE, base::BindLambdaForTesting([&] {
+        shared_remote->Add(
+            123, base::BindLambdaForTesting([&](double result) {
               EXPECT_EQ(123, result);
               // Validate the callback is invoked on the calling sequence.
-              EXPECT_TRUE(sender_sequence_runner->RunsTasksInCurrentSequence());
-              // Notify the run_loop to quit.
-              main_task_runner->PostTask(FROM_HERE, quit_closure);
-            });
-        scoped_refptr<base::SequencedTaskRunner> current_sequence_runner =
-            base::SequencedTaskRunnerHandle::Get();
-        (*thread_safe_ptr)
-            ->Add(123, base::Bind(calc_callback, main_task_runner, quit_closure,
-                                  current_sequence_runner));
-      },
-      base::SequencedTaskRunnerHandle::Get(), run_loop.QuitClosure(),
-      thread_safe_ptr);
-  base::CreateSequencedTaskRunnerWithTraits({})->PostTask(FROM_HERE,
-                                                          run_method);
+              EXPECT_TRUE(sender_task_runner->RunsTasksInCurrentSequence());
+              main_task_runner->PostTask(FROM_HERE, std::move(quit_closure));
+            }));
+      }));
 
-  // Block until the method callback is called on the background thread.
   run_loop.Run();
 }
 
-TEST_P(InterfacePtrTest, ThreadSafeInterfacePointerWithTaskRunner) {
+TEST_P(RemoteTest, SharedRemoteWithTaskRunner) {
   const scoped_refptr<base::SequencedTaskRunner> other_thread_task_runner =
       base::CreateSequencedTaskRunnerWithTraits({});
 
-  math::CalculatorPtr ptr;
-  auto request = mojo::MakeRequest(&ptr);
+  PendingRemote<math::Calculator> remote;
+  auto receiver = remote.InitWithNewPipeAndPassReceiver();
 
-  // Create a ThreadSafeInterfacePtr that we'll bind from a different thread.
-  scoped_refptr<math::ThreadSafeCalculatorPtr> thread_safe_ptr =
-      math::ThreadSafeCalculatorPtr::Create(ptr.PassInterface(),
-                                            other_thread_task_runner);
-  ASSERT_TRUE(thread_safe_ptr);
+  // Create a ThreadSafeRemote that we'll bind from a different thread.
+  SharedRemote<math::Calculator> shared_remote(std::move(remote),
+                                               other_thread_task_runner);
+  ASSERT_TRUE(shared_remote);
 
   MathCalculatorImpl* math_calc_impl = nullptr;
   {
     base::RunLoop run_loop;
-    auto run_method = base::Bind(
-        [](const scoped_refptr<base::TaskRunner>& main_task_runner,
-           const base::Closure& quit_closure,
-           const scoped_refptr<math::ThreadSafeCalculatorPtr>& thread_safe_ptr,
-           math::CalculatorRequest request,
-           MathCalculatorImpl** math_calc_impl) {
-          math::CalculatorPtr ptr;
-          // In real life, the implementation would have a legitimate owner.
-          *math_calc_impl = new MathCalculatorImpl(std::move(request));
-          main_task_runner->PostTask(FROM_HERE, quit_closure);
-        },
-        base::SequencedTaskRunnerHandle::Get(), run_loop.QuitClosure(),
-        thread_safe_ptr, base::Passed(&request), &math_calc_impl);
-    other_thread_task_runner->PostTask(FROM_HERE, run_method);
+    auto quit_closure = run_loop.QuitClosure();
+    other_thread_task_runner->PostTask(
+        FROM_HERE, base::BindLambdaForTesting([&] {
+          math_calc_impl = new MathCalculatorImpl(std::move(receiver));
+          std::move(quit_closure).Run();
+        }));
     run_loop.Run();
   }
 
   {
-    // The interface ptr is bound, we can call methods on it.
-    auto calc_callback =
-        base::Bind([](const base::Closure& quit_closure, double result) {
-          EXPECT_EQ(123, result);
-          quit_closure.Run();
-        });
     base::RunLoop run_loop;
-    (*thread_safe_ptr)
-        ->Add(123, base::Bind(calc_callback, run_loop.QuitClosure()));
-    // Block until the method callback is called.
+    shared_remote->Add(123, base::BindLambdaForTesting([&](double result) {
+                         EXPECT_EQ(123, result);
+                         run_loop.Quit();
+                       }));
     run_loop.Run();
   }
 
   other_thread_task_runner->DeleteSoon(FROM_HERE, math_calc_impl);
 
-  // Reset the pointer now so the InterfacePtr associated resources can be
-  // deleted before the background thread's message loop is invalidated.
-  thread_safe_ptr = nullptr;
+  // Reset the SharedRemote now so the background thread state tied to its
+  // internal Remote can be deleted before the background thread itself is
+  // cleaned up.
+  shared_remote.reset();
 }
 
-INSTANTIATE_MOJO_BINDINGS_TEST_SUITE_P(InterfacePtrTest);
+INSTANTIATE_MOJO_BINDINGS_TEST_SUITE_P(RemoteTest);
 
 }  // namespace
 }  // namespace test
diff --git a/mojo/public/cpp/bindings/tests/report_bad_message_unittest.cc b/mojo/public/cpp/bindings/tests/report_bad_message_unittest.cc
index bb48ab9..1394c86 100644
--- a/mojo/public/cpp/bindings/tests/report_bad_message_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/report_bad_message_unittest.cc
@@ -6,9 +6,11 @@
 #include "base/callback.h"
 #include "base/macros.h"
 #include "base/run_loop.h"
+#include "base/test/bind_test_util.h"
 #include "mojo/core/embedder/embedder.h"
-#include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/bindings/message.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/bindings/tests/bindings_test_base.h"
 #include "mojo/public/interfaces/bindings/tests/test_bad_messages.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -19,11 +21,11 @@
 
 class TestBadMessagesImpl : public TestBadMessages {
  public:
-  TestBadMessagesImpl() : binding_(this) {}
-  ~TestBadMessagesImpl() override {}
+  TestBadMessagesImpl() = default;
+  ~TestBadMessagesImpl() override = default;
 
-  void BindImpl(TestBadMessagesRequest request) {
-    binding_.Bind(std::move(request));
+  void Bind(PendingReceiver<TestBadMessages> receiver) {
+    receiver_.Bind(std::move(receiver));
   }
 
   ReportBadMessageCallback& bad_message_callback() {
@@ -51,20 +53,20 @@
   }
 
   ReportBadMessageCallback bad_message_callback_;
-  mojo::Binding<TestBadMessages> binding_;
+  mojo::Receiver<TestBadMessages> receiver_{this};
 
   DISALLOW_COPY_AND_ASSIGN(TestBadMessagesImpl);
 };
 
 class ReportBadMessageTest : public BindingsTestBase {
  public:
-  ReportBadMessageTest() {}
+  ReportBadMessageTest() = default;
 
   void SetUp() override {
     mojo::core::SetDefaultProcessErrorCallback(base::Bind(
         &ReportBadMessageTest::OnProcessError, base::Unretained(this)));
 
-    impl_.BindImpl(MakeRequest(&proxy_));
+    impl_.Bind(remote_.BindNewPipeAndPassReceiver());
   }
 
   void TearDown() override {
@@ -72,40 +74,40 @@
         mojo::core::ProcessErrorCallback());
   }
 
-  TestBadMessages* proxy() { return proxy_.get(); }
+  TestBadMessages* remote() { return remote_.get(); }
 
   TestBadMessagesImpl* impl() { return &impl_; }
 
-  void SetErrorHandler(const base::Closure& handler) {
-    error_handler_ = handler;
+  void SetErrorHandler(base::OnceClosure handler) {
+    error_handler_ = std::move(handler);
   }
 
  private:
   void OnProcessError(const std::string& error) {
-    if (!error_handler_.is_null())
-      error_handler_.Run();
+    if (error_handler_)
+      std::move(error_handler_).Run();
   }
 
-  TestBadMessagesPtr proxy_;
+  Remote<TestBadMessages> remote_;
   TestBadMessagesImpl impl_;
-  base::Closure error_handler_;
+  base::OnceClosure error_handler_;
 };
 
 TEST_P(ReportBadMessageTest, Request) {
   // Verify that basic immediate error reporting works.
   bool error = false;
-  SetErrorHandler(base::Bind([] (bool* flag) { *flag = true; }, &error));
-  EXPECT_TRUE(proxy()->RejectSync());
+  SetErrorHandler(base::BindLambdaForTesting([&] { error = true; }));
+  EXPECT_TRUE(remote()->RejectSync());
   EXPECT_TRUE(error);
 }
 
 TEST_P(ReportBadMessageTest, RequestAsync) {
   bool error = false;
-  SetErrorHandler(base::Bind([] (bool* flag) { *flag = true; }, &error));
+  SetErrorHandler(base::BindLambdaForTesting([&] { error = true; }));
 
   // This should capture a bad message reporting callback in the impl.
   base::RunLoop loop;
-  proxy()->RejectEventually(loop.QuitClosure());
+  remote()->RejectEventually(loop.QuitClosure());
   loop.Run();
 
   EXPECT_FALSE(error);
@@ -118,17 +120,15 @@
 
 TEST_P(ReportBadMessageTest, Response) {
   bool error = false;
-  SetErrorHandler(base::Bind([] (bool* flag) { *flag = true; }, &error));
+  SetErrorHandler(base::BindLambdaForTesting([&] { error = true; }));
 
   base::RunLoop loop;
-  proxy()->RequestResponse(
-      base::Bind([] (const base::Closure& quit) {
-        // Report a bad message inside the response callback. This should
-        // trigger the error handler.
-        ReportBadMessage("no way!");
-        quit.Run();
-      },
-      loop.QuitClosure()));
+  remote()->RequestResponse(base::BindLambdaForTesting([&] {
+    // Report a bad message inside the response callback. This should
+    // trigger the error handler.
+    ReportBadMessage("no way!");
+    loop.Quit();
+  }));
   loop.Run();
 
   EXPECT_TRUE(error);
@@ -136,18 +136,15 @@
 
 TEST_P(ReportBadMessageTest, ResponseAsync) {
   bool error = false;
-  SetErrorHandler(base::Bind([] (bool* flag) { *flag = true; }, &error));
+  SetErrorHandler(base::BindLambdaForTesting([&] { error = true; }));
 
   ReportBadMessageCallback bad_message_callback;
   base::RunLoop loop;
-  proxy()->RequestResponse(
-      base::Bind([] (const base::Closure& quit,
-                     ReportBadMessageCallback* callback) {
-        // Capture the bad message callback inside the response callback.
-        *callback = GetBadMessageCallback();
-        quit.Run();
-      },
-      loop.QuitClosure(), &bad_message_callback));
+  remote()->RequestResponse(base::BindLambdaForTesting([&] {
+    // Capture the bad message callback inside the response callback.
+    bad_message_callback = GetBadMessageCallback();
+    loop.Quit();
+  }));
   loop.Run();
 
   EXPECT_FALSE(error);
@@ -161,10 +158,10 @@
 
 TEST_P(ReportBadMessageTest, ResponseSync) {
   bool error = false;
-  SetErrorHandler(base::Bind([] (bool* flag) { *flag = true; }, &error));
+  SetErrorHandler(base::BindLambdaForTesting([&] { error = true; }));
 
   SyncMessageResponseContext context;
-  proxy()->RequestResponseSync();
+  remote()->RequestResponseSync();
 
   EXPECT_FALSE(error);
   context.ReportBadMessage("i don't like this response");
@@ -173,12 +170,12 @@
 
 TEST_P(ReportBadMessageTest, ResponseSyncDeferred) {
   bool error = false;
-  SetErrorHandler(base::Bind([] (bool* flag) { *flag = true; }, &error));
+  SetErrorHandler(base::BindLambdaForTesting([&] { error = true; }));
 
   ReportBadMessageCallback bad_message_callback;
   {
     SyncMessageResponseContext context;
-    proxy()->RequestResponseSync();
+    remote()->RequestResponseSync();
     bad_message_callback = context.GetBadMessageCallback();
   }
 
diff --git a/mojo/public/cpp/bindings/tests/request_response_unittest.cc b/mojo/public/cpp/bindings/tests/request_response_unittest.cc
index 1369804..50cf63f 100644
--- a/mojo/public/cpp/bindings/tests/request_response_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/request_response_unittest.cc
@@ -7,7 +7,9 @@
 
 #include "base/bind.h"
 #include "base/run_loop.h"
-#include "mojo/public/cpp/bindings/binding.h"
+#include "base/test/bind_test_util.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/bindings/tests/bindings_test_base.h"
 #include "mojo/public/cpp/test_support/test_utils.h"
 #include "mojo/public/interfaces/bindings/tests/sample_import.mojom.h"
@@ -20,8 +22,8 @@
 
 class ProviderImpl : public sample::Provider {
  public:
-  explicit ProviderImpl(InterfaceRequest<sample::Provider> request)
-      : binding_(this, std::move(request)) {}
+  explicit ProviderImpl(PendingReceiver<sample::Provider> receiver)
+      : receiver_(this, std::move(receiver)) {}
 
   void EchoString(const std::string& a, EchoStringCallback callback) override {
     std::move(callback).Run(a);
@@ -46,103 +48,76 @@
     std::move(callback).Run(a);
   }
 
-  Binding<sample::Provider> binding_;
+ private:
+  Receiver<sample::Provider> receiver_;
 };
 
-void RecordString(std::string* storage,
-                  const base::Closure& closure,
-                  const std::string& str) {
-  *storage = str;
-  closure.Run();
-}
-
-void RecordStrings(std::string* storage,
-                   const base::Closure& closure,
-                   const std::string& a,
-                   const std::string& b) {
-  *storage = a + b;
-  closure.Run();
-}
-
-void WriteToMessagePipe(const char* text,
-                        const base::Closure& closure,
-                        ScopedMessagePipeHandle handle) {
-  WriteTextMessage(handle.get(), text);
-  closure.Run();
-}
-
-void RecordEnum(sample::Enum* storage,
-                const base::Closure& closure,
-                sample::Enum value) {
-  *storage = value;
-  closure.Run();
-}
-
-class RequestResponseTest : public BindingsTestBase {
- public:
-  RequestResponseTest() {}
-  ~RequestResponseTest() override { base::RunLoop().RunUntilIdle(); }
-
-  void PumpMessages() { base::RunLoop().RunUntilIdle(); }
-};
+using RequestResponseTest = BindingsTestBase;
 
 TEST_P(RequestResponseTest, EchoString) {
-  sample::ProviderPtr provider;
-  ProviderImpl provider_impl(MakeRequest(&provider));
+  Remote<sample::Provider> provider;
+  ProviderImpl provider_impl(provider.BindNewPipeAndPassReceiver());
 
-  std::string buf;
   base::RunLoop run_loop;
-  provider->EchoString("hello",
-                       base::Bind(&RecordString, &buf, run_loop.QuitClosure()));
-
+  constexpr const char kTestMessage[] = "hello";
+  provider->EchoString(kTestMessage, base::BindLambdaForTesting(
+                                         [&](const std::string& response) {
+                                           EXPECT_EQ(kTestMessage, response);
+                                           run_loop.Quit();
+                                         }));
   run_loop.Run();
-
-  EXPECT_EQ(std::string("hello"), buf);
 }
 
 TEST_P(RequestResponseTest, EchoStrings) {
-  sample::ProviderPtr provider;
-  ProviderImpl provider_impl(MakeRequest(&provider));
+  Remote<sample::Provider> provider;
+  ProviderImpl provider_impl(provider.BindNewPipeAndPassReceiver());
 
   std::string buf;
   base::RunLoop run_loop;
-  provider->EchoStrings("hello", " world", base::Bind(&RecordStrings, &buf,
-                                                      run_loop.QuitClosure()));
-
+  constexpr const char kTestMessage1[] = "hello";
+  constexpr const char kTestMessage2[] = "hello";
+  provider->EchoStrings(
+      kTestMessage1, kTestMessage2,
+      base::BindLambdaForTesting(
+          [&](const std::string& response1, const std::string& response2) {
+            EXPECT_EQ(kTestMessage1, response1);
+            EXPECT_EQ(kTestMessage2, response2);
+            run_loop.Quit();
+          }));
   run_loop.Run();
-
-  EXPECT_EQ(std::string("hello world"), buf);
 }
 
 TEST_P(RequestResponseTest, EchoMessagePipeHandle) {
-  sample::ProviderPtr provider;
-  ProviderImpl provider_impl(MakeRequest(&provider));
+  Remote<sample::Provider> provider;
+  ProviderImpl provider_impl(provider.BindNewPipeAndPassReceiver());
 
-  MessagePipe pipe2;
+  MessagePipe pipe;
   base::RunLoop run_loop;
+  constexpr const char kTestMessage[] = "hello";
   provider->EchoMessagePipeHandle(
-      std::move(pipe2.handle1),
-      base::Bind(&WriteToMessagePipe, "hello", run_loop.QuitClosure()));
+      std::move(pipe.handle1),
+      base::BindLambdaForTesting([&](ScopedMessagePipeHandle handle) {
+        WriteTextMessage(handle.get(), kTestMessage);
 
+        std::string value;
+        ReadTextMessage(pipe.handle0.get(), &value);
+        EXPECT_EQ(kTestMessage, value);
+        run_loop.Quit();
+      }));
   run_loop.Run();
-
-  std::string value;
-  ReadTextMessage(pipe2.handle0.get(), &value);
-
-  EXPECT_EQ(std::string("hello"), value);
 }
 
 TEST_P(RequestResponseTest, EchoEnum) {
-  sample::ProviderPtr provider;
-  ProviderImpl provider_impl(MakeRequest(&provider));
+  Remote<sample::Provider> provider;
+  ProviderImpl provider_impl(provider.BindNewPipeAndPassReceiver());
 
-  sample::Enum value;
   base::RunLoop run_loop;
   provider->EchoEnum(sample::Enum::VALUE,
-                     base::Bind(&RecordEnum, &value, run_loop.QuitClosure()));
+                     base::BindLambdaForTesting([&](sample::Enum value) {
+                       EXPECT_EQ(sample::Enum::VALUE, value);
+                       run_loop.Quit();
+                     }));
   run_loop.Run();
-
-  EXPECT_EQ(sample::Enum::VALUE, value);
 }
 
 INSTANTIATE_MOJO_BINDINGS_TEST_SUITE_P(RequestResponseTest);
diff --git a/mojo/public/cpp/bindings/tests/sample_service_unittest.cc b/mojo/public/cpp/bindings/tests/sample_service_unittest.cc
index d6eb097..94c44a57 100644
--- a/mojo/public/cpp/bindings/tests/sample_service_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/sample_service_unittest.cc
@@ -9,6 +9,10 @@
 #include <string>
 #include <utility>
 
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/bindings/tests/bindings_test_base.h"
 #include "mojo/public/interfaces/bindings/tests/sample_service.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -247,7 +251,7 @@
  public:
   void Frobinate(FooPtr foo,
                  BazOptions baz,
-                 PortPtr port,
+                 mojo::PendingRemote<Port> pending_port,
                  Service::FrobinateCallback callback) override {
     // Users code goes here to handle the incoming Frobinate message.
 
@@ -257,6 +261,7 @@
       CheckFoo(*foo);
     EXPECT_EQ(BazOptions::EXTRA, baz);
 
+    mojo::Remote<Port> port(std::move(pending_port));
     if (g_dump_message_as_text) {
       // Also dump the Foo structure and all of its members.
       std::cout << "Frobinate:" << std::endl;
@@ -268,7 +273,7 @@
     std::move(callback).Run(5);
   }
 
-  void GetPort(mojo::InterfaceRequest<Port> port_request) override {}
+  void GetPort(mojo::PendingReceiver<Port> receiver) override {}
 };
 
 class ServiceProxyImpl : public ServiceProxy {
@@ -322,9 +327,8 @@
   FooPtr foo = MakeFoo();
   CheckFoo(*foo);
 
-  PortPtr port;
   service->Frobinate(std::move(foo), Service::BazOptions::EXTRA,
-                     std::move(port), Service::FrobinateCallback());
+                     mojo::NullRemote(), Service::FrobinateCallback());
 
   delete service;
 }
diff --git a/mojo/public/cpp/bindings/tests/struct_traits_unittest.cc b/mojo/public/cpp/bindings/tests/struct_traits_unittest.cc
index 66c62fe..e01441fa 100644
--- a/mojo/public/cpp/bindings/tests/struct_traits_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/struct_traits_unittest.cc
@@ -8,8 +8,9 @@
 #include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
-#include "mojo/public/cpp/bindings/interface_request.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver_set.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/bindings/tests/rect_blink.h"
 #include "mojo/public/cpp/bindings/tests/rect_chromium.h"
 #include "mojo/public/cpp/bindings/tests/struct_with_traits_impl.h"
@@ -53,8 +54,8 @@
 }
 
 template <typename T>
-void ExpectError(InterfacePtr<T> *proxy, const base::Closure& callback) {
-  proxy->set_connection_error_handler(callback);
+void ExpectError(Remote<T>* proxy, base::OnceClosure callback) {
+  proxy->set_disconnect_handler(std::move(callback));
 }
 
 // This implements the generated Chromium variant of RectService.
@@ -113,30 +114,30 @@
 class StructTraitsTest : public testing::Test,
                          public TraitsTestService {
  public:
-  StructTraitsTest() {}
+  StructTraitsTest() = default;
 
  protected:
-  void BindToChromiumService(RectServiceRequest request) {
-    chromium_bindings_.AddBinding(&chromium_service_, std::move(request));
+  void BindToChromiumService(PendingReceiver<RectService> receiver) {
+    chromium_receivers_.Add(&chromium_service_, std::move(receiver));
   }
-  void BindToChromiumService(blink::RectServiceRequest request) {
-    chromium_bindings_.AddBinding(
+  void BindToChromiumService(PendingReceiver<blink::RectService> receiver) {
+    chromium_receivers_.Add(
         &chromium_service_,
-        ConvertInterfaceRequest<RectService>(std::move(request)));
+        ConvertPendingReceiver<RectService>(std::move(receiver)));
   }
 
-  void BindToBlinkService(blink::RectServiceRequest request) {
-    blink_bindings_.AddBinding(&blink_service_, std::move(request));
+  void BindToBlinkService(PendingReceiver<blink::RectService> receiver) {
+    blink_receivers_.Add(&blink_service_, std::move(receiver));
   }
-  void BindToBlinkService(RectServiceRequest request) {
-    blink_bindings_.AddBinding(
+  void BindToBlinkService(PendingReceiver<RectService> receiver) {
+    blink_receivers_.Add(
         &blink_service_,
-        ConvertInterfaceRequest<blink::RectService>(std::move(request)));
+        ConvertPendingReceiver<blink::RectService>(std::move(receiver)));
   }
 
-  TraitsTestServicePtr GetTraitsTestProxy() {
-    TraitsTestServicePtr proxy;
-    traits_test_bindings_.AddBinding(this, mojo::MakeRequest(&proxy));
+  Remote<TraitsTestService> GetTraitsTestProxy() {
+    Remote<TraitsTestService> proxy;
+    traits_test_receivers_.Add(this, proxy.BindNewPipeAndPassReceiver());
     return proxy;
   }
 
@@ -190,19 +191,19 @@
   base::MessageLoop loop_;
 
   ChromiumRectServiceImpl chromium_service_;
-  BindingSet<RectService> chromium_bindings_;
+  ReceiverSet<RectService> chromium_receivers_;
 
   BlinkRectServiceImpl blink_service_;
-  BindingSet<blink::RectService> blink_bindings_;
+  ReceiverSet<blink::RectService> blink_receivers_;
 
-  BindingSet<TraitsTestService> traits_test_bindings_;
+  ReceiverSet<TraitsTestService> traits_test_receivers_;
 };
 
 }  // namespace
 
 TEST_F(StructTraitsTest, ChromiumProxyToChromiumService) {
-  RectServicePtr chromium_proxy;
-  BindToChromiumService(MakeRequest(&chromium_proxy));
+  Remote<RectService> chromium_proxy;
+  BindToChromiumService(chromium_proxy.BindNewPipeAndPassReceiver());
   {
     base::RunLoop loop;
     chromium_proxy->AddRect(RectChromium(1, 1, 4, 5));
@@ -221,8 +222,8 @@
 }
 
 TEST_F(StructTraitsTest, ChromiumToBlinkService) {
-  RectServicePtr chromium_proxy;
-  BindToBlinkService(MakeRequest(&chromium_proxy));
+  Remote<RectService> chromium_proxy;
+  BindToBlinkService(chromium_proxy.BindNewPipeAndPassReceiver());
   {
     base::RunLoop loop;
     chromium_proxy->AddRect(RectChromium(1, 1, 4, 5));
@@ -251,8 +252,8 @@
 }
 
 TEST_F(StructTraitsTest, BlinkProxyToBlinkService) {
-  blink::RectServicePtr blink_proxy;
-  BindToBlinkService(MakeRequest(&blink_proxy));
+  Remote<blink::RectService> blink_proxy;
+  BindToBlinkService(blink_proxy.BindNewPipeAndPassReceiver());
   {
     base::RunLoop loop;
     blink_proxy->AddRect(RectBlink(1, 1, 4, 5));
@@ -271,8 +272,8 @@
 }
 
 TEST_F(StructTraitsTest, BlinkProxyToChromiumService) {
-  blink::RectServicePtr blink_proxy;
-  BindToChromiumService(MakeRequest(&blink_proxy));
+  Remote<blink::RectService> blink_proxy;
+  BindToChromiumService(blink_proxy.BindNewPipeAndPassReceiver());
   {
     base::RunLoop loop;
     blink_proxy->AddRect(RectBlink(1, 1, 4, 5));
@@ -323,11 +324,10 @@
   input.get_mutable_struct_map()["world"] = NestedStructWithTraitsImpl(2048);
 
   base::RunLoop loop;
-  TraitsTestServicePtr proxy = GetTraitsTestProxy();
+  Remote<TraitsTestService> proxy = GetTraitsTestProxy();
 
-  proxy->EchoStructWithTraits(
-      input,
-      base::Bind(&ExpectStructWithTraits, input, loop.QuitClosure()));
+  proxy->EchoStructWithTraits(input, base::BindOnce(&ExpectStructWithTraits,
+                                                    input, loop.QuitClosure()));
   loop.Run();
 }
 
@@ -352,11 +352,11 @@
   input.value = 42;
 
   base::RunLoop loop;
-  TraitsTestServicePtr proxy = GetTraitsTestProxy();
+  Remote<TraitsTestService> proxy = GetTraitsTestProxy();
 
   proxy->EchoTrivialStructWithTraits(
-      input,
-      base::Bind(&ExpectTrivialStructWithTraits, input, loop.QuitClosure()));
+      input, base::BindOnce(&ExpectTrivialStructWithTraits, input,
+                            loop.QuitClosure()));
   loop.Run();
 }
 
@@ -374,12 +374,12 @@
   input.get_mutable_handle().reset(mp.handle0.release());
 
   base::RunLoop loop;
-  TraitsTestServicePtr proxy = GetTraitsTestProxy();
+  Remote<TraitsTestService> proxy = GetTraitsTestProxy();
 
   ScopedMessagePipeHandle received;
   proxy->EchoMoveOnlyStructWithTraits(
       std::move(input),
-      base::Bind(&CaptureMessagePipe, &received, loop.QuitClosure()));
+      base::BindOnce(&CaptureMessagePipe, &received, loop.QuitClosure()));
   loop.Run();
 
   ASSERT_TRUE(received.is_valid());
@@ -411,12 +411,13 @@
 
 TEST_F(StructTraitsTest, EchoNullableMoveOnlyStructWithTraits) {
   base::RunLoop loop;
-  TraitsTestServicePtr proxy = GetTraitsTestProxy();
+  Remote<TraitsTestService> proxy = GetTraitsTestProxy();
 
   base::Optional<MoveOnlyStructWithTraitsImpl> received;
   proxy->EchoNullableMoveOnlyStructWithTraits(
-      base::nullopt, base::Bind(&CaptureNullableMoveOnlyStructWithTraitsImpl,
-                                &received, loop.QuitClosure()));
+      base::nullopt,
+      base::BindOnce(&CaptureNullableMoveOnlyStructWithTraitsImpl, &received,
+                     loop.QuitClosure()));
   loop.Run();
 
   EXPECT_FALSE(received);
@@ -431,12 +432,12 @@
 
 TEST_F(StructTraitsTest, EchoEnumWithTraits) {
   base::RunLoop loop;
-  TraitsTestServicePtr proxy = GetTraitsTestProxy();
+  Remote<TraitsTestService> proxy = GetTraitsTestProxy();
 
   proxy->EchoEnumWithTraits(
       EnumWithTraitsImpl::CUSTOM_VALUE_1,
-      base::Bind(&ExpectEnumWithTraits, EnumWithTraitsImpl::CUSTOM_VALUE_1,
-                 loop.QuitClosure()));
+      base::BindOnce(&ExpectEnumWithTraits, EnumWithTraitsImpl::CUSTOM_VALUE_1,
+                     loop.QuitClosure()));
   loop.Run();
 }
 
@@ -483,26 +484,27 @@
 }
 
 TEST_F(StructTraitsTest, TypemapUniquePtr) {
-  TraitsTestServicePtr proxy = GetTraitsTestProxy();
+  Remote<TraitsTestService> proxy = GetTraitsTestProxy();
 
   {
     base::RunLoop loop;
     proxy->EchoStructWithTraitsForUniquePtr(
         std::make_unique<int>(12345),
-        base::Bind(&ExpectUniquePtr, base::Passed(std::make_unique<int>(12345)),
-                   loop.QuitClosure()));
+        base::BindOnce(&ExpectUniquePtr,
+                       base::Passed(std::make_unique<int>(12345)),
+                       loop.QuitClosure()));
     loop.Run();
   }
   {
     base::RunLoop loop;
     proxy->EchoNullableStructWithTraitsForUniquePtr(
-        nullptr, base::Bind(&ExpectUniquePtr, nullptr, loop.QuitClosure()));
+        nullptr, base::BindOnce(&ExpectUniquePtr, nullptr, loop.QuitClosure()));
     loop.Run();
   }
 }
 
 TEST_F(StructTraitsTest, EchoUnionWithTraits) {
-  TraitsTestServicePtr proxy = GetTraitsTestProxy();
+  Remote<TraitsTestService> proxy = GetTraitsTestProxy();
 
   {
     std::unique_ptr<test::UnionWithTraitsBase> input(
@@ -510,7 +512,7 @@
     base::RunLoop loop;
     proxy->EchoUnionWithTraits(
         std::move(input),
-        base::Bind(
+        base::BindOnce(
             [](const base::Closure& quit_closure,
                std::unique_ptr<test::UnionWithTraitsBase> passed) {
               ASSERT_EQ(test::UnionWithTraitsBase::Type::INT32, passed->type());
@@ -518,7 +520,6 @@
                         static_cast<test::UnionWithTraitsInt32*>(passed.get())
                             ->value());
               quit_closure.Run();
-
             },
             loop.QuitClosure()));
     loop.Run();
@@ -530,7 +531,7 @@
     base::RunLoop loop;
     proxy->EchoUnionWithTraits(
         std::move(input),
-        base::Bind(
+        base::BindOnce(
             [](const base::Closure& quit_closure,
                std::unique_ptr<test::UnionWithTraitsBase> passed) {
               ASSERT_EQ(test::UnionWithTraitsBase::Type::STRUCT,
@@ -540,7 +541,6 @@
                             ->get_struct()
                             .value);
               quit_closure.Run();
-
             },
             loop.QuitClosure()));
     loop.Run();
diff --git a/mojo/public/cpp/bindings/tests/sync_method_unittest.cc b/mojo/public/cpp/bindings/tests/sync_method_unittest.cc
index fa9add0..7e7a47d 100644
--- a/mojo/public/cpp/bindings/tests/sync_method_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/sync_method_unittest.cc
@@ -135,11 +135,11 @@
   void AsyncEcho(int32_t value, AsyncEchoCallback callback) override {
     AsyncEchoImpl(value, std::move(callback));
   }
-  void SendInterface(TestSyncAssociatedPtrInfo ptr) override {
-    SendInterfaceImpl(std::move(ptr));
+  void SendRemote(PendingAssociatedRemote<TestSync> remote) override {
+    SendInterfaceImpl(std::move(remote));
   }
-  void SendRequest(TestSyncAssociatedRequest request) override {
-    SendRequestImpl(std::move(request));
+  void SendReceiver(PendingAssociatedReceiver<TestSync> receiver) override {
+    SendRequestImpl(std::move(receiver));
   }
 
   Binding<TestSyncMaster>* binding() { return &binding_; }
@@ -329,8 +329,8 @@
           run_loop.Quit();
         });
 
-    master_ptr_->SendInterface(std::move(opposite_asso_ptr_info_));
-    master_ptr_->SendRequest(std::move(asso_request_));
+    master_ptr_->SendRemote(std::move(opposite_asso_ptr_info_));
+    master_ptr_->SendReceiver(std::move(asso_request_));
     run_loop.Run();
   }
 
diff --git a/mojo/public/cpp/bindings/tests/test_helpers_unittest.cc b/mojo/public/cpp/bindings/tests/test_helpers_unittest.cc
index 9a69f74..8cbdaaf 100644
--- a/mojo/public/cpp/bindings/tests/test_helpers_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/test_helpers_unittest.cc
@@ -4,7 +4,8 @@
 
 #include "base/macros.h"
 #include "base/test/scoped_task_environment.h"
-#include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/system/message_pipe.h"
 #include "mojo/public/cpp/system/wait.h"
 #include "mojo/public/interfaces/bindings/tests/ping_service.mojom-test-utils.h"
@@ -27,8 +28,8 @@
 
 class PingImpl : public test::PingService {
  public:
-  explicit PingImpl(test::PingServiceRequest request)
-      : binding_(this, std::move(request)) {}
+  explicit PingImpl(PendingReceiver<test::PingService> receiver)
+      : receiver_(this, std::move(receiver)) {}
   ~PingImpl() override = default;
 
   bool pinged() const { return pinged_; }
@@ -41,15 +42,15 @@
 
  private:
   bool pinged_ = false;
-  Binding<test::PingService> binding_;
+  Receiver<test::PingService> receiver_;
 
   DISALLOW_COPY_AND_ASSIGN(PingImpl);
 };
 
 class EchoImpl : public test::EchoService {
  public:
-  explicit EchoImpl(test::EchoServiceRequest request)
-      : binding_(this, std::move(request)) {}
+  explicit EchoImpl(PendingReceiver<test::EchoService> receiver)
+      : receiver_(this, std::move(receiver)) {}
   ~EchoImpl() override = default;
 
   // test::EchoService:
@@ -58,15 +59,15 @@
   }
 
  private:
-  Binding<test::EchoService> binding_;
+  Receiver<test::EchoService> receiver_;
 
   DISALLOW_COPY_AND_ASSIGN(EchoImpl);
 };
 
 class TrampolineImpl : public test::HandleTrampoline {
  public:
-  explicit TrampolineImpl(test::HandleTrampolineRequest request)
-      : binding_(this, std::move(request)) {}
+  explicit TrampolineImpl(PendingReceiver<test::HandleTrampoline> receiver)
+      : receiver_(this, std::move(receiver)) {}
   ~TrampolineImpl() override = default;
 
   // test::HandleTrampoline:
@@ -82,22 +83,22 @@
   }
 
  private:
-  Binding<test::HandleTrampoline> binding_;
+  Receiver<test::HandleTrampoline> receiver_;
 
   DISALLOW_COPY_AND_ASSIGN(TrampolineImpl);
 };
 
 TEST_F(TestHelperTest, AsyncWaiter) {
-  test::PingServicePtr ping;
-  PingImpl ping_impl(MakeRequest(&ping));
+  Remote<test::PingService> ping;
+  PingImpl ping_impl(ping.BindNewPipeAndPassReceiver());
 
   test::PingServiceAsyncWaiter wait_for_ping(ping.get());
   EXPECT_FALSE(ping_impl.pinged());
   wait_for_ping.Ping();
   EXPECT_TRUE(ping_impl.pinged());
 
-  test::EchoServicePtr echo;
-  EchoImpl echo_impl(MakeRequest(&echo));
+  Remote<test::EchoService> echo;
+  EchoImpl echo_impl(echo.BindNewPipeAndPassReceiver());
 
   test::EchoServiceAsyncWaiter wait_for_echo(echo.get());
   const std::string kTestString = "a machine that goes 'ping'";
@@ -105,8 +106,8 @@
   wait_for_echo.Echo(kTestString, &response);
   EXPECT_EQ(kTestString, response);
 
-  test::HandleTrampolinePtr trampoline;
-  TrampolineImpl trampoline_impl(MakeRequest(&trampoline));
+  Remote<test::HandleTrampoline> trampoline;
+  TrampolineImpl trampoline_impl(trampoline.BindNewPipeAndPassReceiver());
 
   test::HandleTrampolineAsyncWaiter wait_for_trampoline(trampoline.get());
   MessagePipe pipe;
diff --git a/mojo/public/cpp/bindings/tests/union_unittest.cc b/mojo/public/cpp/bindings/tests/union_unittest.cc
index 86c8cf5..29889db 100644
--- a/mojo/public/cpp/bindings/tests/union_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/union_unittest.cc
@@ -11,13 +11,14 @@
 #include "base/containers/flat_map.h"
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
-#include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/bindings/lib/array_internal.h"
 #include "mojo/public/cpp/bindings/lib/fixed_buffer.h"
 #include "mojo/public/cpp/bindings/lib/serialization.h"
 #include "mojo/public/cpp/bindings/lib/validation_context.h"
 #include "mojo/public/cpp/bindings/lib/validation_errors.h"
 #include "mojo/public/cpp/bindings/message.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/test_support/test_utils.h"
 #include "mojo/public/interfaces/bindings/tests/test_structs.mojom.h"
 #include "mojo/public/interfaces/bindings/tests/test_unions.mojom.h"
@@ -1127,36 +1128,37 @@
 
 class SmallCacheImpl : public SmallCache {
  public:
-  explicit SmallCacheImpl(const base::Closure& closure)
-      : int_value_(0), closure_(closure) {}
-  ~SmallCacheImpl() override {}
+  explicit SmallCacheImpl(base::OnceClosure closure)
+      : int_value_(0), closure_(std::move(closure)) {}
+  ~SmallCacheImpl() override = default;
+
   int64_t int_value() const { return int_value_; }
 
  private:
   void SetIntValue(int64_t int_value) override {
     int_value_ = int_value;
-    closure_.Run();
+    std::move(closure_).Run();
   }
   void GetIntValue(GetIntValueCallback callback) override {
     std::move(callback).Run(int_value_);
   }
 
   int64_t int_value_;
-  base::Closure closure_;
+  base::OnceClosure closure_;
 };
 
 TEST(UnionTest, InterfaceInUnion) {
   base::MessageLoop message_loop;
   base::RunLoop run_loop;
   SmallCacheImpl impl(run_loop.QuitClosure());
-  SmallCachePtr ptr;
-  Binding<SmallCache> bindings(&impl, MakeRequest(&ptr));
+  Remote<SmallCache> remote;
+  Receiver<SmallCache> receiver(&impl, remote.BindNewPipeAndPassReceiver());
 
   HandleUnionPtr handle(HandleUnion::New());
-  handle->set_f_small_cache(ptr.PassInterface());
+  handle->set_f_small_cache(remote.Unbind());
 
-  ptr.Bind(std::move(handle->get_f_small_cache()));
-  ptr->SetIntValue(10);
+  remote.Bind(std::move(handle->get_f_small_cache()));
+  remote->SetIntValue(10);
   run_loop.Run();
   EXPECT_EQ(10, impl.int_value());
 }
@@ -1165,12 +1167,12 @@
   base::MessageLoop message_loop;
   base::RunLoop run_loop;
   SmallCacheImpl impl(run_loop.QuitClosure());
-  SmallCachePtr ptr;
-  Binding<SmallCache> bindings(&impl, MakeRequest(&ptr));
+  Remote<SmallCache> remote;
+  Receiver<SmallCache> receiver(&impl, remote.BindNewPipeAndPassReceiver());
 
-  HandleUnionPtr handle = HandleUnion::NewFSmallCache(ptr.PassInterface());
-  ptr.Bind(std::move(handle->get_f_small_cache()));
-  ptr->SetIntValue(10);
+  HandleUnionPtr handle = HandleUnion::NewFSmallCache(remote.Unbind());
+  remote.Bind(std::move(handle->get_f_small_cache()));
+  remote->SetIntValue(10);
   run_loop.Run();
   EXPECT_EQ(10, impl.int_value());
 }
@@ -1179,11 +1181,11 @@
   base::MessageLoop message_loop;
   base::RunLoop run_loop;
   SmallCacheImpl impl(run_loop.QuitClosure());
-  SmallCachePtr ptr;
-  Binding<SmallCache> bindings(&impl, MakeRequest(&ptr));
+  Remote<SmallCache> remote;
+  Receiver<SmallCache> receiver(&impl, remote.BindNewPipeAndPassReceiver());
 
   HandleUnionPtr handle(HandleUnion::New());
-  handle->set_f_small_cache(ptr.PassInterface());
+  handle->set_f_small_cache(remote.Unbind());
 
   mojo::Message message;
   mojo::internal::SerializationContext context;
@@ -1195,16 +1197,16 @@
   HandleUnionPtr handle2(HandleUnion::New());
   mojo::internal::Deserialize<HandleUnionDataView>(data, &handle2, &context);
 
-  ptr.Bind(std::move(handle2->get_f_small_cache()));
-  ptr->SetIntValue(10);
+  remote.Bind(std::move(handle2->get_f_small_cache()));
+  remote->SetIntValue(10);
   run_loop.Run();
   EXPECT_EQ(10, impl.int_value());
 }
 
 class UnionInterfaceImpl : public UnionInterface {
  public:
-  UnionInterfaceImpl() {}
-  ~UnionInterfaceImpl() override {}
+  UnionInterfaceImpl() = default;
+  ~UnionInterfaceImpl() override = default;
 
  private:
   void Echo(PodUnionPtr in, EchoCallback callback) override {
@@ -1212,20 +1214,18 @@
   }
 };
 
-void ExpectInt16(int16_t value, PodUnionPtr out) {
-  EXPECT_EQ(value, out->get_f_int16());
-}
-
 TEST(UnionTest, UnionInInterface) {
   base::MessageLoop message_loop;
   UnionInterfaceImpl impl;
-  UnionInterfacePtr ptr;
-  Binding<UnionInterface> bindings(&impl, MakeRequest(&ptr));
+  Remote<UnionInterface> remote;
+  Receiver<UnionInterface> receiver(&impl, remote.BindNewPipeAndPassReceiver());
 
   PodUnionPtr pod(PodUnion::New());
   pod->set_f_int16(16);
 
-  ptr->Echo(std::move(pod), base::Bind(&ExpectInt16, 16));
+  remote->Echo(std::move(pod), base::BindOnce([](PodUnionPtr out) {
+                 EXPECT_EQ(16, out->get_f_int16());
+               }));
   base::RunLoop().RunUntilIdle();
 }
 
diff --git a/mojo/public/cpp/bindings/tests/validation_unittest.cc b/mojo/public/cpp/bindings/tests/validation_unittest.cc
index d1d6c99..86da0ab 100644
--- a/mojo/public/cpp/bindings/tests/validation_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/validation_unittest.cc
@@ -16,13 +16,13 @@
 #include "base/run_loop.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "mojo/public/c/system/macros.h"
-#include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/bindings/connector.h"
 #include "mojo/public/cpp/bindings/filter_chain.h"
-#include "mojo/public/cpp/bindings/interface_ptr.h"
 #include "mojo/public/cpp/bindings/lib/validation_errors.h"
 #include "mojo/public/cpp/bindings/message.h"
 #include "mojo/public/cpp/bindings/message_header_validator.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/bindings/tests/validation_test_input_parser.h"
 #include "mojo/public/cpp/system/core.h"
 #include "mojo/public/cpp/system/message.h"
@@ -443,28 +443,29 @@
   RunValidationTests("resp_boundscheck_", &validators);
 }
 
-// Test that InterfacePtr<X> applies the correct validators and they don't
-// conflict with each other:
+// Test that Remote<X> applies the correct validators and they don't conflict
+// with each other:
 //   - MessageHeaderValidator
 //   - X::ResponseValidator_
-TEST_F(ValidationIntegrationTest, InterfacePtr) {
-  IntegrationTestInterfacePtr interface_ptr = MakeProxy(
-      InterfacePtrInfo<IntegrationTestInterface>(testee_endpoint(), 0u));
-  interface_ptr.internal_state()->EnableTestingMode();
+TEST_F(ValidationIntegrationTest, Remote) {
+  Remote<IntegrationTestInterface> remote(
+      PendingRemote<IntegrationTestInterface>(testee_endpoint(), 0u));
+  remote.internal_state()->EnableTestingMode();
 
   RunValidationTests("integration_intf_resp", test_message_receiver());
   RunValidationTests("integration_msghdr", test_message_receiver());
 }
 
-// Test that Binding<X> applies the correct validators and they don't
-// conflict with each other:
+// Test that Receiver<X> applies the correct validators and they don't conflict
+// with each other:
 //   - MessageHeaderValidator
 //   - X::RequestValidator_
-TEST_F(ValidationIntegrationTest, Binding) {
+TEST_F(ValidationIntegrationTest, Receiver) {
   IntegrationTestInterfaceImpl interface_impl;
-  Binding<IntegrationTestInterface> binding(
-      &interface_impl, IntegrationTestInterfaceRequest(testee_endpoint()));
-  binding.EnableTestingMode();
+  Receiver<IntegrationTestInterface> receiver(
+      &interface_impl,
+      PendingReceiver<IntegrationTestInterface>(testee_endpoint()));
+  receiver.internal_state()->EnableTestingMode();
 
   RunValidationTests("integration_intf_rqst", test_message_receiver());
   RunValidationTests("integration_msghdr", test_message_receiver());
diff --git a/mojo/public/cpp/bindings/tests/variant_test_util.h b/mojo/public/cpp/bindings/tests/variant_test_util.h
index f1e75b3..f2ceffb6 100644
--- a/mojo/public/cpp/bindings/tests/variant_test_util.h
+++ b/mojo/public/cpp/bindings/tests/variant_test_util.h
@@ -5,23 +5,21 @@
 #ifndef MOJO_PUBLIC_CPP_BINDINGS_TESTS_VARIANT_TEST_UTIL_H_
 #define MOJO_PUBLIC_CPP_BINDINGS_TESTS_VARIANT_TEST_UTIL_H_
 
-#include <string.h>
+#include <type_traits>
 
-#include "base/logging.h"
-#include "mojo/public/cpp/bindings/interface_request.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
 
 namespace mojo {
 namespace test {
 
-// Converts a request of Interface1 to a request of Interface0. Interface0 and
-// Interface1 are expected to be two variants of the same mojom interface.
-// In real-world use cases, users shouldn't need to worry about this. Because it
-// is rare to deal with two variants of the same interface in the same app.
+// Converts a PendingReceiver of Interface1 to a one of Interface0. Interface0
+// and Interface1 must be two variants of the same mojom interface.
 template <typename Interface0, typename Interface1>
-InterfaceRequest<Interface0> ConvertInterfaceRequest(
-    InterfaceRequest<Interface1> request) {
-  DCHECK_EQ(0, strcmp(Interface0::Name_, Interface1::Name_));
-  return InterfaceRequest<Interface0>(request.PassMessagePipe());
+PendingReceiver<Interface0> ConvertPendingReceiver(
+    PendingReceiver<Interface1> receiver) {
+  static_assert(std::is_base_of<typename Interface0::Base_, Interface1>::value,
+                "Interface types are not variants of the same mojom interface");
+  return PendingReceiver<Interface0>(receiver.PassPipe());
 }
 
 }  // namespace test
diff --git a/mojo/public/cpp/bindings/tests/wtf_types_unittest.cc b/mojo/public/cpp/bindings/tests/wtf_types_unittest.cc
index f7417c8..2abd36b 100644
--- a/mojo/public/cpp/bindings/tests/wtf_types_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/wtf_types_unittest.cc
@@ -6,10 +6,11 @@
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/stl_util.h"
-#include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/bindings/lib/fixed_buffer.h"
 #include "mojo/public/cpp/bindings/lib/serialization.h"
 #include "mojo/public/cpp/bindings/lib/wtf_serialization.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/bindings/tests/variant_test_util.h"
 #include "mojo/public/interfaces/bindings/tests/test_wtf_types.mojom-blink.h"
 #include "mojo/public/interfaces/bindings/tests/test_wtf_types.mojom.h"
@@ -27,8 +28,8 @@
 
 class TestWTFImpl : public TestWTF {
  public:
-  explicit TestWTFImpl(TestWTFRequest request)
-      : binding_(this, std::move(request)) {}
+  explicit TestWTFImpl(PendingReceiver<TestWTF> receiver)
+      : receiver_(this, std::move(receiver)) {}
 
   // mojo::test::TestWTF implementation:
   void EchoString(const base::Optional<std::string>& str,
@@ -50,7 +51,7 @@
   }
 
  private:
-  Binding<TestWTF> binding_;
+  Receiver<TestWTF> receiver_;
 };
 
 class WTFTypesTest : public testing::Test {
@@ -191,8 +192,9 @@
 }
 
 TEST_F(WTFTypesTest, SendString) {
-  blink::TestWTFPtr ptr;
-  TestWTFImpl impl(ConvertInterfaceRequest<TestWTF>(MakeRequest(&ptr)));
+  Remote<blink::TestWTF> remote;
+  TestWTFImpl impl(
+      ConvertPendingReceiver<TestWTF>(remote.BindNewPipeAndPassReceiver()));
 
   WTF::Vector<WTF::String> strs = ConstructStringArray();
 
@@ -203,15 +205,16 @@
     //   - deserialized as base::Optional<std::string>;
     //   - serialized;
     //   - deserialized as WTF::String.
-    ptr->EchoString(strs[i],
-                    base::Bind(&ExpectString, strs[i], loop.QuitClosure()));
+    remote->EchoString(
+        strs[i], base::BindOnce(&ExpectString, strs[i], loop.QuitClosure()));
     loop.Run();
   }
 }
 
 TEST_F(WTFTypesTest, SendStringArray) {
-  blink::TestWTFPtr ptr;
-  TestWTFImpl impl(ConvertInterfaceRequest<TestWTF>(MakeRequest(&ptr)));
+  Remote<blink::TestWTF> remote;
+  TestWTFImpl impl(
+      ConvertPendingReceiver<TestWTF>(remote.BindNewPipeAndPassReceiver()));
 
   base::Optional<WTF::Vector<WTF::String>> arrs[3];
   // arrs[0] is empty.
@@ -228,16 +231,17 @@
     //     base::Optional<std::vector<base::Optional<std::string>>>;
     //   - serialized;
     //   - deserialized as base::Optional<WTF::Vector<WTF::String>>.
-    ptr->EchoStringArray(
-        arrs[i], base::Bind(&ExpectStringArray, base::Unretained(&arrs[i]),
-                            loop.QuitClosure()));
+    remote->EchoStringArray(
+        arrs[i], base::BindOnce(&ExpectStringArray, base::Unretained(&arrs[i]),
+                                loop.QuitClosure()));
     loop.Run();
   }
 }
 
 TEST_F(WTFTypesTest, SendStringMap) {
-  blink::TestWTFPtr ptr;
-  TestWTFImpl impl(ConvertInterfaceRequest<TestWTF>(MakeRequest(&ptr)));
+  Remote<blink::TestWTF> remote;
+  TestWTFImpl impl(
+      ConvertPendingReceiver<TestWTF>(remote.BindNewPipeAndPassReceiver()));
 
   base::Optional<WTF::HashMap<WTF::String, WTF::String>> maps[3];
   // maps[0] is empty.
@@ -255,9 +259,9 @@
     //   - serialized;
     //   - deserialized as base::Optional<WTF::HashMap<WTF::String,
     //     WTF::String>>.
-    ptr->EchoStringMap(maps[i],
-                       base::Bind(&ExpectStringMap, base::Unretained(&maps[i]),
-                                  loop.QuitClosure()));
+    remote->EchoStringMap(
+        maps[i], base::BindOnce(&ExpectStringMap, base::Unretained(&maps[i]),
+                                loop.QuitClosure()));
     loop.Run();
   }
 }
diff --git a/mojo/public/cpp/bindings/unique_receiver_set.h b/mojo/public/cpp/bindings/unique_receiver_set.h
new file mode 100644
index 0000000..c75aeea
--- /dev/null
+++ b/mojo/public/cpp/bindings/unique_receiver_set.h
@@ -0,0 +1,31 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MOJO_PUBLIC_CPP_BINDINGS_UNIQUE_RECEIVER_SET_H_
+#define MOJO_PUBLIC_CPP_BINDINGS_UNIQUE_RECEIVER_SET_H_
+
+#include "mojo/public/cpp/bindings/receiver_set.h"
+#include "mojo/public/cpp/bindings/unique_ptr_impl_ref_traits.h"
+
+namespace mojo {
+
+// This class manages a set of receiving endpoints where each endpoint is bound
+// to a unique implementation of the interface owned by this object. That is to
+// say, for every bound Receiver<T> in the set, there is a dedicated
+// unique_ptr<T> owned by the set and receiving messages.
+//
+// Each owned implementation of T has its lifetime automatically managed by the
+// UniqueReceiverSet, destroying an instance whenever its receiver is
+// disconnected because the remote endpoint intentionally hung up, crashed, or
+// sent malformed message.
+template <typename Interface,
+          typename ContextType = void,
+          typename Deleter = std::default_delete<Interface>>
+using UniqueReceiverSet = ReceiverSetBase<
+    Receiver<Interface, UniquePtrImplRefTraits<Interface, Deleter>>,
+    ContextType>;
+
+}  // namespace mojo
+
+#endif  // MOJO_PUBLIC_CPP_BINDINGS_UNIQUE_RECEIVER_SET_H_
diff --git a/mojo/public/interfaces/bindings/tests/sample_factory.mojom b/mojo/public/interfaces/bindings/tests/sample_factory.mojom
index cb718afd..8a6cbab6 100644
--- a/mojo/public/interfaces/bindings/tests/sample_factory.mojom
+++ b/mojo/public/interfaces/bindings/tests/sample_factory.mojom
@@ -15,8 +15,8 @@
   handle<message_pipe>? pipe;
   array<handle<message_pipe>>? more_pipes;
 
-  // Interfaces can be used as members.
-  imported.ImportedInterface? obj;
+  // Interface remotes can be used as members.
+  pending_remote<imported.ImportedInterface>? obj;
 };
 
 struct Response {
@@ -33,9 +33,9 @@
   DoStuff(Request request, handle<message_pipe>? pipe) =>
       (Response response, string text);
   DoStuff2(handle<data_pipe_consumer> pipe) => (string text);
-  CreateNamedObject(NamedObject& obj);
-  RequestImportedInterface(
-      imported.ImportedInterface& obj) => (imported.ImportedInterface& obj);
-  TakeImportedInterface(
-      imported.ImportedInterface obj) => (imported.ImportedInterface obj);
+  CreateNamedObject(pending_receiver<NamedObject> obj);
+  RequestImportedInterface(pending_receiver<imported.ImportedInterface> obj)
+      => (pending_receiver<imported.ImportedInterface> obj);
+  TakeImportedInterface(pending_remote<imported.ImportedInterface> obj)
+      => (pending_remote<imported.ImportedInterface> obj);
 };
diff --git a/mojo/public/interfaces/bindings/tests/sample_service.mojom b/mojo/public/interfaces/bindings/tests/sample_service.mojom
index 62ff1a8b..682cb3a 100644
--- a/mojo/public/interfaces/bindings/tests/sample_service.mojom
+++ b/mojo/public/interfaces/bindings/tests/sample_service.mojom
@@ -101,12 +101,13 @@
     EXTRA
   };
   const uint8 kFavoriteBaz = 1;
-  Frobinate@0(Foo? foo@0, BazOptions baz@1, Port? port@2) => (int32 result@0);
-  GetPort@1(Port& port @0);
+  Frobinate@0(Foo? foo@0, BazOptions baz@1, pending_remote<Port>? port@2)
+      => (int32 result@0);
+  GetPort@1(pending_receiver<Port> receiver @0);
 };
 
 // This interface is referenced above where it is defined. It also refers to
 // itself from a method.
 interface Port {
-  PostMessageToPort@0(string message_text@0, Port port@1);
+  PostMessageToPort@0(string message_text@0, pending_remote<Port> port@1);
 };
diff --git a/mojo/public/interfaces/bindings/tests/scoping.mojom b/mojo/public/interfaces/bindings/tests/scoping.mojom
index 2e9edb1..d58c86c 100644
--- a/mojo/public/interfaces/bindings/tests/scoping.mojom
+++ b/mojo/public/interfaces/bindings/tests/scoping.mojom
@@ -5,11 +5,11 @@
 module mojo.test;
 
 interface A {
-  GetB(B& b);
+  GetB(pending_receiver<B> b);
 };
 
 interface B {
-  GetC(C& c);
+  GetC(pending_receiver<C> c);
 };
 
 interface C {
diff --git a/mojo/public/interfaces/bindings/tests/test_data_view.mojom b/mojo/public/interfaces/bindings/tests/test_data_view.mojom
index 1fe8c6a..ba7822b 100644
--- a/mojo/public/interfaces/bindings/tests/test_data_view.mojom
+++ b/mojo/public/interfaces/bindings/tests/test_data_view.mojom
@@ -33,7 +33,7 @@
   array<bool> f_bool_array;
   array<int32> f_int32_array;
   array<TestEnum> f_enum_array;
-  array<TestInterface> f_interface_array;
+  array<pending_remote<TestInterface>> f_interface_array;
   array<array<int32>> f_nested_array;
   array<NestedStruct> f_struct_array;
   array<TestUnion> f_union_array;
diff --git a/mojo/public/interfaces/bindings/tests/test_structs.mojom b/mojo/public/interfaces/bindings/tests/test_structs.mojom
index c7dc10e..27cbe5c 100644
--- a/mojo/public/interfaces/bindings/tests/test_structs.mojom
+++ b/mojo/public/interfaces/bindings/tests/test_structs.mojom
@@ -158,8 +158,8 @@
   array<int64> f3;
   array<float> f4;
   array<double> f5;
-  array<SomeInterface> f6;
-  array<SomeInterface&> f7;
+  array<pending_remote<SomeInterface>> f6;
+  array<pending_receiver<SomeInterface>> f7;
 };
 
 // Used to verify that various float and double values can be encoded and
@@ -378,7 +378,7 @@
 };
 
 struct ContainsInterface {
-  SomeInterface some_interface;
+  pending_remote<SomeInterface> some_interface;
 };
 
 // Verify that a field can be called |other|.
@@ -390,7 +390,7 @@
 // Used to verify that structs can contain interface requests.
 
 struct ContainsInterfaceRequest {
-  SomeInterface& request;
+  pending_receiver<SomeInterface> request;
 };
 
 // Used to verify that boolean fields are correctly serialized/deserialized.
diff --git a/mojo/public/interfaces/bindings/tests/test_sync_methods.mojom b/mojo/public/interfaces/bindings/tests/test_sync_methods.mojom
index 3b8cfe6..b5a7911 100644
--- a/mojo/public/interfaces/bindings/tests/test_sync_methods.mojom
+++ b/mojo/public/interfaces/bindings/tests/test_sync_methods.mojom
@@ -38,7 +38,6 @@
 
   AsyncEcho(int32 value) => (int32 result);
 
-  SendInterface(associated TestSync ptr);
-
-  SendRequest(associated TestSync& request);
+  SendRemote(pending_associated_remote<TestSync> remote);
+  SendReceiver(pending_associated_receiver<TestSync> receiver);
 };
diff --git a/mojo/public/interfaces/bindings/tests/test_unions.mojom b/mojo/public/interfaces/bindings/tests/test_unions.mojom
index 4343bc7..6abffe0 100644
--- a/mojo/public/interfaces/bindings/tests/test_unions.mojom
+++ b/mojo/public/interfaces/bindings/tests/test_unions.mojom
@@ -50,8 +50,8 @@
   handle<data_pipe_consumer> f_data_pipe_consumer;
   handle<data_pipe_producer> f_data_pipe_producer;
   handle<shared_buffer> f_shared_buffer;
-  SmallCache f_small_cache;
-  SmallCache& f_small_cache_request;
+  pending_remote<SmallCache> f_small_cache;
+  pending_receiver<SmallCache> f_small_cache_receiver;
 };
 
 struct WrapperStruct {
diff --git a/mojo/public/interfaces/bindings/tests/validation_test_associated_interfaces.mojom b/mojo/public/interfaces/bindings/tests/validation_test_associated_interfaces.mojom
index 2fa77ff..0afad813 100644
--- a/mojo/public/interfaces/bindings/tests/validation_test_associated_interfaces.mojom
+++ b/mojo/public/interfaces/bindings/tests/validation_test_associated_interfaces.mojom
@@ -10,9 +10,9 @@
 interface InterfaceX {};
 
 interface AssociatedConformanceTestInterface {
-  Method0(associated InterfaceX param0);
-  Method1(associated InterfaceX& param0);
-  Method2(associated InterfaceX? param0);
-  Method3(array<associated InterfaceX> param0);
+  Method0(pending_associated_remote<InterfaceX> param0);
+  Method1(pending_associated_receiver<InterfaceX> param0);
+  Method2(pending_associated_remote<InterfaceX>? param0);
+  Method3(array<pending_associated_remote<InterfaceX>> param0);
 };
 
diff --git a/mojo/public/interfaces/bindings/tests/validation_test_interfaces.mojom b/mojo/public/interfaces/bindings/tests/validation_test_interfaces.mojom
index ab69045..44e938a 100644
--- a/mojo/public/interfaces/bindings/tests/validation_test_interfaces.mojom
+++ b/mojo/public/interfaces/bindings/tests/validation_test_interfaces.mojom
@@ -91,11 +91,12 @@
   Method10(map<string, uint8> param0);
   Method11(StructG param0);
   Method12(float param0) => (float param0);
-  Method13(InterfaceA? param0, uint32 param1, InterfaceA? param2);
+  Method13(InterfaceA? param0, uint32 param1,
+           InterfaceA? param2);
   Method14(EnumA param0, EnumB param1);
   Method15(array<EnumA>? param0, array<EnumB>? param1);
   Method16(map<EnumA, EnumA>? param0);
-  Method17(array<InterfaceA> param0);
+  Method17(array<pending_remote<InterfaceA>> param0);
   Method18(UnionA? param0);
   Method19(Recursive recursive);
   Method20(map<StructB, uint8> param0);
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/interface_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/interface_declaration.tmpl
index 0334394..f8b28e7 100644
--- a/mojo/public/tools/bindings/generators/cpp_templates/interface_declaration.tmpl
+++ b/mojo/public/tools/bindings/generators/cpp_templates/interface_declaration.tmpl
@@ -20,6 +20,7 @@
   static constexpr bool PassesAssociatedKinds_ = {% if interface|passes_associated_kinds %}true{% else %}false{% endif %};
   static constexpr bool HasSyncMethods_ = {% if interface|has_sync_methods %}true{% else %}false{% endif %};
 
+  using Base_ = {{interface.name}}InterfaceBase;
   using Proxy_ = {{interface.name}}Proxy;
 
   template <typename ImplRefTraits>
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/pack.py b/mojo/public/tools/bindings/pylib/mojom/generate/pack.py
index 98e4284..66c707a4 100644
--- a/mojo/public/tools/bindings/pylib/mojom/generate/pack.py
+++ b/mojo/public/tools/bindings/pylib/mojom/generate/pack.py
@@ -64,7 +64,8 @@
 
   @classmethod
   def GetAlignmentForKind(cls, kind):
-    if isinstance(kind, (mojom.Interface, mojom.AssociatedInterface)):
+    if isinstance(kind, (mojom.Interface, mojom.AssociatedInterface,
+                         mojom.PendingRemote, mojom.PendingAssociatedRemote)):
       return 4
     if isinstance(kind, mojom.Union):
       return 8
diff --git a/net/BUILD.gn b/net/BUILD.gn
index 584c613..2ebf67a 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -1206,6 +1206,11 @@
       "third_party/mozilla_security_manager/nsNSSCertificateDB.h",
       "third_party/mozilla_security_manager/nsPKCS12Blob.cpp",
       "third_party/mozilla_security_manager/nsPKCS12Blob.h",
+      "third_party/quiche/src/common/platform/api/quiche_logging.h",
+      "third_party/quiche/src/common/platform/api/quiche_ptr_util.h",
+      "third_party/quiche/src/common/platform/api/quiche_test.h",
+      "third_party/quiche/src/common/platform/api/quiche_unordered_containers.h",
+      "third_party/quiche/src/common/simple_linked_hash_map.h",
       "third_party/quiche/src/http2/decoder/decode_buffer.cc",
       "third_party/quiche/src/http2/decoder/decode_buffer.h",
       "third_party/quiche/src/http2/decoder/decode_http2_structures.cc",
@@ -1291,10 +1296,13 @@
       "third_party/quiche/src/http2/http2_structures.h",
       "third_party/quiche/src/http2/platform/api/http2_arraysize.h",
       "third_party/quiche/src/http2/platform/api/http2_bug_tracker.h",
+      "third_party/quiche/src/http2/platform/api/http2_containers.h",
+      "third_party/quiche/src/http2/platform/api/http2_estimate_memory_usage.h",
       "third_party/quiche/src/http2/platform/api/http2_export.h",
       "third_party/quiche/src/http2/platform/api/http2_flag_utils.h",
       "third_party/quiche/src/http2/platform/api/http2_flags.h",
       "third_party/quiche/src/http2/platform/api/http2_logging.h",
+      "third_party/quiche/src/http2/platform/api/http2_macros.h",
       "third_party/quiche/src/http2/platform/api/http2_optional.h",
       "third_party/quiche/src/http2/platform/api/http2_ptr_util.h",
       "third_party/quiche/src/http2/platform/api/http2_reconstruct_object.h",
@@ -1722,6 +1730,7 @@
       "third_party/quiche/src/spdy/platform/api/spdy_estimate_memory_usage.h",
       "third_party/quiche/src/spdy/platform/api/spdy_export.h",
       "third_party/quiche/src/spdy/platform/api/spdy_flags.h",
+      "third_party/quiche/src/spdy/platform/api/spdy_logging.h",
       "third_party/quiche/src/spdy/platform/api/spdy_macros.h",
       "third_party/quiche/src/spdy/platform/api/spdy_mem_slice.h",
       "third_party/quiche/src/spdy/platform/api/spdy_ptr_util.h",
diff --git a/net/android/java/NetError.template b/net/android/java/NetError.template
index f6c1661..2702834 100644
--- a/net/android/java/NetError.template
+++ b/net/android/java/NetError.template
@@ -4,7 +4,21 @@
 
 package org.chromium.net;
 
-public class NetError {
-#define NET_ERROR(name, value) public static final int ERR_##name = value;
+import android.support.annotation.IntDef;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@IntDef({
+#define NET_ERROR(name, value) NetError.ERR_##name,
 #include "net/base/net_error_list.h"
+#undef NET_ERROR
+NetError.OK
+})
+@Retention(RetentionPolicy.SOURCE)
+public @interface NetError {
+int OK = 0;
+#define NET_ERROR(name, value) int ERR_##name = value;
+#include "net/base/net_error_list.h"
+#undef NET_ERROR
 }
diff --git a/net/android/java/src/org/chromium/net/HttpNegotiateAuthenticator.java b/net/android/java/src/org/chromium/net/HttpNegotiateAuthenticator.java
index 8fa3a178..e4fff90 100644
--- a/net/android/java/src/org/chromium/net/HttpNegotiateAuthenticator.java
+++ b/net/android/java/src/org/chromium/net/HttpNegotiateAuthenticator.java
@@ -249,11 +249,12 @@
      */
     private void processResult(Bundle result, RequestData requestData) {
         mSpnegoContext = result.getBundle(HttpNegotiateConstants.KEY_SPNEGO_CONTEXT);
+        @NetError
         int status;
         switch (result.getInt(
                 HttpNegotiateConstants.KEY_SPNEGO_RESULT, HttpNegotiateConstants.ERR_UNEXPECTED)) {
             case HttpNegotiateConstants.OK:
-                status = 0;
+                status = NetError.OK;
                 break;
             case HttpNegotiateConstants.ERR_UNEXPECTED:
                 status = NetError.ERR_UNEXPECTED;
diff --git a/net/base/escape.cc b/net/base/escape.cc
index b37078cb..2245fc5 100644
--- a/net/base/escape.cc
+++ b/net/base/escape.cc
@@ -487,7 +487,7 @@
   return base::UTF8ToUTF16WithAdjustments(text, adjustments);
 }
 
-void UnescapeBinaryURLComponent(const std::string& escaped_text,
+void UnescapeBinaryURLComponent(base::StringPiece escaped_text,
                                 UnescapeRule::Type rules,
                                 std::string* unescaped_text) {
   // Only NORMAL and REPLACE_PLUS_WITH_SPACE are supported.
diff --git a/net/base/escape.h b/net/base/escape.h
index 8e86e61f..151dab3 100644
--- a/net/base/escape.h
+++ b/net/base/escape.h
@@ -150,11 +150,11 @@
 //
 // Only the NORMAL and REPLACE_PLUS_WITH_SPACE rules are allowed.
 // |escaped_text| and |unescaped_text| can be the same string.
-NET_EXPORT void UnescapeBinaryURLComponent(const std::string& escaped_text,
+NET_EXPORT void UnescapeBinaryURLComponent(base::StringPiece escaped_text,
                                            UnescapeRule::Type rules,
                                            std::string* unescaped_text);
 NET_EXPORT inline void UnescapeBinaryURLComponent(
-    const std::string& escaped_text,
+    base::StringPiece escaped_text,
     std::string* unescaped_text) {
   UnescapeBinaryURLComponent(escaped_text, UnescapeRule::NORMAL,
                              unescaped_text);
diff --git a/net/base/net_errors.cc b/net/base/net_errors.cc
index ed7f9fb..ed6bc4514 100644
--- a/net/base/net_errors.cc
+++ b/net/base/net_errors.cc
@@ -22,7 +22,7 @@
 }
 
 std::string ErrorToShortString(int error) {
-  if (error == 0)
+  if (error == OK)
     return "OK";
 
   const char* error_string;
diff --git a/net/base/net_errors.h b/net/base/net_errors.h
index 489c5e2..f24540a 100644
--- a/net/base/net_errors.h
+++ b/net/base/net_errors.h
@@ -16,7 +16,7 @@
 
 // Error values are negative.
 enum Error {
-  // No error.
+  // No error. Change NetError.template after changing value.
   OK = 0,
 
 #define NET_ERROR(label, value) ERR_ ## label = value,
diff --git a/net/http/http_network_session.cc b/net/http/http_network_session.cc
index f14d716..088895ad 100644
--- a/net/http/http_network_session.cc
+++ b/net/http/http_network_session.cc
@@ -137,7 +137,8 @@
       quic_initial_rtt_for_handshake_milliseconds(0),
       http_09_on_non_default_ports_enabled(false),
       disable_idle_sockets_close_on_memory_pressure(false) {
-  quic_supported_versions.push_back(quic::QUIC_VERSION_43);
+  quic_supported_versions.push_back(quic::ParsedQuicVersion(
+      quic::PROTOCOL_QUIC_CRYPTO, quic::QUIC_VERSION_43));
   enable_early_data =
       base::FeatureList::IsEnabled(features::kEnableTLS13EarlyData);
 }
@@ -333,7 +334,7 @@
 
   auto supported_versions(std::make_unique<base::ListValue>());
   for (const auto& version : params_.quic_supported_versions)
-    supported_versions->AppendString(QuicVersionToString(version));
+    supported_versions->AppendString(ParsedQuicVersionToString(version));
   dict->Set("supported_versions", std::move(supported_versions));
 
   auto origins_to_force_quic_on(std::make_unique<base::ListValue>());
diff --git a/net/http/http_network_session.h b/net/http/http_network_session.h
index ead9752..9de62fae 100644
--- a/net/http/http_network_session.h
+++ b/net/http/http_network_session.h
@@ -139,7 +139,7 @@
     // QUIC runtime configuration options.
 
     // Versions of QUIC which may be used.
-    quic::QuicTransportVersionVector quic_supported_versions;
+    quic::ParsedQuicVersionVector quic_supported_versions;
     // User agent description to send in the QUIC handshake.
     std::string quic_user_agent_id;
     // Limit on the size of QUIC packets.
diff --git a/net/http/http_proxy_connect_job.cc b/net/http/http_proxy_connect_job.cc
index 83f167d2..4bc16b74 100644
--- a/net/http/http_proxy_connect_job.cc
+++ b/net/http/http_proxy_connect_job.cc
@@ -465,7 +465,7 @@
         ProxyServer::Direct(), PRIVACY_MODE_DISABLED,
         SpdySessionKey::IsProxySession::kTrue, socket_tag());
     if (common_connect_job_params()->spdy_session_pool->FindAvailableSession(
-            key, /* enable_ip_based_pooling = */ true,
+            key, /* enable_ip_based_pooling = */ false,
             /* is_websocket = */ false, net_log())) {
       using_spdy_ = true;
       next_state_ = STATE_SPDY_PROXY_CREATE_STREAM;
@@ -593,7 +593,7 @@
       SpdySessionKey::IsProxySession::kTrue, socket_tag());
   base::WeakPtr<SpdySession> spdy_session =
       common_connect_job_params()->spdy_session_pool->FindAvailableSession(
-          key, /* enable_ip_based_pooling = */ true,
+          key, /* enable_ip_based_pooling = */ false,
           /* is_websocket = */ false, net_log());
   // It's possible that a session to the proxy has recently been created
   if (spdy_session) {
@@ -664,10 +664,10 @@
       common_connect_job_params()->quic_stream_factory);
 
   // Use default QUIC version, which is the version listed supported version.
-  quic::QuicTransportVersion quic_version =
+  quic::ParsedQuicVersion quic_version =
       common_connect_job_params()->quic_supported_versions->front();
   return quic_stream_request_->Request(
-      proxy_server, quic_version, ssl_params->privacy_mode(),
+      proxy_server, quic_version.transport_version, ssl_params->privacy_mode(),
       kH2QuicTunnelPriority, socket_tag(),
       ssl_params->ssl_config().GetCertVerifyFlags(),
       GURL("https://" + proxy_server.ToString()), net_log(),
diff --git a/net/http/http_server_properties.cc b/net/http/http_server_properties.cc
index 8649ac196..cea0732 100644
--- a/net/http/http_server_properties.cc
+++ b/net/http/http_server_properties.cc
@@ -86,14 +86,14 @@
     base::Time expiration) {
   DCHECK_EQ(alternative_service.protocol, kProtoHTTP2);
   return AlternativeServiceInfo(alternative_service, expiration,
-                                quic::QuicTransportVersionVector());
+                                quic::ParsedQuicVersionVector());
 }
 
 // static
 AlternativeServiceInfo AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
     const AlternativeService& alternative_service,
     base::Time expiration,
-    const quic::QuicTransportVersionVector& advertised_versions) {
+    const quic::ParsedQuicVersionVector& advertised_versions) {
   DCHECK_EQ(alternative_service.protocol, kProtoQUIC);
   return AlternativeServiceInfo(alternative_service, expiration,
                                 advertised_versions);
@@ -106,11 +106,12 @@
 AlternativeServiceInfo::AlternativeServiceInfo(
     const AlternativeService& alternative_service,
     base::Time expiration,
-    const quic::QuicTransportVersionVector& advertised_versions)
+    const quic::ParsedQuicVersionVector& advertised_versions)
     : alternative_service_(alternative_service), expiration_(expiration) {
   if (alternative_service_.protocol == kProtoQUIC) {
     advertised_versions_ = advertised_versions;
-    std::sort(advertised_versions_.begin(), advertised_versions_.end());
+    std::sort(advertised_versions_.begin(), advertised_versions_.end(),
+              TransportVersionLessThan);
   }
 }
 
@@ -134,6 +135,13 @@
       exploded.day_of_month, exploded.hour, exploded.minute, exploded.second);
 }
 
+// static
+bool AlternativeServiceInfo::TransportVersionLessThan(
+    const quic::ParsedQuicVersion& lhs,
+    const quic::ParsedQuicVersion& rhs) {
+  return lhs.transport_version < rhs.transport_version;
+}
+
 std::ostream& operator<<(std::ostream& os,
                          const AlternativeService& alternative_service) {
   os << alternative_service.ToString();
diff --git a/net/http/http_server_properties.h b/net/http/http_server_properties.h
index 999bd2b..a1117925d 100644
--- a/net/http/http_server_properties.h
+++ b/net/http/http_server_properties.h
@@ -133,7 +133,7 @@
   static AlternativeServiceInfo CreateQuicAlternativeServiceInfo(
       const AlternativeService& alternative_service,
       base::Time expiration,
-      const quic::QuicTransportVersionVector& advertised_versions);
+      const quic::ParsedQuicVersionVector& advertised_versions);
 
   AlternativeServiceInfo();
   ~AlternativeServiceInfo();
@@ -173,12 +173,13 @@
   }
 
   void set_advertised_versions(
-      const quic::QuicTransportVersionVector& advertised_versions) {
+      const quic::ParsedQuicVersionVector& advertised_versions) {
     if (alternative_service_.protocol != kProtoQUIC)
       return;
 
     advertised_versions_ = advertised_versions;
-    std::sort(advertised_versions_.begin(), advertised_versions_.end());
+    std::sort(advertised_versions_.begin(), advertised_versions_.end(),
+              TransportVersionLessThan);
   }
 
   const AlternativeService& alternative_service() const {
@@ -193,7 +194,7 @@
 
   base::Time expiration() const { return expiration_; }
 
-  const quic::QuicTransportVersionVector& advertised_versions() const {
+  const quic::ParsedQuicVersionVector& advertised_versions() const {
     return advertised_versions_;
   }
 
@@ -201,7 +202,10 @@
   AlternativeServiceInfo(
       const AlternativeService& alternative_service,
       base::Time expiration,
-      const quic::QuicTransportVersionVector& advertised_versions);
+      const quic::ParsedQuicVersionVector& advertised_versions);
+
+  static bool TransportVersionLessThan(const quic::ParsedQuicVersion& lhs,
+                                       const quic::ParsedQuicVersion& rhs);
 
   AlternativeService alternative_service_;
   base::Time expiration_;
@@ -210,7 +214,7 @@
   // by Chrome. If empty, defaults to versions used by the current instance of
   // the netstack.
   // This list MUST be sorted in ascending order.
-  quic::QuicTransportVersionVector advertised_versions_;
+  quic::ParsedQuicVersionVector advertised_versions_;
 };
 
 struct NET_EXPORT SupportsQuic {
@@ -373,7 +377,7 @@
       const url::SchemeHostPort& origin,
       const AlternativeService& alternative_service,
       base::Time expiration,
-      const quic::QuicTransportVersionVector& advertised_versions) = 0;
+      const quic::ParsedQuicVersionVector& advertised_versions) = 0;
 
   // Set alternative services for |origin|.  Previous alternative services for
   // |origin| are discarded.
diff --git a/net/http/http_server_properties_impl.cc b/net/http/http_server_properties_impl.cc
index 0a872c3..f18530db 100644
--- a/net/http/http_server_properties_impl.cc
+++ b/net/http/http_server_properties_impl.cc
@@ -385,7 +385,7 @@
     const url::SchemeHostPort& origin,
     const AlternativeService& alternative_service,
     base::Time expiration,
-    const quic::QuicTransportVersionVector& advertised_versions) {
+    const quic::ParsedQuicVersionVector& advertised_versions) {
   DCHECK(alternative_service.protocol == kProtoQUIC);
 
   return SetAlternativeServices(
diff --git a/net/http/http_server_properties_impl.h b/net/http/http_server_properties_impl.h
index e7fdd20..78c8cf0b 100644
--- a/net/http/http_server_properties_impl.h
+++ b/net/http/http_server_properties_impl.h
@@ -109,7 +109,7 @@
       const url::SchemeHostPort& origin,
       const AlternativeService& alternative_service,
       base::Time expiration,
-      const quic::QuicTransportVersionVector& advertised_versions) override;
+      const quic::ParsedQuicVersionVector& advertised_versions) override;
   bool SetAlternativeServices(const url::SchemeHostPort& origin,
                               const AlternativeServiceInfoVector&
                                   alternative_service_info_vector) override;
diff --git a/net/http/http_server_properties_manager.cc b/net/http/http_server_properties_manager.cc
index 50658601..9b780f4c 100644
--- a/net/http/http_server_properties_manager.cc
+++ b/net/http/http_server_properties_manager.cc
@@ -225,7 +225,7 @@
     const url::SchemeHostPort& origin,
     const AlternativeService& alternative_service,
     base::Time expiration,
-    const quic::QuicTransportVersionVector& advertised_versions) {
+    const quic::ParsedQuicVersionVector& advertised_versions) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   const bool changed = http_server_properties_impl_->SetQuicAlternativeService(
       origin, alternative_service, expiration, advertised_versions);
@@ -842,7 +842,7 @@
                << "server: " << server_str;
       return false;
     }
-    quic::QuicTransportVersionVector advertised_versions;
+    quic::ParsedQuicVersionVector advertised_versions;
     for (const auto& value : *versions_list) {
       int version;
       if (!value.GetAsInteger(&version)) {
@@ -850,7 +850,10 @@
                  << server_str;
         return false;
       }
-      advertised_versions.push_back(quic::QuicTransportVersion(version));
+      // TODO(nharper): Support ParsedQuicVersions (instead of
+      // QuicTransportVersions) in AlternativeServiceMap.
+      advertised_versions.push_back(quic::ParsedQuicVersion(
+          quic::PROTOCOL_QUIC_CRYPTO, quic::QuicTransportVersion(version)));
     }
     alternative_service_info->set_advertised_versions(advertised_versions);
   }
@@ -1175,7 +1178,7 @@
     std::unique_ptr<base::ListValue> advertised_versions_list =
         std::make_unique<base::ListValue>();
     for (const auto& version : alternative_service_info.advertised_versions()) {
-      advertised_versions_list->AppendInteger(version);
+      advertised_versions_list->AppendInteger(version.transport_version);
     }
     alternative_service_dict->SetList(kAdvertisedVersionsKey,
                                       std::move(advertised_versions_list));
diff --git a/net/http/http_server_properties_manager.h b/net/http/http_server_properties_manager.h
index 7d63bb9..a8ecf31 100644
--- a/net/http/http_server_properties_manager.h
+++ b/net/http/http_server_properties_manager.h
@@ -106,7 +106,7 @@
       const url::SchemeHostPort& origin,
       const AlternativeService& alternative_service,
       base::Time expiration,
-      const quic::QuicTransportVersionVector& advertised_versions) override;
+      const quic::ParsedQuicVersionVector& advertised_versions) override;
   bool SetAlternativeServices(const url::SchemeHostPort& origin,
                               const AlternativeServiceInfoVector&
                                   alternative_service_info_vector) override;
diff --git a/net/http/http_server_properties_manager_unittest.cc b/net/http/http_server_properties_manager_unittest.cc
index 7a78852..8673b83 100644
--- a/net/http/http_server_properties_manager_unittest.cc
+++ b/net/http/http_server_properties_manager_unittest.cc
@@ -144,7 +144,7 @@
   MockPrefDelegate* pref_delegate_;  // Owned by HttpServerPropertiesManager.
   std::unique_ptr<HttpServerPropertiesManager> http_server_props_manager_;
   base::Time one_day_from_now_;
-  quic::QuicTransportVersionVector advertised_versions_;
+  quic::ParsedQuicVersionVector advertised_versions_;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(HttpServerPropertiesManagerTest);
@@ -1447,8 +1447,11 @@
   AlternativeService quic_alternative_service1(kProtoQUIC, "", 443);
   base::Time expiration1;
   ASSERT_TRUE(base::Time::FromUTCString("2036-12-01 10:00:00", &expiration1));
-  quic::QuicTransportVersionVector advertised_versions = {
-      quic::QUIC_VERSION_44, quic::QUIC_VERSION_39};
+  quic::ParsedQuicVersionVector advertised_versions = {
+      quic::ParsedQuicVersion(quic::PROTOCOL_QUIC_CRYPTO,
+                              quic::QUIC_VERSION_44),
+      quic::ParsedQuicVersion(quic::PROTOCOL_QUIC_CRYPTO,
+                              quic::QUIC_VERSION_39)};
   alternative_service_info_vector.push_back(
       AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
           quic_alternative_service1, expiration1, advertised_versions));
@@ -1554,11 +1557,15 @@
   EXPECT_EQ(123, alternative_service_info_vector[1].alternative_service().port);
   EXPECT_EQ(base::Time::Max(), alternative_service_info_vector[1].expiration());
   // Verify advertised versions.
-  const quic::QuicTransportVersionVector loaded_advertised_versions =
+  const quic::ParsedQuicVersionVector loaded_advertised_versions =
       alternative_service_info_vector[1].advertised_versions();
   EXPECT_EQ(2u, loaded_advertised_versions.size());
-  EXPECT_EQ(quic::QUIC_VERSION_39, loaded_advertised_versions[0]);
-  EXPECT_EQ(quic::QUIC_VERSION_44, loaded_advertised_versions[1]);
+  EXPECT_EQ(quic::ParsedQuicVersion(quic::PROTOCOL_QUIC_CRYPTO,
+                                    quic::QUIC_VERSION_39),
+            loaded_advertised_versions[0]);
+  EXPECT_EQ(quic::ParsedQuicVersion(quic::PROTOCOL_QUIC_CRYPTO,
+                                    quic::QUIC_VERSION_44),
+            loaded_advertised_versions[1]);
 }
 
 TEST_P(HttpServerPropertiesManagerTest,
@@ -1615,8 +1622,11 @@
   // AlternativeService.
   AlternativeServiceInfoVector alternative_service_info_vector_2;
   // Quic alternative service set with two advertised QUIC versions.
-  quic::QuicTransportVersionVector advertised_versions = {
-      quic::QUIC_VERSION_44, quic::QUIC_VERSION_39};
+  quic::ParsedQuicVersionVector advertised_versions = {
+      quic::ParsedQuicVersion(quic::PROTOCOL_QUIC_CRYPTO,
+                              quic::QUIC_VERSION_44),
+      quic::ParsedQuicVersion(quic::PROTOCOL_QUIC_CRYPTO,
+                              quic::QUIC_VERSION_39)};
   alternative_service_info_vector_2.push_back(
       AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
           quic_alternative_service1, expiration1, advertised_versions));
@@ -1645,8 +1655,11 @@
   // #3: Set AlternativeService with same advertised_versions.
   AlternativeServiceInfoVector alternative_service_info_vector_3;
   // A same set of QUIC versions but listed in a different order.
-  quic::QuicTransportVersionVector advertised_versions_2 = {
-      quic::QUIC_VERSION_39, quic::QUIC_VERSION_44};
+  quic::ParsedQuicVersionVector advertised_versions_2 = {
+      quic::ParsedQuicVersion(quic::PROTOCOL_QUIC_CRYPTO,
+                              quic::QUIC_VERSION_39),
+      quic::ParsedQuicVersion(quic::PROTOCOL_QUIC_CRYPTO,
+                              quic::QUIC_VERSION_44)};
   alternative_service_info_vector_3.push_back(
       AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
           quic_alternative_service1, expiration1, advertised_versions_2));
diff --git a/net/http/http_stream_factory.cc b/net/http/http_stream_factory.cc
index 6eded7b5..3bca1d7c 100644
--- a/net/http/http_stream_factory.cc
+++ b/net/http/http_stream_factory.cc
@@ -75,7 +75,7 @@
       continue;
     }
     // Check if QUIC version is supported. Filter supported QUIC versions.
-    quic::QuicTransportVersionVector advertised_versions;
+    quic::ParsedQuicVersionVector advertised_versions;
     if (protocol == kProtoQUIC && !alternative_service_entry.version.empty()) {
       advertised_versions = FilterSupportedAltSvcVersions(
           alternative_service_entry, session->params().quic_supported_versions,
diff --git a/net/http/http_stream_factory_job.cc b/net/http/http_stream_factory_job.cc
index 28af63b..1fe654c 100644
--- a/net/http/http_stream_factory_job.cc
+++ b/net/http/http_stream_factory_job.cc
@@ -106,7 +106,7 @@
                             HostPortPair destination,
                             GURL origin_url,
                             NextProto alternative_protocol,
-                            quic::QuicTransportVersion quic_version,
+                            quic::ParsedQuicVersion quic_version,
                             const ProxyServer& alternative_proxy_server,
                             bool is_websocket,
                             bool enable_ip_based_pooling,
@@ -131,7 +131,11 @@
                                 origin_url_.SchemeIs(url::kWssScheme) &&
                                 proxy_info_.is_direct() &&
                                 session_->params().enable_websocket_over_http2),
-      enable_ip_based_pooling_(enable_ip_based_pooling),
+      // Don't use IP connection pooling for HTTP over HTTPS proxies. It doesn't
+      // get us much, and testing it is more effort than its worth.
+      enable_ip_based_pooling_(enable_ip_based_pooling &&
+                               !(proxy_info_.proxy_server().is_https() &&
+                                 origin_url_.SchemeIs(url::kHttpScheme))),
       delegate_(delegate),
       job_type_(job_type),
       using_ssl_(origin_url_.SchemeIs(url::kHttpsScheme) ||
@@ -172,14 +176,14 @@
 
   // The Job is forced to use QUIC without a designated version, try the
   // preferred QUIC version that is supported by default.
-  if (quic_version_ == quic::QUIC_VERSION_UNSUPPORTED &&
+  if (quic_version_ == quic::UnsupportedQuicVersion() &&
       ShouldForceQuic(session, destination, origin_url, proxy_info,
                       using_ssl_)) {
     quic_version_ = session->params().quic_supported_versions[0];
   }
 
   if (using_quic_)
-    DCHECK_NE(quic_version_, quic::QUIC_VERSION_UNSUPPORTED);
+    DCHECK_NE(quic_version_, quic::UnsupportedQuicVersion());
 
   DCHECK(session);
   if (alternative_protocol != kProtoUnknown) {
@@ -766,9 +770,9 @@
       ssl_config = &server_ssl_config_;
     }
     int rv = quic_request_.Request(
-        destination, quic_version_, request_info_.privacy_mode, priority_,
-        request_info_.socket_tag, ssl_config->GetCertVerifyFlags(), url,
-        net_log_, &net_error_details_,
+        destination, quic_version_.transport_version,
+        request_info_.privacy_mode, priority_, request_info_.socket_tag,
+        ssl_config->GetCertVerifyFlags(), url, net_log_, &net_error_details_,
         base::BindOnce(&Job::OnFailedOnDefaultNetwork,
                        ptr_factory_.GetWeakPtr()),
         io_callback_);
@@ -1302,7 +1306,7 @@
   return std::make_unique<HttpStreamFactory::Job>(
       delegate, job_type, session, request_info, priority, proxy_info,
       server_ssl_config, proxy_ssl_config, destination, origin_url,
-      kProtoUnknown, quic::QUIC_VERSION_UNSUPPORTED, ProxyServer(),
+      kProtoUnknown, quic::UnsupportedQuicVersion(), ProxyServer(),
       is_websocket, enable_ip_based_pooling, net_log);
 }
 
@@ -1319,7 +1323,7 @@
     HostPortPair destination,
     GURL origin_url,
     NextProto alternative_protocol,
-    quic::QuicTransportVersion quic_version,
+    quic::ParsedQuicVersion quic_version,
     bool is_websocket,
     bool enable_ip_based_pooling,
     NetLog* net_log) {
@@ -1349,7 +1353,7 @@
   return std::make_unique<HttpStreamFactory::Job>(
       delegate, job_type, session, request_info, priority, proxy_info,
       server_ssl_config, proxy_ssl_config, destination, origin_url,
-      kProtoUnknown, quic::QUIC_VERSION_UNSUPPORTED, alternative_proxy_server,
+      kProtoUnknown, quic::UnsupportedQuicVersion(), alternative_proxy_server,
       is_websocket, enable_ip_based_pooling, net_log);
 }
 
diff --git a/net/http/http_stream_factory_job.h b/net/http/http_stream_factory_job.h
index 3946a9a..4923750 100644
--- a/net/http/http_stream_factory_job.h
+++ b/net/http/http_stream_factory_job.h
@@ -168,7 +168,7 @@
       HostPortPair destination,
       GURL origin_url,
       NextProto alternative_protocol,
-      quic::QuicTransportVersion quic_version,
+      quic::ParsedQuicVersion quic_version,
       const ProxyServer& alternative_proxy_server,
       bool is_websocket,
       bool enable_ip_based_pooling,
@@ -411,9 +411,9 @@
   // True if Job uses QUIC.
   const bool using_quic_;
 
-  // quic::QuicTransportVersion that should be used to connect to the QUIC
+  // quic::ParsedQuicVersion that should be used to connect to the QUIC
   // server if Job uses QUIC.
-  quic::QuicTransportVersion quic_version_;
+  quic::ParsedQuicVersion quic_version_;
 
   // True if Alternative Service protocol field requires that HTTP/2 is used.
   // In this case, Job fails if it cannot pool to an existing SpdySession and
@@ -518,7 +518,7 @@
       HostPortPair destination,
       GURL origin_url,
       NextProto alternative_protocol,
-      quic::QuicTransportVersion quic_version,
+      quic::ParsedQuicVersion quic_version,
       bool is_websocket,
       bool enable_ip_based_pooling,
       NetLog* net_log);
diff --git a/net/http/http_stream_factory_job_controller.cc b/net/http/http_stream_factory_job_controller.cc
index 4d3bcc185..d208cd01 100644
--- a/net/http/http_stream_factory_job_controller.cc
+++ b/net/http/http_stream_factory_job_controller.cc
@@ -681,11 +681,11 @@
     alternative_service_info_ =
         GetAlternativeServiceInfoFor(request_info_, delegate_, stream_type_);
   }
-  quic::QuicTransportVersion quic_version = quic::QUIC_VERSION_UNSUPPORTED;
+  quic::ParsedQuicVersion quic_version = quic::UnsupportedQuicVersion();
   if (alternative_service_info_.protocol() == kProtoQUIC) {
     quic_version =
         SelectQuicVersion(alternative_service_info_.advertised_versions());
-    DCHECK_NE(quic_version, quic::QUIC_VERSION_UNSUPPORTED);
+    DCHECK_NE(quic_version, quic::UnsupportedQuicVersion());
   }
 
   if (is_preconnect_) {
@@ -1060,7 +1060,7 @@
     // If there is no QUIC version in the advertised versions that is
     // supported, ignore this entry.
     if (SelectQuicVersion(alternative_service_info.advertised_versions()) ==
-        quic::QUIC_VERSION_UNSUPPORTED)
+        quic::UnsupportedQuicVersion())
       continue;
 
     // Check whether there is an existing QUIC session to use for this origin.
@@ -1095,23 +1095,23 @@
   return first_alternative_service_info;
 }
 
-quic::QuicTransportVersion HttpStreamFactory::JobController::SelectQuicVersion(
-    const quic::QuicTransportVersionVector& advertised_versions) {
-  const quic::QuicTransportVersionVector& supported_versions =
+quic::ParsedQuicVersion HttpStreamFactory::JobController::SelectQuicVersion(
+    const quic::ParsedQuicVersionVector& advertised_versions) {
+  const quic::ParsedQuicVersionVector& supported_versions =
       session_->params().quic_supported_versions;
   if (advertised_versions.empty())
     return supported_versions[0];
 
-  for (const quic::QuicTransportVersion& supported : supported_versions) {
-    for (const quic::QuicTransportVersion& advertised : advertised_versions) {
+  for (const quic::ParsedQuicVersion& supported : supported_versions) {
+    for (const quic::ParsedQuicVersion& advertised : advertised_versions) {
       if (supported == advertised) {
-        DCHECK_NE(quic::QUIC_VERSION_UNSUPPORTED, supported);
+        DCHECK_NE(quic::UnsupportedQuicVersion(), supported);
         return supported;
       }
     }
   }
 
-  return quic::QUIC_VERSION_UNSUPPORTED;
+  return quic::UnsupportedQuicVersion();
 }
 
 bool HttpStreamFactory::JobController::ShouldCreateAlternativeProxyServerJob(
diff --git a/net/http/http_stream_factory_job_controller.h b/net/http/http_stream_factory_job_controller.h
index e549dd0..f24cdd7a 100644
--- a/net/http/http_stream_factory_job_controller.h
+++ b/net/http/http_stream_factory_job_controller.h
@@ -250,13 +250,13 @@
       HttpStreamRequest::Delegate* delegate,
       HttpStreamRequest::StreamType stream_type);
 
-  // Returns a quic::QuicTransportVersion that has been advertised in
+  // Returns a quic::ParsedQuicVersion that has been advertised in
   // |advertised_versions| and is supported.  If more than one
-  // QuicTransportVersions are supported, the first matched in the supported
+  // ParsedQuicVersions are supported, the first matched in the supported
   // versions will be returned.  If no mutually supported version is found,
   // QUIC_VERSION_UNSUPPORTED_VERSION will be returned.
-  quic::QuicTransportVersion SelectQuicVersion(
-      const quic::QuicTransportVersionVector& advertised_versions);
+  quic::ParsedQuicVersion SelectQuicVersion(
+      const quic::ParsedQuicVersionVector& advertised_versions);
 
   // Returns true if the |request_| can be fetched via an alternative
   // proxy server, and sets |alternative_proxy_info| to the alternative proxy
diff --git a/net/http/http_stream_factory_job_controller_unittest.cc b/net/http/http_stream_factory_job_controller_unittest.cc
index 922b291..05c444f 100644
--- a/net/http/http_stream_factory_job_controller_unittest.cc
+++ b/net/http/http_stream_factory_job_controller_unittest.cc
@@ -841,7 +841,7 @@
   base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
   session_->http_server_properties()->SetQuicAlternativeService(
       server, alternative_service, expiration,
-      {quic::QUIC_VERSION_UNSUPPORTED});
+      {quic::UnsupportedQuicVersion()});
 
   request_ =
       job_controller_->Start(&request_delegate_, nullptr, net_log_.bound(),
@@ -2896,8 +2896,7 @@
 
   // Set alternative service with no advertised version.
   session_->http_server_properties()->SetQuicAlternativeService(
-      server, alternative_service, expiration,
-      quic::QuicTransportVersionVector());
+      server, alternative_service, expiration, quic::ParsedQuicVersionVector());
 
   AlternativeServiceInfo alt_svc_info =
       JobControllerPeer::GetAlternativeServiceInfoFor(
@@ -2908,7 +2907,7 @@
 
   // Set alternative service for the same server with the same list of versions
   // that is supported.
-  quic::QuicTransportVersionVector supported_versions =
+  quic::ParsedQuicVersionVector supported_versions =
       session_->params().quic_supported_versions;
   ASSERT_TRUE(session_->http_server_properties()->SetQuicAlternativeService(
       server, alternative_service, expiration, supported_versions));
@@ -2916,19 +2915,22 @@
   alt_svc_info = JobControllerPeer::GetAlternativeServiceInfoFor(
       job_controller_, request_info, &request_delegate_,
       HttpStreamRequest::HTTP_STREAM);
-  std::sort(supported_versions.begin(), supported_versions.end());
+  std::sort(
+      supported_versions.begin(), supported_versions.end(),
+      [](const quic::ParsedQuicVersion& a, const quic::ParsedQuicVersion& b) {
+        return a.transport_version < b.transport_version;
+      });
   EXPECT_EQ(supported_versions, alt_svc_info.advertised_versions());
 
-  quic::QuicTransportVersion unsupported_version_1(
-      quic::QUIC_VERSION_UNSUPPORTED);
-  quic::QuicTransportVersion unsupported_version_2(
-      quic::QUIC_VERSION_UNSUPPORTED);
-  for (const quic::QuicTransportVersion& version :
-       quic::AllSupportedTransportVersions()) {
+  quic::ParsedQuicVersion unsupported_version_1 =
+      quic::UnsupportedQuicVersion();
+  quic::ParsedQuicVersion unsupported_version_2 =
+      quic::UnsupportedQuicVersion();
+  for (const quic::ParsedQuicVersion& version : quic::AllSupportedVersions()) {
     if (std::find(supported_versions.begin(), supported_versions.end(),
                   version) != supported_versions.end())
       continue;
-    if (unsupported_version_1 == quic::QUIC_VERSION_UNSUPPORTED) {
+    if (unsupported_version_1 == quic::UnsupportedQuicVersion()) {
       unsupported_version_1 = version;
       continue;
     }
@@ -2939,7 +2941,7 @@
   // Set alternative service for the same server with two QUIC versions:
   // - one unsupported version: |unsupported_version_1|,
   // - one supported version: session_->params().quic_supported_versions[0].
-  quic::QuicTransportVersionVector mixed_quic_versions = {
+  quic::ParsedQuicVersionVector mixed_quic_versions = {
       unsupported_version_1, session_->params().quic_supported_versions[0]};
   ASSERT_TRUE(session_->http_server_properties()->SetQuicAlternativeService(
       server, alternative_service, expiration, mixed_quic_versions));
@@ -2949,7 +2951,11 @@
       HttpStreamRequest::HTTP_STREAM);
   EXPECT_EQ(2u, alt_svc_info.advertised_versions().size());
   // Verify that JobController returns the list of versions specified in set.
-  std::sort(mixed_quic_versions.begin(), mixed_quic_versions.end());
+  std::sort(
+      mixed_quic_versions.begin(), mixed_quic_versions.end(),
+      [](const quic::ParsedQuicVersion& a, const quic::ParsedQuicVersion& b) {
+        return a.transport_version < b.transport_version;
+      });
   EXPECT_EQ(mixed_quic_versions, alt_svc_info.advertised_versions());
 
   // Set alternative service for the same server with two unsupported QUIC
@@ -2984,7 +2990,7 @@
   // Set alternative service for www.google.com to be www.example.com over QUIC.
   url::SchemeHostPort server(request_info.url);
   base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
-  quic::QuicTransportVersionVector supported_versions =
+  quic::ParsedQuicVersionVector supported_versions =
       session_->params().quic_supported_versions;
   session_->http_server_properties()->SetQuicAlternativeService(
       server, AlternativeService(kProtoQUIC, "www.example.com", 443),
@@ -2995,7 +3001,11 @@
           job_controller_, request_info, &request_delegate_,
           HttpStreamRequest::HTTP_STREAM);
 
-  std::sort(supported_versions.begin(), supported_versions.end());
+  std::sort(
+      supported_versions.begin(), supported_versions.end(),
+      [](const quic::ParsedQuicVersion& a, const quic::ParsedQuicVersion& b) {
+        return a.transport_version < b.transport_version;
+      });
   EXPECT_EQ(kProtoQUIC, alt_svc_info.alternative_service().protocol);
   EXPECT_EQ(supported_versions, alt_svc_info.advertised_versions());
 
diff --git a/net/http/http_stream_factory_test_util.cc b/net/http/http_stream_factory_test_util.cc
index bd71aa00..1e898ceb 100644
--- a/net/http/http_stream_factory_test_util.cc
+++ b/net/http/http_stream_factory_test_util.cc
@@ -27,7 +27,7 @@
     HostPortPair destination,
     GURL origin_url,
     NextProto alternative_protocol,
-    quic::QuicTransportVersion quic_version,
+    quic::ParsedQuicVersion quic_version,
     const ProxyServer& alternative_proxy_server,
     bool is_websocket,
     bool enable_ip_based_pooling,
@@ -80,7 +80,7 @@
   auto main_job = std::make_unique<MockHttpStreamFactoryJob>(
       delegate, job_type, session, request_info, priority, proxy_info,
       SSLConfig(), SSLConfig(), destination, origin_url, kProtoUnknown,
-      quic::QUIC_VERSION_UNSUPPORTED, ProxyServer(), is_websocket,
+      quic::UnsupportedQuicVersion(), ProxyServer(), is_websocket,
       enable_ip_based_pooling, net_log);
 
   // Keep raw pointer to Job but pass ownership.
@@ -101,7 +101,7 @@
     HostPortPair destination,
     GURL origin_url,
     NextProto alternative_protocol,
-    quic::QuicTransportVersion quic_version,
+    quic::ParsedQuicVersion quic_version,
     bool is_websocket,
     bool enable_ip_based_pooling,
     NetLog* net_log) {
@@ -135,7 +135,7 @@
   auto alternative_job = std::make_unique<MockHttpStreamFactoryJob>(
       delegate, job_type, session, request_info, priority, proxy_info,
       SSLConfig(), SSLConfig(), destination, origin_url, kProtoUnknown,
-      quic::QUIC_VERSION_UNSUPPORTED, alternative_proxy_server, is_websocket,
+      quic::UnsupportedQuicVersion(), alternative_proxy_server, is_websocket,
       enable_ip_based_pooling, net_log);
 
   // Keep raw pointer to Job but pass ownership.
diff --git a/net/http/http_stream_factory_test_util.h b/net/http/http_stream_factory_test_util.h
index 5ce937a2..63ba8cc 100644
--- a/net/http/http_stream_factory_test_util.h
+++ b/net/http/http_stream_factory_test_util.h
@@ -112,7 +112,7 @@
                            HostPortPair destination,
                            GURL origin_url,
                            NextProto alternative_protocol,
-                           quic::QuicTransportVersion quic_version,
+                           quic::ParsedQuicVersion quic_version,
                            const ProxyServer& alternative_proxy_server,
                            bool is_websocket,
                            bool enable_ip_based_pooling,
@@ -158,7 +158,7 @@
       HostPortPair destination,
       GURL origin_url,
       NextProto alternative_protocol,
-      quic::QuicTransportVersion quic_version,
+      quic::ParsedQuicVersion quic_version,
       bool is_websocket,
       bool enable_ip_based_pooling,
       NetLog* net_log) override;
diff --git a/net/http/http_stream_factory_unittest.cc b/net/http/http_stream_factory_unittest.cc
index cc67340..ac5eacc 100644
--- a/net/http/http_stream_factory_unittest.cc
+++ b/net/http/http_stream_factory_unittest.cc
@@ -2173,7 +2173,7 @@
 class HttpStreamFactoryBidirectionalQuicTest
     : public TestWithScopedTaskEnvironment,
       public ::testing::WithParamInterface<
-          std::tuple<quic::QuicTransportVersion, bool>> {
+          std::tuple<quic::ParsedQuicVersion, bool>> {
  protected:
   HttpStreamFactoryBidirectionalQuicTest()
       : default_url_(kDefaultUrl),
@@ -2209,8 +2209,7 @@
 
   void Initialize() {
     params_.enable_quic = true;
-    params_.quic_supported_versions =
-        quic::test::SupportedTransportVersions(version_);
+    params_.quic_supported_versions = quic::test::SupportedVersions(version_);
     params_.quic_headers_include_h2_stream_dependency =
         client_headers_include_h2_stream_dependency_;
 
@@ -2265,11 +2264,12 @@
   const GURL default_url_;
 
   quic::QuicStreamId GetNthClientInitiatedBidirectionalStreamId(int n) {
-    return quic::test::GetNthClientInitiatedBidirectionalStreamId(version_, n);
+    return quic::test::GetNthClientInitiatedBidirectionalStreamId(
+        version_.transport_version, n);
   }
 
  private:
-  const quic::QuicTransportVersion version_;
+  const quic::ParsedQuicVersion version_;
   const bool client_headers_include_h2_stream_dependency_;
   quic::MockClock clock_;
   quic::test::MockRandom random_generator_;
@@ -2293,9 +2293,8 @@
 INSTANTIATE_TEST_SUITE_P(
     VersionIncludeStreamDependencySequence,
     HttpStreamFactoryBidirectionalQuicTest,
-    ::testing::Combine(
-        ::testing::ValuesIn(quic::AllSupportedTransportVersions()),
-        ::testing::Bool()));
+    ::testing::Combine(::testing::ValuesIn(quic::AllSupportedVersions()),
+                       ::testing::Bool()));
 
 TEST_P(HttpStreamFactoryBidirectionalQuicTest,
        RequestBidirectionalStreamImplQuicAlternative) {
diff --git a/net/http/http_util.cc b/net/http/http_util.cc
index 6c04368..1d2251e 100644
--- a/net/http/http_util.cc
+++ b/net/http/http_util.cc
@@ -665,51 +665,48 @@
 // In order for a line to be continuable, it must specify a
 // non-blank header-name. Line continuations are specifically for
 // header values -- do not allow headers names to span lines.
-static bool IsLineSegmentContinuable(const char* begin, const char* end) {
-  if (begin == end)
+static bool IsLineSegmentContinuable(base::StringPiece line) {
+  if (line.empty())
     return false;
 
-  const char* colon = std::find(begin, end, ':');
-  if (colon == end)
+  size_t colon = line.find(':');
+  if (colon == base::StringPiece::npos)
     return false;
 
-  const char* name_begin = begin;
-  const char* name_end = colon;
+  base::StringPiece name = line.substr(0, colon);
 
   // Name can't be empty.
-  if (name_begin == name_end)
+  if (name.empty())
     return false;
 
   // Can't start with LWS (this would imply the segment is a continuation)
-  if (HttpUtil::IsLWS(*name_begin))
+  if (HttpUtil::IsLWS(name[0]))
     return false;
 
   return true;
 }
 
 // Helper used by AssembleRawHeaders, to find the end of the status line.
-static const char* FindStatusLineEnd(const char* begin, const char* end) {
-  size_t i = base::StringPiece(begin, end - begin).find_first_of("\r\n");
+static size_t FindStatusLineEnd(base::StringPiece str) {
+  size_t i = str.find_first_of("\r\n");
   if (i == base::StringPiece::npos)
-    return end;
-  return begin + i;
+    return str.size();
+  return i;
 }
 
 // Helper used by AssembleRawHeaders, to skip past leading LWS.
-static const char* FindFirstNonLWS(const char* begin, const char* end) {
-  for (const char* cur = begin; cur != end; ++cur) {
-    if (!HttpUtil::IsLWS(*cur))
-      return cur;
+static base::StringPiece RemoveLeadingNonLWS(base::StringPiece str) {
+  for (size_t i = 0; i < str.size(); i++) {
+    if (!HttpUtil::IsLWS(str[i]))
+      return str.substr(i);
   }
-  return end;  // Not found.
+  return base::StringPiece();  // Remove everything.
 }
 
 std::string HttpUtil::AssembleRawHeaders(base::StringPiece input) {
   std::string raw_headers;
   raw_headers.reserve(input.size());
 
-  const char* input_end = input.data() + input.size();
-
   // Skip any leading slop, since the consumers of this output
   // (HttpResponseHeaders) don't deal with it.
   size_t status_begin_offset =
@@ -718,36 +715,37 @@
     input.remove_prefix(status_begin_offset);
 
   // Copy the status line.
-  const char* status_line_end = FindStatusLineEnd(input.data(), input_end);
-  raw_headers.append(input.data(), status_line_end);
+  size_t status_line_end = FindStatusLineEnd(input);
+  input.substr(0, status_line_end).AppendToString(&raw_headers);
+  input.remove_prefix(status_line_end);
 
   // After the status line, every subsequent line is a header line segment.
   // Should a segment start with LWS, it is a continuation of the previous
   // line's field-value.
 
   // TODO(ericroman): is this too permissive? (delimits on [\r\n]+)
-  base::CStringTokenizer lines(status_line_end, input_end, "\r\n");
+  base::CStringTokenizer lines(input.data(), input.data() + input.size(),
+                               "\r\n");
 
   // This variable is true when the previous line was continuable.
   bool prev_line_continuable = false;
 
   while (lines.GetNext()) {
-    const char* line_begin = lines.token_begin();
-    const char* line_end = lines.token_end();
+    base::StringPiece line = lines.token_piece();
 
-    if (prev_line_continuable && IsLWS(*line_begin)) {
+    if (prev_line_continuable && IsLWS(line[0])) {
       // Join continuation; reduce the leading LWS to a single SP.
       raw_headers.push_back(' ');
-      raw_headers.append(FindFirstNonLWS(line_begin, line_end), line_end);
+      RemoveLeadingNonLWS(line).AppendToString(&raw_headers);
     } else {
       // Terminate the previous line.
       raw_headers.push_back('\n');
 
       // Copy the raw data to output.
-      raw_headers.append(line_begin, line_end);
+      line.AppendToString(&raw_headers);
 
       // Check if the current line can be continued.
-      prev_line_continuable = IsLineSegmentContinuable(line_begin, line_end);
+      prev_line_continuable = IsLineSegmentContinuable(line);
     }
   }
 
diff --git a/net/http/http_util_unittest.cc b/net/http/http_util_unittest.cc
index 55672d5..74674f81 100644
--- a/net/http/http_util_unittest.cc
+++ b/net/http/http_util_unittest.cc
@@ -12,10 +12,6 @@
 
 namespace net {
 
-namespace {
-class HttpUtilTest : public testing::Test {};
-}
-
 TEST(HttpUtilTest, IsSafeHeader) {
   static const char* const unsafe_headers[] = {
     "sec-",
diff --git a/net/quic/bidirectional_stream_quic_impl_unittest.cc b/net/quic/bidirectional_stream_quic_impl_unittest.cc
index 3f94e0b..4ee06cc 100644
--- a/net/quic/bidirectional_stream_quic_impl_unittest.cc
+++ b/net/quic/bidirectional_stream_quic_impl_unittest.cc
@@ -392,7 +392,7 @@
 
 class BidirectionalStreamQuicImplTest
     : public ::testing::TestWithParam<
-          std::tuple<quic::QuicTransportVersion, bool>>,
+          std::tuple<quic::ParsedQuicVersion, bool>>,
       public WithScopedTaskEnvironment {
  protected:
   static const bool kFin = true;
@@ -499,8 +499,7 @@
         helper_.get(), alarm_factory_.get(),
         new QuicChromiumPacketWriter(socket.get(), runner_.get()),
         true /* owns_writer */, quic::Perspective::IS_CLIENT,
-        quic::test::SupportedVersions(
-            quic::ParsedQuicVersion(quic::PROTOCOL_QUIC_CRYPTO, version_)));
+        quic::test::SupportedVersions(version_));
     if (connection_->version().KnowsWhichDecrypterToUse()) {
       connection_->InstallDecrypter(quic::ENCRYPTION_FORWARD_SECURE,
                                     quic::QuicMakeUnique<quic::NullDecrypter>(
@@ -821,11 +820,12 @@
   QuicChromiumClientSession* session() const { return session_.get(); }
 
   quic::QuicStreamId GetNthClientInitiatedBidirectionalStreamId(int n) {
-    return quic::test::GetNthClientInitiatedBidirectionalStreamId(version_, n);
+    return quic::test::GetNthClientInitiatedBidirectionalStreamId(
+        version_.transport_version, n);
   }
 
   std::string ConstructDataHeader(size_t body_len) {
-    if (version_ != quic::QUIC_VERSION_99) {
+    if (version_.transport_version != quic::QUIC_VERSION_99) {
       return "";
     }
     quic::HttpEncoder encoder;
@@ -835,7 +835,7 @@
   }
 
  protected:
-  const quic::QuicTransportVersion version_;
+  const quic::ParsedQuicVersion version_;
   const bool client_headers_include_h2_stream_dependency_;
   BoundTestNetLog net_log_;
   scoped_refptr<TestTaskRunner> runner_;
@@ -868,9 +868,8 @@
 INSTANTIATE_TEST_SUITE_P(
     Version,
     BidirectionalStreamQuicImplTest,
-    ::testing::Combine(
-        ::testing::ValuesIn(quic::AllSupportedTransportVersions()),
-        ::testing::Bool()));
+    ::testing::Combine(::testing::ValuesIn(quic::AllSupportedVersions()),
+                       ::testing::Bool()));
 
 TEST_P(BidirectionalStreamQuicImplTest, GetRequest) {
   SetRequest("GET", "/", DEFAULT_PRIORITY);
@@ -1064,7 +1063,7 @@
   AddWrite(ConstructRequestHeadersPacketInner(
       2, GetNthClientInitiatedBidirectionalStreamId(0), !kFin, DEFAULT_PRIORITY,
       &spdy_request_headers_frame_length, &header_stream_offset));
-  if (version_ != quic::QUIC_VERSION_99) {
+  if (version_.transport_version != quic::QUIC_VERSION_99) {
     AddWrite(ConstructClientMultipleDataFramesPacket(3, kIncludeVersion, !kFin,
                                                      0, {kBody1, kBody2}));
   } else {
@@ -1082,7 +1081,7 @@
   std::string header5 = ConstructDataHeader(strlen(kBody5));
   quic::QuicStreamOffset data_offset =
       strlen(kBody1) + strlen(kBody2) + header.length() + header2.length();
-  if (version_ != quic::QUIC_VERSION_99) {
+  if (version_.transport_version != quic::QUIC_VERSION_99) {
     AddWrite(ConstructClientMultipleDataFramesPacket(
         5, !kIncludeVersion, kFin, data_offset, {kBody3, kBody4, kBody5}));
   } else {
@@ -1199,7 +1198,7 @@
   AddWrite(ConstructInitialSettingsPacket(1, &header_stream_offset));
   const char kBody1[] = "here are some data";
   std::string header = ConstructDataHeader(strlen(kBody1));
-  if (version_ == quic::QUIC_VERSION_99) {
+  if (version_.transport_version == quic::QUIC_VERSION_99) {
     AddWrite(ConstructRequestHeadersAndMultipleDataFramesPacket(
         2, !kFin, DEFAULT_PRIORITY, &header_stream_offset,
         &spdy_request_headers_frame_length, {header, kBody1}));
@@ -1214,7 +1213,7 @@
   const char kBody2[] = "really small";
   std::string header2 = ConstructDataHeader(strlen(kBody2));
   quic::QuicStreamOffset data_offset = strlen(kBody1) + header.length();
-  if (version_ == quic::QUIC_VERSION_99) {
+  if (version_.transport_version == quic::QUIC_VERSION_99) {
     AddWrite(ConstructClientMultipleDataFramesPacket(
         4, !kIncludeVersion, kFin, data_offset, {header2, kBody2}));
   } else {
@@ -1318,7 +1317,7 @@
   std::string header = ConstructDataHeader(strlen(kBody1));
   std::string header2 = ConstructDataHeader(strlen(kBody2));
 
-  if (version_ == quic::QUIC_VERSION_99) {
+  if (version_.transport_version == quic::QUIC_VERSION_99) {
     AddWrite(ConstructRequestHeadersAndMultipleDataFramesPacket(
         2, !kFin, DEFAULT_PRIORITY, &header_stream_offset,
         &spdy_request_headers_frame_length, {header, kBody1, header2, kBody2}));
@@ -1338,7 +1337,7 @@
   std::string header5 = ConstructDataHeader(strlen(kBody5));
   quic::QuicStreamOffset data_offset =
       strlen(kBody1) + strlen(kBody2) + header.length() + header2.length();
-  if (version_ == quic::QUIC_VERSION_99) {
+  if (version_.transport_version == quic::QUIC_VERSION_99) {
     AddWrite(ConstructClientMultipleDataFramesPacket(
         4, !kIncludeVersion, kFin, data_offset,
         {header3, kBody3, header4, kBody4, header5, kBody5}));
@@ -1525,7 +1524,7 @@
       2, GetNthClientInitiatedBidirectionalStreamId(0), !kFin, DEFAULT_PRIORITY,
       &spdy_request_headers_frame_length, &header_stream_offset));
   std::string header = ConstructDataHeader(strlen(kUploadData));
-  if (version_ == quic::QUIC_VERSION_99) {
+  if (version_.transport_version == quic::QUIC_VERSION_99) {
     AddWrite(ConstructClientMultipleDataFramesPacket(3, kIncludeVersion, kFin,
                                                      0, {header, kUploadData}));
   } else {
@@ -1618,7 +1617,7 @@
       2, GetNthClientInitiatedBidirectionalStreamId(0), !kFin, DEFAULT_PRIORITY,
       &spdy_request_headers_frame_length, &header_stream_offset));
   std::string header = ConstructDataHeader(strlen(kUploadData));
-  if (version_ == quic::QUIC_VERSION_99) {
+  if (version_.transport_version == quic::QUIC_VERSION_99) {
     AddWrite(ConstructClientMultipleDataFramesPacket(3, kIncludeVersion, kFin,
                                                      0, {header, kUploadData}));
   } else {
@@ -1713,7 +1712,7 @@
       &spdy_request_headers_frame_length, &header_stream_offset));
 
   std::string header = ConstructDataHeader(strlen(kUploadData));
-  if (version_ != quic::QUIC_VERSION_99) {
+  if (version_.transport_version != quic::QUIC_VERSION_99) {
     AddWrite(ConstructAckAndDataPacket(3, !kIncludeVersion, 2, 1, 2, !kFin, 0,
                                        kUploadData, &client_maker_));
     AddWrite(ConstructAckAndDataPacket(4, !kIncludeVersion, 3, 3, 3, kFin,
@@ -2262,7 +2261,7 @@
       2, GetNthClientInitiatedBidirectionalStreamId(0), !kFin, DEFAULT_PRIORITY,
       &spdy_request_headers_frame_length, &header_stream_offset));
   std::string header = ConstructDataHeader(strlen(kBody));
-  if (version_ == quic::QUIC_VERSION_99) {
+  if (version_.transport_version == quic::QUIC_VERSION_99) {
     AddWrite(ConstructClientMultipleDataFramesPacket(3, kIncludeVersion, kFin,
                                                      0, {header, kBody}));
   } else {
diff --git a/net/quic/mock_decrypter.cc b/net/quic/mock_decrypter.cc
index 689c58d..3a99ad42 100644
--- a/net/quic/mock_decrypter.cc
+++ b/net/quic/mock_decrypter.cc
@@ -11,7 +11,6 @@
 using quic::Perspective;
 using quic::QuicPacketNumber;
 using quic::QuicStringPiece;
-using quic::QuicTransportVersion;
 
 namespace net {
 
diff --git a/net/quic/mock_encrypter.cc b/net/quic/mock_encrypter.cc
index 147cdda..0984631 100644
--- a/net/quic/mock_encrypter.cc
+++ b/net/quic/mock_encrypter.cc
@@ -11,7 +11,6 @@
 using quic::Perspective;
 using quic::QuicPacketNumber;
 using quic::QuicStringPiece;
-using quic::QuicTransportVersion;
 
 namespace net {
 
diff --git a/net/quic/quic_chromium_client_session_test.cc b/net/quic/quic_chromium_client_session_test.cc
index be97e603..f81af100 100644
--- a/net/quic/quic_chromium_client_session_test.cc
+++ b/net/quic/quic_chromium_client_session_test.cc
@@ -83,7 +83,7 @@
 
 class QuicChromiumClientSessionTest
     : public ::testing::TestWithParam<
-          std::tuple<quic::QuicTransportVersion, bool>>,
+          std::tuple<quic::ParsedQuicVersion, bool>>,
       public WithScopedTaskEnvironment {
  public:
   QuicChromiumClientSessionTest()
@@ -140,8 +140,7 @@
         quic::QuicUtils::CreateRandomConnectionId(&random_),
         quic::QuicSocketAddress(quic::QuicSocketAddressImpl(kIpEndPoint)),
         &helper_, &alarm_factory_, writer, true, quic::Perspective::IS_CLIENT,
-        quic::test::SupportedVersions(
-            quic::ParsedQuicVersion(quic::PROTOCOL_QUIC_CRYPTO, version_)));
+        quic::test::SupportedVersions(version_));
     session_.reset(new TestingQuicChromiumClientSession(
         connection, std::move(socket),
         /*stream_factory=*/nullptr, &crypto_client_stream_factory_, &clock_,
@@ -199,17 +198,19 @@
   }
 
   quic::QuicStreamId GetNthClientInitiatedBidirectionalStreamId(int n) {
-    return quic::test::GetNthClientInitiatedBidirectionalStreamId(version_, n);
+    return quic::test::GetNthClientInitiatedBidirectionalStreamId(
+        version_.transport_version, n);
   }
 
   quic::QuicStreamId GetNthServerInitiatedUnidirectionalStreamId(int n) {
-    return quic::test::GetNthServerInitiatedUnidirectionalStreamId(version_, n);
+    return quic::test::GetNthServerInitiatedUnidirectionalStreamId(
+        version_.transport_version, n);
   }
 
   size_t GetMaxAllowedOutgoingBidirectionalStreams() {
     quic::QuicSession* quic_session =
         dynamic_cast<quic::QuicSession*>(&*session_);
-    if (version_ != quic::QUIC_VERSION_99) {
+    if (version_.transport_version != quic::QUIC_VERSION_99) {
       return quic::test::QuicSessionPeer::GetStreamIdManager(quic_session)
           ->max_open_outgoing_streams();
     }
@@ -222,7 +223,7 @@
            2;
   }
 
-  const quic::QuicTransportVersion version_;
+  const quic::ParsedQuicVersion version_;
   const bool client_headers_include_h2_stream_dependency_;
   QuicFlagSaver flags_;  // Save/restore all QUIC flag values.
   quic::QuicCryptoClientConfig crypto_config_;
@@ -253,9 +254,8 @@
 INSTANTIATE_TEST_SUITE_P(
     VersionIncludeStreamDependencySequence,
     QuicChromiumClientSessionTest,
-    ::testing::Combine(
-        ::testing::ValuesIn(quic::AllSupportedTransportVersions()),
-        ::testing::Bool()));
+    ::testing::Combine(::testing::ValuesIn(quic::AllSupportedVersions()),
+                       ::testing::Bool()));
 
 TEST_P(QuicChromiumClientSessionTest, IsFatalErrorNotSetForNonFatalError) {
   MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
@@ -331,7 +331,7 @@
       session_->CreateHandle(destination_);
   EXPECT_TRUE(handle->IsConnected());
   EXPECT_FALSE(handle->IsCryptoHandshakeConfirmed());
-  EXPECT_EQ(version_, handle->GetQuicVersion());
+  EXPECT_EQ(version_.transport_version, handle->GetQuicVersion());
   EXPECT_EQ(session_key_.server_id(), handle->server_id());
   EXPECT_EQ(session_net_log.source().type, handle->net_log().source().type);
   EXPECT_EQ(session_net_log.source().id, handle->net_log().source().id);
@@ -360,7 +360,7 @@
   // Veirfy that the handle works correctly after the session is closed.
   EXPECT_FALSE(handle->IsConnected());
   EXPECT_TRUE(handle->IsCryptoHandshakeConfirmed());
-  EXPECT_EQ(version_, handle->GetQuicVersion());
+  EXPECT_EQ(version_.transport_version, handle->GetQuicVersion());
   EXPECT_EQ(session_key_.server_id(), handle->server_id());
   EXPECT_EQ(session_net_log.source().type, handle->net_log().source().type);
   EXPECT_EQ(session_net_log.source().id, handle->net_log().source().id);
@@ -385,7 +385,7 @@
   // Veirfy that the handle works correctly after the session is deleted.
   EXPECT_FALSE(handle->IsConnected());
   EXPECT_TRUE(handle->IsCryptoHandshakeConfirmed());
-  EXPECT_EQ(version_, handle->GetQuicVersion());
+  EXPECT_EQ(version_.transport_version, handle->GetQuicVersion());
   EXPECT_EQ(session_key_.server_id(), handle->server_id());
   EXPECT_EQ(session_net_log.source().type, handle->net_log().source().type);
   EXPECT_EQ(session_net_log.source().id, handle->net_log().source().id);
@@ -512,7 +512,7 @@
   MockQuicData quic_data;
   quic_data.AddWrite(SYNCHRONOUS,
                      client_maker_.MakeInitialSettingsPacket(1, nullptr));
-  if (version_ == quic::QUIC_VERSION_99) {
+  if (version_.transport_version == quic::QUIC_VERSION_99) {
     // The open stream limit is set to 50 by
     // MockCryptoClientStream::SetConfigNegotiated() so when the 51st stream is
     // requested, a STREAMS_BLOCKED will be sent, indicating that it's blocked
@@ -566,7 +566,7 @@
                                GetNthClientInitiatedBidirectionalStreamId(0),
                                quic::QUIC_STREAM_CANCELLED, 0);
   session_->OnRstStream(rst);
-  if (version_ == quic::QUIC_VERSION_99) {
+  if (version_.transport_version == quic::QUIC_VERSION_99) {
     // For version99, to close the stream completely, we also must receive a
     // STOP_SENDING frame:
     quic::QuicStopSendingFrame stop_sending(
@@ -591,7 +591,7 @@
   MockQuicData quic_data;
   quic_data.AddWrite(SYNCHRONOUS,
                      client_maker_.MakeInitialSettingsPacket(1, nullptr));
-  if (version_ == quic::QUIC_VERSION_99) {
+  if (version_.transport_version == quic::QUIC_VERSION_99) {
     // The open stream limit is set to 50 by
     // MockCryptoClientStream::SetConfigNegotiated() so when the 51st stream is
     // requested, a STREAMS_BLOCKED will be sent, indicating that it's blocked
@@ -656,7 +656,7 @@
   MockQuicData quic_data;
   quic_data.AddWrite(SYNCHRONOUS,
                      client_maker_.MakeInitialSettingsPacket(1, nullptr));
-  if (version_ == quic::QUIC_VERSION_99) {
+  if (version_.transport_version == quic::QUIC_VERSION_99) {
     // The open stream limit is set to 50 by
     // MockCryptoClientStream::SetConfigNegotiated() so when the 51st stream is
     // requested, a STREAMS_BLOCKED will be sent.
@@ -708,7 +708,7 @@
                                GetNthClientInitiatedBidirectionalStreamId(0),
                                quic::QUIC_STREAM_CANCELLED, 0);
   session_->OnRstStream(rst);
-  if (version_ == quic::QUIC_VERSION_99) {
+  if (version_.transport_version == quic::QUIC_VERSION_99) {
     // For version99, we require a STOP_SENDING as well as a RESET_STREAM to
     // fully close the stream.
     quic::QuicStopSendingFrame stop_sending(
@@ -791,7 +791,7 @@
   MockQuicData quic_data;
   quic_data.AddWrite(SYNCHRONOUS,
                      client_maker_.MakeInitialSettingsPacket(1, nullptr));
-  if (version_ == quic::QUIC_VERSION_99) {
+  if (version_.transport_version == quic::QUIC_VERSION_99) {
     quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeStreamsBlockedPacket(
                                         2, true, 52,
                                         /*unidirectional=*/false));
@@ -838,7 +838,7 @@
   MockQuicData quic_data;
   quic_data.AddWrite(SYNCHRONOUS,
                      client_maker_.MakeInitialSettingsPacket(1, nullptr));
-  if (version_ == quic::QUIC_VERSION_99) {
+  if (version_.transport_version == quic::QUIC_VERSION_99) {
     // Initial configuration is 50 dynamic streams. Taking into account
     // the two static streams (crypto and headers), expect to block on
     // when hitting the limit of 52 streams
@@ -1182,7 +1182,7 @@
   MockQuicData quic_data;
   quic_data.AddWrite(SYNCHRONOUS,
                      client_maker_.MakeInitialSettingsPacket(1, nullptr));
-  if (version_ == quic::QUIC_VERSION_99) {
+  if (version_.transport_version == quic::QUIC_VERSION_99) {
     quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeStreamsBlockedPacket(
                                         2, true, 52,
                                         /*unidirectional=*/false));
@@ -1557,7 +1557,7 @@
 }
 
 TEST_P(QuicChromiumClientSessionTest, DetectPathDegradingDuringHandshake) {
-  if (version_ >= quic::QUIC_VERSION_47) {
+  if (version_.transport_version >= quic::QUIC_VERSION_47) {
     // TODO(nharper): reenable once MakeDummyCHLOPacket() fixed
     return;
   }
diff --git a/net/quic/quic_flags_list.h b/net/quic/quic_flags_list.h
index 4e31dfd8..97b8d68 100644
--- a/net/quic/quic_flags_list.h
+++ b/net/quic/quic_flags_list.h
@@ -343,3 +343,8 @@
 QUIC_FLAG(bool,
           FLAGS_quic_reloadable_flag_quic_terminate_gquic_connection_as_ietf,
           false)
+
+// If true, disable QUIC trial decryption in V44 and above.
+QUIC_FLAG(bool,
+          FLAGS_quic_reloadable_flag_quic_v44_disable_trial_decryption,
+          false)
diff --git a/net/quic/quic_http_stream_test.cc b/net/quic/quic_http_stream_test.cc
index b2e826e..781b0a4 100644
--- a/net/quic/quic_http_stream_test.cc
+++ b/net/quic/quic_http_stream_test.cc
@@ -171,7 +171,7 @@
 };
 
 class QuicHttpStreamTest : public ::testing::TestWithParam<
-                               std::tuple<quic::QuicTransportVersion, bool>>,
+                               std::tuple<quic::ParsedQuicVersion, bool>>,
                            public WithScopedTaskEnvironment {
  public:
   void CloseStream(QuicHttpStream* stream, int /*rv*/) { stream->Close(false); }
@@ -296,9 +296,8 @@
     alarm_factory_.reset(new QuicChromiumAlarmFactory(runner_.get(), &clock_));
 
     connection_ = new TestQuicConnection(
-        quic::test::SupportedVersions(
-            quic::ParsedQuicVersion(quic::PROTOCOL_QUIC_CRYPTO, version_)),
-        connection_id_, peer_addr_, helper_.get(), alarm_factory_.get(),
+        quic::test::SupportedVersions(version_), connection_id_, peer_addr_,
+        helper_.get(), alarm_factory_.get(),
         new QuicChromiumPacketWriter(
             socket.get(), base::ThreadTaskRunnerHandle::Get().get()));
     connection_->set_visitor(&visitor_);
@@ -639,7 +638,7 @@
   }
 
   std::string ConstructDataHeader(size_t body_len) {
-    if (version_ != quic::QUIC_VERSION_99) {
+    if (version_.transport_version != quic::QUIC_VERSION_99) {
       return "";
     }
     quic::HttpEncoder encoder;
@@ -670,14 +669,16 @@
   }
 
   quic::QuicStreamId GetNthClientInitiatedBidirectionalStreamId(int n) {
-    return quic::test::GetNthClientInitiatedBidirectionalStreamId(version_, n);
+    return quic::test::GetNthClientInitiatedBidirectionalStreamId(
+        version_.transport_version, n);
   }
 
   quic::QuicStreamId GetNthServerInitiatedUnidirectionalStreamId(int n) {
-    return quic::test::GetNthServerInitiatedUnidirectionalStreamId(version_, n);
+    return quic::test::GetNthServerInitiatedUnidirectionalStreamId(
+        version_.transport_version, n);
   }
 
-  const quic::QuicTransportVersion version_;
+  const quic::ParsedQuicVersion version_;
   const bool client_headers_include_h2_stream_dependency_;
 
   BoundTestNetLog net_log_;
@@ -729,9 +730,8 @@
 INSTANTIATE_TEST_SUITE_P(
     VersionIncludeStreamDependencySequence,
     QuicHttpStreamTest,
-    ::testing::Combine(
-        ::testing::ValuesIn(quic::AllSupportedTransportVersions()),
-        ::testing::Bool()));
+    ::testing::Combine(::testing::ValuesIn(quic::AllSupportedVersions()),
+                       ::testing::Bool()));
 
 TEST_P(QuicHttpStreamTest, RenewStreamForAuth) {
   Initialize();
@@ -1245,7 +1245,7 @@
   AddWrite(ConstructInitialSettingsPacket(&header_stream_offset));
 
   std::string header = ConstructDataHeader(strlen(kUploadData));
-  if (version_ != quic::QUIC_VERSION_99) {
+  if (version_.transport_version != quic::QUIC_VERSION_99) {
     AddWrite(ConstructRequestHeadersAndDataFramesPacket(
         2, GetNthClientInitiatedBidirectionalStreamId(0), kIncludeVersion, kFin,
         DEFAULT_PRIORITY, 0, &header_stream_offset,
@@ -1326,7 +1326,7 @@
   quic::QuicStreamOffset header_stream_offset = 0;
   AddWrite(ConstructInitialSettingsPacket(&header_stream_offset));
   std::string header = ConstructDataHeader(strlen(kUploadData));
-  if (version_ != quic::QUIC_VERSION_99) {
+  if (version_.transport_version != quic::QUIC_VERSION_99) {
     AddWrite(ConstructRequestHeadersAndDataFramesPacket(
         2, GetNthClientInitiatedBidirectionalStreamId(0), kIncludeVersion, kFin,
         DEFAULT_PRIORITY, 0, &header_stream_offset,
@@ -1410,7 +1410,7 @@
   quic::QuicStreamOffset header_stream_offset = 0;
   AddWrite(ConstructInitialSettingsPacket(&header_stream_offset));
   std::string header = ConstructDataHeader(chunk_size);
-  if (version_ == quic::QUIC_VERSION_99) {
+  if (version_.transport_version == quic::QUIC_VERSION_99) {
     AddWrite(ConstructRequestHeadersAndDataFramesPacket(
         2, GetNthClientInitiatedBidirectionalStreamId(0), kIncludeVersion,
         !kFin, DEFAULT_PRIORITY, 0, &header_stream_offset,
@@ -1497,7 +1497,7 @@
   AddWrite(ConstructInitialSettingsPacket(&header_stream_offset));
   std::string header = ConstructDataHeader(chunk_size);
 
-  if (version_ != quic::QUIC_VERSION_99) {
+  if (version_.transport_version != quic::QUIC_VERSION_99) {
     AddWrite(ConstructRequestHeadersAndDataFramesPacket(
         2, GetNthClientInitiatedBidirectionalStreamId(0), kIncludeVersion,
         !kFin, DEFAULT_PRIORITY, 0, &header_stream_offset,
@@ -1734,7 +1734,7 @@
   quic::QuicStreamOffset header_stream_offset = 0;
   AddWrite(ConstructInitialSettingsPacket(&header_stream_offset));
   std::string header = ConstructDataHeader(strlen(kUploadData));
-  if (version_ != quic::QUIC_VERSION_99) {
+  if (version_.transport_version != quic::QUIC_VERSION_99) {
     AddWrite(ConstructRequestHeadersAndDataFramesPacket(
         2, GetNthClientInitiatedBidirectionalStreamId(0), kIncludeVersion,
         !kFin, DEFAULT_PRIORITY, 0, &header_stream_offset,
@@ -1895,7 +1895,7 @@
   quic::QuicStreamOffset header_stream_offset = 0;
   AddWrite(ConstructInitialSettingsPacket(&header_stream_offset));
   std::string header = ConstructDataHeader(strlen(kUploadData));
-  if (version_ != quic::QUIC_VERSION_99) {
+  if (version_.transport_version != quic::QUIC_VERSION_99) {
     AddWrite(ConstructRequestHeadersAndDataFramesPacket(
         2, GetNthClientInitiatedBidirectionalStreamId(0), kIncludeVersion,
         !kFin, DEFAULT_PRIORITY, 0, &header_stream_offset,
@@ -2312,16 +2312,16 @@
 
   uint64_t client_packet_number = 2;
   if (client_headers_include_h2_stream_dependency_ &&
-      version_ >= quic::QUIC_VERSION_43) {
+      version_.transport_version >= quic::QUIC_VERSION_43) {
     AddWrite(ConstructClientPriorityPacket(
         client_packet_number++, kIncludeVersion, promise_id_, 0,
         DEFAULT_PRIORITY, &header_stream_offset));
   }
   AddWrite(ConstructClientRstStreamVaryMismatchAndRequestHeadersPacket(
       client_packet_number++,
-      stream_id_ + quic::QuicUtils::StreamIdDelta(version_), !kIncludeVersion,
-      kFin, DEFAULT_PRIORITY, promise_id_, &spdy_request_header_frame_length,
-      &header_stream_offset));
+      stream_id_ + quic::QuicUtils::StreamIdDelta(version_.transport_version),
+      !kIncludeVersion, kFin, DEFAULT_PRIORITY, promise_id_,
+      &spdy_request_header_frame_length, &header_stream_offset));
   AddWrite(ConstructClientAckPacket(client_packet_number++, 3, 1, 2));
   AddWrite(ConstructClientRstStreamCancelledPacket(client_packet_number++));
 
@@ -2381,7 +2381,7 @@
   EXPECT_EQ(
       QuicHttpStreamPeer::GetQuicChromiumClientStream(promised_stream_.get())
           ->id(),
-      stream_id_ + quic::QuicUtils::StreamIdDelta(version_));
+      stream_id_ + quic::QuicUtils::StreamIdDelta(version_.transport_version));
 
   // After rendezvous failure, the push stream has been cancelled.
   EXPECT_EQ(session_->GetPromisedByUrl(promise_url_), nullptr);
@@ -2395,8 +2395,9 @@
   SetResponse("404 Not Found", string());
   size_t spdy_response_header_frame_length;
   ProcessPacket(InnerConstructResponseHeadersPacket(
-      3, stream_id_ + quic::QuicUtils::StreamIdDelta(version_), kFin,
-      &spdy_response_header_frame_length));
+      3,
+      stream_id_ + quic::QuicUtils::StreamIdDelta(version_.transport_version),
+      kFin, &spdy_response_header_frame_length));
 
   base::RunLoop().RunUntilIdle();
 
diff --git a/net/quic/quic_http_utils.cc b/net/quic/quic_http_utils.cc
index fa9ab08..1f1f2762 100644
--- a/net/quic/quic_http_utils.cc
+++ b/net/quic/quic_http_utils.cc
@@ -57,18 +57,18 @@
   return dict;
 }
 
-quic::QuicTransportVersionVector FilterSupportedAltSvcVersions(
+quic::ParsedQuicVersionVector FilterSupportedAltSvcVersions(
     const spdy::SpdyAltSvcWireFormat::AlternativeService& quic_alt_svc,
-    const quic::QuicTransportVersionVector& supported_versions,
+    const quic::ParsedQuicVersionVector& supported_versions,
     bool support_ietf_format_quic_altsvc) {
-  quic::QuicTransportVersionVector supported_alt_svc_versions;
+  quic::ParsedQuicVersionVector supported_alt_svc_versions;
   if (support_ietf_format_quic_altsvc && quic_alt_svc.protocol_id == "hq") {
     // Using IETF format for advertising QUIC. In this case,
     // |alternative_service_entry.version| will store QUIC version labels.
     for (uint32_t quic_version_label : quic_alt_svc.version) {
-      for (quic::QuicTransportVersion supported : supported_versions) {
+      for (quic::ParsedQuicVersion supported : supported_versions) {
         quic::QuicVersionLabel supported_version_label_network_order =
-            QuicVersionToQuicVersionLabel(supported);
+            CreateQuicVersionLabel(supported);
         if (supported_version_label_network_order == quic_version_label) {
           supported_alt_svc_versions.push_back(supported);
           RecordAltSvcFormat(IETF_FORMAT);
@@ -77,8 +77,9 @@
     }
   } else if (quic_alt_svc.protocol_id == "quic") {
     for (uint32_t quic_version : quic_alt_svc.version) {
-      for (quic::QuicTransportVersion supported : supported_versions) {
-        if (static_cast<uint32_t>(supported) == quic_version) {
+      for (quic::ParsedQuicVersion supported : supported_versions) {
+        if (static_cast<uint32_t>(supported.transport_version) ==
+            quic_version) {
           supported_alt_svc_versions.push_back(supported);
           RecordAltSvcFormat(GOOGLE_FORMAT);
         }
diff --git a/net/quic/quic_http_utils.h b/net/quic/quic_http_utils.h
index 5990ad1..3fe19fc 100644
--- a/net/quic/quic_http_utils.h
+++ b/net/quic/quic_http_utils.h
@@ -36,11 +36,11 @@
     const spdy::SpdyHeaderBlock* headers,
     NetLogCaptureMode capture_mode);
 
-// Parses |alt_svc_versions| into a quic::QuicTransportVersionVector and removes
+// Parses |alt_svc_versions| into a quic::ParsedQuicVersionVector and removes
 // all entries that aren't found in |supported_versions|.
-NET_EXPORT quic::QuicTransportVersionVector FilterSupportedAltSvcVersions(
+NET_EXPORT quic::ParsedQuicVersionVector FilterSupportedAltSvcVersions(
     const spdy::SpdyAltSvcWireFormat::AlternativeService& quic_alt_svc,
-    const quic::QuicTransportVersionVector& supported_versions,
+    const quic::ParsedQuicVersionVector& supported_versions,
     bool support_ietf_format_quic_altsvc);
 
 }  // namespace net
diff --git a/net/quic/quic_http_utils_test.cc b/net/quic/quic_http_utils_test.cc
index 2d070e2..8a92955 100644
--- a/net/quic/quic_http_utils_test.cc
+++ b/net/quic/quic_http_utils_test.cc
@@ -12,6 +12,9 @@
 #include "net/third_party/quiche/src/spdy/core/spdy_alt_svc_wire_format.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+using quic::ParsedQuicVersion;
+using quic::PROTOCOL_QUIC_CRYPTO;
+
 namespace net {
 namespace test {
 
@@ -38,8 +41,10 @@
 }
 
 TEST(QuicHttpUtilsTest, FilterSupportedAltSvcVersions) {
-  quic::QuicTransportVersionVector supported_versions = {
-      quic::QUIC_VERSION_46, quic::QUIC_VERSION_39, quic::QUIC_VERSION_44};
+  quic::ParsedQuicVersionVector supported_versions = {
+      ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, quic::QUIC_VERSION_46),
+      ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, quic::QUIC_VERSION_39),
+      ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, quic::QUIC_VERSION_44)};
 
   std::vector<uint32_t> alt_svc_versions_google = {quic::QUIC_VERSION_44,
                                                    quic::QUIC_VERSION_43};
@@ -47,8 +52,8 @@
       QuicVersionToQuicVersionLabel(quic::QUIC_VERSION_44),
       QuicVersionToQuicVersionLabel(quic::QUIC_VERSION_43)};
 
-  quic::QuicTransportVersionVector supported_alt_svc_versions = {
-      quic::QUIC_VERSION_44};
+  quic::ParsedQuicVersionVector supported_alt_svc_versions = {
+      ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, quic::QUIC_VERSION_44)};
   spdy::SpdyAltSvcWireFormat::AlternativeService altsvc;
 
   altsvc.protocol_id = "quic";
@@ -62,14 +67,14 @@
   altsvc.version = alt_svc_versions_ietf;
   EXPECT_EQ(supported_alt_svc_versions,
             FilterSupportedAltSvcVersions(altsvc, supported_versions, true));
-  EXPECT_EQ(quic::QuicTransportVersionVector(),
+  EXPECT_EQ(quic::ParsedQuicVersionVector(),
             FilterSupportedAltSvcVersions(altsvc, supported_versions, false));
 
   altsvc.protocol_id = "invalid_protocol";
   altsvc.version = alt_svc_versions_ietf;
-  EXPECT_EQ(quic::QuicTransportVersionVector(),
+  EXPECT_EQ(quic::ParsedQuicVersionVector(),
             FilterSupportedAltSvcVersions(altsvc, supported_versions, true));
-  EXPECT_EQ(quic::QuicTransportVersionVector(),
+  EXPECT_EQ(quic::ParsedQuicVersionVector(),
             FilterSupportedAltSvcVersions(altsvc, supported_versions, false));
 }
 
diff --git a/net/quic/quic_network_transaction_unittest.cc b/net/quic/quic_network_transaction_unittest.cc
index 17f9ac87..ccffb73 100644
--- a/net/quic/quic_network_transaction_unittest.cc
+++ b/net/quic/quic_network_transaction_unittest.cc
@@ -119,7 +119,7 @@
 struct PoolingTestParams {
   friend std::ostream& operator<<(std::ostream& os,
                                   const PoolingTestParams& p) {
-    os << "{ version: " << QuicVersionToString(p.version)
+    os << "{ version: " << ParsedQuicVersionToString(p.version)
        << ", destination_type: ";
     switch (p.destination_type) {
       case SAME_AS_FIRST:
@@ -138,27 +138,27 @@
     return os;
   }
 
-  quic::QuicTransportVersion version;
+  quic::ParsedQuicVersion version;
   DestinationType destination_type;
   bool client_headers_include_h2_stream_dependency;
 };
 
 std::string GenerateQuicVersionsListForAltSvcHeader(
-    const quic::QuicTransportVersionVector& versions) {
+    const quic::ParsedQuicVersionVector& versions) {
   std::string result = "";
-  for (const quic::QuicTransportVersion& version : versions) {
+  for (const quic::ParsedQuicVersion& version : versions) {
     if (!result.empty())
       result.append(",");
-    result.append(base::NumberToString(version));
+    result.append(base::NumberToString(version.transport_version));
   }
   return result;
 }
 
 std::vector<PoolingTestParams> GetPoolingTestParams() {
   std::vector<PoolingTestParams> params;
-  quic::QuicTransportVersionVector all_supported_versions =
-      quic::AllSupportedTransportVersions();
-  for (const quic::QuicTransportVersion version : all_supported_versions) {
+  quic::ParsedQuicVersionVector all_supported_versions =
+      quic::AllSupportedVersions();
+  for (const quic::ParsedQuicVersion version : all_supported_versions) {
     params.push_back(PoolingTestParams{version, SAME_AS_FIRST, false});
     params.push_back(PoolingTestParams{version, SAME_AS_FIRST, true});
     params.push_back(PoolingTestParams{version, SAME_AS_SECOND, false});
@@ -256,13 +256,13 @@
 class QuicNetworkTransactionTest
     : public PlatformTest,
       public ::testing::WithParamInterface<
-          std::tuple<quic::QuicTransportVersion, bool>>,
+          std::tuple<quic::ParsedQuicVersion, bool>>,
       public WithScopedTaskEnvironment {
  protected:
   QuicNetworkTransactionTest()
       : version_(std::get<0>(GetParam())),
         client_headers_include_h2_stream_dependency_(std::get<1>(GetParam())),
-        supported_versions_(quic::test::SupportedTransportVersions(version_)),
+        supported_versions_(quic::test::SupportedVersions(version_)),
         random_generator_(0),
         client_maker_(
             version_,
@@ -675,7 +675,7 @@
   }
 
   std::string ConstructDataHeader(size_t body_len) {
-    if (version_ != quic::QUIC_VERSION_99) {
+    if (version_.transport_version != quic::QUIC_VERSION_99) {
       return "";
     }
     quic::HttpEncoder encoder;
@@ -684,8 +684,7 @@
     return std::string(buffer.get(), header_length);
   }
 
-  void CreateSession(
-      const quic::QuicTransportVersionVector& supported_versions) {
+  void CreateSession(const quic::ParsedQuicVersionVector& supported_versions) {
     session_params_.enable_quic = true;
     session_params_.quic_supported_versions = supported_versions;
     session_params_.quic_headers_include_h2_stream_dependency =
@@ -725,7 +724,8 @@
     EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
     EXPECT_TRUE(response->was_fetched_via_spdy);
     EXPECT_TRUE(response->was_alpn_negotiated);
-    EXPECT_EQ(QuicHttpStream::ConnectionInfoFromQuicVersion(version_),
+    EXPECT_EQ(QuicHttpStream::ConnectionInfoFromQuicVersion(
+                  version_.transport_version),
               response->connection_info);
   }
 
@@ -935,11 +935,13 @@
   }
 
   quic::QuicStreamId GetNthClientInitiatedBidirectionalStreamId(int n) {
-    return quic::test::GetNthClientInitiatedBidirectionalStreamId(version_, n);
+    return quic::test::GetNthClientInitiatedBidirectionalStreamId(
+        version_.transport_version, n);
   }
 
   quic::QuicStreamId GetNthServerInitiatedUnidirectionalStreamId(int n) {
-    return quic::test::GetNthServerInitiatedUnidirectionalStreamId(version_, n);
+    return quic::test::GetNthServerInitiatedUnidirectionalStreamId(
+        version_.transport_version, n);
   }
 
   static void AddCertificate(SSLSocketDataProvider* ssl_data) {
@@ -948,9 +950,9 @@
     ASSERT_TRUE(ssl_data->ssl_info.cert);
   }
 
-  const quic::QuicTransportVersion version_;
+  const quic::ParsedQuicVersion version_;
   const bool client_headers_include_h2_stream_dependency_;
-  quic::QuicTransportVersionVector supported_versions_;
+  quic::ParsedQuicVersionVector supported_versions_;
   QuicFlagSaver flags_;  // Save/restore all QUIC flag values.
   quic::MockClock clock_;
   quic::test::MockRandom random_generator_;
@@ -1004,9 +1006,8 @@
 INSTANTIATE_TEST_SUITE_P(
     VersionIncludeStreamDependencySequence,
     QuicNetworkTransactionTest,
-    ::testing::Combine(
-        ::testing::ValuesIn(quic::AllSupportedTransportVersions()),
-        ::testing::Bool()));
+    ::testing::Combine(::testing::ValuesIn(quic::AllSupportedVersions()),
+                       ::testing::Bool()));
 
 TEST_P(QuicNetworkTransactionTest, WriteErrorHandshakeConfirmed) {
   session_params_.retry_without_alt_svc_on_quic_errors = false;
@@ -1213,7 +1214,7 @@
 
   int log_stream_id;
   ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id));
-  EXPECT_EQ(quic::QuicUtils::GetHeadersStreamId(version_),
+  EXPECT_EQ(quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
             static_cast<quic::QuicStreamId>(log_stream_id));
 }
 
@@ -1251,10 +1252,12 @@
   for (size_t offset = 0; offset < spdy_frame.size(); offset += chunk_size) {
     size_t len = std::min(chunk_size, spdy_frame.size() - offset);
     mock_quic_data.AddRead(
-        ASYNC, ConstructServerDataPacket(
-                   packet_number++,
-                   quic::QuicUtils::GetHeadersStreamId(version_), false, false,
-                   offset, base::StringPiece(spdy_frame.data() + offset, len)));
+        ASYNC,
+        ConstructServerDataPacket(
+            packet_number++,
+            quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+            false, false, offset,
+            base::StringPiece(spdy_frame.data() + offset, len)));
   }
 
   std::string header = ConstructDataHeader(6);
@@ -1310,10 +1313,12 @@
   for (size_t offset = 0; offset < spdy_frame.size(); offset += chunk_size) {
     size_t len = std::min(chunk_size, spdy_frame.size() - offset);
     mock_quic_data.AddRead(
-        ASYNC, ConstructServerDataPacket(
-                   packet_number++,
-                   quic::QuicUtils::GetHeadersStreamId(version_), false, false,
-                   offset, base::StringPiece(spdy_frame.data() + offset, len)));
+        ASYNC,
+        ConstructServerDataPacket(
+            packet_number++,
+            quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+            false, false, offset,
+            base::StringPiece(spdy_frame.data() + offset, len)));
   }
 
   std::string header = ConstructDataHeader(6);
@@ -1523,12 +1528,10 @@
 }
 
 TEST_P(QuicNetworkTransactionTest, DoNotUseQuicForUnsupportedVersion) {
-  quic::QuicTransportVersion unsupported_version =
-      quic::QUIC_VERSION_UNSUPPORTED;
+  quic::ParsedQuicVersion unsupported_version = quic::UnsupportedQuicVersion();
   // Add support for another QUIC version besides |version_|. Also find a
   // unsupported version.
-  for (const quic::QuicTransportVersion& version :
-       quic::AllSupportedTransportVersions()) {
+  for (const quic::ParsedQuicVersion& version : quic::AllSupportedVersions()) {
     if (version == version_)
       continue;
     if (supported_versions_.size() != 2) {
@@ -1538,7 +1541,7 @@
     unsupported_version = version;
     break;
   }
-  DCHECK_NE(unsupported_version, quic::QUIC_VERSION_UNSUPPORTED);
+  DCHECK_NE(unsupported_version, quic::UnsupportedQuicVersion());
 
   // Set up alternative service to use QUIC with a version that is not
   // supported.
@@ -1562,8 +1565,7 @@
   // the response from the server will advertise new Alt-Svc with supported
   // versions.
   std::string advertised_versions_list_str =
-      GenerateQuicVersionsListForAltSvcHeader(
-          quic::AllSupportedTransportVersions());
+      GenerateQuicVersionsListForAltSvcHeader(quic::AllSupportedVersions());
   std::string altsvc_header =
       base::StringPrintf("Alt-Svc: quic=\":443\"; v=\"%s\"\r\n\r\n",
                          advertised_versions_list_str.c_str());
@@ -1618,7 +1620,11 @@
   EXPECT_EQ(kProtoQUIC, alt_svc_info_vector[0].alternative_service().protocol);
   EXPECT_EQ(2u, alt_svc_info_vector[0].advertised_versions().size());
   // Advertised versions will be lised in a sorted order.
-  std::sort(supported_versions_.begin(), supported_versions_.end());
+  std::sort(
+      supported_versions_.begin(), supported_versions_.end(),
+      [](const quic::ParsedQuicVersion& a, const quic::ParsedQuicVersion& b) {
+        return a.transport_version < b.transport_version;
+      });
   EXPECT_EQ(supported_versions_[0],
             alt_svc_info_vector[0].advertised_versions()[0]);
   EXPECT_EQ(supported_versions_[1],
@@ -1813,10 +1819,8 @@
 
   // Add support for another QUIC version besides |version_| on the client side.
   // Also find a different version advertised by the server.
-  quic::QuicTransportVersion advertised_version_2 =
-      quic::QUIC_VERSION_UNSUPPORTED;
-  for (const quic::QuicTransportVersion& version :
-       quic::AllSupportedTransportVersions()) {
+  quic::ParsedQuicVersion advertised_version_2 = quic::UnsupportedQuicVersion();
+  for (const quic::ParsedQuicVersion& version : quic::AllSupportedVersions()) {
     if (version == version_)
       continue;
     if (supported_versions_.size() != 2) {
@@ -1826,11 +1830,11 @@
     advertised_version_2 = version;
     break;
   }
-  DCHECK_NE(advertised_version_2, quic::QUIC_VERSION_UNSUPPORTED);
+  DCHECK_NE(advertised_version_2, quic::UnsupportedQuicVersion());
 
-  std::string QuicAltSvcWithVersionHeader =
-      base::StringPrintf("Alt-Svc: quic=\":443\";v=\"%d,%d\"\r\n\r\n",
-                         advertised_version_2, version_);
+  std::string QuicAltSvcWithVersionHeader = base::StringPrintf(
+      "Alt-Svc: quic=\":443\";v=\"%d,%d\"\r\n\r\n",
+      advertised_version_2.transport_version, version_.transport_version);
 
   MockRead http_reads[] = {
       MockRead("HTTP/1.1 200 OK\r\n"),
@@ -1879,21 +1883,21 @@
   // The QuicStreamFactoy will pick the preferred QUIC_VERSION: |version_|,
   // which is verified as the PacketMakers are using |version_|.
 
-  quic::QuicTransportVersion common_version_2 = quic::QUIC_VERSION_UNSUPPORTED;
-  for (const quic::QuicTransportVersion& version :
-       quic::AllSupportedTransportVersions()) {
+  quic::ParsedQuicVersion common_version_2 = quic::UnsupportedQuicVersion();
+  for (const quic::ParsedQuicVersion& version : quic::AllSupportedVersions()) {
     if (version == version_)
       continue;
     common_version_2 = version;
     break;
   }
-  DCHECK_NE(common_version_2, quic::QUIC_VERSION_UNSUPPORTED);
+  DCHECK_NE(common_version_2, quic::UnsupportedQuicVersion());
 
   supported_versions_.push_back(
       common_version_2);  // Supported but unpreferred.
 
   std::string QuicAltSvcWithVersionHeader = base::StringPrintf(
-      "Alt-Svc: quic=\":443\";v=\"%d,%d\"\r\n\r\n", common_version_2, version_);
+      "Alt-Svc: quic=\":443\";v=\"%d,%d\"\r\n\r\n",
+      common_version_2.transport_version, version_.transport_version);
 
   MockRead http_reads[] = {
       MockRead("HTTP/1.1 200 OK\r\n"),
@@ -2051,8 +2055,7 @@
 TEST_P(QuicNetworkTransactionTest,
        StoreMutuallySupportedVersionsWhenProcessAltSvc) {
   // Add support for another QUIC version besides |version_|.
-  for (const quic::QuicTransportVersion& version :
-       quic::AllSupportedTransportVersions()) {
+  for (const quic::ParsedQuicVersion& version : quic::AllSupportedVersions()) {
     if (version == version_)
       continue;
     supported_versions_.push_back(version);
@@ -2060,8 +2063,7 @@
   }
 
   std::string advertised_versions_list_str =
-      GenerateQuicVersionsListForAltSvcHeader(
-          quic::AllSupportedTransportVersions());
+      GenerateQuicVersionsListForAltSvcHeader(quic::AllSupportedVersions());
   std::string altsvc_header =
       base::StringPrintf("Alt-Svc: quic=\":443\"; v=\"%s\"\r\n\r\n",
                          advertised_versions_list_str.c_str());
@@ -2116,7 +2118,11 @@
   EXPECT_EQ(kProtoQUIC, alt_svc_info_vector[0].alternative_service().protocol);
   EXPECT_EQ(2u, alt_svc_info_vector[0].advertised_versions().size());
   // Advertised versions will be lised in a sorted order.
-  std::sort(supported_versions_.begin(), supported_versions_.end());
+  std::sort(
+      supported_versions_.begin(), supported_versions_.end(),
+      [](const quic::ParsedQuicVersion& a, const quic::ParsedQuicVersion& b) {
+        return a.transport_version < b.transport_version;
+      });
   EXPECT_EQ(supported_versions_[0],
             alt_svc_info_vector[0].advertised_versions()[0]);
   EXPECT_EQ(supported_versions_[1],
@@ -2124,8 +2130,8 @@
 }
 
 TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceAllSupportedVersion) {
-  std::string altsvc_header =
-      base::StringPrintf("Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", version_);
+  std::string altsvc_header = base::StringPrintf(
+      "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", version_.transport_version);
   MockRead http_reads[] = {
       MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
       MockRead("hello world"),
@@ -2169,7 +2175,7 @@
 }
 
 TEST_P(QuicNetworkTransactionTest, GoAwayWithConnectionMigrationOnPortsOnly) {
-  if (version_ == quic::QUIC_VERSION_99) {
+  if (version_.transport_version == quic::QUIC_VERSION_99) {
     // Not available under version 99
     return;
   }
@@ -2247,7 +2253,7 @@
 // alternate network as well, QUIC is marked as broken and the brokenness will
 // not expire when default network changes.
 TEST_P(QuicNetworkTransactionTest, QuicFailsOnBothNetworksWhileTCPSucceeds) {
-  if (version_ >= quic::QUIC_VERSION_47) {
+  if (version_.transport_version >= quic::QUIC_VERSION_47) {
     // TODO(nharper): reenable once MakeDummyCHLOPacket() fixed
     return;
   }
@@ -2272,7 +2278,7 @@
   quic_data.AddWrite(SYNCHRONOUS,
                      client_maker_.MakeDummyCHLOPacket(packet_num++));
   // TODO(zhongyi): remove condition check once b/115926584 is fixed.
-  if (version_ <= quic::QUIC_VERSION_39) {
+  if (version_.transport_version <= quic::QUIC_VERSION_39) {
     quic_data.AddWrite(SYNCHRONOUS,
                        client_maker_.MakeDummyCHLOPacket(packet_num++));
   }
@@ -2367,7 +2373,7 @@
 // alternate network, QUIC is marked as broken. The brokenness will expire when
 // the default network changes.
 TEST_P(QuicNetworkTransactionTest, RetryOnAlternateNetworkWhileTCPSucceeds) {
-  if (version_ >= quic::QUIC_VERSION_47) {
+  if (version_.transport_version >= quic::QUIC_VERSION_47) {
     // TODO(nharper): reenable once MakeDummyCHLOPacket() fixed
     return;
   }
@@ -2392,7 +2398,7 @@
   quic_data.AddWrite(SYNCHRONOUS,
                      client_maker_.MakeDummyCHLOPacket(packet_num++));
   // TODO(zhongyi): remove condition check once b/115926584 is fixed.
-  if (version_ <= quic::QUIC_VERSION_39) {
+  if (version_.transport_version <= quic::QUIC_VERSION_39) {
     quic_data.AddWrite(SYNCHRONOUS,
                        client_maker_.MakeDummyCHLOPacket(packet_num++));
   }
@@ -2501,7 +2507,7 @@
 // before handshake is confirmed. If TCP doesn't succeed but QUIC on the
 // alternative network succeeds, QUIC is not marked as broken.
 TEST_P(QuicNetworkTransactionTest, RetryOnAlternateNetworkWhileTCPHanging) {
-  if (version_ >= quic::QUIC_VERSION_47) {
+  if (version_.transport_version >= quic::QUIC_VERSION_47) {
     // TODO(nharper): reenable once MakeDummyCHLOPacket() fixed
     return;
   }
@@ -2527,7 +2533,7 @@
                      client_maker_.MakeDummyCHLOPacket(packet_num++));
   // TODO(zhongyi): remove condition check once b/115926584 is fixed, i.e.,
   // quic_fix_has_pending_crypto_data is introduced and enabled.
-  if (version_ <= quic::QUIC_VERSION_39) {
+  if (version_.transport_version <= quic::QUIC_VERSION_39) {
     quic_data.AddWrite(SYNCHRONOUS,
                        client_maker_.MakeDummyCHLOPacket(packet_num++));
   }
@@ -2654,42 +2660,50 @@
                      client_maker_.MakeInitialSettingsPacketAndSaveData(
                          2, &header_stream_offset, &settings_data));
   // TLP 1
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         3, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, 0, request_data));
-  // TLP 2
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         4, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, settings_offset, settings_data));
-  // RTO 1
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         5, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, 0, request_data));
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         6, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, settings_offset, settings_data));
-  // RTO 2
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         7, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, 0, request_data));
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         8, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, settings_offset, settings_data));
-  // RTO 3
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         9, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, 0, request_data));
   quic_data.AddWrite(
-      SYNCHRONOUS, client_maker_.MakeDataPacket(
-                       10, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                       false, settings_offset, settings_data));
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          3, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, 0, request_data));
+  // TLP 2
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          4, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, settings_offset, settings_data));
+  // RTO 1
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          5, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, 0, request_data));
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          6, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, settings_offset, settings_data));
+  // RTO 2
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          7, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, 0, request_data));
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          8, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, settings_offset, settings_data));
+  // RTO 3
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          9, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, 0, request_data));
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          10, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, settings_offset, settings_data));
 
   quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
                                       11, true, quic::QUIC_NETWORK_IDLE_TIMEOUT,
@@ -2764,51 +2778,61 @@
                      client_maker_.MakeInitialSettingsPacketAndSaveData(
                          2, &header_stream_offset, &settings_data));
   // TLP 1
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         3, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, 0, request_data));
-  // TLP 2
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         4, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, settings_offset, settings_data));
-  // RTO 1
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         5, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, 0, request_data));
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         6, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, settings_offset, settings_data));
-  // RTO 2
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         7, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, 0, request_data));
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         8, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, settings_offset, settings_data));
-  // RTO 3
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         9, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, 0, request_data));
   quic_data.AddWrite(
-      SYNCHRONOUS, client_maker_.MakeDataPacket(
-                       10, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                       false, settings_offset, settings_data));
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          3, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, 0, request_data));
+  // TLP 2
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          4, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, settings_offset, settings_data));
+  // RTO 1
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          5, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, 0, request_data));
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          6, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, settings_offset, settings_data));
+  // RTO 2
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          7, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, 0, request_data));
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          8, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, settings_offset, settings_data));
+  // RTO 3
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          9, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, 0, request_data));
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          10, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, settings_offset, settings_data));
   // RTO 4
   quic_data.AddWrite(
-      SYNCHRONOUS, client_maker_.MakeDataPacket(
-                       11, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                       false, 0, request_data));
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          11, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, 0, request_data));
   quic_data.AddWrite(
-      SYNCHRONOUS, client_maker_.MakeDataPacket(
-                       12, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                       false, settings_offset, settings_data));
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          12, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, settings_offset, settings_data));
   // RTO 5
   quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
                                       13, true, quic::QUIC_TOO_MANY_RTOS,
@@ -2887,51 +2911,58 @@
                          3, true, GetNthClientInitiatedBidirectionalStreamId(0),
                          quic::QUIC_STREAM_CANCELLED));
   // TLP 1
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         4, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, 0, request_data));
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          4, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, 0, request_data));
   // TLP 2
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         5, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, settings_offset, settings_data));
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          5, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, settings_offset, settings_data));
   // RTO 1
   quic_data.AddWrite(SYNCHRONOUS,
                      client_maker_.MakeRstPacket(
                          6, true, GetNthClientInitiatedBidirectionalStreamId(0),
                          quic::QUIC_STREAM_CANCELLED));
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         7, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, 0, request_data));
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          7, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, 0, request_data));
   // RTO 2
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         8, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, settings_offset, settings_data));
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          8, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, settings_offset, settings_data));
   quic_data.AddWrite(SYNCHRONOUS,
                      client_maker_.MakeRstPacket(
                          9, true, GetNthClientInitiatedBidirectionalStreamId(0),
                          quic::QUIC_STREAM_CANCELLED));
   // RTO 3
   quic_data.AddWrite(
-      SYNCHRONOUS, client_maker_.MakeDataPacket(
-                       10, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                       false, 0, request_data));
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          10, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, 0, request_data));
   quic_data.AddWrite(
-      SYNCHRONOUS, client_maker_.MakeDataPacket(
-                       11, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                       false, settings_offset, settings_data));
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          11, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, settings_offset, settings_data));
   // RTO 4
   quic_data.AddWrite(
       SYNCHRONOUS, client_maker_.MakeRstPacket(
                        12, true, GetNthClientInitiatedBidirectionalStreamId(0),
                        quic::QUIC_STREAM_CANCELLED));
   quic_data.AddWrite(
-      SYNCHRONOUS, client_maker_.MakeDataPacket(
-                       13, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                       false, 0, request_data));
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          13, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, 0, request_data));
   // RTO 5
   quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
                                       14, true, quic::QUIC_TOO_MANY_RTOS,
@@ -3075,42 +3106,50 @@
                      client_maker_.MakeInitialSettingsPacketAndSaveData(
                          2, &header_stream_offset, &settings_data));
   // TLP 1
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         3, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, 0, request_data));
-  // TLP 2
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         4, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, settings_offset, settings_data));
-  // RTO 1
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         5, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, 0, request_data));
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         6, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, settings_offset, settings_data));
-  // RTO 2
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         7, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, 0, request_data));
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         8, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, settings_offset, settings_data));
-  // RTO 3
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         9, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, 0, request_data));
   quic_data.AddWrite(
-      SYNCHRONOUS, client_maker_.MakeDataPacket(
-                       10, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                       false, settings_offset, settings_data));
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          3, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, 0, request_data));
+  // TLP 2
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          4, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, settings_offset, settings_data));
+  // RTO 1
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          5, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, 0, request_data));
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          6, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, settings_offset, settings_data));
+  // RTO 2
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          7, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, 0, request_data));
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          8, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, settings_offset, settings_data));
+  // RTO 3
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          9, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, 0, request_data));
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          10, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, settings_offset, settings_data));
 
   quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
                                       11, true, quic::QUIC_NETWORK_IDLE_TIMEOUT,
@@ -3209,42 +3248,50 @@
                      client_maker_.MakeInitialSettingsPacketAndSaveData(
                          2, &header_stream_offset, &settings_data));
   // TLP 1
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         3, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, 0, request_data));
-  // TLP 2
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         4, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, settings_offset, settings_data));
-  // RTO 1
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         5, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, 0, request_data));
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         6, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, settings_offset, settings_data));
-  // RTO 2
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         7, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, 0, request_data));
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         8, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, settings_offset, settings_data));
-  // RTO 3
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         9, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, 0, request_data));
   quic_data.AddWrite(
-      SYNCHRONOUS, client_maker_.MakeDataPacket(
-                       10, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                       false, settings_offset, settings_data));
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          3, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, 0, request_data));
+  // TLP 2
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          4, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, settings_offset, settings_data));
+  // RTO 1
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          5, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, 0, request_data));
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          6, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, settings_offset, settings_data));
+  // RTO 2
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          7, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, 0, request_data));
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          8, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, settings_offset, settings_data));
+  // RTO 3
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          9, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, 0, request_data));
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          10, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, settings_offset, settings_data));
 
   quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
                                       11, true, quic::QUIC_NETWORK_IDLE_TIMEOUT,
@@ -3358,41 +3405,49 @@
 
   // TLP 1
   quic_data.AddWrite(
-      SYNCHRONOUS, client_maker_.MakeDataPacket(
-                       4, quic::QuicUtils::GetHeadersStreamId(version_), false,
-                       false, 0, request_data));
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          4, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          false, false, 0, request_data));
   // TLP 2
   quic_data.AddWrite(
-      SYNCHRONOUS, client_maker_.MakeDataPacket(
-                       5, quic::QuicUtils::GetHeadersStreamId(version_), false,
-                       false, settings_offset, settings_data));
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          5, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          false, false, settings_offset, settings_data));
   // RTO 1
   quic_data.AddWrite(
-      SYNCHRONOUS, client_maker_.MakeDataPacket(
-                       6, quic::QuicUtils::GetHeadersStreamId(version_), false,
-                       false, 0, request_data));
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          6, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          false, false, 0, request_data));
   quic_data.AddWrite(
-      SYNCHRONOUS, client_maker_.MakeDataPacket(
-                       7, quic::QuicUtils::GetHeadersStreamId(version_), false,
-                       false, settings_offset, settings_data));
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          7, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          false, false, settings_offset, settings_data));
   // RTO 2
   quic_data.AddWrite(
-      SYNCHRONOUS, client_maker_.MakeDataPacket(
-                       8, quic::QuicUtils::GetHeadersStreamId(version_), false,
-                       false, 0, request_data));
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          8, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          false, false, 0, request_data));
   quic_data.AddWrite(
-      SYNCHRONOUS, client_maker_.MakeDataPacket(
-                       9, quic::QuicUtils::GetHeadersStreamId(version_), false,
-                       false, settings_offset, settings_data));
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          9, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          false, false, settings_offset, settings_data));
   // RTO 3
   quic_data.AddWrite(
-      SYNCHRONOUS, client_maker_.MakeDataPacket(
-                       10, quic::QuicUtils::GetHeadersStreamId(version_), false,
-                       false, 0, request_data));
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          10, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          false, false, 0, request_data));
   quic_data.AddWrite(
-      SYNCHRONOUS, client_maker_.MakeDataPacket(
-                       11, quic::QuicUtils::GetHeadersStreamId(version_), false,
-                       false, settings_offset, settings_data));
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          11, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          false, false, settings_offset, settings_data));
 
   if (GetQuicReloadableFlag(
           quic_fix_time_of_first_packet_sent_after_receiving)) {
@@ -3492,51 +3547,61 @@
                      client_maker_.MakeInitialSettingsPacketAndSaveData(
                          2, &header_stream_offset, &settings_data));
   // TLP 1
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         3, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, 0, request_data));
-  // TLP 2
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         4, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, settings_offset, settings_data));
-  // RTO 1
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         5, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, 0, request_data));
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         6, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, settings_offset, settings_data));
-  // RTO 2
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         7, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, 0, request_data));
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         8, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, settings_offset, settings_data));
-  // RTO 3
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         9, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, 0, request_data));
   quic_data.AddWrite(
-      SYNCHRONOUS, client_maker_.MakeDataPacket(
-                       10, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                       false, settings_offset, settings_data));
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          3, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, 0, request_data));
+  // TLP 2
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          4, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, settings_offset, settings_data));
+  // RTO 1
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          5, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, 0, request_data));
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          6, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, settings_offset, settings_data));
+  // RTO 2
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          7, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, 0, request_data));
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          8, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, settings_offset, settings_data));
+  // RTO 3
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          9, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, 0, request_data));
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          10, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, settings_offset, settings_data));
   // RTO 4
   quic_data.AddWrite(
-      SYNCHRONOUS, client_maker_.MakeDataPacket(
-                       11, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                       false, 0, request_data));
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          11, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, 0, request_data));
   quic_data.AddWrite(
-      SYNCHRONOUS, client_maker_.MakeDataPacket(
-                       12, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                       false, settings_offset, settings_data));
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          12, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, settings_offset, settings_data));
 
   quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
                                       13, true, quic::QUIC_TOO_MANY_RTOS,
@@ -3640,51 +3705,58 @@
                          3, true, GetNthClientInitiatedBidirectionalStreamId(0),
                          quic::QUIC_STREAM_CANCELLED));
   // TLP 1
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         4, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, 0, request_data));
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          4, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, 0, request_data));
   // TLP 2
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         5, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, settings_offset, settings_data));
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          5, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, settings_offset, settings_data));
   // RTO 1
   quic_data.AddWrite(SYNCHRONOUS,
                      client_maker_.MakeRstPacket(
                          6, true, GetNthClientInitiatedBidirectionalStreamId(0),
                          quic::QUIC_STREAM_CANCELLED));
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         7, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, 0, request_data));
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          7, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, 0, request_data));
   // RTO 2
-  quic_data.AddWrite(SYNCHRONOUS,
-                     client_maker_.MakeDataPacket(
-                         8, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                         false, settings_offset, settings_data));
+  quic_data.AddWrite(
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          8, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, settings_offset, settings_data));
   quic_data.AddWrite(SYNCHRONOUS,
                      client_maker_.MakeRstPacket(
                          9, true, GetNthClientInitiatedBidirectionalStreamId(0),
                          quic::QUIC_STREAM_CANCELLED));
   // RTO 3
   quic_data.AddWrite(
-      SYNCHRONOUS, client_maker_.MakeDataPacket(
-                       10, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                       false, 0, request_data));
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          10, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, 0, request_data));
   quic_data.AddWrite(
-      SYNCHRONOUS, client_maker_.MakeDataPacket(
-                       11, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                       false, settings_offset, settings_data));
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          11, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, settings_offset, settings_data));
   // RTO 4
   quic_data.AddWrite(
       SYNCHRONOUS, client_maker_.MakeRstPacket(
                        12, true, GetNthClientInitiatedBidirectionalStreamId(0),
                        quic::QUIC_STREAM_CANCELLED));
   quic_data.AddWrite(
-      SYNCHRONOUS, client_maker_.MakeDataPacket(
-                       13, quic::QuicUtils::GetHeadersStreamId(version_), true,
-                       false, 0, request_data));
+      SYNCHRONOUS,
+      client_maker_.MakeDataPacket(
+          13, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          true, false, 0, request_data));
   // RTO 5
   quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
                                       14, true, quic::QUIC_TOO_MANY_RTOS,
@@ -4117,8 +4189,9 @@
 
 TEST_P(QuicNetworkTransactionTest,
        DoNotUseAlternativeServiceQuicUnsupportedVersion) {
-  std::string altsvc_header = base::StringPrintf(
-      "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", version_ - 1);
+  std::string altsvc_header =
+      base::StringPrintf("Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n",
+                         version_.transport_version - 1);
   MockRead http_reads[] = {
       MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
       MockRead("hello world"),
@@ -5032,8 +5105,8 @@
   mock_quic_data.AddWrite(
       SYNCHRONOUS,
       client_maker_.MakeDataPacket(
-          3, quic::QuicUtils::GetHeadersStreamId(version_), false, false,
-          client_header_stream_offset,
+          3, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          false, false, client_header_stream_offset,
           quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size())));
   client_header_stream_offset += spdy_frame.size();
 
@@ -5125,8 +5198,8 @@
   mock_quic_data.AddWrite(
       SYNCHRONOUS,
       client_maker_.MakeDataPacket(
-          3, quic::QuicUtils::GetHeadersStreamId(version_), false, false,
-          client_header_stream_offset,
+          3, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+          false, false, client_header_stream_offset,
           quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size())));
   client_header_stream_offset += spdy_frame.size();
 
@@ -5188,8 +5261,9 @@
   EXPECT_EQ("HTTP/1.1 425 TOO_EARLY", response->headers->GetStatusLine());
   EXPECT_TRUE(response->was_fetched_via_spdy);
   EXPECT_TRUE(response->was_alpn_negotiated);
-  EXPECT_EQ(QuicHttpStream::ConnectionInfoFromQuicVersion(version_),
-            response->connection_info);
+  EXPECT_EQ(
+      QuicHttpStream::ConnectionInfoFromQuicVersion(version_.transport_version),
+      response->connection_info);
 }
 
 TEST_P(QuicNetworkTransactionTest,
@@ -5357,8 +5431,9 @@
   EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
   EXPECT_TRUE(response->was_fetched_via_spdy);
   EXPECT_TRUE(response->was_alpn_negotiated);
-  EXPECT_EQ(QuicHttpStream::ConnectionInfoFromQuicVersion(version_),
-            response->connection_info);
+  EXPECT_EQ(
+      QuicHttpStream::ConnectionInfoFromQuicVersion(version_.transport_version),
+      response->connection_info);
 
   std::string response_data;
   ASSERT_EQ(ERR_QUIC_PROTOCOL_ERROR, ReadTransaction(&trans, &response_data));
@@ -5739,7 +5814,7 @@
 }
 
 TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) {
-  if (version_ >= quic::QUIC_VERSION_47) {
+  if (version_.transport_version >= quic::QUIC_VERSION_47) {
     // TODO(nharper): reenable once MakeDummyCHLOPacket() fixed
     return;
   }
@@ -6218,7 +6293,7 @@
                  GetRequestHeaders("GET", "https", "/pushed.jpg"),
                  &server_header_offset, &server_maker_));
   if (client_headers_include_h2_stream_dependency_ &&
-      version_ >= quic::QUIC_VERSION_43) {
+      version_.transport_version >= quic::QUIC_VERSION_43) {
     mock_quic_data.AddWrite(SYNCHRONOUS,
                             ConstructClientPriorityPacket(
                                 client_packet_number++, false,
@@ -6312,7 +6387,7 @@
                  GetRequestHeaders("GET", "https", "/pushed.jpg"),
                  &server_header_offset, &server_maker_));
   if (client_headers_include_h2_stream_dependency_ &&
-      version_ >= quic::QUIC_VERSION_43) {
+      version_.transport_version >= quic::QUIC_VERSION_43) {
     mock_quic_data.AddWrite(SYNCHRONOUS,
                             ConstructClientPriorityPacket(
                                 client_packet_number++, false,
@@ -6388,7 +6463,7 @@
                                            write_packet_index++, &offset));
 
   std::string header = ConstructDataHeader(1);
-  if (version_ != quic::QUIC_VERSION_99) {
+  if (version_.transport_version != quic::QUIC_VERSION_99) {
     mock_quic_data.AddWrite(
         SYNCHRONOUS,
         ConstructClientRequestHeadersAndDataFramesPacket(
@@ -6570,7 +6645,7 @@
                  &server_header_offset, &server_maker_));
 
   if (client_headers_include_h2_stream_dependency_ &&
-      version_ >= quic::QUIC_VERSION_43) {
+      version_.transport_version >= quic::QUIC_VERSION_43) {
     mock_quic_data.AddWrite(SYNCHRONOUS,
                             ConstructClientPriorityPacket(
                                 client_packet_number++, false,
@@ -6724,7 +6799,7 @@
       : version_(GetParam().version),
         client_headers_include_h2_stream_dependency_(
             GetParam().client_headers_include_h2_stream_dependency),
-        supported_versions_(quic::test::SupportedTransportVersions(version_)),
+        supported_versions_(quic::test::SupportedVersions(version_)),
         destination_type_(GetParam().destination_type),
         cert_transparency_verifier_(new MultiLogCTVerifier()),
         ssl_config_service_(new SSLConfigServiceDefaults),
@@ -6860,7 +6935,7 @@
       quic::QuicStreamId stream_id,
       QuicTestPacketMaker* maker) {
     std::string header = "";
-    if (version_ == quic::QUIC_VERSION_99) {
+    if (version_.transport_version == quic::QUIC_VERSION_99) {
       quic::HttpEncoder encoder;
       std::unique_ptr<char[]> buffer;
       auto header_length = encoder.SerializeDataFrameHeader(5, &buffer);
@@ -6940,19 +7015,21 @@
     EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
     EXPECT_TRUE(response->was_fetched_via_spdy);
     EXPECT_TRUE(response->was_alpn_negotiated);
-    EXPECT_EQ(QuicHttpStream::ConnectionInfoFromQuicVersion(version_),
+    EXPECT_EQ(QuicHttpStream::ConnectionInfoFromQuicVersion(
+                  version_.transport_version),
               response->connection_info);
     EXPECT_EQ(443, response->remote_endpoint.port());
   }
 
   quic::QuicStreamId GetNthClientInitiatedBidirectionalStreamId(int n) {
-    return quic::test::GetNthClientInitiatedBidirectionalStreamId(version_, n);
+    return quic::test::GetNthClientInitiatedBidirectionalStreamId(
+        version_.transport_version, n);
   }
 
   quic::MockClock clock_;
-  const quic::QuicTransportVersion version_;
+  const quic::ParsedQuicVersion version_;
   const bool client_headers_include_h2_stream_dependency_;
-  quic::QuicTransportVersionVector supported_versions_;
+  quic::ParsedQuicVersionVector supported_versions_;
   DestinationType destination_type_;
   std::string origin1_;
   std::string origin2_;
@@ -7244,7 +7321,7 @@
                  GetRequestHeaders("GET", "https", "/pushed.jpg"),
                  &server_header_offset, &server_maker_));
   if (client_headers_include_h2_stream_dependency_ &&
-      version_ >= quic::QUIC_VERSION_43) {
+      version_.transport_version >= quic::QUIC_VERSION_43) {
     mock_quic_data.AddWrite(SYNCHRONOUS,
                             ConstructClientPriorityPacket(
                                 client_packet_number++, false,
@@ -7286,7 +7363,7 @@
                               quic::QUIC_STREAM_CANCELLED, 5, 5, 1));
   const char kBody[] = "1";
   std::string header3 = ConstructDataHeader(1);
-  if (version_ != quic::QUIC_VERSION_99) {
+  if (version_.transport_version != quic::QUIC_VERSION_99) {
     mock_quic_data.AddWrite(
         SYNCHRONOUS,
         ConstructClientRequestHeadersAndDataFramesPacket(
@@ -7435,7 +7512,7 @@
       "Host: mail.example.org\r\n"
       "Connection: keep-alive\r\n\r\n";
   std::string header = ConstructDataHeader(strlen(get_request));
-  if (version_ != quic::QUIC_VERSION_99) {
+  if (version_.transport_version != quic::QUIC_VERSION_99) {
     mock_quic_data.AddWrite(
         SYNCHRONOUS,
         ConstructClientAckAndDataPacket(
@@ -7528,7 +7605,7 @@
   spdy::SpdySerializedFrame get_frame =
       spdy_util.ConstructSpdyGet("https://mail.example.org/", 1, LOWEST);
   std::string header = ConstructDataHeader(get_frame.size());
-  if (version_ != quic::QUIC_VERSION_99) {
+  if (version_.transport_version != quic::QUIC_VERSION_99) {
     mock_quic_data.AddWrite(
         SYNCHRONOUS,
         ConstructClientAckAndDataPacket(
@@ -7633,7 +7710,7 @@
       "Host: mail.example.org\r\n"
       "Connection: keep-alive\r\n\r\n";
   std::string header = ConstructDataHeader(strlen(get_request_1));
-  if (version_ != quic::QUIC_VERSION_99) {
+  if (version_.transport_version != quic::QUIC_VERSION_99) {
     mock_quic_data.AddWrite(
         SYNCHRONOUS,
         ConstructClientAckAndDataPacket(
@@ -7677,7 +7754,7 @@
       "Host: mail.example.org\r\n"
       "Connection: keep-alive\r\n\r\n";
   std::string header4 = ConstructDataHeader(strlen(get_request_2));
-  if (version_ == quic::QUIC_VERSION_99) {
+  if (version_.transport_version == quic::QUIC_VERSION_99) {
     mock_quic_data.AddWrite(
         SYNCHRONOUS,
         ConstructClientMultipleDataFramesPacket(
@@ -7797,7 +7874,7 @@
       "Host: mail.example.org\r\n"
       "Connection: keep-alive\r\n\r\n";
   std::string header = ConstructDataHeader(strlen(get_request));
-  if (version_ != quic::QUIC_VERSION_99) {
+  if (version_.transport_version != quic::QUIC_VERSION_99) {
     mock_quic_data.AddWrite(
         SYNCHRONOUS,
         ConstructClientAckAndDataPacket(
@@ -7845,7 +7922,7 @@
   spdy::SpdySerializedFrame get_frame =
       spdy_util.ConstructSpdyGet("https://different.example.org/", 1, LOWEST);
   std::string header4 = ConstructDataHeader(get_frame.size());
-  if (version_ != quic::QUIC_VERSION_99) {
+  if (version_.transport_version != quic::QUIC_VERSION_99) {
     mock_quic_data.AddWrite(
         SYNCHRONOUS,
         ConstructClientAckAndDataPacket(
@@ -8070,7 +8147,7 @@
       "Host: mail.example.org\r\n"
       "Connection: keep-alive\r\n\r\n";
   std::string header = ConstructDataHeader(strlen(get_request));
-  if (version_ != quic::QUIC_VERSION_99) {
+  if (version_.transport_version != quic::QUIC_VERSION_99) {
     mock_quic_data.AddWrite(
         SYNCHRONOUS,
         ConstructClientAckAndDataPacket(
@@ -8478,7 +8555,7 @@
 TEST_P(QuicNetworkTransactionTest, QuicServerPushUpdatesPriority) {
   // Only run this test if HTTP/2 stream dependency info is sent by client (sent
   // in HEADERS frames for requests and PRIORITY frames).
-  if (version_ < quic::QUIC_VERSION_43 ||
+  if (version_.transport_version < quic::QUIC_VERSION_43 ||
       !client_headers_include_h2_stream_dependency_) {
     return;
   }
diff --git a/net/quic/quic_proxy_client_socket_unittest.cc b/net/quic/quic_proxy_client_socket_unittest.cc
index 5c7931b..9c1edbe 100644
--- a/net/quic/quic_proxy_client_socket_unittest.cc
+++ b/net/quic/quic_proxy_client_socket_unittest.cc
@@ -83,7 +83,7 @@
 
 class QuicProxyClientSocketTest
     : public ::testing::TestWithParam<
-          std::tuple<quic::QuicTransportVersion, bool>>,
+          std::tuple<quic::ParsedQuicVersion, bool>>,
       public WithScopedTaskEnvironment {
  protected:
   static const bool kFin = true;
@@ -94,7 +94,7 @@
 
   static size_t GetStreamFrameDataLengthFromPacketLength(
       quic::QuicByteCount packet_length,
-      quic::QuicTransportVersion version,
+      quic::ParsedQuicVersion version,
       bool include_version,
       bool include_diversification_nonce,
       quic::QuicConnectionIdLength connection_id_length,
@@ -103,7 +103,8 @@
     quic::QuicVariableLengthIntegerLength retry_token_length_length =
         quic::VARIABLE_LENGTH_INTEGER_LENGTH_0;
     quic::QuicVariableLengthIntegerLength length_length =
-        quic::QuicVersionHasLongHeaderLengths(version) && include_version
+        quic::QuicVersionHasLongHeaderLengths(version.transport_version) &&
+                include_version
             ? quic::VARIABLE_LENGTH_INTEGER_LENGTH_2
             : quic::VARIABLE_LENGTH_INTEGER_LENGTH_0;
     size_t min_data_length = 1;
@@ -111,7 +112,7 @@
         quic::NullEncrypter(quic::Perspective::IS_CLIENT)
             .GetCiphertextSize(min_data_length) +
         quic::QuicPacketCreator::StreamFramePacketOverhead(
-            version, quic::PACKET_8BYTE_CONNECTION_ID,
+            version.transport_version, quic::PACKET_8BYTE_CONNECTION_ID,
             quic::PACKET_0BYTE_CONNECTION_ID, include_version,
             include_diversification_nonce, packet_number_length,
             retry_token_length_length, length_length, offset);
@@ -122,8 +123,9 @@
 
   QuicProxyClientSocketTest()
       : version_(std::get<0>(GetParam())),
-        client_data_stream_id1_(quic::QuicUtils::GetHeadersStreamId(version_) +
-                                quic::QuicUtils::StreamIdDelta(version_)),
+        client_data_stream_id1_(
+            quic::QuicUtils::GetHeadersStreamId(version_.transport_version) +
+            quic::QuicUtils::StreamIdDelta(version_.transport_version)),
         client_headers_include_h2_stream_dependency_(std::get<1>(GetParam())),
         crypto_config_(quic::test::crypto_test_utils::ProofVerifierForTesting(),
                        quic::TlsClientHandshaker::CreateSslCtx()),
@@ -193,9 +195,7 @@
         connection_id_,
         quic::QuicSocketAddress(quic::QuicSocketAddressImpl(peer_addr_)),
         helper_.get(), alarm_factory_.get(), writer, true /* owns_writer */,
-        quic::Perspective::IS_CLIENT,
-        quic::test::SupportedVersions(
-            quic::ParsedQuicVersion(quic::PROTOCOL_QUIC_CRYPTO, version_)));
+        quic::Perspective::IS_CLIENT, quic::test::SupportedVersions(version_));
     connection->set_visitor(&visitor_);
     quic::test::QuicConnectionPeer::SetSendAlgorithm(connection,
                                                      send_algorithm_);
@@ -553,7 +553,7 @@
   }
 
   std::string ConstructDataHeader(size_t body_len) {
-    if (version_ != quic::QUIC_VERSION_99) {
+    if (version_.transport_version != quic::QUIC_VERSION_99) {
       return "";
     }
     quic::HttpEncoder encoder;
@@ -562,7 +562,7 @@
     return std::string(buffer.get(), header_length);
   }
 
-  const quic::QuicTransportVersion version_;
+  const quic::ParsedQuicVersion version_;
   const quic::QuicStreamId client_data_stream_id1_;
   const bool client_headers_include_h2_stream_dependency_;
 
@@ -855,7 +855,7 @@
   mock_quic_data_.AddWrite(SYNCHRONOUS, ConstructConnectRequestPacket(2));
   mock_quic_data_.AddRead(ASYNC, ConstructServerConnectReplyPacket(1, !kFin));
   mock_quic_data_.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
-  if (version_ == quic::QUIC_VERSION_99) {
+  if (version_.transport_version == quic::QUIC_VERSION_99) {
     std::string header = ConstructDataHeader(kLen1);
     mock_quic_data_.AddWrite(
         SYNCHRONOUS, ConstructAckAndMultipleDataFramesPacket(
@@ -897,7 +897,7 @@
   mock_quic_data_.AddRead(ASYNC, ConstructServerConnectReplyPacket(1, !kFin));
   mock_quic_data_.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
   std::string header = ConstructDataHeader(kLen1);
-  if (version_ != quic::QUIC_VERSION_99) {
+  if (version_.transport_version != quic::QUIC_VERSION_99) {
     mock_quic_data_.AddWrite(
         SYNCHRONOUS, ConstructAckAndDataPacket(write_packet_index++, 1, 1, 1, 0,
                                                std::string(kMsg1, kLen1)));
@@ -914,7 +914,7 @@
   std::string data(numDataPackets * quic::kDefaultMaxPacketSize, 'x');
   quic::QuicStreamOffset offset = kLen1 + header.length();
 
-  if (version_ == quic::QUIC_VERSION_99) {
+  if (version_.transport_version == quic::QUIC_VERSION_99) {
     numDataPackets++;
   }
   size_t total_data_length = 0;
@@ -923,7 +923,7 @@
         quic::kDefaultMaxPacketSize, version_, !kIncludeVersion,
         !kIncludeDiversificationNonce, quic::PACKET_8BYTE_CONNECTION_ID,
         quic::PACKET_1BYTE_PACKET_NUMBER, offset);
-    if (version_ == quic::QUIC_VERSION_99 && i == 0) {
+    if (version_.transport_version == quic::QUIC_VERSION_99 && i == 0) {
       // 3973 is the data frame length from packet length.
       std::string header2 = ConstructDataHeader(3973);
       mock_quic_data_.AddWrite(
@@ -932,7 +932,8 @@
                            {header2, std::string(data.c_str(),
                                                  max_packet_data_length - 7)}));
       offset += max_packet_data_length - header2.length() - 1;
-    } else if (version_ == quic::QUIC_VERSION_99 && i == numDataPackets - 1) {
+    } else if (version_.transport_version == quic::QUIC_VERSION_99 &&
+               i == numDataPackets - 1) {
       mock_quic_data_.AddWrite(
           SYNCHRONOUS, ConstructDataPacket(write_packet_index++, offset,
                                            std::string(data.c_str(), 7)));
@@ -1281,7 +1282,7 @@
                            ConstructAckPacket(write_packet_index++, 2, 1, 1));
 
   std::string header2 = ConstructDataHeader(kLen2);
-  if (version_ == quic::QUIC_VERSION_99) {
+  if (version_.transport_version == quic::QUIC_VERSION_99) {
     mock_quic_data_.AddWrite(
         SYNCHRONOUS,
         ConstructMultipleDataFramesPacket(
@@ -1346,7 +1347,7 @@
   mock_quic_data_.AddWrite(ASYNC, ERR_IO_PENDING);  // Pause
 
   std::string header3 = ConstructDataHeader(kLen2);
-  if (version_ != quic::QUIC_VERSION_99) {
+  if (version_.transport_version != quic::QUIC_VERSION_99) {
     mock_quic_data_.AddWrite(
         ASYNC, ConstructDataPacket(4, 0, std::string(kMsg2, kLen2)));
     mock_quic_data_.AddWrite(
@@ -1627,7 +1628,7 @@
       ASYNC, ConstructServerRstPacket(2, quic::QUIC_STREAM_CANCELLED, 0));
   mock_quic_data_.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
   std::string header = ConstructDataHeader(kLen2);
-  if (version_ != quic::QUIC_VERSION_99) {
+  if (version_.transport_version != quic::QUIC_VERSION_99) {
     mock_quic_data_.AddWrite(
         ASYNC,
         ConstructAckAndDataPacket(3, 1, 1, 1, 0, std::string(kMsg2, kLen2)));
@@ -1759,7 +1760,7 @@
   mock_quic_data_.AddRead(
       ASYNC, ConstructServerRstPacket(2, quic::QUIC_STREAM_CANCELLED, 0));
   mock_quic_data_.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
-  if (version_ != quic::QUIC_VERSION_99) {
+  if (version_.transport_version != quic::QUIC_VERSION_99) {
     mock_quic_data_.AddWrite(
         ASYNC,
         ConstructAckAndDataPacket(3, 1, 1, 1, 0, std::string(kMsg1, kLen1)));
@@ -1806,9 +1807,8 @@
 INSTANTIATE_TEST_SUITE_P(
     VersionIncludeStreamDependencySequence,
     QuicProxyClientSocketTest,
-    ::testing::Combine(
-        ::testing::ValuesIn(quic::AllSupportedTransportVersions()),
-        ::testing::Bool()));
+    ::testing::Combine(::testing::ValuesIn(quic::AllSupportedVersions()),
+                       ::testing::Bool()));
 
 }  // namespace test
 }  // namespace net
diff --git a/net/quic/quic_stream_factory_test.cc b/net/quic/quic_stream_factory_test.cc
index 52f94f4..00821bda 100644
--- a/net/quic/quic_stream_factory_test.cc
+++ b/net/quic/quic_stream_factory_test.cc
@@ -118,20 +118,20 @@
 // and enable_connection_racting.
 struct TestParams {
   friend std::ostream& operator<<(std::ostream& os, const TestParams& p) {
-    os << "{ version: " << QuicVersionToString(p.version)
+    os << "{ version: " << ParsedQuicVersionToString(p.version)
        << ", client_headers_include_h2_stream_dependency: "
        << p.client_headers_include_h2_stream_dependency << " }";
     return os;
   }
 
-  quic::QuicTransportVersion version;
+  quic::ParsedQuicVersion version;
   bool client_headers_include_h2_stream_dependency;
 };
 
 std::vector<TestParams> GetTestParams() {
   std::vector<TestParams> params;
-  quic::QuicTransportVersionVector all_supported_versions =
-      quic::AllSupportedTransportVersions();
+  quic::ParsedQuicVersionVector all_supported_versions =
+      quic::AllSupportedVersions();
   for (const auto& version : all_supported_versions) {
     params.push_back(TestParams{version, false});
     params.push_back(TestParams{version, true});
@@ -144,7 +144,7 @@
 struct PoolingTestParams {
   friend std::ostream& operator<<(std::ostream& os,
                                   const PoolingTestParams& p) {
-    os << "{ version: " << QuicVersionToString(p.version)
+    os << "{ version: " << ParsedQuicVersionToString(p.version)
        << ", destination_type: ";
     switch (p.destination_type) {
       case SAME_AS_FIRST:
@@ -163,16 +163,16 @@
     return os;
   }
 
-  quic::QuicTransportVersion version;
+  quic::ParsedQuicVersion version;
   DestinationType destination_type;
   bool client_headers_include_h2_stream_dependency;
 };
 
 std::vector<PoolingTestParams> GetPoolingTestParams() {
   std::vector<PoolingTestParams> params;
-  quic::QuicTransportVersionVector all_supported_versions =
-      quic::AllSupportedTransportVersions();
-  for (const quic::QuicTransportVersion version : all_supported_versions) {
+  quic::ParsedQuicVersionVector all_supported_versions =
+      quic::AllSupportedVersions();
+  for (const quic::ParsedQuicVersion version : all_supported_versions) {
     params.push_back(PoolingTestParams{version, SAME_AS_FIRST, false});
     params.push_back(PoolingTestParams{version, SAME_AS_FIRST, true});
     params.push_back(PoolingTestParams{version, SAME_AS_SECOND, false});
@@ -219,7 +219,7 @@
 
 class QuicStreamFactoryTestBase : public WithScopedTaskEnvironment {
  protected:
-  QuicStreamFactoryTestBase(quic::QuicTransportVersion version,
+  QuicStreamFactoryTestBase(quic::ParsedQuicVersion version,
                             bool client_headers_include_h2_stream_dependency)
       : host_resolver_(new MockHostResolver),
         ssl_config_service_(new MockSSLConfigService),
@@ -386,12 +386,12 @@
 
     QuicStreamRequest request(factory_.get());
     GURL url("https://" + destination.host() + "/");
-    EXPECT_EQ(
-        ERR_IO_PENDING,
-        request.Request(
-            destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
-            /*cert_verify_flags=*/0, url, net_log_, &net_error_details_,
-            failed_on_default_network_callback_, callback_.callback()));
+    EXPECT_EQ(ERR_IO_PENDING,
+              request.Request(
+                  destination, version_.transport_version, privacy_mode_,
+                  DEFAULT_PRIORITY, SocketTag(),
+                  /*cert_verify_flags=*/0, url, net_log_, &net_error_details_,
+                  failed_on_default_network_callback_, callback_.callback()));
 
     EXPECT_THAT(callback_.WaitForResult(), IsOk());
     std::unique_ptr<HttpStream> stream = CreateStream(&request);
@@ -547,8 +547,8 @@
     QuicStreamRequest request(factory_.get());
     EXPECT_EQ(ERR_IO_PENDING,
               request.Request(
-                  host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                  SocketTag(),
+                  host_port_pair_, version_.transport_version, privacy_mode_,
+                  DEFAULT_PRIORITY, SocketTag(),
                   /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                   failed_on_default_network_callback_, callback_.callback()));
     EXPECT_EQ(OK, callback_.WaitForResult());
@@ -735,7 +735,8 @@
     EXPECT_EQ(ERR_IO_PENDING,
               request.Request(
                   HostPortPair(quic_server_id.host(), quic_server_id.port()),
-                  version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+                  version_.transport_version, privacy_mode_, DEFAULT_PRIORITY,
+                  SocketTag(),
                   /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                   failed_on_default_network_callback_, callback_.callback()));
     EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -770,7 +771,8 @@
     EXPECT_EQ(ERR_IO_PENDING,
               request2.Request(
                   HostPortPair(quic_server_id2.host(), quic_server_id2.port()),
-                  version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+                  version_.transport_version, privacy_mode_, DEFAULT_PRIORITY,
+                  SocketTag(),
                   /*cert_verify_flags=*/0, GURL("https://mail.example.org/"),
                   net_log_, &net_error_details_,
                   failed_on_default_network_callback_, callback_.callback()));
@@ -797,11 +799,13 @@
   }
 
   quic::QuicStreamId GetNthClientInitiatedBidirectionalStreamId(int n) {
-    return quic::test::GetNthClientInitiatedBidirectionalStreamId(version_, n);
+    return quic::test::GetNthClientInitiatedBidirectionalStreamId(
+        version_.transport_version, n);
   }
 
   quic::QuicStreamId GetNthServerInitiatedUnidirectionalStreamId(int n) {
-    return quic::test::GetNthServerInitiatedUnidirectionalStreamId(version_, n);
+    return quic::test::GetNthServerInitiatedUnidirectionalStreamId(
+        version_.transport_version, n);
   }
 
   void OnFailedOnDefaultNetwork(int rv) { failed_on_default_network_ = true; }
@@ -849,7 +853,7 @@
   quic::test::MockRandom random_generator_;
   quic::MockClock clock_;
   scoped_refptr<TestTaskRunner> runner_;
-  const quic::QuicTransportVersion version_;
+  const quic::ParsedQuicVersion version_;
   QuicTestPacketMaker client_maker_;
   QuicTestPacketMaker server_maker_;
   HttpServerPropertiesImpl http_server_properties_;
@@ -904,8 +908,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -916,8 +920,8 @@
   EXPECT_EQ(DEFAULT_PRIORITY, host_resolver_->last_request_priority());
 
   QuicStreamRequest request2(factory_.get());
-  EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
-                                 DEFAULT_PRIORITY, SocketTag(),
+  EXPECT_EQ(OK, request2.Request(host_port_pair_, version_.transport_version,
+                                 privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
                                  /*cert_verify_flags=*/0, url_, net_log_,
                                  &net_error_details_,
                                  failed_on_default_network_callback_,
@@ -930,8 +934,8 @@
   // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
   // in streams on different sessions.
   QuicStreamRequest request3(factory_.get());
-  EXPECT_EQ(OK, request3.Request(host_port_pair_, version_, privacy_mode_,
-                                 DEFAULT_PRIORITY, SocketTag(),
+  EXPECT_EQ(OK, request3.Request(host_port_pair_, version_.transport_version,
+                                 privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
                                  /*cert_verify_flags=*/0, url_, net_log_,
                                  &net_error_details_,
                                  failed_on_default_network_callback_,
@@ -960,8 +964,8 @@
                                             "192.168.0.1", "");
 
   QuicStreamRequest request(factory_.get());
-  EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
-                                DEFAULT_PRIORITY, SocketTag(),
+  EXPECT_EQ(OK, request.Request(host_port_pair_, version_.transport_version,
+                                privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
                                 /*cert_verify_flags=*/0, url_, net_log_,
                                 &net_error_details_,
                                 failed_on_default_network_callback_,
@@ -986,8 +990,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -1014,8 +1018,8 @@
   auto request = std::make_unique<QuicStreamRequest>(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request->Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   request.reset();
@@ -1044,8 +1048,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -1085,8 +1089,8 @@
 
   QuicStreamRequest request(factory_.get());
   EXPECT_THAT(request.Request(
-                  host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                  SocketTag(),
+                  host_port_pair_, version_.transport_version, privacy_mode_,
+                  DEFAULT_PRIORITY, SocketTag(),
                   /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                   failed_on_default_network_callback_, callback_.callback()),
               IsOk());
@@ -1125,8 +1129,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -1158,8 +1162,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -1191,8 +1195,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -1219,8 +1223,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -1251,8 +1255,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -1296,8 +1300,8 @@
   host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
 
   QuicStreamRequest request(factory_.get());
-  EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
-                                DEFAULT_PRIORITY, SocketTag(),
+  EXPECT_EQ(OK, request.Request(host_port_pair_, version_.transport_version,
+                                privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
                                 /*cert_verify_flags=*/0, url_, net_log_,
                                 &net_error_details_,
                                 failed_on_default_network_callback_,
@@ -1307,11 +1311,12 @@
 
   TestCompletionCallback callback;
   QuicStreamRequest request2(factory_.get());
-  EXPECT_EQ(OK,
-            request2.Request(
-                server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
-                /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
-                failed_on_default_network_callback_, callback.callback()));
+  EXPECT_EQ(OK, request2.Request(server2, version_.transport_version,
+                                 privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+                                 /*cert_verify_flags=*/0, url2_, net_log_,
+                                 &net_error_details_,
+                                 failed_on_default_network_callback_,
+                                 callback.callback()));
   std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
   EXPECT_TRUE(stream2.get());
 
@@ -1360,7 +1365,8 @@
   QuicStreamRequest request2(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request2.Request(
-                server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+                server2, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback.callback()));
   EXPECT_EQ(OK, callback.WaitForResult());
@@ -1394,8 +1400,8 @@
   host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
 
   QuicStreamRequest request(factory_.get());
-  EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
-                                DEFAULT_PRIORITY, SocketTag(),
+  EXPECT_EQ(OK, request.Request(host_port_pair_, version_.transport_version,
+                                privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
                                 /*cert_verify_flags=*/0, url_, net_log_,
                                 &net_error_details_,
                                 failed_on_default_network_callback_,
@@ -1405,11 +1411,12 @@
 
   TestCompletionCallback callback;
   QuicStreamRequest request2(factory_.get());
-  EXPECT_EQ(OK,
-            request2.Request(
-                server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
-                /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
-                failed_on_default_network_callback_, callback.callback()));
+  EXPECT_EQ(OK, request2.Request(server2, version_.transport_version,
+                                 privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+                                 /*cert_verify_flags=*/0, url2_, net_log_,
+                                 &net_error_details_,
+                                 failed_on_default_network_callback_,
+                                 callback.callback()));
   std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
   EXPECT_TRUE(stream2.get());
 
@@ -1419,11 +1426,12 @@
 
   TestCompletionCallback callback3;
   QuicStreamRequest request3(factory_.get());
-  EXPECT_EQ(OK,
-            request3.Request(
-                server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
-                /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
-                failed_on_default_network_callback_, callback3.callback()));
+  EXPECT_EQ(OK, request3.Request(server2, version_.transport_version,
+                                 privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+                                 /*cert_verify_flags=*/0, url2_, net_log_,
+                                 &net_error_details_,
+                                 failed_on_default_network_callback_,
+                                 callback3.callback()));
   std::unique_ptr<HttpStream> stream3 = CreateStream(&request3);
   EXPECT_TRUE(stream3.get());
 
@@ -1454,21 +1462,23 @@
   host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
 
   QuicStreamRequest request(factory_.get());
-  EXPECT_EQ(OK,
-            request.Request(
-                server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
-                /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
-                failed_on_default_network_callback_, callback_.callback()));
+  EXPECT_EQ(OK, request.Request(server1, version_.transport_version,
+                                privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+                                /*cert_verify_flags=*/0, url_, net_log_,
+                                &net_error_details_,
+                                failed_on_default_network_callback_,
+                                callback_.callback()));
   std::unique_ptr<HttpStream> stream = CreateStream(&request);
   EXPECT_TRUE(stream.get());
 
   TestCompletionCallback callback;
   QuicStreamRequest request2(factory_.get());
-  EXPECT_EQ(OK,
-            request2.Request(
-                server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
-                /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
-                failed_on_default_network_callback_, callback_.callback()));
+  EXPECT_EQ(OK, request2.Request(server2, version_.transport_version,
+                                 privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+                                 /*cert_verify_flags=*/0, url2_, net_log_,
+                                 &net_error_details_,
+                                 failed_on_default_network_callback_,
+                                 callback_.callback()));
   std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
   EXPECT_TRUE(stream2.get());
 
@@ -1502,21 +1512,23 @@
   host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
 
   QuicStreamRequest request(factory_.get());
-  EXPECT_EQ(OK,
-            request.Request(
-                server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
-                /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
-                failed_on_default_network_callback_, callback_.callback()));
+  EXPECT_EQ(OK, request.Request(server1, version_.transport_version,
+                                privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+                                /*cert_verify_flags=*/0, url_, net_log_,
+                                &net_error_details_,
+                                failed_on_default_network_callback_,
+                                callback_.callback()));
   std::unique_ptr<HttpStream> stream = CreateStream(&request);
   EXPECT_TRUE(stream.get());
 
   TestCompletionCallback callback;
   QuicStreamRequest request2(factory_.get());
-  EXPECT_EQ(OK,
-            request2.Request(
-                server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
-                /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
-                failed_on_default_network_callback_, callback_.callback()));
+  EXPECT_EQ(OK, request2.Request(server2, version_.transport_version,
+                                 privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+                                 /*cert_verify_flags=*/0, url2_, net_log_,
+                                 &net_error_details_,
+                                 failed_on_default_network_callback_,
+                                 callback_.callback()));
   std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
   EXPECT_TRUE(stream2.get());
 
@@ -1561,21 +1573,23 @@
   host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
 
   QuicStreamRequest request(factory_.get());
-  EXPECT_EQ(OK,
-            request.Request(
-                server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
-                /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
-                failed_on_default_network_callback_, callback_.callback()));
+  EXPECT_EQ(OK, request.Request(server1, version_.transport_version,
+                                privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+                                /*cert_verify_flags=*/0, url_, net_log_,
+                                &net_error_details_,
+                                failed_on_default_network_callback_,
+                                callback_.callback()));
   std::unique_ptr<HttpStream> stream = CreateStream(&request);
   EXPECT_TRUE(stream.get());
 
   TestCompletionCallback callback;
   QuicStreamRequest request2(factory_.get());
-  EXPECT_EQ(OK,
-            request2.Request(
-                server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
-                /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
-                failed_on_default_network_callback_, callback_.callback()));
+  EXPECT_EQ(OK, request2.Request(server2, version_.transport_version,
+                                 privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+                                 /*cert_verify_flags=*/0, url2_, net_log_,
+                                 &net_error_details_,
+                                 failed_on_default_network_callback_,
+                                 callback_.callback()));
   std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
   EXPECT_TRUE(stream2.get());
 
@@ -1605,8 +1619,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -1627,8 +1641,8 @@
   QuicStreamRequest request2(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request2.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -1657,7 +1671,7 @@
   quic::QuicStreamId stream_id = GetNthClientInitiatedBidirectionalStreamId(0);
   MockQuicData socket_data;
   socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
-  if (version_ == quic::QUIC_VERSION_99) {
+  if (version_.transport_version == quic::QUIC_VERSION_99) {
     socket_data.AddWrite(SYNCHRONOUS, client_maker_.MakeStreamsBlockedPacket(
                                           2, true, 52,
                                           /*unidirectional=*/false));
@@ -1691,7 +1705,8 @@
   for (size_t i = 0; i < quic::kDefaultMaxStreamsPerConnection / 2; i++) {
     QuicStreamRequest request(factory_.get());
     int rv = request.Request(
-        host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+        host_port_pair_, version_.transport_version, privacy_mode_,
+        DEFAULT_PRIORITY, SocketTag(),
         /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
         failed_on_default_network_callback_, callback_.callback());
     if (i == 0) {
@@ -1709,8 +1724,8 @@
   }
 
   QuicStreamRequest request(factory_.get());
-  EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
-                                DEFAULT_PRIORITY, SocketTag(),
+  EXPECT_EQ(OK, request.Request(host_port_pair_, version_.transport_version,
+                                privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
                                 /*cert_verify_flags=*/0, url_, net_log_,
                                 &net_error_details_,
                                 failed_on_default_network_callback_,
@@ -1750,8 +1765,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -1771,8 +1786,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -1792,8 +1807,8 @@
     QuicStreamRequest request(factory_.get());
     EXPECT_EQ(ERR_IO_PENDING,
               request.Request(
-                  host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                  SocketTag(),
+                  host_port_pair_, version_.transport_version, privacy_mode_,
+                  DEFAULT_PRIORITY, SocketTag(),
                   /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                   failed_on_default_network_callback_, callback_.callback()));
   }
@@ -1801,8 +1816,8 @@
   base::RunLoop().RunUntilIdle();
 
   QuicStreamRequest request2(factory_.get());
-  EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
-                                 DEFAULT_PRIORITY, SocketTag(),
+  EXPECT_EQ(OK, request2.Request(host_port_pair_, version_.transport_version,
+                                 privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
                                  /*cert_verify_flags=*/0, url_, net_log_,
                                  &net_error_details_,
                                  failed_on_default_network_callback_,
@@ -1840,8 +1855,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -1865,8 +1880,8 @@
   QuicStreamRequest request2(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request2.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -1901,8 +1916,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED, callback_.WaitForResult());
@@ -1922,8 +1937,8 @@
   QuicStreamRequest request2(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request2.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_FALSE(HasActiveSession(host_port_pair_));
@@ -1967,8 +1982,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   // Check no active session, or active jobs left for this server.
@@ -1988,8 +2003,8 @@
   QuicStreamRequest request2(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request2.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_FALSE(HasActiveSession(host_port_pair_));
@@ -2037,8 +2052,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -2072,8 +2087,8 @@
   QuicStreamRequest request2(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request2.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -2130,8 +2145,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -2176,8 +2191,8 @@
   QuicStreamRequest request2(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request2.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -2215,8 +2230,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -2238,8 +2253,8 @@
 
   // Attempting a new request to the same origin uses the same connection.
   QuicStreamRequest request2(factory_.get());
-  EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
-                                 DEFAULT_PRIORITY, SocketTag(),
+  EXPECT_EQ(OK, request2.Request(host_port_pair_, version_.transport_version,
+                                 privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
                                  /*cert_verify_flags=*/0, url_, net_log_,
                                  &net_error_details_,
                                  failed_on_default_network_callback_,
@@ -2316,8 +2331,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -2495,8 +2510,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -2639,8 +2654,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -2756,8 +2771,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -2821,8 +2836,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -2913,8 +2928,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -2977,8 +2992,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -3066,8 +3081,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -3134,8 +3149,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -3207,8 +3222,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -3326,8 +3341,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -3489,8 +3504,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -3663,8 +3678,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -3801,8 +3816,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cerf_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -3842,8 +3857,8 @@
   QuicStreamRequest request2(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request2.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -3918,8 +3933,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -4060,8 +4075,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -4217,8 +4232,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -4356,21 +4371,23 @@
 
   // Create request and QuicHttpStream to create session1.
   QuicStreamRequest request1(factory_.get());
-  EXPECT_EQ(OK,
-            request1.Request(
-                server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
-                /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
-                failed_on_default_network_callback_, callback_.callback()));
+  EXPECT_EQ(OK, request1.Request(server1, version_.transport_version,
+                                 privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+                                 /*cert_verify_flags=*/0, url_, net_log_,
+                                 &net_error_details_,
+                                 failed_on_default_network_callback_,
+                                 callback_.callback()));
   std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
   EXPECT_TRUE(stream1.get());
 
   // Create request and QuicHttpStream to create session2.
   QuicStreamRequest request2(factory_.get());
-  EXPECT_EQ(OK,
-            request2.Request(
-                server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
-                /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
-                failed_on_default_network_callback_, callback_.callback()));
+  EXPECT_EQ(OK, request2.Request(server2, version_.transport_version,
+                                 privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+                                 /*cert_verify_flags=*/0, url2_, net_log_,
+                                 &net_error_details_,
+                                 failed_on_default_network_callback_,
+                                 callback_.callback()));
   std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
   EXPECT_TRUE(stream2.get());
 
@@ -4481,8 +4498,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -4595,8 +4612,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -4661,8 +4678,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -4763,8 +4780,8 @@
   QuicStreamRequest request1(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request1.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -4783,8 +4800,8 @@
   // Request #2 returns synchronously because it pools to existing session.
   TestCompletionCallback callback2;
   QuicStreamRequest request2(factory_.get());
-  EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
-                                 DEFAULT_PRIORITY, SocketTag(),
+  EXPECT_EQ(OK, request2.Request(host_port_pair_, version_.transport_version,
+                                 privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
                                  /*cert_verify_flags=*/0, url_, net_log_,
                                  &net_error_details_,
                                  failed_on_default_network_callback_,
@@ -4900,8 +4917,8 @@
   QuicStreamRequest request1(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request1.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -5022,8 +5039,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -5083,8 +5100,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -5205,8 +5222,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -5322,8 +5339,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED, callback_.WaitForResult());
@@ -5343,8 +5360,8 @@
   QuicStreamRequest request2(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request2.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_FALSE(HasActiveSession(host_port_pair_));
@@ -5417,8 +5434,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   // Ensure that the session is alive but not active.
@@ -5487,8 +5504,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_EQ(OK, callback_.WaitForResult());
@@ -5584,8 +5601,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_EQ(OK, callback_.WaitForResult());
@@ -5721,8 +5738,8 @@
   QuicStreamRequest request1(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request1.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -5741,8 +5758,8 @@
   // Second request returns synchronously because it pools to existing session.
   TestCompletionCallback callback2;
   QuicStreamRequest request2(factory_.get());
-  EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
-                                 DEFAULT_PRIORITY, SocketTag(),
+  EXPECT_EQ(OK, request2.Request(host_port_pair_, version_.transport_version,
+                                 privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
                                  /*cert_verify_flags=*/0, url_, net_log_,
                                  &net_error_details_,
                                  failed_on_default_network_callback_,
@@ -5857,8 +5874,8 @@
   QuicStreamRequest request1(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request1.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -5877,8 +5894,8 @@
   // Second request returns synchronously because it pools to existing session.
   TestCompletionCallback callback2;
   QuicStreamRequest request2(factory_.get());
-  EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
-                                 DEFAULT_PRIORITY, SocketTag(),
+  EXPECT_EQ(OK, request2.Request(host_port_pair_, version_.transport_version,
+                                 privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
                                  /*cert_verify_flags=*/0, url_, net_log_,
                                  &net_error_details_,
                                  failed_on_default_network_callback_,
@@ -6004,8 +6021,8 @@
   QuicStreamRequest request1(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request1.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -6024,8 +6041,8 @@
   // Second request returns synchronously because it pools to existing session.
   TestCompletionCallback callback2;
   QuicStreamRequest request2(factory_.get());
-  EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
-                                 DEFAULT_PRIORITY, SocketTag(),
+  EXPECT_EQ(OK, request2.Request(host_port_pair_, version_.transport_version,
+                                 privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
                                  /*cert_verify_flags=*/0, url_, net_log_,
                                  &net_error_details_,
                                  failed_on_default_network_callback_,
@@ -6137,8 +6154,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_EQ(OK, callback_.WaitForResult());
@@ -6224,8 +6241,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_EQ(OK, callback_.WaitForResult());
@@ -6350,8 +6367,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_EQ(OK, callback_.WaitForResult());
@@ -6445,8 +6462,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   // Deliver the network notification, which should cause the connection to be
@@ -6484,8 +6501,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_EQ(OK, callback_.WaitForResult());
@@ -6618,8 +6635,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_EQ(OK, callback_.WaitForResult());
@@ -6758,8 +6775,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -6889,8 +6906,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_EQ(OK, callback_.WaitForResult());
@@ -6993,8 +7010,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_EQ(OK, callback_.WaitForResult());
@@ -7107,8 +7124,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_EQ(OK, callback_.WaitForResult());
@@ -7222,8 +7239,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_EQ(OK, callback_.WaitForResult());
@@ -7367,8 +7384,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_EQ(OK, callback_.WaitForResult());
@@ -7460,8 +7477,8 @@
       ->NotifyNetworkMadeDefault(kNewNetworkForTests);
 
   QuicStreamRequest request2(factory_.get());
-  EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
-                                 DEFAULT_PRIORITY, SocketTag(),
+  EXPECT_EQ(OK, request2.Request(host_port_pair_, version_.transport_version,
+                                 privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
                                  /*cert_verify_flags=*/0, url_, net_log_,
                                  &net_error_details_,
                                  failed_on_default_network_callback_,
@@ -7546,8 +7563,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -7660,8 +7677,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -7738,8 +7755,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_EQ(OK, callback_.WaitForResult());
@@ -7890,8 +7907,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_EQ(OK, callback_.WaitForResult());
@@ -7948,8 +7965,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -7971,8 +7988,8 @@
   QuicStreamRequest request2(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request2.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -8089,8 +8106,8 @@
                                             "192.168.0.1", "");
 
   QuicStreamRequest request(factory_.get());
-  EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
-                                DEFAULT_PRIORITY, SocketTag(),
+  EXPECT_EQ(OK, request.Request(host_port_pair_, version_.transport_version,
+                                privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
                                 /*cert_verify_flags=*/0, url_, net_log_,
                                 &net_error_details_,
                                 failed_on_default_network_callback_,
@@ -8140,8 +8157,8 @@
   EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(quic::kPingTimeoutSecs),
             QuicStreamFactoryPeer::GetPingTimeout(factory_.get()));
   QuicStreamRequest request(factory_.get());
-  EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
-                                DEFAULT_PRIORITY, SocketTag(),
+  EXPECT_EQ(OK, request.Request(host_port_pair_, version_.transport_version,
+                                privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
                                 /*cert_verify_flags=*/0, url_, net_log_,
                                 &net_error_details_,
                                 failed_on_default_network_callback_,
@@ -8178,11 +8195,12 @@
   DVLOG(1) << "Create 2nd session and timeout with open stream";
   TestCompletionCallback callback2;
   QuicStreamRequest request2(factory_.get());
-  EXPECT_EQ(OK,
-            request2.Request(
-                server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
-                /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
-                failed_on_default_network_callback_, callback2.callback()));
+  EXPECT_EQ(OK, request2.Request(server2, version_.transport_version,
+                                 privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+                                 /*cert_verify_flags=*/0, url2_, net_log_,
+                                 &net_error_details_,
+                                 failed_on_default_network_callback_,
+                                 callback2.callback()));
   QuicChromiumClientSession* session2 = GetActiveSession(server2);
   EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(10),
             session2->connection()->ping_timeout());
@@ -8251,8 +8269,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -8298,8 +8316,8 @@
                                        "StartReading");
 
   QuicStreamRequest request(factory_.get());
-  EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
-                                DEFAULT_PRIORITY, SocketTag(),
+  EXPECT_EQ(OK, request.Request(host_port_pair_, version_.transport_version,
+                                privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
                                 /*cert_verify_flags=*/0, url_, net_log_,
                                 &net_error_details_,
                                 failed_on_default_network_callback_,
@@ -8347,8 +8365,8 @@
                                        "StartReading");
 
   QuicStreamRequest request(factory_.get());
-  EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
-                                DEFAULT_PRIORITY, SocketTag(),
+  EXPECT_EQ(OK, request.Request(host_port_pair_, version_.transport_version,
+                                privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
                                 /*cert_verify_flags=*/0, url_, net_log_,
                                 &net_error_details_,
                                 failed_on_default_network_callback_,
@@ -8383,8 +8401,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -8404,8 +8422,8 @@
         ->promised_by_url())[kDefaultUrl] = &promised;
 
   QuicStreamRequest request2(factory_.get());
-  EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
-                                 DEFAULT_PRIORITY, SocketTag(),
+  EXPECT_EQ(OK, request2.Request(host_port_pair_, version_.transport_version,
+                                 privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
                                  /*cert_verify_flags=*/0, url_, net_log_,
                                  &net_error_details_,
                                  failed_on_default_network_callback_,
@@ -8437,8 +8455,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -8465,8 +8483,8 @@
   QuicStreamRequest request2(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request2.Request(
-                host_port_pair_, version_, PRIVACY_MODE_ENABLED,
-                DEFAULT_PRIORITY, SocketTag(),
+                host_port_pair_, version_.transport_version,
+                PRIVACY_MODE_ENABLED, DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -8500,12 +8518,12 @@
   socket_data.AddSocketDataToFactory(socket_factory_.get());
 
   QuicStreamRequest request1(factory_.get());
-  EXPECT_EQ(
-      ERR_IO_PENDING,
-      request1.Request(
-          destination1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
-          /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
-          failed_on_default_network_callback_, callback_.callback()));
+  EXPECT_EQ(ERR_IO_PENDING,
+            request1.Request(
+                destination1, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
+                /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
+                failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
   std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
   EXPECT_TRUE(stream1.get());
@@ -8514,8 +8532,8 @@
   // Second request returns synchronously because it pools to existing session.
   TestCompletionCallback callback2;
   QuicStreamRequest request2(factory_.get());
-  EXPECT_EQ(OK, request2.Request(destination2, version_, privacy_mode_,
-                                 DEFAULT_PRIORITY, SocketTag(),
+  EXPECT_EQ(OK, request2.Request(destination2, version_.transport_version,
+                                 privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
                                  /*cert_verify_flags=*/0, url_, net_log_,
                                  &net_error_details_,
                                  failed_on_default_network_callback_,
@@ -8621,12 +8639,12 @@
   AddHangingSocketData();
 
   QuicStreamRequest request(factory_.get());
-  EXPECT_EQ(
-      ERR_IO_PENDING,
-      request.Request(
-          destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
-          /*cert_verify_flags=*/0, url, net_log_, &net_error_details_,
-          failed_on_default_network_callback_, callback_.callback()));
+  EXPECT_EQ(ERR_IO_PENDING,
+            request.Request(
+                destination, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
+                /*cert_verify_flags=*/0, url, net_log_, &net_error_details_,
+                failed_on_default_network_callback_, callback_.callback()));
 
   EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_QUIC_HANDSHAKE_FAILED));
 
@@ -8666,12 +8684,12 @@
   sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data));
 
   QuicStreamRequest request1(factory_.get());
-  EXPECT_EQ(
-      ERR_IO_PENDING,
-      request1.Request(
-          destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
-          /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_,
-          failed_on_default_network_callback_, callback_.callback()));
+  EXPECT_EQ(ERR_IO_PENDING,
+            request1.Request(
+                destination, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
+                /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_,
+                failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
 
   std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
@@ -8681,8 +8699,8 @@
   // Second request returns synchronously because it pools to existing session.
   TestCompletionCallback callback2;
   QuicStreamRequest request2(factory_.get());
-  EXPECT_EQ(OK, request2.Request(destination, version_, privacy_mode_,
-                                 DEFAULT_PRIORITY, SocketTag(),
+  EXPECT_EQ(OK, request2.Request(destination, version_.transport_version,
+                                 privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
                                  /*cert_verify_flags=*/0, url2, net_log_,
                                  &net_error_details_,
                                  failed_on_default_network_callback_,
@@ -8747,8 +8765,8 @@
   QuicStreamRequest request1(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request1.Request(
-                destination, version_, PRIVACY_MODE_DISABLED, DEFAULT_PRIORITY,
-                SocketTag(),
+                destination, version_.transport_version, PRIVACY_MODE_DISABLED,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_EQ(OK, callback_.WaitForResult());
@@ -8760,8 +8778,8 @@
   QuicStreamRequest request2(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request2.Request(
-                destination, version_, PRIVACY_MODE_ENABLED, DEFAULT_PRIORITY,
-                SocketTag(),
+                destination, version_.transport_version, PRIVACY_MODE_ENABLED,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url2, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback2.callback()));
   EXPECT_EQ(OK, callback2.WaitForResult());
@@ -8832,12 +8850,12 @@
   sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data1));
 
   QuicStreamRequest request1(factory_.get());
-  EXPECT_EQ(
-      ERR_IO_PENDING,
-      request1.Request(
-          destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
-          /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_,
-          failed_on_default_network_callback_, callback_.callback()));
+  EXPECT_EQ(ERR_IO_PENDING,
+            request1.Request(
+                destination, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
+                /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_,
+                failed_on_default_network_callback_, callback_.callback()));
   EXPECT_THAT(callback_.WaitForResult(), IsOk());
   std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
   EXPECT_TRUE(stream1.get());
@@ -8845,12 +8863,12 @@
 
   TestCompletionCallback callback2;
   QuicStreamRequest request2(factory_.get());
-  EXPECT_EQ(
-      ERR_IO_PENDING,
-      request2.Request(
-          destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
-          /*cert_verify_flags=*/0, url2, net_log_, &net_error_details_,
-          failed_on_default_network_callback_, callback2.callback()));
+  EXPECT_EQ(ERR_IO_PENDING,
+            request2.Request(
+                destination, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
+                /*cert_verify_flags=*/0, url2, net_log_, &net_error_details_,
+                failed_on_default_network_callback_, callback2.callback()));
   EXPECT_THAT(callback2.WaitForResult(), IsOk());
   std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
   EXPECT_TRUE(stream2.get());
@@ -8958,8 +8976,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, MAXIMUM_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                MAXIMUM_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -8986,8 +9004,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, MAXIMUM_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                MAXIMUM_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -8997,8 +9015,8 @@
   QuicStreamRequest request2(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request2.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_EQ(DEFAULT_PRIORITY, host_resolver_->last_request_priority());
@@ -9042,8 +9060,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -9096,8 +9114,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -9147,8 +9165,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -9185,8 +9203,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -9219,8 +9237,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_NAME_NOT_RESOLVED,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -9245,8 +9263,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -9298,8 +9316,8 @@
 
   QuicStreamRequest request(factory_.get());
   EXPECT_THAT(request.Request(
-                  host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                  SocketTag(),
+                  host_port_pair_, version_.transport_version, privacy_mode_,
+                  DEFAULT_PRIORITY, SocketTag(),
                   /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                   failed_on_default_network_callback_, callback_.callback()),
               IsOk());
@@ -9336,8 +9354,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   TestCompletionCallback host_resolution_callback;
@@ -9396,8 +9414,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -9458,8 +9476,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -9526,8 +9544,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -9598,8 +9616,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -9670,8 +9688,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -9746,8 +9764,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   // Finish dns resolution, but need to wait for stale connection.
@@ -9790,8 +9808,8 @@
 
   EXPECT_EQ(ERR_NAME_NOT_RESOLVED,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 }
@@ -9815,8 +9833,8 @@
 
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -9862,8 +9880,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -9917,8 +9935,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   EXPECT_FALSE(HasLiveSession(host_port_pair_));
@@ -9966,8 +9984,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -10030,8 +10048,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -10084,8 +10102,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -10137,8 +10155,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -10172,8 +10190,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
 
@@ -10224,8 +10242,8 @@
   QuicStreamRequest request(factory_.get());
   EXPECT_EQ(ERR_IO_PENDING,
             request.Request(
-                host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
-                SocketTag(),
+                host_port_pair_, version_.transport_version, privacy_mode_,
+                DEFAULT_PRIORITY, SocketTag(),
                 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
                 failed_on_default_network_callback_, callback_.callback()));
   base::RunLoop().RunUntilIdle();
@@ -10235,8 +10253,9 @@
 
   // The pending task is scheduled for handshake timeout retransmission,
   // which is 2 * 400ms for v99 and 1.5 * 400ms for others.
-  int handshake_timeout =
-      version_ == quic::QUIC_VERSION_99 ? 2 * kInitialRtt : 1.5 * kInitialRtt;
+  int handshake_timeout = version_.transport_version == quic::QUIC_VERSION_99
+                              ? 2 * kInitialRtt
+                              : 1.5 * kInitialRtt;
   EXPECT_EQ(base::TimeDelta::FromMilliseconds(handshake_timeout),
             task_runner->NextPendingTaskDelay());
 
@@ -10289,7 +10308,8 @@
   // Request a stream with |tag1|.
   QuicStreamRequest request1(factory_.get());
   int rv = request1.Request(
-      host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY, tag1,
+      host_port_pair_, version_.transport_version, privacy_mode_,
+      DEFAULT_PRIORITY, tag1,
       /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
       failed_on_default_network_callback_, callback_.callback());
   EXPECT_THAT(callback_.GetResult(rv), IsOk());
@@ -10304,7 +10324,8 @@
   // Request a stream with |tag1| and verify underlying session is reused.
   QuicStreamRequest request2(factory_.get());
   rv = request2.Request(
-      host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY, tag1,
+      host_port_pair_, version_.transport_version, privacy_mode_,
+      DEFAULT_PRIORITY, tag1,
       /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
       failed_on_default_network_callback_, callback_.callback());
   EXPECT_THAT(callback_.GetResult(rv), IsOk());
@@ -10317,7 +10338,8 @@
   // Request a stream with |tag2| and verify a new session is created.
   QuicStreamRequest request3(factory_.get());
   rv = request3.Request(
-      host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY, tag2,
+      host_port_pair_, version_.transport_version, privacy_mode_,
+      DEFAULT_PRIORITY, tag2,
       /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
       failed_on_default_network_callback_, callback_.callback());
   EXPECT_THAT(callback_.GetResult(rv), IsOk());
diff --git a/net/quic/quic_test_packet_maker.cc b/net/quic/quic_test_packet_maker.cc
index cd20f7ae..cd107c7 100644
--- a/net/quic/quic_test_packet_maker.cc
+++ b/net/quic/quic_test_packet_maker.cc
@@ -28,7 +28,7 @@
 }  // namespace
 
 QuicTestPacketMaker::QuicTestPacketMaker(
-    quic::QuicTransportVersion version,
+    quic::ParsedQuicVersion version,
     quic::QuicConnectionId connection_id,
     quic::MockClock* clock,
     const std::string& host,
@@ -45,7 +45,7 @@
       long_header_type_(quic::INVALID_PACKET_TYPE),
       client_headers_include_h2_stream_dependency_(
           client_headers_include_h2_stream_dependency &&
-          version >= quic::QUIC_VERSION_43) {
+          version.transport_version >= quic::QUIC_VERSION_43) {
   DCHECK(!(perspective_ == quic::Perspective::IS_SERVER &&
            client_headers_include_h2_stream_dependency_));
 }
@@ -70,22 +70,22 @@
   header.packet_number_length = GetPacketNumberLength();
   header.packet_number = quic::QuicPacketNumber(num);
 
-  if (quic::QuicVersionHasLongHeaderLengths(version_) && header.version_flag) {
+  if (quic::QuicVersionHasLongHeaderLengths(version_.transport_version) &&
+      header.version_flag) {
     if (long_header_type_ == quic::INITIAL) {
       header.retry_token_length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_1;
     }
     header.length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_2;
   }
 
-  quic::QuicFramer framer(quic::test::SupportedVersions(quic::ParsedQuicVersion(
-                              quic::PROTOCOL_QUIC_CRYPTO, version_)),
+  quic::QuicFramer framer(quic::test::SupportedVersions(version_),
                           clock_->Now(), perspective_,
                           quic::kQuicDefaultConnectionIdLength);
   size_t max_plaintext_size =
       framer.GetMaxPlaintextSize(quic::kDefaultMaxPacketSize);
   char buffer[quic::kDefaultMaxPacketSize];
   size_t length;
-  if (version_ != quic::QUIC_VERSION_99) {
+  if (version_.transport_version != quic::QUIC_VERSION_99) {
     length = framer.BuildConnectivityProbingPacket(
         header, buffer, max_plaintext_size, encryption_level_);
   } else if (perspective_ == quic::Perspective::IS_CLIENT) {
@@ -125,7 +125,8 @@
   header.packet_number_length = GetPacketNumberLength();
   header.packet_number = quic::QuicPacketNumber(num);
 
-  if (quic::QuicVersionHasLongHeaderLengths(version_) && header.version_flag) {
+  if (quic::QuicVersionHasLongHeaderLengths(version_.transport_version) &&
+      header.version_flag) {
     if (long_header_type_ == quic::INITIAL) {
       header.retry_token_length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_1;
     }
@@ -149,10 +150,10 @@
   quic::QuicCryptoFrame crypto_frame;
   quic::test::SimpleDataProducer producer;
   quic::QuicStreamFrameDataProducer* producer_p = nullptr;
-  if (!QuicVersionUsesCryptoFrames(version_)) {
-    quic::QuicStreamFrame frame(quic::QuicUtils::GetCryptoStreamId(version_),
-                                /*fin=*/false, /*offset=*/0,
-                                data.AsStringPiece());
+  if (!QuicVersionUsesCryptoFrames(version_.transport_version)) {
+    quic::QuicStreamFrame frame(
+        quic::QuicUtils::GetCryptoStreamId(version_.transport_version),
+        /*fin=*/false, /*offset=*/0, data.AsStringPiece());
     frames.push_back(quic::QuicFrame(frame));
   } else {
     crypto_frame =
@@ -188,7 +189,8 @@
   header.packet_number_length = GetPacketNumberLength();
   header.packet_number = quic::QuicPacketNumber(num);
 
-  if (quic::QuicVersionHasLongHeaderLengths(version_) && header.version_flag) {
+  if (quic::QuicVersionHasLongHeaderLengths(version_.transport_version) &&
+      header.version_flag) {
     if (long_header_type_ == quic::INITIAL) {
       header.retry_token_length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_1;
     }
@@ -242,7 +244,8 @@
   header.packet_number_length = GetPacketNumberLength();
   header.packet_number = quic::QuicPacketNumber(num);
 
-  if (quic::QuicVersionHasLongHeaderLengths(version_) && header.version_flag) {
+  if (quic::QuicVersionHasLongHeaderLengths(version_.transport_version) &&
+      header.version_flag) {
     if (long_header_type_ == quic::INITIAL) {
       header.retry_token_length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_1;
     }
@@ -258,7 +261,8 @@
   // The STOP_SENDING frame must be outside of the if (version==99) so that it
   // stays in scope until the packet is built.
   quic::QuicStopSendingFrame stop(1, stream_id, error_code);
-  if (include_stop_sending_if_v99 && version_ == quic::QUIC_VERSION_99) {
+  if (include_stop_sending_if_v99 &&
+      version_.transport_version == quic::QUIC_VERSION_99) {
     frames.push_back(quic::QuicFrame(&stop));
     DVLOG(1) << "Adding frame: " << frames.back();
   }
@@ -282,7 +286,8 @@
   header.packet_number_length = GetPacketNumberLength();
   header.packet_number = quic::QuicPacketNumber(num);
 
-  if (quic::QuicVersionHasLongHeaderLengths(version_) && header.version_flag) {
+  if (quic::QuicVersionHasLongHeaderLengths(version_.transport_version) &&
+      header.version_flag) {
     if (long_header_type_ == quic::INITIAL) {
       header.retry_token_length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_1;
     }
@@ -310,7 +315,8 @@
   header.packet_number_length = GetPacketNumberLength();
   header.packet_number = quic::QuicPacketNumber(num);
 
-  if (quic::QuicVersionHasLongHeaderLengths(version_) && header.version_flag) {
+  if (quic::QuicVersionHasLongHeaderLengths(version_.transport_version) &&
+      header.version_flag) {
     if (long_header_type_ == quic::INITIAL) {
       header.retry_token_length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_1;
     }
@@ -348,7 +354,8 @@
     *offset += spdy_frame.size();
   }
   quic::QuicStreamFrame headers_frame(
-      quic::QuicUtils::GetHeadersStreamId(version_), false, header_offset,
+      quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false,
+      header_offset,
       quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
 
   quic::QuicFrames frames;
@@ -358,7 +365,7 @@
   // The STOP_SENDING frame must be outside of the if (version==99) so that it
   // stays in scope until the packet is built.
   quic::QuicStopSendingFrame stop(1, rst_stream_id, rst_error_code);
-  if (version_ == quic::QUIC_VERSION_99) {
+  if (version_.transport_version == quic::QUIC_VERSION_99) {
     frames.push_back(quic::QuicFrame(&stop));
     DVLOG(1) << "Adding frame: " << frames.back();
   }
@@ -408,7 +415,8 @@
   header.packet_number_length = GetPacketNumberLength();
   header.packet_number = quic::QuicPacketNumber(num);
 
-  if (quic::QuicVersionHasLongHeaderLengths(version_) && header.version_flag) {
+  if (quic::QuicVersionHasLongHeaderLengths(version_.transport_version) &&
+      header.version_flag) {
     if (long_header_type_ == quic::INITIAL) {
       header.retry_token_length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_1;
     }
@@ -436,7 +444,8 @@
   // The STOP_SENDING frame must be outside of the if (version==99) so that it
   // stays in scope until the packet is built.
   quic::QuicStopSendingFrame stop(1, stream_id, error_code);
-  if (version_ == quic::QUIC_VERSION_99 && include_stop_sending_if_v99) {
+  if (version_.transport_version == quic::QUIC_VERSION_99 &&
+      include_stop_sending_if_v99) {
     frames.push_back(quic::QuicFrame(&stop));
     DVLOG(1) << "Adding frame: " << frames.back();
   }
@@ -467,7 +476,8 @@
   header.packet_number_length = GetPacketNumberLength();
   header.packet_number = quic::QuicPacketNumber(num);
 
-  if (quic::QuicVersionHasLongHeaderLengths(version_) && header.version_flag) {
+  if (quic::QuicVersionHasLongHeaderLengths(version_.transport_version) &&
+      header.version_flag) {
     if (long_header_type_ == quic::INITIAL) {
       header.retry_token_length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_1;
     }
@@ -483,7 +493,7 @@
   // stays in scope until the packet is built.
   quic::QuicStopSendingFrame stop(
       1, stream_id, static_cast<quic::QuicApplicationErrorCode>(error_code));
-  if (version_ == quic::QUIC_VERSION_99) {
+  if (version_.transport_version == quic::QUIC_VERSION_99) {
     frames.push_back(quic::QuicFrame(&stop));
     DVLOG(1) << "Adding frame: " << frames.back();
   }
@@ -504,7 +514,7 @@
   quic::QuicConnectionCloseFrame close;
   close.quic_error_code = quic_error;
   close.error_details = quic_error_details;
-  if (version_ == quic::QUIC_VERSION_99) {
+  if (version_.transport_version == quic::QUIC_VERSION_99) {
     close.close_type = quic::IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
   }
 
@@ -535,7 +545,8 @@
   header.packet_number_length = GetPacketNumberLength();
   header.packet_number = quic::QuicPacketNumber(num);
 
-  if (quic::QuicVersionHasLongHeaderLengths(version_) && header.version_flag) {
+  if (quic::QuicVersionHasLongHeaderLengths(version_.transport_version) &&
+      header.version_flag) {
     if (long_header_type_ == quic::INITIAL) {
       header.retry_token_length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_1;
     }
@@ -559,7 +570,7 @@
   quic::QuicConnectionCloseFrame close;
   close.quic_error_code = quic_error;
   close.error_details = quic_error_details;
-  if (version_ == quic::QUIC_VERSION_99) {
+  if (version_.transport_version == quic::QUIC_VERSION_99) {
     close.close_type = quic::IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
   }
 
@@ -586,7 +597,8 @@
   header.packet_number_length = GetPacketNumberLength();
   header.packet_number = quic::QuicPacketNumber(num);
 
-  if (quic::QuicVersionHasLongHeaderLengths(version_) && header.version_flag) {
+  if (quic::QuicVersionHasLongHeaderLengths(version_.transport_version) &&
+      header.version_flag) {
     if (long_header_type_ == quic::INITIAL) {
       header.retry_token_length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_1;
     }
@@ -596,7 +608,7 @@
   quic::QuicConnectionCloseFrame close;
   close.quic_error_code = quic_error;
   close.error_details = quic_error_details;
-  if (version_ == quic::QUIC_VERSION_99) {
+  if (version_.transport_version == quic::QUIC_VERSION_99) {
     close.close_type = quic::IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
   }
 
@@ -618,7 +630,8 @@
   header.packet_number_length = GetPacketNumberLength();
   header.packet_number = quic::QuicPacketNumber(num);
 
-  if (quic::QuicVersionHasLongHeaderLengths(version_) && header.version_flag) {
+  if (quic::QuicVersionHasLongHeaderLengths(version_.transport_version) &&
+      header.version_flag) {
     if (long_header_type_ == quic::INITIAL) {
       header.retry_token_length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_1;
     }
@@ -685,7 +698,8 @@
   header.packet_number_length = GetPacketNumberLength();
   header.packet_number = quic::QuicPacketNumber(packet_number);
 
-  if (quic::QuicVersionHasLongHeaderLengths(version_) && header.version_flag) {
+  if (quic::QuicVersionHasLongHeaderLengths(version_.transport_version) &&
+      header.version_flag) {
     if (long_header_type_ == quic::INITIAL) {
       header.retry_token_length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_1;
     }
@@ -703,8 +717,7 @@
     ack.packets.AddRange(quic::QuicPacketNumber(first_received),
                          quic::QuicPacketNumber(largest_received + 1));
   }
-  quic::QuicFramer framer(quic::test::SupportedVersions(quic::ParsedQuicVersion(
-                              quic::PROTOCOL_QUIC_CRYPTO, version_)),
+  quic::QuicFramer framer(quic::test::SupportedVersions(version_),
                           clock_->Now(), perspective_,
                           quic::kQuicDefaultConnectionIdLength);
   quic::QuicFrames frames;
@@ -854,7 +867,8 @@
   quic::QuicStreamOffset header_offset =
       header_stream_offset == nullptr ? 0 : *header_stream_offset;
   quic::QuicStreamFrame frame(
-      quic::QuicUtils::GetHeadersStreamId(version_), false, header_offset,
+      quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false,
+      header_offset,
       quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
   frames.push_back(quic::QuicFrame(frame));
   DVLOG(1) << "Adding frame: " << frames.back();
@@ -934,14 +948,14 @@
 
   if (offset != nullptr) {
     quic::QuicStreamFrame frame(
-        quic::QuicUtils::GetHeadersStreamId(version_), false, *offset,
-        quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
+        quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false,
+        *offset, quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
     *offset += spdy_frame.size();
     return MakePacket(header_, quic::QuicFrame(frame));
   } else {
     quic::QuicStreamFrame frame(
-        quic::QuicUtils::GetHeadersStreamId(version_), false, 0,
-        quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
+        quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false,
+        0, quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
 
     return MakePacket(header_, quic::QuicFrame(frame));
   }
@@ -971,7 +985,8 @@
     *header_stream_offset += spdy_frame.size();
   }
   quic::QuicStreamFrame headers_frame(
-      quic::QuicUtils::GetHeadersStreamId(version_), false, header_offset,
+      quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false,
+      header_offset,
       quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
 
   quic::QuicRstStreamFrame rst_frame(1, stream_id, error_code, bytes_written);
@@ -985,7 +1000,7 @@
   // The STOP_SENDING frame must be outside of the if (version==99) so that it
   // stays in scope until the packet is built.
   quic::QuicStopSendingFrame stop(1, stream_id, error_code);
-  if (version_ == quic::QUIC_VERSION_99) {
+  if (version_.transport_version == quic::QUIC_VERSION_99) {
     frames.push_back(quic::QuicFrame(&stop));
     DVLOG(1) << "Adding frame: " << frames.back();
   }
@@ -1056,14 +1071,14 @@
   }
   if (offset != nullptr) {
     quic::QuicStreamFrame frame(
-        quic::QuicUtils::GetHeadersStreamId(version_), false, *offset,
-        quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
+        quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false,
+        *offset, quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
     *offset += spdy_frame.size();
     return MakePacket(header_, quic::QuicFrame(frame));
   } else {
     quic::QuicStreamFrame frame(
-        quic::QuicUtils::GetHeadersStreamId(version_), false, 0,
-        quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
+        quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false,
+        0, quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
     return MakePacket(header_, quic::QuicFrame(frame));
   }
 }
@@ -1081,8 +1096,8 @@
       spdy_request_framer_.SerializeFrame(spdy_data));
   InitializeHeader(packet_number, should_include_version);
   quic::QuicStreamFrame quic_frame(
-      quic::QuicUtils::GetHeadersStreamId(version_), false, *offset,
-      quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
+      quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false,
+      *offset, quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
   *offset += spdy_frame.size();
   return MakePacket(header_, quic::QuicFrame(quic_frame));
 }
@@ -1109,14 +1124,14 @@
   }
   if (offset != nullptr) {
     quic::QuicStreamFrame frame(
-        quic::QuicUtils::GetHeadersStreamId(version_), false, *offset,
-        quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
+        quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false,
+        *offset, quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
     *offset += spdy_frame.size();
     return MakePacket(header_, quic::QuicFrame(frame));
   } else {
     quic::QuicStreamFrame frame(
-        quic::QuicUtils::GetHeadersStreamId(version_), false, 0,
-        quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
+        quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false,
+        0, quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
     return MakePacket(header_, quic::QuicFrame(frame));
   }
 }
@@ -1200,8 +1215,7 @@
     const quic::QuicPacketHeader& header,
     const quic::QuicFrames& frames,
     quic::QuicStreamFrameDataProducer* data_producer) {
-  quic::QuicFramer framer(quic::test::SupportedVersions(quic::ParsedQuicVersion(
-                              quic::PROTOCOL_QUIC_CRYPTO, version_)),
+  quic::QuicFramer framer(quic::test::SupportedVersions(version_),
                           clock_->Now(), perspective_,
                           quic::kQuicDefaultConnectionIdLength);
   if (data_producer != nullptr) {
@@ -1232,7 +1246,7 @@
   header_.long_packet_type = long_header_type_;
   header_.packet_number_length = GetPacketNumberLength();
   header_.packet_number = quic::QuicPacketNumber(packet_number);
-  if (quic::QuicVersionHasLongHeaderLengths(version_) &&
+  if (quic::QuicVersionHasLongHeaderLengths(version_.transport_version) &&
       should_include_version) {
     if (long_header_type_ == quic::INITIAL) {
       header_.retry_token_length_length =
@@ -1264,13 +1278,13 @@
   *stream_data = std::string(spdy_frame.data(), spdy_frame.size());
   if (offset != nullptr) {
     quic::QuicStreamFrame quic_frame(
-        quic::QuicUtils::GetHeadersStreamId(version_), false, *offset,
-        quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
+        quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false,
+        *offset, quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
     *offset += spdy_frame.size();
     return MakePacket(header_, quic::QuicFrame(quic_frame));
   }
   quic::QuicStreamFrame quic_frame(
-      quic::QuicUtils::GetHeadersStreamId(version_), false, 0,
+      quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false, 0,
       quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
   return MakePacket(header_, quic::QuicFrame(quic_frame));
 }
@@ -1297,7 +1311,8 @@
     *offset += spdy_frame.size();
   }
   quic::QuicStreamFrame quic_frame(
-      quic::QuicUtils::GetHeadersStreamId(version_), false, header_offset,
+      quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false,
+      header_offset,
       quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
   DVLOG(1) << "Adding frame: " << quic::QuicFrame(quic_frame);
   InitializeHeader(packet_number, should_include_version);
@@ -1344,8 +1359,8 @@
 
     spdy::SpdySerializedFrame* spdy_frame = spdy_frames.back().get();
     quic::QuicStreamFrame stream_frame(
-        quic::QuicUtils::GetHeadersStreamId(version_), false, *offset,
-        quic::QuicStringPiece(spdy_frame->data(), spdy_frame->size()));
+        quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false,
+        *offset, quic::QuicStringPiece(spdy_frame->data(), spdy_frame->size()));
     *offset += spdy_frame->size();
 
     frames.push_back(quic::QuicFrame(stream_frame));
@@ -1375,7 +1390,7 @@
 }
 
 bool QuicTestPacketMaker::ShouldIncludeVersion(bool include_version) const {
-  if (version_ > quic::QUIC_VERSION_43) {
+  if (version_.transport_version > quic::QUIC_VERSION_43) {
     return encryption_level_ < quic::ENCRYPTION_FORWARD_SECURE;
   }
   return include_version;
@@ -1383,9 +1398,9 @@
 
 quic::QuicPacketNumberLength QuicTestPacketMaker::GetPacketNumberLength()
     const {
-  if (version_ > quic::QUIC_VERSION_43 &&
+  if (version_.transport_version > quic::QUIC_VERSION_43 &&
       encryption_level_ < quic::ENCRYPTION_FORWARD_SECURE &&
-      version_ != quic::QUIC_VERSION_99) {
+      version_.transport_version != quic::QUIC_VERSION_99) {
     return quic::PACKET_4BYTE_PACKET_NUMBER;
   }
   return quic::PACKET_1BYTE_PACKET_NUMBER;
@@ -1394,7 +1409,7 @@
 quic::QuicConnectionIdIncluded QuicTestPacketMaker::HasDestinationConnectionId()
     const {
   if (perspective_ == quic::Perspective::IS_SERVER &&
-      version_ > quic::QUIC_VERSION_43) {
+      version_.transport_version > quic::QUIC_VERSION_43) {
     return quic::CONNECTION_ID_ABSENT;
   }
   return quic::CONNECTION_ID_PRESENT;
@@ -1403,7 +1418,7 @@
 quic::QuicConnectionIdIncluded QuicTestPacketMaker::HasSourceConnectionId()
     const {
   if (perspective_ == quic::Perspective::IS_SERVER &&
-      version_ > quic::QUIC_VERSION_43 &&
+      version_.transport_version > quic::QUIC_VERSION_43 &&
       encryption_level_ < quic::ENCRYPTION_FORWARD_SECURE) {
     return quic::CONNECTION_ID_PRESENT;
   }
diff --git a/net/quic/quic_test_packet_maker.h b/net/quic/quic_test_packet_maker.h
index 9e1e880e..9569b53 100644
--- a/net/quic/quic_test_packet_maker.h
+++ b/net/quic/quic_test_packet_maker.h
@@ -40,7 +40,7 @@
   // stream id set to the |parent_stream_id| param of MakeRequestHeaders...().
   // Otherwise, headers are constructed with the exclusive flag set to false and
   // the parent stream ID set to 0 (ignoring the |parent_stream_id| param).
-  QuicTestPacketMaker(quic::QuicTransportVersion version,
+  QuicTestPacketMaker(quic::ParsedQuicVersion version,
                       quic::QuicConnectionId connection_id,
                       quic::MockClock* clock,
                       const std::string& host,
@@ -410,7 +410,7 @@
   quic::QuicConnectionIdIncluded HasDestinationConnectionId() const;
   quic::QuicConnectionIdIncluded HasSourceConnectionId() const;
 
-  quic::QuicTransportVersion version_;
+  quic::ParsedQuicVersion version_;
   quic::QuicConnectionId connection_id_;
   quic::MockClock* clock_;  // Owned by QuicStreamFactory.
   std::string host_;
diff --git a/net/socket/connect_job.cc b/net/socket/connect_job.cc
index 7419124..97756b1 100644
--- a/net/socket/connect_job.cc
+++ b/net/socket/connect_job.cc
@@ -30,7 +30,7 @@
     HttpAuthCache* http_auth_cache,
     HttpAuthHandlerFactory* http_auth_handler_factory,
     SpdySessionPool* spdy_session_pool,
-    const quic::QuicTransportVersionVector* quic_supported_versions,
+    const quic::ParsedQuicVersionVector* quic_supported_versions,
     QuicStreamFactory* quic_stream_factory,
     ProxyDelegate* proxy_delegate,
     const HttpUserAgentSettings* http_user_agent_settings,
diff --git a/net/socket/connect_job.h b/net/socket/connect_job.h
index 2ce8d90..ced8ed3 100644
--- a/net/socket/connect_job.h
+++ b/net/socket/connect_job.h
@@ -63,7 +63,7 @@
       HttpAuthCache* http_auth_cache,
       HttpAuthHandlerFactory* http_auth_handler_factory,
       SpdySessionPool* spdy_session_pool,
-      const quic::QuicTransportVersionVector* quic_supported_versions,
+      const quic::ParsedQuicVersionVector* quic_supported_versions,
       QuicStreamFactory* quic_stream_factory,
       ProxyDelegate* proxy_delegate,
       const HttpUserAgentSettings* http_user_agent_settings,
@@ -83,7 +83,7 @@
   HttpAuthCache* http_auth_cache;
   HttpAuthHandlerFactory* http_auth_handler_factory;
   SpdySessionPool* spdy_session_pool;
-  const quic::QuicTransportVersionVector* quic_supported_versions;
+  const quic::ParsedQuicVersionVector* quic_supported_versions;
   QuicStreamFactory* quic_stream_factory;
   ProxyDelegate* proxy_delegate;
   const HttpUserAgentSettings* http_user_agent_settings;
diff --git a/net/spdy/spdy_session.cc b/net/spdy/spdy_session.cc
index ff1a81c..de872e5 100644
--- a/net/spdy/spdy_session.cc
+++ b/net/spdy/spdy_session.cc
@@ -883,7 +883,7 @@
     HttpServerProperties* http_server_properties,
     TransportSecurityState* transport_security_state,
     SSLConfigService* ssl_config_service,
-    const quic::QuicTransportVersionVector& quic_supported_versions,
+    const quic::ParsedQuicVersionVector& quic_supported_versions,
     bool enable_sending_initial_data,
     bool enable_ping_based_connection_checking,
     bool support_ietf_format_quic_altsvc,
@@ -3393,7 +3393,7 @@
       continue;
 
     // Check if QUIC version is supported. Filter supported QUIC versions.
-    quic::QuicTransportVersionVector advertised_versions;
+    quic::ParsedQuicVersionVector advertised_versions;
     if (protocol == kProtoQUIC && !altsvc.version.empty()) {
       advertised_versions = FilterSupportedAltSvcVersions(
           altsvc, quic_supported_versions_, support_ietf_format_quic_altsvc_);
diff --git a/net/spdy/spdy_session.h b/net/spdy/spdy_session.h
index b9da335..4a1a740 100644
--- a/net/spdy/spdy_session.h
+++ b/net/spdy/spdy_session.h
@@ -315,7 +315,7 @@
               HttpServerProperties* http_server_properties,
               TransportSecurityState* transport_security_state,
               SSLConfigService* ssl_config_service,
-              const quic::QuicTransportVersionVector& quic_supported_versions,
+              const quic::ParsedQuicVersionVector& quic_supported_versions,
               bool enable_sending_initial_data,
               bool enable_ping_based_connection_checking,
               bool support_ietf_format_quic_altsvc,
@@ -1156,7 +1156,7 @@
   NetLogWithSource net_log_;
 
   // Versions of QUIC which may be used.
-  const quic::QuicTransportVersionVector quic_supported_versions_;
+  const quic::ParsedQuicVersionVector quic_supported_versions_;
 
   // Outside of tests, these should always be true.
   const bool enable_sending_initial_data_;
diff --git a/net/spdy/spdy_session_pool.cc b/net/spdy/spdy_session_pool.cc
index 8cc2dbd..97d484d 100644
--- a/net/spdy/spdy_session_pool.cc
+++ b/net/spdy/spdy_session_pool.cc
@@ -81,7 +81,7 @@
     SSLConfigService* ssl_config_service,
     HttpServerProperties* http_server_properties,
     TransportSecurityState* transport_security_state,
-    const quic::QuicTransportVersionVector& quic_supported_versions,
+    const quic::ParsedQuicVersionVector& quic_supported_versions,
     bool enable_ping_based_connection_checking,
     bool support_ietf_format_quic_altsvc,
     size_t session_max_recv_window_size,
diff --git a/net/spdy/spdy_session_pool.h b/net/spdy/spdy_session_pool.h
index 9d9476ec..143d5645 100644
--- a/net/spdy/spdy_session_pool.h
+++ b/net/spdy/spdy_session_pool.h
@@ -133,19 +133,18 @@
     DISALLOW_COPY_AND_ASSIGN(SpdySessionRequest);
   };
 
-  SpdySessionPool(
-      HostResolver* host_resolver,
-      SSLConfigService* ssl_config_service,
-      HttpServerProperties* http_server_properties,
-      TransportSecurityState* transport_security_state,
-      const quic::QuicTransportVersionVector& quic_supported_versions,
-      bool enable_ping_based_connection_checking,
-      bool support_ietf_format_quic_altsvc,
-      size_t session_max_recv_window_size,
-      const spdy::SettingsMap& initial_settings,
-      const base::Optional<GreasedHttp2Frame>& greased_http2_frame,
-      SpdySessionPool::TimeFunc time_func,
-      NetworkQualityEstimator* network_quality_estimator);
+  SpdySessionPool(HostResolver* host_resolver,
+                  SSLConfigService* ssl_config_service,
+                  HttpServerProperties* http_server_properties,
+                  TransportSecurityState* transport_security_state,
+                  const quic::ParsedQuicVersionVector& quic_supported_versions,
+                  bool enable_ping_based_connection_checking,
+                  bool support_ietf_format_quic_altsvc,
+                  size_t session_max_recv_window_size,
+                  const spdy::SettingsMap& initial_settings,
+                  const base::Optional<GreasedHttp2Frame>& greased_http2_frame,
+                  SpdySessionPool::TimeFunc time_func,
+                  NetworkQualityEstimator* network_quality_estimator);
   ~SpdySessionPool() override;
 
   // In the functions below, a session is "available" if this pool has
@@ -419,7 +418,7 @@
   HostResolver* const resolver_;
 
   // Versions of QUIC which may be used.
-  const quic::QuicTransportVersionVector quic_supported_versions_;
+  const quic::ParsedQuicVersionVector quic_supported_versions_;
 
   // Defaults to true. May be controlled via SpdySessionPoolPeer for tests.
   bool enable_sending_initial_data_;
diff --git a/net/url_request/url_request_quic_perftest.cc b/net/url_request/url_request_quic_perftest.cc
index 736c26a..4941e92 100644
--- a/net/url_request/url_request_quic_perftest.cc
+++ b/net/url_request/url_request_quic_perftest.cc
@@ -67,9 +67,11 @@
   std::unique_ptr<test_server::BasicHttpResponse> http_response(
       new test_server::BasicHttpResponse());
   http_response->AddCustomHeader(
-      "Alt-Svc", base::StringPrintf(
-                     "quic=\"%s:%d\"; v=\"%u\"", kAltSvcHost, kAltSvcPort,
-                     HttpNetworkSession::Params().quic_supported_versions[0]));
+      "Alt-Svc",
+      base::StringPrintf("quic=\"%s:%d\"; v=\"%u\"", kAltSvcHost, kAltSvcPort,
+                         HttpNetworkSession::Params()
+                             .quic_supported_versions[0]
+                             .transport_version));
   http_response->set_code(HTTP_OK);
   http_response->set_content(kHelloOriginResponse);
   http_response->set_content_type("text/plain");
diff --git a/remoting/signaling/BUILD.gn b/remoting/signaling/BUILD.gn
index a659345..6f92899 100644
--- a/remoting/signaling/BUILD.gn
+++ b/remoting/signaling/BUILD.gn
@@ -63,7 +63,7 @@
     "//base",
     "//crypto",
     "//google_apis",
-    "//jingle:jingle_glue",
+    "//jingle:webrtc_glue",
     "//net",
     "//remoting/base",
     "//remoting/base/grpc_support",
diff --git a/services/network/BUILD.gn b/services/network/BUILD.gn
index 181c75b..d93471a 100644
--- a/services/network/BUILD.gn
+++ b/services/network/BUILD.gn
@@ -215,7 +215,7 @@
     "//components/network_session_configurator/common",
     "//components/os_crypt",
     "//components/prefs",
-    "//jingle:jingle_fake_socket",
+    "//jingle:fake_ssl_socket",
     "//mojo/core/embedder",
     "//mojo/public/cpp/bindings",
     "//mojo/public/cpp/system",
@@ -369,7 +369,7 @@
     "//components/prefs:test_support",
     "//components/variations:test_support",
     "//crypto:test_support",
-    "//jingle:jingle_fake_socket",
+    "//jingle:fake_ssl_socket",
     "//mojo/core/embedder",
     "//mojo/public/cpp/bindings",
     "//mojo/public/cpp/system",
diff --git a/services/service_manager/sandbox/BUILD.gn b/services/service_manager/sandbox/BUILD.gn
index 260239a4..3e07753 100644
--- a/services/service_manager/sandbox/BUILD.gn
+++ b/services/service_manager/sandbox/BUILD.gn
@@ -110,6 +110,7 @@
     deps += [
       "//third_party/fuchsia-sdk/sdk:fonts",
       "//third_party/fuchsia-sdk/sdk:mediacodec",
+      "//third_party/fuchsia-sdk/sdk:sysmem",
       "//third_party/fuchsia-sdk/sdk:ui_scenic",
     ]
   }
diff --git a/services/service_manager/sandbox/fuchsia/sandbox_policy_fuchsia.cc b/services/service_manager/sandbox/fuchsia/sandbox_policy_fuchsia.cc
index 53ea196a..3b621b0 100644
--- a/services/service_manager/sandbox/fuchsia/sandbox_policy_fuchsia.cc
+++ b/services/service_manager/sandbox/fuchsia/sandbox_policy_fuchsia.cc
@@ -10,6 +10,7 @@
 
 #include <fuchsia/fonts/cpp/fidl.h>
 #include <fuchsia/mediacodec/cpp/fidl.h>
+#include <fuchsia/sysmem/cpp/fidl.h>
 #include <fuchsia/ui/scenic/cpp/fidl.h>
 #include <memory>
 #include <utility>
@@ -69,9 +70,9 @@
     },
     {
         SANDBOX_TYPE_GPU,
-        base::make_span(
-            (const char* const[]){fuchsia::ui::scenic::Scenic::Name_,
-                                  "fuchsia.vulkan.loader.Loader"}),
+        base::make_span((const char* const[]){
+            fuchsia::ui::scenic::Scenic::Name_,
+            fuchsia::sysmem::Allocator::Name_, "fuchsia.vulkan.loader.Loader"}),
         kProvideVulkanResources,
     },
 };
diff --git a/services/service_manager/sandbox/mac/gpu_v2.sb b/services/service_manager/sandbox/mac/gpu_v2.sb
index 7035890..3db67c8 100644
--- a/services/service_manager/sandbox/mac/gpu_v2.sb
+++ b/services/service_manager/sandbox/mac/gpu_v2.sb
@@ -80,3 +80,7 @@
   (subpath "/Library/Video/Plug-Ins")
   (subpath "/System/Library/Video/Plug-Ins")
 )
+
+; A temporary test to diagnose a hang.
+(if (string=? (param bundle-id) "com.google.Chrome.canary")
+  (allow mach-lookup))
diff --git a/testing/buildbot/chromium.chrome.json b/testing/buildbot/chromium.chrome.json
index ad59c2f..c1a9788f 100644
--- a/testing/buildbot/chromium.chrome.json
+++ b/testing/buildbot/chromium.chrome.json
@@ -21,6 +21,10 @@
     "gtest_tests": [
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -34,6 +38,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -47,6 +55,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -60,6 +72,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -73,6 +89,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -86,6 +106,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -99,6 +123,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -112,6 +140,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -125,6 +157,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -138,6 +174,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -151,6 +191,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -164,6 +208,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -178,6 +226,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -191,6 +243,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -204,6 +260,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -221,6 +281,10 @@
           "--enable-features=VizDisplayCompositor"
         ],
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "viz_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -240,6 +304,10 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -254,6 +322,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -270,6 +342,10 @@
           "--gtest_filter=-*UsingRealWebcam*"
         ],
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -283,6 +359,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -296,6 +376,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -309,6 +393,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -322,6 +410,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -335,6 +427,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -348,6 +444,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -361,6 +461,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -374,6 +478,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -387,6 +495,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -400,6 +512,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -418,6 +534,10 @@
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -435,6 +555,10 @@
           "--enable-features=VizDisplayCompositor"
         ],
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "viz_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -450,6 +574,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -466,6 +594,10 @@
           "--enable-features=VizDisplayCompositor"
         ],
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "viz_content_unittests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -480,6 +612,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -493,6 +629,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -506,6 +646,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -519,6 +663,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -532,6 +680,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -545,6 +697,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -558,6 +714,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -571,6 +731,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -584,6 +748,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -597,6 +765,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -610,6 +782,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -623,6 +799,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -636,6 +816,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -649,6 +833,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -662,6 +850,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -675,6 +867,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -689,6 +885,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -702,6 +902,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -715,6 +919,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -728,6 +936,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -741,6 +953,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -754,6 +970,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -767,6 +987,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -780,6 +1004,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -793,6 +1021,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -806,6 +1038,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -819,6 +1055,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -832,6 +1072,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -845,6 +1089,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -858,6 +1106,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -871,6 +1123,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -884,6 +1140,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -897,6 +1157,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -913,6 +1177,10 @@
           "--ozone-platform=headless"
         ],
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -926,6 +1194,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -939,6 +1211,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -952,6 +1228,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -965,6 +1245,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -978,6 +1262,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -991,6 +1279,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1004,6 +1296,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1017,6 +1313,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1030,6 +1330,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1043,6 +1347,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1056,6 +1364,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1069,6 +1381,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1082,6 +1398,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1095,6 +1415,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1108,6 +1432,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1121,6 +1449,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1134,6 +1466,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1147,6 +1483,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1160,6 +1500,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1173,6 +1517,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1186,6 +1534,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1199,6 +1551,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1212,6 +1568,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1225,6 +1585,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1238,6 +1602,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1251,6 +1619,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1264,6 +1636,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1277,6 +1653,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json
index 3d4dfdb0..99f3df62 100644
--- a/testing/buildbot/chromium.chromiumos.json
+++ b/testing/buildbot/chromium.chromiumos.json
@@ -20,6 +20,10 @@
         "args": [
           "--ozone-platform=headless"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -33,6 +37,10 @@
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -46,6 +54,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -63,6 +75,10 @@
           "--test-launcher-jobs=1",
           "--gtest_filter=-*UsingRealWebcam_CaptureMjpeg*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -76,6 +92,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -89,6 +109,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -103,6 +127,10 @@
         "test": "chrome_all_tast_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -116,6 +144,10 @@
         "test": "cros_vm_sanity_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -129,6 +161,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -142,6 +178,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -159,6 +199,10 @@
           "--dbus-stub",
           "--gtest_filter=SplitViewTest.SplitViewResize"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -172,6 +216,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -185,6 +233,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -198,6 +250,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -214,6 +270,10 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/chromeos.media_unittests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -227,6 +287,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -240,6 +304,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -256,6 +324,10 @@
         "args": [
           "--vpython-dir=../../vpython_dir_linux_amd64"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -280,6 +352,10 @@
         "args": [
           "--ozone-platform=headless"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -293,6 +369,10 @@
         "test": "ozone_gl_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -306,6 +386,10 @@
         "test": "ozone_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -319,6 +403,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -332,6 +420,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -345,6 +437,10 @@
         "test": "sandbox_linux_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -358,6 +454,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -432,6 +532,10 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/chromeos.base_unittests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -448,6 +552,10 @@
         }
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -465,6 +573,10 @@
         }
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -485,6 +597,10 @@
   "linux-chromeos-dbg": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -496,6 +612,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -507,6 +627,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -518,6 +642,10 @@
         "test": "app_list_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -529,6 +657,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -540,6 +672,10 @@
         "test": "ash_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -551,6 +687,10 @@
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -562,6 +702,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -573,6 +717,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -584,6 +732,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -595,6 +747,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -606,6 +762,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -618,6 +778,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -629,6 +793,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -640,6 +808,10 @@
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -655,6 +827,10 @@
         "args": [
           "--disable-features=NetworkService"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "non_network_service_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -671,6 +847,10 @@
         "args": [
           "--enable-features=VizDisplayCompositor"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "viz_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -688,6 +868,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -700,6 +884,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -714,6 +902,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -725,6 +917,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -736,6 +932,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -747,6 +947,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -758,6 +962,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -769,6 +977,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -780,6 +992,10 @@
         "test": "chromeos_components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -791,6 +1007,10 @@
         "test": "chromeos_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -805,6 +1025,10 @@
         "args": [
           "--disable-features=NetworkService"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "non_network_service_components_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -817,6 +1041,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -828,6 +1056,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -839,6 +1071,10 @@
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -854,6 +1090,10 @@
         "args": [
           "--disable-features=NetworkService"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "non_network_service_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -870,6 +1110,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -885,6 +1129,10 @@
         "args": [
           "--enable-features=VizDisplayCompositor"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "viz_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -898,6 +1146,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -912,6 +1164,10 @@
         "args": [
           "--enable-features=VizDisplayCompositor"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "viz_content_unittests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -924,6 +1180,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -935,6 +1195,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -946,6 +1210,10 @@
         "test": "dbus_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -957,6 +1225,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -968,6 +1240,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -979,6 +1255,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -990,6 +1270,10 @@
         "test": "exo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1004,6 +1288,10 @@
         "args": [
           "--disable-features=NetworkService"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "non_network_service_extensions_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1016,6 +1304,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1027,6 +1319,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1038,6 +1334,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1049,6 +1349,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1060,6 +1364,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1071,6 +1379,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1082,6 +1394,10 @@
         "test": "gl_unittests_ozone"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1093,6 +1409,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1104,6 +1424,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1119,6 +1443,10 @@
         "args": [
           "--disable-features=NetworkService"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "non_network_service_interactive_ui_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1132,6 +1460,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1143,6 +1475,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1154,6 +1490,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1165,6 +1505,10 @@
         "test": "keyboard_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1176,6 +1520,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1187,6 +1535,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1198,6 +1550,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1209,6 +1565,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1220,6 +1580,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1231,6 +1595,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1242,6 +1610,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1253,6 +1625,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1264,6 +1640,10 @@
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1275,6 +1655,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1286,6 +1670,10 @@
         "test": "nacl_helper_nonsfi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1297,6 +1685,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1308,6 +1700,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1323,6 +1719,10 @@
         "args": [
           "--ozone-platform=headless"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1334,6 +1734,10 @@
         "test": "ozone_gl_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1345,6 +1749,10 @@
         "test": "ozone_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1356,6 +1764,10 @@
         "test": "ozone_x11_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1367,6 +1779,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1378,6 +1794,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1389,6 +1809,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1400,6 +1824,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1411,6 +1839,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1422,6 +1854,10 @@
         "test": "sandbox_linux_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1433,6 +1869,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1444,6 +1884,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1455,6 +1899,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1466,6 +1914,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1477,6 +1929,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1488,6 +1944,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1499,6 +1959,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1513,6 +1977,10 @@
         "args": [
           "--disable-features=NetworkService"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "non_network_service_sync_integration_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1525,6 +1993,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1536,6 +2008,10 @@
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1547,6 +2023,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1558,6 +2038,10 @@
         "test": "ui_chromeos_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1569,6 +2053,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1580,6 +2068,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1592,6 +2084,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1603,6 +2099,10 @@
         "test": "usage_time_limit_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1614,6 +2114,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1625,6 +2129,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1636,6 +2144,10 @@
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1654,6 +2166,10 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1665,6 +2181,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1676,6 +2196,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1687,6 +2211,10 @@
         "test": "app_list_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1698,6 +2226,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1709,6 +2241,10 @@
         "test": "ash_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1720,6 +2256,10 @@
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1731,6 +2271,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1742,6 +2286,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1753,6 +2301,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1764,6 +2316,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1775,6 +2331,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1787,6 +2347,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1798,6 +2362,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1809,6 +2377,10 @@
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1824,6 +2396,10 @@
         "args": [
           "--enable-features=VizDisplayCompositor"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "viz_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1841,6 +2417,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1853,6 +2433,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1867,6 +2451,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1878,6 +2466,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1889,6 +2481,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1900,6 +2496,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1911,6 +2511,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1922,6 +2526,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1933,6 +2541,10 @@
         "test": "chromeos_components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1944,6 +2556,10 @@
         "test": "chromeos_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1955,6 +2571,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1966,6 +2586,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1977,6 +2601,10 @@
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1993,6 +2621,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2008,6 +2640,10 @@
         "args": [
           "--enable-features=VizDisplayCompositor"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "viz_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2021,6 +2657,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2035,6 +2675,10 @@
         "args": [
           "--enable-features=VizDisplayCompositor"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "viz_content_unittests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2047,6 +2691,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2058,6 +2706,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2069,6 +2721,10 @@
         "test": "dbus_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2080,6 +2736,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2091,6 +2751,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2102,6 +2766,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2113,6 +2781,10 @@
         "test": "exo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2124,6 +2796,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2135,6 +2811,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2146,6 +2826,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2157,6 +2841,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2168,6 +2856,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2179,6 +2871,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2190,6 +2886,10 @@
         "test": "gl_unittests_ozone"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2201,6 +2901,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2212,6 +2916,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2224,6 +2932,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2235,6 +2947,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2246,6 +2962,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2257,6 +2977,10 @@
         "test": "keyboard_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2268,6 +2992,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2279,6 +3007,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2290,6 +3022,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2301,6 +3037,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2312,6 +3052,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2323,6 +3067,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2334,6 +3082,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2345,6 +3097,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2356,6 +3112,10 @@
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2367,6 +3127,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2378,6 +3142,10 @@
         "test": "nacl_helper_nonsfi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2389,6 +3157,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2400,6 +3172,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2414,6 +3190,10 @@
         "args": [
           "--ozone-platform=headless"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2425,6 +3205,10 @@
         "test": "ozone_gl_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2436,6 +3220,10 @@
         "test": "ozone_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2447,6 +3235,10 @@
         "test": "ozone_x11_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2458,6 +3250,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2469,6 +3265,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2480,6 +3280,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2491,6 +3295,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2502,6 +3310,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2513,6 +3325,10 @@
         "test": "sandbox_linux_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2524,6 +3340,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2535,6 +3355,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2546,6 +3370,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2557,6 +3385,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2568,6 +3400,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2579,6 +3415,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2590,6 +3430,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2601,6 +3445,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2612,6 +3460,10 @@
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2623,6 +3475,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2634,6 +3490,10 @@
         "test": "ui_chromeos_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2645,6 +3505,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2656,6 +3520,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2668,6 +3536,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2679,6 +3551,10 @@
         "test": "usage_time_limit_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2690,6 +3566,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2701,6 +3581,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2712,6 +3596,10 @@
         "test": "wayland_client_perftests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2723,6 +3611,10 @@
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
diff --git a/testing/buildbot/chromium.clang.json b/testing/buildbot/chromium.clang.json
index 7cde0fd..2395cc47 100644
--- a/testing/buildbot/chromium.clang.json
+++ b/testing/buildbot/chromium.clang.json
@@ -4,6 +4,10 @@
   "CFI Linux ToT": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15,6 +19,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26,6 +34,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -37,6 +49,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -48,6 +64,10 @@
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -59,6 +79,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -70,6 +94,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -81,6 +109,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -92,6 +124,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -103,6 +139,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -115,6 +155,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -126,6 +170,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -137,6 +185,10 @@
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -153,6 +205,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -165,6 +221,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -179,6 +239,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -190,6 +254,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -201,6 +269,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -212,6 +284,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -223,6 +299,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -234,6 +314,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -245,6 +329,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -256,6 +344,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -267,6 +359,10 @@
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -283,6 +379,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -295,6 +395,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -306,6 +410,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -317,6 +425,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -328,6 +440,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -339,6 +455,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -350,6 +470,10 @@
         "test": "dbus_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -361,6 +485,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -372,6 +500,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -383,6 +515,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -394,6 +530,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -405,6 +545,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -416,6 +560,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -427,6 +575,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -438,6 +590,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -453,6 +609,10 @@
           "--use-gpu-in-tests",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -467,6 +627,10 @@
         "use_xvfb": false
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -478,6 +642,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -489,6 +657,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -500,6 +672,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -511,6 +687,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -523,6 +703,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -534,6 +718,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -545,6 +733,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -556,6 +748,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -567,6 +763,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -578,6 +778,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -589,6 +793,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -600,6 +808,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -611,6 +823,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -622,6 +838,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -633,6 +853,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -644,6 +868,10 @@
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -655,6 +883,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -666,6 +898,10 @@
         "test": "nacl_helper_nonsfi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -677,6 +913,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -688,6 +928,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -699,6 +943,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -710,6 +958,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -721,6 +973,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -732,6 +988,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -743,6 +1003,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -754,6 +1018,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -765,6 +1033,10 @@
         "test": "sandbox_linux_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -776,6 +1048,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -787,6 +1063,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -798,6 +1078,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -809,6 +1093,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -820,6 +1108,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -831,6 +1123,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -842,6 +1138,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -853,6 +1153,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -864,6 +1168,10 @@
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -875,6 +1183,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -886,6 +1198,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -897,6 +1213,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -908,6 +1228,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -919,6 +1243,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -930,6 +1258,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -941,6 +1273,10 @@
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -952,6 +1288,10 @@
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -963,6 +1303,10 @@
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -978,6 +1322,10 @@
   "CrWinAsan": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -990,6 +1338,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1002,6 +1354,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1014,6 +1370,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1026,6 +1386,10 @@
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1038,6 +1402,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1050,6 +1418,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1062,6 +1434,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1074,6 +1450,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1086,6 +1466,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1099,6 +1483,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1111,6 +1499,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1123,6 +1515,10 @@
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1140,6 +1536,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1153,6 +1553,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1168,6 +1572,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1180,6 +1588,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1192,6 +1604,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1204,6 +1620,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1216,6 +1636,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1228,6 +1652,10 @@
         "test": "chrome_cleaner_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1240,6 +1668,10 @@
         "test": "chrome_elf_import_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1252,6 +1684,10 @@
         "test": "chrome_elf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1264,6 +1700,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1276,6 +1716,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1288,6 +1732,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1300,6 +1748,10 @@
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1317,6 +1769,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1330,6 +1786,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1342,6 +1802,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1354,6 +1818,10 @@
         "test": "courgette_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1366,6 +1834,10 @@
         "test": "crashpad_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1378,6 +1850,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1390,6 +1866,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1402,6 +1882,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1414,6 +1898,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1426,6 +1914,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1438,6 +1930,10 @@
         "test": "elevation_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1450,6 +1946,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1462,6 +1962,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1474,6 +1978,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1486,6 +1994,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1498,6 +2010,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1510,6 +2026,10 @@
         "test": "gcp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1522,6 +2042,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1534,6 +2058,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1546,6 +2074,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1558,6 +2090,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1570,6 +2106,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1582,6 +2122,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1594,6 +2138,10 @@
         "test": "install_static_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1607,6 +2155,10 @@
         "test": "installer_util_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1620,6 +2172,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1632,6 +2188,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1644,6 +2204,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1656,6 +2220,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1668,6 +2236,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1680,6 +2252,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1692,6 +2268,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1704,6 +2284,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1716,6 +2300,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1728,6 +2316,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1740,6 +2332,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1752,6 +2348,10 @@
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1764,6 +2364,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1776,6 +2380,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1788,6 +2396,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1800,6 +2412,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1812,6 +2428,10 @@
         "test": "notification_helper_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1824,6 +2444,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1836,6 +2460,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1848,6 +2476,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1860,6 +2492,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1872,6 +2508,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1885,6 +2525,10 @@
         "test": "sbox_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1897,6 +2541,10 @@
         "test": "sbox_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1909,6 +2557,10 @@
         "test": "sbox_validation_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1921,6 +2573,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1933,6 +2589,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1946,6 +2606,10 @@
         "test": "setup_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1958,6 +2622,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1970,6 +2638,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1982,6 +2654,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1994,6 +2670,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2006,6 +2686,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2018,6 +2702,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2030,6 +2718,10 @@
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2042,6 +2734,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2054,6 +2750,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2066,6 +2766,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2078,6 +2782,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2090,6 +2798,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2102,6 +2814,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2114,6 +2830,10 @@
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2126,6 +2846,10 @@
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2138,6 +2862,10 @@
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2150,6 +2878,10 @@
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2166,6 +2898,10 @@
   "CrWinAsan(dll)": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2178,6 +2914,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2190,6 +2930,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2202,6 +2946,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2214,6 +2962,10 @@
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2226,6 +2978,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2238,6 +2994,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2250,6 +3010,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2262,6 +3026,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2274,6 +3042,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2287,6 +3059,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2299,6 +3075,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2311,6 +3091,10 @@
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2326,6 +3110,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2338,6 +3126,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2350,6 +3142,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2362,6 +3158,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2374,6 +3174,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2386,6 +3190,10 @@
         "test": "chrome_cleaner_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2398,6 +3206,10 @@
         "test": "chrome_elf_import_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2410,6 +3222,10 @@
         "test": "chrome_elf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2422,6 +3238,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2434,6 +3254,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2446,6 +3270,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2462,6 +3290,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2475,6 +3307,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2487,6 +3323,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2499,6 +3339,10 @@
         "test": "courgette_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2511,6 +3355,10 @@
         "test": "crashpad_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2523,6 +3371,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2535,6 +3387,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2547,6 +3403,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2559,6 +3419,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2571,6 +3435,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2583,6 +3451,10 @@
         "test": "elevation_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2595,6 +3467,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2607,6 +3483,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2619,6 +3499,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2631,6 +3515,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2643,6 +3531,10 @@
         "test": "gcp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2655,6 +3547,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2667,6 +3563,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2679,6 +3579,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2691,6 +3595,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2703,6 +3611,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2715,6 +3627,10 @@
         "test": "install_static_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2728,6 +3644,10 @@
         "test": "installer_util_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2740,6 +3660,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2752,6 +3676,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2764,6 +3692,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2776,6 +3708,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2788,6 +3724,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2800,6 +3740,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2812,6 +3756,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2824,6 +3772,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2836,6 +3788,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2848,6 +3804,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2860,6 +3820,10 @@
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2872,6 +3836,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2884,6 +3852,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2896,6 +3868,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2908,6 +3884,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2920,6 +3900,10 @@
         "test": "notification_helper_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2932,6 +3916,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2944,6 +3932,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2956,6 +3948,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2968,6 +3964,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2980,6 +3980,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2993,6 +3997,10 @@
         "test": "sbox_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3005,6 +4013,10 @@
         "test": "sbox_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3017,6 +4029,10 @@
         "test": "sbox_validation_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3029,6 +4045,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3041,6 +4061,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3054,6 +4078,10 @@
         "test": "setup_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3066,6 +4094,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3078,6 +4110,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3090,6 +4126,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3102,6 +4142,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3114,6 +4158,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3126,6 +4174,10 @@
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3138,6 +4190,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3150,6 +4206,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3162,6 +4222,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3174,6 +4238,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3186,6 +4254,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3198,6 +4270,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3210,6 +4286,10 @@
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3222,6 +4302,10 @@
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3234,6 +4318,10 @@
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3246,6 +4334,10 @@
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5909,6 +7001,10 @@
         "args": [
           "--tool=asan"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
@@ -8527,6 +9623,10 @@
   "ToTLinux": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8538,6 +9638,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8549,6 +9653,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8560,6 +9668,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8571,6 +9683,10 @@
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8582,6 +9698,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8593,6 +9713,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8604,6 +9728,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8615,6 +9743,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8626,6 +9758,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -8638,6 +9774,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8649,6 +9789,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8660,6 +9804,10 @@
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8676,6 +9824,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -8688,6 +9840,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8702,6 +9858,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8713,6 +9873,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8724,6 +9888,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8735,6 +9903,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8746,6 +9918,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8757,6 +9933,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8768,6 +9948,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8779,6 +9963,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8790,6 +9978,10 @@
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8806,6 +9998,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -8822,6 +10018,10 @@
           "--enable-features=VizDisplayCompositor,UseSkiaRenderer",
           "--gtest_filter=AuraWindowVideoCaptureDeviceBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "skia_renderer_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -8834,6 +10034,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8845,6 +10049,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8856,6 +10064,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8867,6 +10079,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8878,6 +10094,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8889,6 +10109,10 @@
         "test": "dbus_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8900,6 +10124,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8911,6 +10139,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8922,6 +10154,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8933,6 +10169,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8944,6 +10184,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8955,6 +10199,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8966,6 +10214,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8977,6 +10229,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8988,6 +10244,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8999,6 +10259,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9010,6 +10274,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9021,6 +10289,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9032,6 +10304,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9044,6 +10320,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9055,6 +10335,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9066,6 +10350,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9077,6 +10365,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9088,6 +10380,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9099,6 +10395,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9110,6 +10410,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9121,6 +10425,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9132,6 +10440,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9143,6 +10455,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9154,6 +10470,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9165,6 +10485,10 @@
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9176,6 +10500,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9187,6 +10515,10 @@
         "test": "nacl_helper_nonsfi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9198,6 +10530,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9209,6 +10545,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9220,6 +10560,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9231,6 +10575,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9242,6 +10590,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9253,6 +10605,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9264,6 +10620,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9275,6 +10635,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9286,6 +10650,10 @@
         "test": "sandbox_linux_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9297,6 +10665,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9308,6 +10680,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9319,6 +10695,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9330,6 +10710,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9341,6 +10725,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9352,6 +10740,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9363,6 +10755,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9374,6 +10770,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9385,6 +10785,10 @@
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9396,6 +10800,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9407,6 +10815,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9418,6 +10830,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9429,6 +10845,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9440,6 +10860,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9451,6 +10875,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9462,6 +10890,10 @@
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9473,6 +10905,10 @@
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9484,6 +10920,10 @@
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9495,6 +10935,10 @@
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -9522,6 +10966,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9536,6 +10984,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9550,6 +11002,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9564,6 +11020,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9578,6 +11038,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9592,6 +11056,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9606,6 +11074,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9620,6 +11092,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9634,6 +11110,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9648,6 +11128,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -9663,6 +11147,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9677,6 +11165,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9691,6 +11183,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9708,6 +11204,10 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -9723,6 +11223,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9738,6 +11242,10 @@
           "--gtest_filter=-*UsingRealWebcam*",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9752,6 +11260,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9766,6 +11278,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9780,6 +11296,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9794,6 +11314,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9808,6 +11332,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9822,6 +11350,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9836,6 +11368,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9850,6 +11386,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9867,6 +11407,10 @@
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -9884,6 +11428,10 @@
           "--gtest_filter=AuraWindowVideoCaptureDeviceBrowserTest.*",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "skia_renderer_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -9899,6 +11447,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9913,6 +11465,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9927,6 +11483,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9941,6 +11501,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9955,6 +11519,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9969,6 +11537,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9983,6 +11555,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9997,6 +11573,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10011,6 +11591,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10025,6 +11609,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10039,6 +11627,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10053,6 +11645,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10067,6 +11663,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10081,6 +11681,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10095,6 +11699,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10109,6 +11717,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10123,6 +11735,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10137,6 +11753,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10152,6 +11772,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10166,6 +11790,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10180,6 +11808,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10194,6 +11826,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10208,6 +11844,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10222,6 +11862,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10236,6 +11880,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10250,6 +11898,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10264,6 +11916,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10278,6 +11934,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10292,6 +11952,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10306,6 +11970,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10320,6 +11988,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10334,6 +12006,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10348,6 +12024,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10362,6 +12042,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10377,6 +12061,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10391,6 +12079,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10405,6 +12097,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10419,6 +12115,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10433,6 +12133,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10447,6 +12151,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10461,6 +12169,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10475,6 +12187,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10489,6 +12205,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10503,6 +12223,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10517,6 +12241,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10531,6 +12259,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10545,6 +12277,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10559,6 +12295,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10573,6 +12313,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10587,6 +12331,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10601,6 +12349,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10615,6 +12367,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10630,6 +12386,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10644,6 +12404,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10658,6 +12422,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10672,6 +12440,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10686,6 +12458,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10700,6 +12476,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10714,6 +12494,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10728,6 +12512,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -10747,6 +12535,10 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10758,6 +12550,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10769,6 +12565,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10780,6 +12580,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10791,6 +12595,10 @@
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10802,6 +12610,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10813,6 +12625,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10824,6 +12640,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10835,6 +12655,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10846,6 +12670,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -10858,6 +12686,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10869,6 +12701,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10880,6 +12716,10 @@
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10896,6 +12736,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -10908,6 +12752,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10922,6 +12770,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10933,6 +12785,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10944,6 +12800,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10955,6 +12815,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10966,6 +12830,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10977,6 +12845,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10988,6 +12860,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10999,6 +12875,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11010,6 +12890,10 @@
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11026,6 +12910,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -11042,6 +12930,10 @@
           "--enable-features=VizDisplayCompositor,UseSkiaRenderer",
           "--gtest_filter=AuraWindowVideoCaptureDeviceBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "skia_renderer_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -11054,6 +12946,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11065,6 +12961,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11076,6 +12976,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11087,6 +12991,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11098,6 +13006,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11109,6 +13021,10 @@
         "test": "dbus_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11120,6 +13036,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11131,6 +13051,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11142,6 +13066,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11153,6 +13081,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11164,6 +13096,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11175,6 +13111,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11186,6 +13126,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11197,6 +13141,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11208,6 +13156,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11219,6 +13171,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11230,6 +13186,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11241,6 +13201,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11252,6 +13216,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11264,6 +13232,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11275,6 +13247,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11286,6 +13262,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11297,6 +13277,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11308,6 +13292,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11319,6 +13307,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11330,6 +13322,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11341,6 +13337,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11352,6 +13352,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11363,6 +13367,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11374,6 +13382,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11385,6 +13397,10 @@
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11396,6 +13412,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11407,6 +13427,10 @@
         "test": "nacl_helper_nonsfi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11418,6 +13442,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11429,6 +13457,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11440,6 +13472,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11451,6 +13487,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11462,6 +13502,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11473,6 +13517,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11484,6 +13532,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11495,6 +13547,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11506,6 +13562,10 @@
         "test": "sandbox_linux_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11517,6 +13577,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11528,6 +13592,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11539,6 +13607,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11550,6 +13622,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11561,6 +13637,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11572,6 +13652,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11583,6 +13667,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11594,6 +13682,10 @@
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11605,6 +13697,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11616,6 +13712,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11627,6 +13727,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11638,6 +13742,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11649,6 +13757,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11660,6 +13772,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11671,6 +13787,10 @@
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11682,6 +13802,10 @@
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11693,6 +13817,10 @@
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11704,6 +13832,10 @@
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -11720,6 +13852,10 @@
   "ToTLinuxOfficial": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11731,6 +13867,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11742,6 +13882,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11753,6 +13897,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11764,6 +13912,10 @@
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11775,6 +13927,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11786,6 +13942,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11797,6 +13957,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11808,6 +13972,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11819,6 +13987,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -11831,6 +14003,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11842,6 +14018,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11853,6 +14033,10 @@
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11869,6 +14053,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -11881,6 +14069,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11895,6 +14087,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11906,6 +14102,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11917,6 +14117,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11928,6 +14132,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11939,6 +14147,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11950,6 +14162,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11961,6 +14177,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11972,6 +14192,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11983,6 +14207,10 @@
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11999,6 +14227,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -12015,6 +14247,10 @@
           "--enable-features=VizDisplayCompositor,UseSkiaRenderer",
           "--gtest_filter=AuraWindowVideoCaptureDeviceBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "skia_renderer_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -12027,6 +14263,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12038,6 +14278,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12049,6 +14293,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12060,6 +14308,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12071,6 +14323,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12082,6 +14338,10 @@
         "test": "dbus_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12093,6 +14353,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12104,6 +14368,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12115,6 +14383,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12126,6 +14398,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12137,6 +14413,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12148,6 +14428,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12159,6 +14443,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12170,6 +14458,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12181,6 +14473,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12192,6 +14488,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12203,6 +14503,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12214,6 +14518,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12225,6 +14533,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12237,6 +14549,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12248,6 +14564,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12259,6 +14579,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12270,6 +14594,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12281,6 +14609,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12292,6 +14624,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12303,6 +14639,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12314,6 +14654,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12325,6 +14669,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12336,6 +14684,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12347,6 +14699,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12358,6 +14714,10 @@
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12369,6 +14729,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12380,6 +14744,10 @@
         "test": "nacl_helper_nonsfi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12391,6 +14759,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12402,6 +14774,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12413,6 +14789,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12424,6 +14804,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12435,6 +14819,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12446,6 +14834,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12457,6 +14849,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12468,6 +14864,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12479,6 +14879,10 @@
         "test": "sandbox_linux_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12490,6 +14894,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12501,6 +14909,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12512,6 +14924,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12523,6 +14939,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12534,6 +14954,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12545,6 +14969,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12556,6 +14984,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12567,6 +14999,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12578,6 +15014,10 @@
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12589,6 +15029,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12600,6 +15044,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12611,6 +15059,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12622,6 +15074,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12633,6 +15089,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12644,6 +15104,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12655,6 +15119,10 @@
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12666,6 +15134,10 @@
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12677,6 +15149,10 @@
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12688,6 +15164,10 @@
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -12707,6 +15187,10 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12718,6 +15202,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12729,6 +15217,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12740,6 +15232,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12751,6 +15247,10 @@
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12762,6 +15262,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12773,6 +15277,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12784,6 +15292,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12795,6 +15307,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12806,6 +15322,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -12818,6 +15338,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12829,6 +15353,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12844,6 +15372,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -12856,6 +15388,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12870,6 +15406,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12881,6 +15421,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12892,6 +15436,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12903,6 +15451,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12914,6 +15466,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12925,6 +15481,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12936,6 +15496,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12947,6 +15511,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12958,6 +15526,10 @@
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12974,6 +15546,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -12990,6 +15566,10 @@
           "--enable-features=VizDisplayCompositor,UseSkiaRenderer",
           "--gtest_filter=AuraWindowVideoCaptureDeviceBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "skia_renderer_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -13002,6 +15582,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13013,6 +15597,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13024,6 +15612,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13035,6 +15627,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13046,6 +15642,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13057,6 +15657,10 @@
         "test": "dbus_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13068,6 +15672,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13079,6 +15687,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13090,6 +15702,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13101,6 +15717,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13112,6 +15732,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13123,6 +15747,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13134,6 +15762,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13145,6 +15777,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13156,6 +15792,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13167,6 +15807,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13178,6 +15822,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13189,6 +15837,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13200,6 +15852,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13212,6 +15868,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13223,6 +15883,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13234,6 +15898,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13245,6 +15913,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13256,6 +15928,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13267,6 +15943,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13278,6 +15958,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13289,6 +15973,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13300,6 +15988,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13311,6 +16003,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13322,6 +16018,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13333,6 +16033,10 @@
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13344,6 +16048,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13355,6 +16063,10 @@
         "test": "nacl_helper_nonsfi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13366,6 +16078,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13377,6 +16093,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13389,6 +16109,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13400,6 +16124,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13411,6 +16139,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13422,6 +16154,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13433,6 +16169,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13444,6 +16184,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13455,6 +16199,10 @@
         "test": "sandbox_linux_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13466,6 +16214,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13477,6 +16229,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13488,6 +16244,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13499,6 +16259,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13510,6 +16274,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13521,6 +16289,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13532,6 +16304,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13544,6 +16320,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13555,6 +16335,10 @@
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13566,6 +16350,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13577,6 +16365,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13588,6 +16380,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13599,6 +16395,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13610,6 +16410,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13621,6 +16425,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13632,6 +16440,10 @@
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13643,6 +16455,10 @@
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13654,6 +16470,10 @@
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13665,6 +16485,10 @@
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -13681,6 +16505,10 @@
   "ToTLinuxThinLTO": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13692,6 +16520,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13703,6 +16535,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13714,6 +16550,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13725,6 +16565,10 @@
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13736,6 +16580,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13747,6 +16595,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13758,6 +16610,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13769,6 +16625,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13780,6 +16640,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -13792,6 +16656,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13803,6 +16671,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13814,6 +16686,10 @@
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13830,6 +16706,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -13842,6 +16722,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13856,6 +16740,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13867,6 +16755,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13878,6 +16770,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13889,6 +16785,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13900,6 +16800,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13911,6 +16815,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13922,6 +16830,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13933,6 +16845,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13944,6 +16860,10 @@
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13960,6 +16880,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -13976,6 +16900,10 @@
           "--enable-features=VizDisplayCompositor,UseSkiaRenderer",
           "--gtest_filter=AuraWindowVideoCaptureDeviceBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "skia_renderer_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -13988,6 +16916,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13999,6 +16931,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14010,6 +16946,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14021,6 +16961,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14032,6 +16976,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14043,6 +16991,10 @@
         "test": "dbus_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14054,6 +17006,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14065,6 +17021,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14076,6 +17036,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14087,6 +17051,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14098,6 +17066,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14109,6 +17081,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14120,6 +17096,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14131,6 +17111,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14142,6 +17126,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14153,6 +17141,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14164,6 +17156,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14175,6 +17171,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14186,6 +17186,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14198,6 +17202,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14209,6 +17217,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14220,6 +17232,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14231,6 +17247,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14242,6 +17262,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14253,6 +17277,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14264,6 +17292,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14275,6 +17307,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14286,6 +17322,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14297,6 +17337,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14308,6 +17352,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14319,6 +17367,10 @@
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14330,6 +17382,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14341,6 +17397,10 @@
         "test": "nacl_helper_nonsfi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14352,6 +17412,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14363,6 +17427,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14374,6 +17442,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14385,6 +17457,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14396,6 +17472,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14407,6 +17487,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14418,6 +17502,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14429,6 +17517,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14440,6 +17532,10 @@
         "test": "sandbox_linux_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14451,6 +17547,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14462,6 +17562,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14473,6 +17577,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14484,6 +17592,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14495,6 +17607,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14506,6 +17622,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14517,6 +17637,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14528,6 +17652,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14539,6 +17667,10 @@
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14550,6 +17682,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14561,6 +17697,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14572,6 +17712,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14583,6 +17727,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14594,6 +17742,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14605,6 +17757,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14616,6 +17772,10 @@
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14627,6 +17787,10 @@
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14638,6 +17802,10 @@
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14649,6 +17817,10 @@
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -14668,6 +17840,10 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14679,6 +17855,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14690,6 +17870,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14701,6 +17885,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14712,6 +17900,10 @@
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14723,6 +17915,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14734,6 +17930,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14745,6 +17945,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14756,6 +17960,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14767,6 +17975,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -14779,6 +17991,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14790,6 +18006,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14801,6 +18021,10 @@
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14817,6 +18041,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -14829,6 +18057,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14843,6 +18075,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14854,6 +18090,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14865,6 +18105,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14876,6 +18120,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14887,6 +18135,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14898,6 +18150,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14909,6 +18165,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14920,6 +18180,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14931,6 +18195,10 @@
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14947,6 +18215,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -14963,6 +18235,10 @@
           "--enable-features=VizDisplayCompositor,UseSkiaRenderer",
           "--gtest_filter=AuraWindowVideoCaptureDeviceBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "skia_renderer_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -14975,6 +18251,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14986,6 +18266,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14997,6 +18281,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15008,6 +18296,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15019,6 +18311,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15030,6 +18326,10 @@
         "test": "dbus_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15041,6 +18341,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15052,6 +18356,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15063,6 +18371,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15074,6 +18386,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15085,6 +18401,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15096,6 +18416,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15107,6 +18431,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15118,6 +18446,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15129,6 +18461,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15140,6 +18476,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15151,6 +18491,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15162,6 +18506,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15173,6 +18521,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15185,6 +18537,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15196,6 +18552,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15207,6 +18567,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15218,6 +18582,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15229,6 +18597,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15240,6 +18612,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15251,6 +18627,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15262,6 +18642,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15273,6 +18657,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15284,6 +18672,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15295,6 +18687,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15306,6 +18702,10 @@
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15317,6 +18717,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15328,6 +18732,10 @@
         "test": "nacl_helper_nonsfi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15339,6 +18747,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15350,6 +18762,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15361,6 +18777,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15372,6 +18792,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15383,6 +18807,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15394,6 +18822,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15405,6 +18837,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15416,6 +18852,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15427,6 +18867,10 @@
         "test": "sandbox_linux_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15438,6 +18882,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15449,6 +18897,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15460,6 +18912,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15471,6 +18927,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15482,6 +18942,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15493,6 +18957,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15504,6 +18972,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15515,6 +18987,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15526,6 +19002,10 @@
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15537,6 +19017,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15548,6 +19032,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15559,6 +19047,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15570,6 +19062,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15581,6 +19077,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15592,6 +19092,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15603,6 +19107,10 @@
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15614,6 +19122,10 @@
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15625,6 +19137,10 @@
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15636,6 +19152,10 @@
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -15652,54 +19172,90 @@
   "ToTMac": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -15707,12 +19263,20 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -15723,6 +19287,10 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/mac_window_server_killers.browser_tests.filter",
           "--gtest_shuffle"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 10
@@ -15734,6 +19302,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -15741,6 +19313,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -15750,48 +19326,80 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 6
@@ -15803,6 +19411,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -15810,114 +19422,190 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "crashpad_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 3
@@ -15925,210 +19613,350 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sandbox_mac_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16269,6 +20097,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16278,6 +20110,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16287,6 +20123,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16296,6 +20136,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16305,6 +20149,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16314,6 +20162,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16323,6 +20175,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16332,6 +20188,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16341,6 +20201,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -16351,6 +20215,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16360,6 +20228,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16371,6 +20243,10 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/mac_window_server_killers.browser_tests.filter",
           "--gtest_shuffle"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 10
@@ -16383,6 +20259,10 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -16393,6 +20273,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16403,6 +20287,10 @@
           "--gtest_filter=-*UsingRealWebcam*",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16412,6 +20300,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16421,6 +20313,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16430,6 +20326,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16439,6 +20339,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16448,6 +20352,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16457,6 +20365,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16466,6 +20378,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 6
@@ -16478,6 +20394,10 @@
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -16488,6 +20408,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16497,6 +20421,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16506,6 +20434,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16515,6 +20447,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16524,6 +20460,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16533,6 +20473,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16542,6 +20486,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16551,6 +20499,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16560,6 +20512,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16569,6 +20525,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16578,6 +20538,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16587,6 +20551,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16596,6 +20564,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16605,6 +20577,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16614,6 +20590,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16623,6 +20603,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16632,6 +20616,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16641,6 +20629,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16650,6 +20642,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 3
@@ -16660,6 +20656,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16669,6 +20669,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16678,6 +20682,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16687,6 +20695,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16696,6 +20708,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16705,6 +20721,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16714,6 +20734,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16723,6 +20747,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16732,6 +20760,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16741,6 +20773,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16750,6 +20786,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16759,6 +20799,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16768,6 +20812,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16777,6 +20825,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16786,6 +20838,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16795,6 +20851,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16804,6 +20864,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16813,6 +20877,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16822,6 +20890,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16831,6 +20903,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16840,6 +20916,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16849,6 +20929,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16858,6 +20942,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16867,6 +20955,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16876,6 +20968,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16885,6 +20981,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16894,6 +20994,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16903,6 +21007,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16912,6 +21020,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16921,6 +21033,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16930,6 +21046,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16939,6 +21059,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16948,6 +21072,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16957,6 +21085,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -16967,54 +21099,90 @@
   "ToTMacOfficial": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -17022,18 +21190,30 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 10
@@ -17045,6 +21225,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -17052,6 +21236,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -17061,48 +21249,80 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 6
@@ -17114,6 +21334,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -17121,114 +21345,190 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "crashpad_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 3
@@ -17236,210 +21536,350 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sandbox_mac_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -17577,60 +22017,100 @@
   "ToTWin": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -17638,18 +22118,30 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 10
@@ -17661,6 +22153,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -17668,6 +22164,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -17677,72 +22177,120 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_cleaner_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_elf_import_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_elf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 6
@@ -17754,6 +22302,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -17761,138 +22313,230 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "courgette_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "crashpad_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "elevation_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gcp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "install_static_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -17904,6 +22548,10 @@
         "test": "installer_util_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 3
@@ -17911,126 +22559,210 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -18042,30 +22774,50 @@
         "test": "sbox_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sbox_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sbox_validation_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -18077,108 +22829,180 @@
         "test": "setup_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -18189,60 +23013,100 @@
   "ToTWin(dbg)": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -18250,18 +23114,30 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 20
@@ -18273,6 +23149,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -18280,6 +23160,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -18289,72 +23173,120 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_cleaner_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_elf_import_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_elf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 6
@@ -18366,6 +23298,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -18373,138 +23309,230 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "courgette_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "crashpad_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "elevation_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gcp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "install_static_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -18516,6 +23544,10 @@
         "test": "installer_util_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 3
@@ -18523,126 +23555,210 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -18654,30 +23770,50 @@
         "test": "sbox_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sbox_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sbox_validation_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -18689,108 +23825,180 @@
         "test": "setup_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -18801,60 +24009,100 @@
   "ToTWin(dll)": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -18862,18 +24110,30 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 10
@@ -18885,6 +24145,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -18892,6 +24156,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -18901,72 +24169,120 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_cleaner_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_elf_import_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_elf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 6
@@ -18978,6 +24294,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -18985,138 +24305,230 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "courgette_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "crashpad_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "elevation_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gcp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "install_static_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19128,6 +24540,10 @@
         "test": "installer_util_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 3
@@ -19135,126 +24551,210 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19266,30 +24766,50 @@
         "test": "sbox_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sbox_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sbox_validation_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19301,108 +24821,180 @@
         "test": "setup_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -19413,6 +25005,10 @@
   "ToTWin64": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19425,6 +25021,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19437,6 +25037,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19449,6 +25053,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19461,6 +25069,10 @@
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19473,6 +25085,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19485,6 +25101,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19497,6 +25117,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19509,6 +25133,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19521,6 +25149,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -19534,6 +25166,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19546,6 +25182,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19558,6 +25198,10 @@
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19575,6 +25219,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -19588,6 +25236,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19603,6 +25255,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19615,6 +25271,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19627,6 +25287,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19639,6 +25303,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19651,6 +25319,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19663,6 +25335,10 @@
         "test": "chrome_cleaner_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19675,6 +25351,10 @@
         "test": "chrome_elf_import_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19687,6 +25367,10 @@
         "test": "chrome_elf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19699,6 +25383,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19711,6 +25399,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19723,6 +25415,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19735,6 +25431,10 @@
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19752,6 +25452,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -19765,6 +25469,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19777,6 +25485,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19789,6 +25501,10 @@
         "test": "courgette_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19801,6 +25517,10 @@
         "test": "crashpad_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19813,6 +25533,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19825,6 +25549,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19837,6 +25565,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19849,6 +25581,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19861,6 +25597,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19873,6 +25613,10 @@
         "test": "elevation_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19885,6 +25629,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19897,6 +25645,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19909,6 +25661,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19921,6 +25677,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19933,6 +25693,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19945,6 +25709,10 @@
         "test": "gcp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19957,6 +25725,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19969,6 +25741,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19981,6 +25757,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19993,6 +25773,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20005,6 +25789,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20017,6 +25805,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20029,6 +25821,10 @@
         "test": "install_static_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20042,6 +25838,10 @@
         "test": "installer_util_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20055,6 +25855,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20067,6 +25871,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20079,6 +25887,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20091,6 +25903,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20103,6 +25919,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20115,6 +25935,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20127,6 +25951,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20139,6 +25967,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20151,6 +25983,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20163,6 +25999,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20175,6 +26015,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20187,6 +26031,10 @@
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20199,6 +26047,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20211,6 +26063,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20223,6 +26079,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20235,6 +26095,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20247,6 +26111,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20259,6 +26127,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20271,6 +26143,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20283,6 +26159,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20295,6 +26175,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20308,6 +26192,10 @@
         "test": "sbox_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20320,6 +26208,10 @@
         "test": "sbox_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20332,6 +26224,10 @@
         "test": "sbox_validation_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20344,6 +26240,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20356,6 +26256,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20369,6 +26273,10 @@
         "test": "setup_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20381,6 +26289,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20393,6 +26305,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20405,6 +26321,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20417,6 +26337,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20429,6 +26353,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20441,6 +26369,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20453,6 +26385,10 @@
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20465,6 +26401,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20477,6 +26417,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20489,6 +26433,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20501,6 +26449,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20513,6 +26465,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20525,6 +26481,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20537,6 +26497,10 @@
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20549,6 +26513,10 @@
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20561,6 +26529,10 @@
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20573,6 +26545,10 @@
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20589,6 +26565,10 @@
   "ToTWin64(dbg)": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20601,6 +26581,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20613,6 +26597,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20625,6 +26613,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20637,6 +26629,10 @@
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20649,6 +26645,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20661,6 +26661,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20673,6 +26677,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20685,6 +26693,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20697,6 +26709,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -20710,6 +26726,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20722,6 +26742,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20734,6 +26758,10 @@
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20751,6 +26779,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -20764,6 +26796,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20779,6 +26815,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20791,6 +26831,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20803,6 +26847,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20815,6 +26863,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20827,6 +26879,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20839,6 +26895,10 @@
         "test": "chrome_cleaner_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20851,6 +26911,10 @@
         "test": "chrome_elf_import_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20863,6 +26927,10 @@
         "test": "chrome_elf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20875,6 +26943,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20887,6 +26959,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20899,6 +26975,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20911,6 +26991,10 @@
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20928,6 +27012,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -20941,6 +27029,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20953,6 +27045,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20965,6 +27061,10 @@
         "test": "courgette_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20977,6 +27077,10 @@
         "test": "crashpad_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20989,6 +27093,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21001,6 +27109,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21013,6 +27125,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21025,6 +27141,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21037,6 +27157,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21049,6 +27173,10 @@
         "test": "elevation_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21061,6 +27189,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21073,6 +27205,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21085,6 +27221,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21097,6 +27237,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21109,6 +27253,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21121,6 +27269,10 @@
         "test": "gcp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21133,6 +27285,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21145,6 +27301,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21157,6 +27317,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21169,6 +27333,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21181,6 +27349,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21193,6 +27365,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21205,6 +27381,10 @@
         "test": "install_static_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21218,6 +27398,10 @@
         "test": "installer_util_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21231,6 +27415,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21243,6 +27431,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21255,6 +27447,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21267,6 +27463,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21279,6 +27479,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21291,6 +27495,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21303,6 +27511,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21315,6 +27527,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21327,6 +27543,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21339,6 +27559,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21351,6 +27575,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21363,6 +27591,10 @@
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21375,6 +27607,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21387,6 +27623,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21399,6 +27639,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21411,6 +27655,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21423,6 +27671,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21435,6 +27687,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21447,6 +27703,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21459,6 +27719,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21471,6 +27735,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21484,6 +27752,10 @@
         "test": "sbox_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21496,6 +27768,10 @@
         "test": "sbox_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21508,6 +27784,10 @@
         "test": "sbox_validation_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21520,6 +27800,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21532,6 +27816,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21545,6 +27833,10 @@
         "test": "setup_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21557,6 +27849,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21569,6 +27865,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21581,6 +27881,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21593,6 +27897,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21605,6 +27913,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21617,6 +27929,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21629,6 +27945,10 @@
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21641,6 +27961,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21653,6 +27977,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21665,6 +27993,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21677,6 +28009,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21689,6 +28025,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21701,6 +28041,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21713,6 +28057,10 @@
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21725,6 +28073,10 @@
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21737,6 +28089,10 @@
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21749,6 +28105,10 @@
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21765,6 +28125,10 @@
   "ToTWin64(dll)": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21777,6 +28141,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21789,6 +28157,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21801,6 +28173,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21813,6 +28189,10 @@
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21825,6 +28205,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21837,6 +28221,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21849,6 +28237,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21861,6 +28253,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21873,6 +28269,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -21886,6 +28286,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21898,6 +28302,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21910,6 +28318,10 @@
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21927,6 +28339,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -21940,6 +28356,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21955,6 +28375,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21967,6 +28391,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21979,6 +28407,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21991,6 +28423,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22003,6 +28439,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22015,6 +28455,10 @@
         "test": "chrome_cleaner_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22027,6 +28471,10 @@
         "test": "chrome_elf_import_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22039,6 +28487,10 @@
         "test": "chrome_elf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22051,6 +28503,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22063,6 +28519,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22075,6 +28535,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22087,6 +28551,10 @@
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22104,6 +28572,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -22117,6 +28589,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22129,6 +28605,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22141,6 +28621,10 @@
         "test": "courgette_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22153,6 +28637,10 @@
         "test": "crashpad_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22165,6 +28653,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22177,6 +28669,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22189,6 +28685,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22201,6 +28701,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22213,6 +28717,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22225,6 +28733,10 @@
         "test": "elevation_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22237,6 +28749,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22249,6 +28765,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22261,6 +28781,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22273,6 +28797,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22285,6 +28813,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22297,6 +28829,10 @@
         "test": "gcp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22309,6 +28845,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22321,6 +28861,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22333,6 +28877,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22345,6 +28893,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22357,6 +28909,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22369,6 +28925,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22381,6 +28941,10 @@
         "test": "install_static_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22394,6 +28958,10 @@
         "test": "installer_util_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22407,6 +28975,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22419,6 +28991,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22431,6 +29007,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22443,6 +29023,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22455,6 +29039,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22467,6 +29055,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22479,6 +29071,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22491,6 +29087,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22503,6 +29103,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22515,6 +29119,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22527,6 +29135,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22539,6 +29151,10 @@
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22551,6 +29167,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22563,6 +29183,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22575,6 +29199,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22587,6 +29215,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22599,6 +29231,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22611,6 +29247,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22623,6 +29263,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22635,6 +29279,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22647,6 +29295,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22660,6 +29312,10 @@
         "test": "sbox_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22672,6 +29328,10 @@
         "test": "sbox_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22684,6 +29344,10 @@
         "test": "sbox_validation_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22696,6 +29360,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22708,6 +29376,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22721,6 +29393,10 @@
         "test": "setup_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22733,6 +29409,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22745,6 +29425,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22757,6 +29441,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22769,6 +29457,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22781,6 +29473,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22793,6 +29489,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22805,6 +29505,10 @@
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22817,6 +29521,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22829,6 +29537,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22841,6 +29553,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22853,6 +29569,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22865,6 +29585,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22877,6 +29601,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22889,6 +29617,10 @@
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22901,6 +29633,10 @@
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22913,6 +29649,10 @@
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22925,6 +29665,10 @@
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22941,60 +29685,100 @@
   "ToTWinCFI": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -23002,18 +29786,30 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 10
@@ -23025,6 +29821,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -23032,6 +29832,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -23041,72 +29845,120 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_cleaner_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_elf_import_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_elf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 6
@@ -23118,6 +29970,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -23125,138 +29981,230 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "courgette_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "crashpad_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "elevation_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gcp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "install_static_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -23268,6 +30216,10 @@
         "test": "installer_util_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 3
@@ -23275,126 +30227,210 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -23406,30 +30442,50 @@
         "test": "sbox_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sbox_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sbox_validation_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -23441,108 +30497,180 @@
         "test": "setup_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -23553,60 +30681,100 @@
   "ToTWinCFI64": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -23614,18 +30782,30 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 10
@@ -23637,6 +30817,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -23644,6 +30828,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -23653,72 +30841,120 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_cleaner_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_elf_import_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_elf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 6
@@ -23730,6 +30966,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -23737,138 +30977,230 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "courgette_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "crashpad_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "elevation_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gcp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "install_static_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -23880,6 +31212,10 @@
         "test": "installer_util_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 3
@@ -23887,126 +31223,210 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -24018,30 +31438,50 @@
         "test": "sbox_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sbox_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sbox_validation_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -24053,108 +31493,180 @@
         "test": "setup_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -24165,60 +31677,100 @@
   "ToTWinLibcxx64": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -24226,18 +31778,30 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 10
@@ -24249,6 +31813,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -24256,6 +31824,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -24265,72 +31837,120 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_cleaner_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_elf_import_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_elf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 6
@@ -24342,6 +31962,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -24349,138 +31973,230 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "courgette_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "crashpad_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "elevation_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gcp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "install_static_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -24492,6 +32208,10 @@
         "test": "installer_util_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 3
@@ -24499,126 +32219,210 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -24630,30 +32434,50 @@
         "test": "sbox_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sbox_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sbox_validation_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -24665,108 +32489,180 @@
         "test": "setup_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -24777,60 +32673,100 @@
   "ToTWinOfficial": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -24838,18 +32774,30 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 10
@@ -24861,6 +32809,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -24868,6 +32820,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -24877,72 +32833,120 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_cleaner_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_elf_import_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_elf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 6
@@ -24954,6 +32958,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -24961,138 +32969,230 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "courgette_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "crashpad_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "elevation_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gcp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "install_static_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -25104,6 +33204,10 @@
         "test": "installer_util_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 3
@@ -25111,126 +33215,210 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -25242,30 +33430,50 @@
         "test": "sbox_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sbox_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sbox_validation_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -25277,108 +33485,180 @@
         "test": "setup_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -25389,60 +33669,100 @@
   "ToTWinThinLTO64": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -25450,18 +33770,30 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 10
@@ -25473,6 +33805,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -25480,6 +33816,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -25489,72 +33829,120 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_cleaner_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_elf_import_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_elf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 6
@@ -25566,6 +33954,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -25573,138 +33965,230 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "courgette_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "crashpad_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "elevation_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gcp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "install_static_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -25716,6 +34200,10 @@
         "test": "installer_util_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 3
@@ -25723,126 +34211,210 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -25854,30 +34426,50 @@
         "test": "sbox_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sbox_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sbox_validation_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -25889,108 +34481,180 @@
         "test": "setup_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -26001,6 +34665,10 @@
   "UBSanVptr Linux": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26012,6 +34680,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26023,6 +34695,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26034,6 +34710,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26045,6 +34725,10 @@
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26056,6 +34740,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26067,6 +34755,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26078,6 +34770,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26089,6 +34785,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26100,6 +34800,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -26112,6 +34816,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26123,6 +34831,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26134,6 +34846,10 @@
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26150,6 +34866,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -26162,6 +34882,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26176,6 +34900,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26187,6 +34915,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26198,6 +34930,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26209,6 +34945,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26220,6 +34960,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26231,6 +34975,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26242,6 +34990,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26253,6 +35005,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26264,6 +35020,10 @@
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26280,6 +35040,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -26296,6 +35060,10 @@
           "--enable-features=VizDisplayCompositor,UseSkiaRenderer",
           "--gtest_filter=AuraWindowVideoCaptureDeviceBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "skia_renderer_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -26308,6 +35076,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26319,6 +35091,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26330,6 +35106,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26341,6 +35121,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26352,6 +35136,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26363,6 +35151,10 @@
         "test": "dbus_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26374,6 +35166,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26385,6 +35181,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26396,6 +35196,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26407,6 +35211,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26418,6 +35226,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26429,6 +35241,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26440,6 +35256,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26451,6 +35271,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26462,6 +35286,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26473,6 +35301,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26484,6 +35316,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26495,6 +35331,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26506,6 +35346,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26518,6 +35362,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26529,6 +35377,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26540,6 +35392,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26551,6 +35407,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26562,6 +35422,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26573,6 +35437,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26584,6 +35452,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26595,6 +35467,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26606,6 +35482,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26617,6 +35497,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26628,6 +35512,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26639,6 +35527,10 @@
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26650,6 +35542,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26661,6 +35557,10 @@
         "test": "nacl_helper_nonsfi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26672,6 +35572,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26683,6 +35587,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26694,6 +35602,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26705,6 +35617,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26716,6 +35632,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26727,6 +35647,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26738,6 +35662,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26749,6 +35677,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26760,6 +35692,10 @@
         "test": "sandbox_linux_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26771,6 +35707,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26782,6 +35722,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26793,6 +35737,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26804,6 +35752,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26815,6 +35767,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26826,6 +35782,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26837,6 +35797,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26848,6 +35812,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26859,6 +35827,10 @@
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26870,6 +35842,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26881,6 +35857,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26892,6 +35872,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26903,6 +35887,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26914,6 +35902,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26925,6 +35917,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26936,6 +35932,10 @@
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26947,6 +35947,10 @@
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26958,6 +35962,10 @@
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26969,6 +35977,10 @@
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -26985,6 +35997,10 @@
   "linux-win_cross-rel": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26996,6 +36012,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27007,6 +36027,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27018,6 +36042,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27029,6 +36057,10 @@
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27040,6 +36072,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27051,6 +36087,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27062,6 +36102,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27073,6 +36117,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27084,6 +36132,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -27096,6 +36148,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27107,6 +36163,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27122,6 +36182,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -27134,6 +36198,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27148,6 +36216,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27159,6 +36231,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27170,6 +36246,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27181,6 +36261,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27192,6 +36276,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27203,6 +36291,10 @@
         "test": "chrome_cleaner_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27214,6 +36306,10 @@
         "test": "chrome_elf_import_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27225,6 +36321,10 @@
         "test": "chrome_elf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27236,6 +36336,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27247,6 +36351,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27258,6 +36366,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27269,6 +36381,10 @@
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27285,6 +36401,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -27297,6 +36417,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27308,6 +36432,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27319,6 +36447,10 @@
         "test": "courgette_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27330,6 +36462,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27341,6 +36477,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27352,6 +36492,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27363,6 +36507,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27374,6 +36522,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27385,6 +36537,10 @@
         "test": "elevation_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27396,6 +36552,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27407,6 +36567,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27418,6 +36582,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27429,6 +36597,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27440,6 +36612,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27451,6 +36627,10 @@
         "test": "gcp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27462,6 +36642,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27473,6 +36657,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27484,6 +36672,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27495,6 +36687,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27506,6 +36702,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27517,6 +36717,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27528,6 +36732,10 @@
         "test": "install_static_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27540,6 +36748,10 @@
         "test": "installer_util_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27552,6 +36764,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27563,6 +36779,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27574,6 +36794,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27585,6 +36809,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27596,6 +36824,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27607,6 +36839,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27618,6 +36854,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27629,6 +36869,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27640,6 +36884,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27651,6 +36899,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27662,6 +36914,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27673,6 +36929,10 @@
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27684,6 +36944,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27695,6 +36959,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27706,6 +36974,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27717,6 +36989,10 @@
         "test": "notification_helper_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27728,6 +37004,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27739,6 +37019,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27750,6 +37034,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27761,6 +37049,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27772,6 +37064,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27784,6 +37080,10 @@
         "test": "sbox_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27795,6 +37095,10 @@
         "test": "sbox_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27806,6 +37110,10 @@
         "test": "sbox_validation_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27817,6 +37125,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27828,6 +37140,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27840,6 +37156,10 @@
         "test": "setup_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27851,6 +37171,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27862,6 +37186,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27873,6 +37201,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27884,6 +37216,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27895,6 +37231,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27906,6 +37246,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27917,6 +37261,10 @@
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27928,6 +37276,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27939,6 +37291,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27950,6 +37306,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27961,6 +37321,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27972,6 +37336,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27983,6 +37351,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27994,6 +37366,10 @@
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -28005,6 +37381,10 @@
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -28016,6 +37396,10 @@
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -28027,6 +37411,10 @@
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
diff --git a/testing/buildbot/chromium.dawn.json b/testing/buildbot/chromium.dawn.json
index d571fff..851e53f 100644
--- a/testing/buildbot/chromium.dawn.json
+++ b/testing/buildbot/chromium.dawn.json
@@ -10,6 +10,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -28,6 +32,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -45,6 +53,10 @@
           "--use-gpu-in-tests",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -66,6 +78,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -84,6 +100,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -101,6 +121,10 @@
           "--use-gpu-in-tests",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -122,6 +146,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -144,6 +172,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -168,6 +200,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -187,6 +223,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -204,6 +244,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -226,6 +270,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -244,6 +292,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -260,6 +312,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -281,6 +337,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -304,6 +364,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -328,6 +392,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -346,6 +414,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -362,6 +434,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -383,6 +459,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -401,6 +481,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -417,6 +501,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -438,6 +526,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -460,6 +552,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -484,6 +580,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -502,6 +602,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -518,6 +622,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -539,6 +647,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -557,6 +669,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -573,6 +689,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -594,6 +714,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -616,6 +740,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index 251c64c..24855f1 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -9,54 +9,90 @@
   "Chromium Mac 10.13": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -64,12 +100,20 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -80,6 +124,10 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/mac_window_server_killers.browser_tests.filter",
           "--gtest_shuffle"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 10
@@ -91,6 +139,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -98,6 +150,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -107,48 +163,80 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 6
@@ -160,6 +248,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -167,114 +259,190 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "crashpad_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 3
@@ -282,210 +450,350 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sandbox_mac_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -620,6 +928,10 @@
   "Linux ARM": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -632,6 +944,10 @@
         "test": "nacl_helper_nonsfi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -647,6 +963,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -666,6 +986,10 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -677,6 +1001,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -698,6 +1026,10 @@
         "args": [
           "--enable-features=VizDisplayCompositor,UseSkiaRenderer"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "skia_renderer_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -714,6 +1046,10 @@
         "args": [
           "--enable-features=VizDisplayCompositor,UseSkiaRenderer"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "skia_renderer_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -734,6 +1070,10 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -745,6 +1085,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -763,6 +1107,10 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -774,6 +1122,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -792,6 +1144,10 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -803,6 +1159,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -821,6 +1181,10 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -832,6 +1196,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -851,6 +1219,10 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -862,6 +1234,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -880,6 +1256,10 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -891,6 +1271,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -909,6 +1293,10 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -920,6 +1308,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1363,6 +1755,10 @@
   "Mojo ChromiumOS": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -1372,6 +1768,10 @@
         "args": [
           "--enable-features=NetworkService"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "network_service_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1383,6 +1783,10 @@
         "args": [
           "--enable-features=VizDisplayCompositor"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "viz_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1394,6 +1798,10 @@
         "args": [
           "--enable-features=NetworkService"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "network_service_components_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -1401,6 +1809,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -1410,6 +1822,10 @@
         "args": [
           "--enable-features=NetworkService"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "network_service_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1421,6 +1837,10 @@
         "args": [
           "--enable-features=VizDisplayCompositor"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "viz_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1432,6 +1852,10 @@
         "args": [
           "--enable-features=VizDisplayCompositor"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "viz_content_unittests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -1442,6 +1866,10 @@
         "args": [
           "--enable-features=NetworkService"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "network_service_extensions_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -1452,6 +1880,10 @@
         "args": [
           "--enable-features=NetworkService"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "network_service_interactive_ui_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1463,6 +1895,10 @@
         "args": [
           "--enable-features=VizDisplayCompositor"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "viz_interactive_ui_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -1470,12 +1906,20 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "wayland_client_perftests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -1489,6 +1933,10 @@
         "args": [
           "--enable-features=NetworkService,NetworkServiceInProcess"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "network_service_in_process_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1505,6 +1953,10 @@
         "args": [
           "--enable-features=ForceWebRequestProxyForTest"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "network_service_web_request_proxy_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1521,6 +1973,10 @@
         "args": [
           "--enable-features=NetworkService,NetworkServiceInProcess"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "network_service_in_process_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1541,6 +1997,10 @@
         "args": [
           "--enable-features=NetworkService,NetworkServiceInProcess"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "network_service_in_process_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1552,6 +2012,10 @@
         "args": [
           "--enable-features=ForceWebRequestProxyForTest"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "network_service_web_request_proxy_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1563,6 +2027,10 @@
         "args": [
           "--enable-features=NetworkService,NetworkServiceInProcess"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "network_service_in_process_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1571,6 +2039,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -1584,6 +2056,10 @@
         "args": [
           "--site-per-process"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "site_per_process_components_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1602,6 +2078,10 @@
         "args": [
           "--site-per-process"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "site_per_process_components_unittests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1622,6 +2102,10 @@
           "--site-per-process",
           "--test-launcher-filter-file=../../testing/buildbot/filters/site_isolation_android.content_browsertests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "site_per_process_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1641,6 +2125,10 @@
         "args": [
           "--site-per-process"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "site_per_process_content_unittests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1659,6 +2147,10 @@
         "args": [
           "--site-per-process"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "site_per_process_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1682,6 +2174,10 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1729,6 +2225,10 @@
         "args": [
           "--enable-blink-features=LayoutNG"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests_ng",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1802,60 +2302,100 @@
   "Win 10 Fast Ring": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": false
@@ -1863,18 +2403,30 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
@@ -1885,6 +2437,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": false
@@ -1892,6 +2448,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
@@ -1901,72 +2461,120 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "chrome_cleaner_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "chrome_elf_import_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "chrome_elf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
@@ -1977,6 +2585,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": false
@@ -1984,414 +2596,690 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "courgette_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "crashpad_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "elevation_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "gcp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "install_static_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "installer_util_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "notification_helper_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "sbox_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "sbox_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "sbox_validation_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "setup_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
@@ -2405,12 +3293,20 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -2425,12 +3321,20 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -2444,12 +3348,20 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -2473,12 +3385,20 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -2493,12 +3413,20 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -2946,6 +3874,10 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2962,6 +3894,10 @@
         "test": "chrome_all_tast_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2983,6 +3919,10 @@
           "--ozone-platform=headless",
           "--test-launcher-filter-file=../../testing/buildbot/filters/chromeos.services_unittests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3069,6 +4009,10 @@
           "--ozone-platform=headless"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3085,6 +4029,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3101,6 +4049,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3121,6 +4073,10 @@
           "--gtest_filter=-*UsingRealWebcam_CaptureMjpeg*"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3137,6 +4093,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3153,6 +4113,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3170,6 +4134,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3186,6 +4154,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3202,6 +4174,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3218,6 +4194,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3234,6 +4214,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3250,6 +4234,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3266,6 +4254,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3285,6 +4277,10 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/chromeos.media_unittests.filter"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3301,6 +4297,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3317,6 +4317,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3336,6 +4340,10 @@
           "--vpython-dir=../../vpython_dir_linux_amd64"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3363,6 +4371,10 @@
           "--ozone-platform=headless"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3379,6 +4391,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3395,6 +4411,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3411,6 +4431,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3427,6 +4451,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3443,6 +4471,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3459,6 +4491,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3481,42 +4517,70 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cast_runner_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -3526,36 +4590,60 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.content_unittests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cr_fuchsia_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -3565,30 +4653,50 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.gfx_unittests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "http_service_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -3598,30 +4706,50 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.mojo_unittests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -3631,24 +4759,40 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.ui_base_unittests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "web_engine_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "web_engine_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -3662,6 +4806,10 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3673,6 +4821,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3684,6 +4836,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3695,6 +4851,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3706,6 +4866,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3717,6 +4881,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3728,6 +4896,10 @@
         "test": "cast_runner_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3742,6 +4914,10 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.content_unittests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3753,6 +4929,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3764,6 +4944,10 @@
         "test": "cr_fuchsia_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3775,6 +4959,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3786,6 +4974,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3797,6 +4989,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3811,6 +5007,10 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.gfx_unittests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3822,6 +5022,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3833,6 +5037,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3844,6 +5052,10 @@
         "test": "http_service_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3855,6 +5067,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3869,6 +5085,10 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.mojo_unittests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3880,6 +5100,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3891,6 +5115,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3902,6 +5130,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3913,6 +5145,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3927,6 +5163,10 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.ui_base_unittests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3938,6 +5178,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3949,6 +5193,10 @@
         "test": "web_engine_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3960,6 +5208,10 @@
         "test": "web_engine_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3978,6 +5230,10 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3989,6 +5245,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4000,6 +5260,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4011,6 +5275,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4022,6 +5290,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4033,6 +5305,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4044,6 +5320,10 @@
         "test": "cast_runner_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4058,6 +5338,10 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.content_unittests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4069,6 +5353,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4080,6 +5368,10 @@
         "test": "cr_fuchsia_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4091,6 +5383,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4102,6 +5398,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4113,6 +5413,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4127,6 +5431,10 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.gfx_unittests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4138,6 +5446,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4149,6 +5461,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4160,6 +5476,10 @@
         "test": "http_service_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4171,6 +5491,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4185,6 +5509,10 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.mojo_unittests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4199,6 +5527,10 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.net_unittests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4210,6 +5542,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4221,6 +5557,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4232,6 +5572,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4243,6 +5587,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4257,6 +5605,10 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.ui_base_unittests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4268,6 +5620,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4279,6 +5635,10 @@
         "test": "web_engine_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4290,6 +5650,10 @@
         "test": "web_engine_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4330,6 +5694,10 @@
   "ios-simulator-code-coverage": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -4352,6 +5720,10 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4363,6 +5735,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4374,6 +5750,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4385,6 +5765,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4396,6 +5780,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4407,6 +5795,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -4419,6 +5811,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4430,6 +5826,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4441,6 +5841,10 @@
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4455,6 +5859,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4466,6 +5874,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4477,6 +5889,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4488,6 +5904,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4499,6 +5919,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4515,6 +5939,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -4527,6 +5955,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4538,6 +5970,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4549,6 +5985,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4560,6 +6000,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4571,6 +6015,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4582,6 +6030,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4593,6 +6045,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4604,6 +6060,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4615,6 +6075,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4626,6 +6090,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4637,6 +6105,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4648,6 +6120,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4659,6 +6135,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4670,6 +6150,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4681,6 +6165,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4692,6 +6180,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4703,6 +6195,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4714,6 +6210,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4725,6 +6225,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4736,6 +6240,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4747,6 +6255,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4758,6 +6270,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4769,6 +6285,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4780,6 +6300,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4791,6 +6315,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4802,6 +6330,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4813,6 +6345,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4857,6 +6393,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4871,6 +6411,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4885,6 +6429,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4899,6 +6447,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4913,6 +6465,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4927,6 +6483,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -4942,6 +6502,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4956,6 +6520,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4970,6 +6538,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4985,6 +6557,10 @@
           "--gtest_filter=-*UsingRealWebcam*",
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4999,6 +6575,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5013,6 +6593,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5027,6 +6611,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5041,6 +6629,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5058,6 +6650,10 @@
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*",
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -5073,6 +6669,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5087,6 +6687,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5101,6 +6705,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5115,6 +6723,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5129,6 +6741,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5143,6 +6759,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5157,6 +6777,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5171,6 +6795,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5185,6 +6813,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5199,6 +6831,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5213,6 +6849,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5227,6 +6867,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5241,6 +6885,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5255,6 +6903,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5269,6 +6921,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5283,6 +6939,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5297,6 +6957,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5311,6 +6975,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5325,6 +6993,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5339,6 +7011,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5353,6 +7029,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5367,6 +7047,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5381,6 +7065,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5395,6 +7083,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5409,6 +7101,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5423,6 +7119,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5437,6 +7137,10 @@
         "args": [
           "--enable-blink-features=HeapConcurrentMarking"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5482,6 +7186,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5496,6 +7204,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5510,6 +7222,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5524,6 +7240,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5538,6 +7258,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5552,6 +7276,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -5567,6 +7295,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5581,6 +7313,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5595,6 +7331,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5610,6 +7350,10 @@
           "--gtest_filter=-*UsingRealWebcam*",
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5624,6 +7368,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5638,6 +7386,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5652,6 +7404,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5666,6 +7422,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5683,6 +7443,10 @@
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*",
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -5698,6 +7462,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5712,6 +7480,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5726,6 +7498,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5740,6 +7516,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5754,6 +7534,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5768,6 +7552,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5782,6 +7570,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5796,6 +7588,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5810,6 +7606,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5824,6 +7624,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5838,6 +7642,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5852,6 +7660,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5866,6 +7678,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5880,6 +7696,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5894,6 +7714,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5908,6 +7732,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5922,6 +7750,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5936,6 +7768,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5950,6 +7786,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5964,6 +7804,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5978,6 +7822,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5992,6 +7840,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6006,6 +7858,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6020,6 +7876,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6034,6 +7894,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6048,6 +7912,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6062,6 +7930,10 @@
         "args": [
           "--enable-blink-features=HeapUnifiedGarbageCollection"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6104,6 +7976,10 @@
   "linux-blink-heap-verification": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6115,6 +7991,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6126,6 +8006,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6137,6 +8021,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6148,6 +8036,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6159,6 +8051,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -6171,6 +8067,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6182,6 +8082,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6193,6 +8097,10 @@
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6207,6 +8115,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6218,6 +8130,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6229,6 +8145,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6240,6 +8160,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6251,6 +8175,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6267,6 +8195,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -6279,6 +8211,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6290,6 +8226,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6301,6 +8241,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6312,6 +8256,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6323,6 +8271,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6334,6 +8286,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6345,6 +8301,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6356,6 +8316,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6367,6 +8331,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6378,6 +8346,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6389,6 +8361,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6400,6 +8376,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6411,6 +8391,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6422,6 +8406,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6433,6 +8421,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6444,6 +8436,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6455,6 +8451,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6466,6 +8466,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6477,6 +8481,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6488,6 +8496,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6499,6 +8511,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6510,6 +8526,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6521,6 +8541,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6532,6 +8556,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6543,6 +8571,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6554,6 +8586,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6565,6 +8601,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6636,6 +8676,10 @@
     "gtest_tests": [
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6648,6 +8692,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6660,6 +8708,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6672,6 +8724,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6684,6 +8740,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6696,6 +8756,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6708,6 +8772,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6720,6 +8788,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6732,6 +8804,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6744,6 +8820,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6756,6 +8836,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6768,6 +8852,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -6781,6 +8869,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6793,6 +8885,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6805,6 +8901,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6821,6 +8921,10 @@
           "--enable-features=VizDisplayCompositor"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "viz_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -6839,6 +8943,10 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -6852,6 +8960,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6867,6 +8979,10 @@
           "--gtest_filter=-*UsingRealWebcam*"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6879,6 +8995,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6891,6 +9011,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6903,6 +9027,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6915,6 +9043,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6927,6 +9059,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6939,6 +9075,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6951,6 +9091,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6963,6 +9107,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6975,6 +9123,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6987,6 +9139,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7004,6 +9160,10 @@
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -7020,6 +9180,10 @@
           "--enable-features=VizDisplayCompositor"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "viz_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -7034,6 +9198,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7049,6 +9217,10 @@
           "--enable-features=VizDisplayCompositor"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "viz_content_unittests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -7062,6 +9234,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7074,6 +9250,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7086,6 +9266,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7098,6 +9282,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7110,6 +9298,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7122,6 +9314,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7134,6 +9330,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7146,6 +9346,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7158,6 +9362,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7170,6 +9378,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7182,6 +9394,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7194,6 +9410,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7206,6 +9426,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7218,6 +9442,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7230,6 +9458,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7242,6 +9474,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7255,6 +9491,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7267,6 +9507,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7279,6 +9523,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7291,6 +9539,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7303,6 +9555,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7315,6 +9571,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7327,6 +9587,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7339,6 +9603,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7351,6 +9619,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7363,6 +9635,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7375,6 +9651,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7387,6 +9667,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7399,6 +9683,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7411,6 +9699,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7423,6 +9715,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7435,6 +9731,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7447,6 +9747,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7462,6 +9766,10 @@
           "--ozone-platform=headless"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7474,6 +9782,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7486,6 +9798,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7498,6 +9814,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7510,6 +9830,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7522,6 +9846,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7534,6 +9862,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7546,6 +9878,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7558,6 +9894,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7570,6 +9910,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7582,6 +9926,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7594,6 +9942,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7606,6 +9958,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7618,6 +9974,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7630,6 +9990,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7642,6 +10006,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7654,6 +10022,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7666,6 +10038,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7678,6 +10054,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7690,6 +10070,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7702,6 +10086,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7714,6 +10102,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7726,6 +10118,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7739,6 +10135,10 @@
       {
         "experiment_percentage": 100,
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7751,6 +10151,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7763,6 +10167,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7775,6 +10183,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7787,6 +10199,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7799,6 +10215,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7818,6 +10238,10 @@
     "gtest_tests": [
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7830,6 +10254,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7842,6 +10270,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7854,6 +10286,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7866,6 +10302,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7878,6 +10318,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7890,6 +10334,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7902,6 +10350,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7914,6 +10366,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7926,6 +10382,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7938,6 +10398,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7950,6 +10414,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -7963,6 +10431,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7975,6 +10447,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7987,6 +10463,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8003,6 +10483,10 @@
           "--enable-features=VizDisplayCompositor"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "viz_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -8021,6 +10505,10 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -8034,6 +10522,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8049,6 +10541,10 @@
           "--gtest_filter=-*UsingRealWebcam*"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8061,6 +10557,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8073,6 +10573,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8085,6 +10589,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8097,6 +10605,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8109,6 +10621,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8121,6 +10637,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8133,6 +10653,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8145,6 +10669,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8157,6 +10685,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8169,6 +10701,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8186,6 +10722,10 @@
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -8202,6 +10742,10 @@
           "--enable-features=VizDisplayCompositor"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "viz_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -8216,6 +10760,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8231,6 +10779,10 @@
           "--enable-features=VizDisplayCompositor"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "viz_content_unittests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -8244,6 +10796,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8256,6 +10812,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8268,6 +10828,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8280,6 +10844,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8292,6 +10860,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8304,6 +10876,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8316,6 +10892,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8328,6 +10908,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8340,6 +10924,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8352,6 +10940,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8364,6 +10956,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8376,6 +10972,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8388,6 +10988,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8400,6 +11004,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8412,6 +11020,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8424,6 +11036,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8437,6 +11053,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8449,6 +11069,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8461,6 +11085,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8473,6 +11101,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8485,6 +11117,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8497,6 +11133,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8509,6 +11149,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8521,6 +11165,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8533,6 +11181,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8545,6 +11197,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8557,6 +11213,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8569,6 +11229,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8581,6 +11245,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8593,6 +11261,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8605,6 +11277,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8617,6 +11293,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8629,6 +11309,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8644,6 +11328,10 @@
           "--ozone-platform=headless"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8656,6 +11344,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8668,6 +11360,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8680,6 +11376,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8692,6 +11392,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8704,6 +11408,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8716,6 +11424,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8728,6 +11440,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8740,6 +11456,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8752,6 +11472,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8764,6 +11488,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8776,6 +11504,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8788,6 +11520,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8800,6 +11536,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8812,6 +11552,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8824,6 +11568,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8836,6 +11584,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8848,6 +11600,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8860,6 +11616,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8872,6 +11632,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8884,6 +11648,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8896,6 +11664,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8908,6 +11680,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8921,6 +11697,10 @@
       {
         "experiment_percentage": 100,
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8933,6 +11713,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8945,6 +11729,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8957,6 +11745,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8969,6 +11761,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8981,6 +11777,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9008,6 +11808,10 @@
   "linux-chromium-tests-staging-tests": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9019,6 +11823,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9030,6 +11838,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9041,6 +11853,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9052,6 +11868,10 @@
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9063,6 +11883,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9074,6 +11898,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9085,6 +11913,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9096,6 +11928,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9107,6 +11943,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -9119,6 +11959,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9130,6 +11974,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9141,6 +11989,10 @@
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9157,6 +12009,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -9169,6 +12025,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9183,6 +12043,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9194,6 +12058,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9205,6 +12073,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9216,6 +12088,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9227,6 +12103,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9238,6 +12118,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9249,6 +12133,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9260,6 +12148,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9271,6 +12163,10 @@
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9287,6 +12183,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -9303,6 +12203,10 @@
           "--enable-features=VizDisplayCompositor,UseSkiaRenderer",
           "--gtest_filter=AuraWindowVideoCaptureDeviceBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "skia_renderer_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -9315,6 +12219,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9326,6 +12234,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9337,6 +12249,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9348,6 +12264,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9359,6 +12279,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9370,6 +12294,10 @@
         "test": "dbus_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9381,6 +12309,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9392,6 +12324,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9403,6 +12339,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9414,6 +12354,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9425,6 +12369,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9436,6 +12384,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9447,6 +12399,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9458,6 +12414,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9469,6 +12429,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9480,6 +12444,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9491,6 +12459,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9502,6 +12474,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9513,6 +12489,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9525,6 +12505,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9536,6 +12520,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9547,6 +12535,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9558,6 +12550,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9569,6 +12565,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9580,6 +12580,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9591,6 +12595,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9602,6 +12610,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9613,6 +12625,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9624,6 +12640,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9635,6 +12655,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9646,6 +12670,10 @@
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9657,6 +12685,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9668,6 +12700,10 @@
         "test": "nacl_helper_nonsfi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9679,6 +12715,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9690,6 +12730,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9701,6 +12745,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9712,6 +12760,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9723,6 +12775,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9734,6 +12790,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9745,6 +12805,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9756,6 +12820,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9767,6 +12835,10 @@
         "test": "sandbox_linux_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9778,6 +12850,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9789,6 +12865,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9800,6 +12880,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9811,6 +12895,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9822,6 +12910,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9833,6 +12925,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9844,6 +12940,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9855,6 +12955,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9866,6 +12970,10 @@
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9877,6 +12985,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9888,6 +13000,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9899,6 +13015,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9910,6 +13030,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9921,6 +13045,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9932,6 +13060,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9943,6 +13075,10 @@
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9954,6 +13090,10 @@
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9965,6 +13105,10 @@
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9976,6 +13120,10 @@
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -10227,6 +13375,10 @@
     "gtest_tests": [
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10239,6 +13391,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10251,6 +13407,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10263,6 +13423,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10275,6 +13439,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10287,6 +13455,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10299,6 +13471,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10311,6 +13487,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10323,6 +13503,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10335,6 +13519,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -10348,6 +13536,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10360,6 +13552,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10372,6 +13568,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10389,6 +13589,10 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -10402,6 +13606,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10417,6 +13625,10 @@
           "--gtest_filter=-*UsingRealWebcam*"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10429,6 +13641,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10441,6 +13657,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10453,6 +13673,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10465,6 +13689,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10477,6 +13705,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10489,6 +13721,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10501,6 +13737,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10513,6 +13753,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10530,6 +13774,10 @@
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -10543,6 +13791,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10555,6 +13807,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10567,6 +13823,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10579,6 +13839,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10591,6 +13855,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10603,6 +13871,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10615,6 +13887,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10627,6 +13903,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10639,6 +13919,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10651,6 +13935,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10663,6 +13951,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10675,6 +13967,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10687,6 +13983,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10699,6 +13999,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10711,6 +14015,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10723,6 +14031,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10735,6 +14047,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10747,6 +14063,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10759,6 +14079,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10772,6 +14096,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10784,6 +14112,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10796,6 +14128,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10808,6 +14144,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10820,6 +14160,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10832,6 +14176,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10844,6 +14192,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10856,6 +14208,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10868,6 +14224,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10880,6 +14240,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10892,6 +14256,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10904,6 +14272,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10916,6 +14288,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10928,6 +14304,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10940,6 +14320,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10952,6 +14336,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10964,6 +14352,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10976,6 +14368,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10988,6 +14384,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11000,6 +14400,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11012,6 +14416,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11024,6 +14432,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11036,6 +14448,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11048,6 +14464,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11060,6 +14480,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11072,6 +14496,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11084,6 +14512,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11096,6 +14528,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11108,6 +14544,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11120,6 +14560,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11132,6 +14576,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11144,6 +14592,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11156,6 +14608,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11168,6 +14624,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11180,6 +14640,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11192,6 +14656,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11204,6 +14672,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11216,6 +14688,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11228,6 +14704,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11240,6 +14720,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11252,6 +14736,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13999,6 +17487,10 @@
   "linux-tcmalloc-rel": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14010,6 +17502,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14021,6 +17517,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14032,6 +17532,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14043,6 +17547,10 @@
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14054,6 +17562,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14065,6 +17577,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14076,6 +17592,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14087,6 +17607,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14098,6 +17622,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -14110,6 +17638,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14121,6 +17653,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14132,6 +17668,10 @@
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14148,6 +17688,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -14160,6 +17704,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14174,6 +17722,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14185,6 +17737,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14196,6 +17752,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14207,6 +17767,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14218,6 +17782,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14229,6 +17797,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14240,6 +17812,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14251,6 +17827,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14262,6 +17842,10 @@
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14278,6 +17862,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -14294,6 +17882,10 @@
           "--enable-features=VizDisplayCompositor,UseSkiaRenderer",
           "--gtest_filter=AuraWindowVideoCaptureDeviceBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "skia_renderer_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -14306,6 +17898,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14317,6 +17913,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14328,6 +17928,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14339,6 +17943,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14350,6 +17958,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14361,6 +17973,10 @@
         "test": "dbus_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14372,6 +17988,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14383,6 +18003,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14394,6 +18018,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14405,6 +18033,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14416,6 +18048,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14427,6 +18063,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14438,6 +18078,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14449,6 +18093,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14460,6 +18108,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14471,6 +18123,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14482,6 +18138,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14493,6 +18153,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14504,6 +18168,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14516,6 +18184,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14527,6 +18199,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14538,6 +18214,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14549,6 +18229,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14560,6 +18244,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14571,6 +18259,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14582,6 +18274,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14593,6 +18289,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14604,6 +18304,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14615,6 +18319,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14626,6 +18334,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14637,6 +18349,10 @@
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14648,6 +18364,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14659,6 +18379,10 @@
         "test": "nacl_helper_nonsfi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14670,6 +18394,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14681,6 +18409,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14692,6 +18424,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14703,6 +18439,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14714,6 +18454,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14725,6 +18469,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14736,6 +18484,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14747,6 +18499,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14758,6 +18514,10 @@
         "test": "sandbox_linux_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14769,6 +18529,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14780,6 +18544,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14791,6 +18559,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14802,6 +18574,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14813,6 +18589,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14824,6 +18604,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14835,6 +18619,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14846,6 +18634,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14857,6 +18649,10 @@
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14868,6 +18664,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14879,6 +18679,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14890,6 +18694,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14901,6 +18709,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14912,6 +18724,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14923,6 +18739,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14934,6 +18754,10 @@
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14945,6 +18769,10 @@
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14956,6 +18784,10 @@
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14967,6 +18799,10 @@
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -15250,6 +19086,10 @@
   "mac-osxbeta-rel": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15263,6 +19103,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15276,6 +19120,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15289,6 +19137,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15302,6 +19154,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15315,6 +19171,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15328,6 +19188,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15341,6 +19205,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15354,6 +19222,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -15368,6 +19240,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15381,6 +19257,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15398,6 +19278,10 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/mac_window_server_killers.browser_tests.filter",
           "--gtest_shuffle"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15416,6 +19300,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -15430,6 +19318,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15446,6 +19338,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15459,6 +19355,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15472,6 +19372,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15485,6 +19389,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15498,6 +19406,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15511,6 +19423,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15524,6 +19440,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15537,6 +19457,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15555,6 +19479,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -15569,6 +19497,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15582,6 +19514,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15595,6 +19531,10 @@
         "test": "crashpad_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15608,6 +19548,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15621,6 +19565,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15634,6 +19582,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15647,6 +19599,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15660,6 +19616,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15673,6 +19633,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15686,6 +19650,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15699,6 +19667,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15712,6 +19684,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15725,6 +19701,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15738,6 +19718,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15751,6 +19735,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15764,6 +19752,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15777,6 +19769,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15790,6 +19786,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15803,6 +19803,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15817,6 +19821,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15830,6 +19838,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15843,6 +19855,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15856,6 +19872,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15869,6 +19889,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15882,6 +19906,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15895,6 +19923,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15908,6 +19940,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15921,6 +19957,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15934,6 +19974,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15947,6 +19991,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15960,6 +20008,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15973,6 +20025,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15986,6 +20042,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15999,6 +20059,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -16012,6 +20076,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -16025,6 +20093,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -16038,6 +20110,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -16051,6 +20127,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -16064,6 +20144,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -16077,6 +20161,10 @@
         "test": "sandbox_mac_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -16090,6 +20178,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -16103,6 +20195,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -16116,6 +20212,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -16129,6 +20229,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -16142,6 +20246,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -16155,6 +20263,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -16168,6 +20280,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -16181,6 +20297,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -16194,6 +20314,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -16207,6 +20331,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -16220,6 +20348,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -16233,6 +20365,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -16246,6 +20382,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -16259,6 +20399,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
diff --git a/testing/buildbot/chromium.goma.json b/testing/buildbot/chromium.goma.json
index 337d7a1..164be878 100644
--- a/testing/buildbot/chromium.goma.json
+++ b/testing/buildbot/chromium.goma.json
@@ -13,6 +13,10 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -24,6 +28,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -42,6 +50,10 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -53,6 +65,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -71,6 +87,10 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -82,6 +102,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -100,6 +124,10 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -111,6 +139,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -129,6 +161,10 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -140,6 +176,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -158,12 +198,20 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -177,12 +225,20 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -196,12 +252,20 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -215,12 +279,20 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -234,12 +306,20 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -253,12 +333,20 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json
index 3afd092..ad8fb1d1 100644
--- a/testing/buildbot/chromium.gpu.fyi.json
+++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -8,6 +8,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -28,6 +32,10 @@
           "--test-launcher-retry-limit=0",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -45,6 +53,10 @@
         "args": [
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -63,6 +75,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -80,6 +96,10 @@
           "--use-gpu-in-tests",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -96,6 +116,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -300,6 +324,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -320,6 +348,10 @@
           "--test-launcher-retry-limit=0",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -337,6 +369,10 @@
         "args": [
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -355,6 +391,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -372,6 +412,10 @@
           "--use-gpu-in-tests",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -388,6 +432,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -592,6 +640,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -610,6 +662,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -627,6 +683,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -642,6 +702,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -657,6 +721,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -669,6 +737,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -768,6 +840,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -788,6 +864,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -807,6 +887,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -824,6 +908,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -841,6 +929,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -855,6 +947,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -962,6 +1058,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -982,6 +1082,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1005,6 +1109,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1023,6 +1131,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1040,6 +1152,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1057,6 +1173,10 @@
         "args": [
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1075,6 +1195,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1092,6 +1216,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=passthrough"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gl_tests_passthrough",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1111,6 +1239,10 @@
           "--use-angle=d3d11",
           "--disable-gpu-sandbox"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gles2_conform_d3d11_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1129,6 +1261,10 @@
           "--use-gpu-in-tests",
           "--use-angle=d3d9"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gles2_conform_d3d9_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1148,6 +1284,10 @@
           "--use-angle=gl",
           "--disable-gpu-sandbox"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gles2_conform_gl_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1167,6 +1307,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_d3d11_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1186,6 +1330,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_d3d9_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1417,6 +1565,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1435,6 +1587,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1452,6 +1608,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1469,6 +1629,10 @@
         "args": [
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1487,6 +1651,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1504,6 +1672,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=passthrough"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gl_tests_passthrough",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1523,6 +1695,10 @@
           "--use-angle=d3d11",
           "--disable-gpu-sandbox"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gles2_conform_d3d11_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1541,6 +1717,10 @@
           "--use-gpu-in-tests",
           "--use-angle=d3d9"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gles2_conform_d3d9_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1560,6 +1740,10 @@
           "--use-angle=gl",
           "--disable-gpu-sandbox"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gles2_conform_gl_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1579,6 +1763,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_d3d11_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1598,6 +1786,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_d3d9_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1617,6 +1809,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_gl_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1929,6 +2125,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1966,6 +2166,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2035,6 +2239,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2072,6 +2280,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2144,6 +2356,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_egl_vulkan_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -2185,6 +2401,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles2_vulkan_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -2226,6 +2446,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles3_vulkan_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -2271,6 +2495,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_egl_vulkan_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -2312,6 +2540,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles2_vulkan_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -2353,6 +2585,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles3_vulkan_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -2395,6 +2631,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2432,6 +2672,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2501,6 +2745,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2538,6 +2786,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2610,6 +2862,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_egl_vulkan_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -2651,6 +2907,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles2_vulkan_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -2692,6 +2952,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles3_vulkan_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -2737,6 +3001,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_egl_vulkan_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -2778,6 +3046,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles2_vulkan_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -2819,6 +3091,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles3_vulkan_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -2861,6 +3137,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2898,6 +3178,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2934,6 +3218,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -2969,6 +3257,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3004,6 +3296,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3351,6 +3647,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -3387,6 +3687,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3422,6 +3726,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3457,6 +3765,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -3777,6 +4089,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -3813,6 +4129,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4213,6 +4533,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -4249,6 +4573,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4284,6 +4612,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4319,6 +4651,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4639,6 +4975,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -4676,6 +5016,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -4712,6 +5056,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4747,6 +5095,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -4782,6 +5134,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5129,6 +5485,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -5165,6 +5525,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5200,6 +5564,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5235,6 +5603,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5617,6 +5989,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_egl_gles_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -5657,6 +6033,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles2_gles_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -5697,6 +6077,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles3_gles_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -5738,6 +6122,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5760,6 +6148,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5782,6 +6174,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5803,6 +6199,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5826,6 +6226,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5849,6 +6253,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5871,6 +6279,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5907,6 +6319,10 @@
           "--test-launcher-retry-limit=0",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -5924,6 +6340,10 @@
         "args": [
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -5942,6 +6362,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5959,6 +6383,10 @@
           "--use-gpu-in-tests",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5975,6 +6403,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5988,6 +6420,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6305,6 +6741,10 @@
           "--test-launcher-retry-limit=0",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -6323,6 +6763,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6340,6 +6784,10 @@
           "--use-gpu-in-tests",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6356,6 +6804,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6369,6 +6821,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6760,6 +7216,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -6780,6 +7240,10 @@
           "--test-launcher-retry-limit=0",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -6797,6 +7261,10 @@
         "args": [
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -6818,6 +7286,10 @@
           "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "tab_capture_end2end_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -6836,6 +7308,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6853,6 +7329,10 @@
           "--use-gpu-in-tests",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6869,6 +7349,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6882,6 +7366,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7326,6 +7814,10 @@
           "--test-launcher-retry-limit=0",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -7343,6 +7835,10 @@
         "args": [
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -7361,6 +7857,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7378,6 +7878,10 @@
           "--use-gpu-in-tests",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7394,6 +7898,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7407,6 +7915,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7429,6 +7941,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -7449,6 +7965,10 @@
           "--test-launcher-retry-limit=0",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -7472,6 +7992,10 @@
           "--test-launcher-retry-limit=0",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -7490,6 +8014,10 @@
         "args": [
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -7512,6 +8040,10 @@
           "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "tab_capture_end2end_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -7531,6 +8063,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7548,6 +8084,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7562,6 +8102,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7918,6 +8462,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -7938,6 +8486,10 @@
           "--test-launcher-retry-limit=0",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -7955,6 +8507,10 @@
         "args": [
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -7976,6 +8532,10 @@
           "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "tab_capture_end2end_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -8005,6 +8565,10 @@
           "--disable-software-compositing-fallback",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "vulkan_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -8023,6 +8587,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8040,6 +8608,10 @@
           "--use-gpu-in-tests",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8056,6 +8628,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8069,6 +8645,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8487,6 +9067,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -8507,6 +9091,10 @@
           "--test-launcher-retry-limit=0",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -8524,6 +9112,10 @@
         "args": [
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -8545,6 +9137,10 @@
           "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "tab_capture_end2end_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -8563,6 +9159,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8580,6 +9180,10 @@
           "--use-gpu-in-tests",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8596,6 +9200,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8609,6 +9217,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9052,6 +9664,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -9072,6 +9688,10 @@
           "--test-launcher-retry-limit=0",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -9089,6 +9709,10 @@
         "args": [
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -9110,6 +9734,10 @@
           "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "tab_capture_end2end_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -9128,6 +9756,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9145,6 +9777,10 @@
           "--use-gpu-in-tests",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9161,6 +9797,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9174,6 +9814,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9227,6 +9871,10 @@
           "--test-launcher-batch-limit=400",
           "--deqp-egl-display-type=angle-gl"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles2_gl_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -9251,6 +9899,10 @@
           "--test-launcher-batch-limit=400",
           "--deqp-egl-display-type=angle-gl"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_egl_gl_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -9271,6 +9923,10 @@
           "--deqp-egl-display-type=angle-vulkan",
           "--test-launcher-batch-limit=400"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_egl_vulkan_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -9291,6 +9947,10 @@
           "--test-launcher-batch-limit=400",
           "--deqp-egl-display-type=angle-gl"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles2_gl_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -9311,6 +9971,10 @@
           "--deqp-egl-display-type=angle-vulkan",
           "--test-launcher-batch-limit=400"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles2_vulkan_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -9331,6 +9995,10 @@
           "--test-launcher-batch-limit=400",
           "--deqp-egl-display-type=angle-gl"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles31_gl_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -9351,6 +10019,10 @@
           "--test-launcher-batch-limit=400",
           "--deqp-egl-display-type=angle-gl"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles3_gl_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -9371,6 +10043,10 @@
           "--deqp-egl-display-type=angle-vulkan",
           "--test-launcher-batch-limit=400"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles3_vulkan_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -9395,6 +10071,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -9422,6 +10102,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -9450,6 +10134,10 @@
           "--test-launcher-jobs=1",
           "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "tab_capture_end2end_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -9476,6 +10164,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9500,6 +10192,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9524,6 +10220,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9545,6 +10245,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9570,6 +10274,10 @@
           "--gtest_filter=*Detection*",
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9591,6 +10299,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10005,6 +10717,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -10032,6 +10748,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -10060,6 +10780,10 @@
           "--test-launcher-jobs=1",
           "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "tab_capture_end2end_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -10086,6 +10810,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10110,6 +10838,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10134,6 +10866,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10155,6 +10891,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10180,6 +10920,10 @@
           "--gtest_filter=*Detection*",
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10201,6 +10945,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10615,6 +11363,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -10642,6 +11394,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -10670,6 +11426,10 @@
           "--test-launcher-jobs=1",
           "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "tab_capture_end2end_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -10696,6 +11456,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10720,6 +11484,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10744,6 +11512,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10765,6 +11537,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10790,6 +11566,10 @@
           "--gtest_filter=*Detection*",
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10811,6 +11591,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11225,6 +12009,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -11243,6 +12031,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -11260,6 +12052,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11275,6 +12071,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11290,6 +12090,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11302,6 +12106,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11318,6 +12126,10 @@
           "--gtest_filter=*Detection*",
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11330,6 +12142,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11610,6 +12426,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -11630,6 +12450,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -11651,6 +12475,10 @@
           "--test-launcher-jobs=1",
           "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "tab_capture_end2end_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -11670,6 +12498,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11687,6 +12519,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11704,6 +12540,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11718,6 +12558,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11736,6 +12580,10 @@
           "--gtest_filter=*Detection*",
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12066,6 +12914,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -12087,6 +12939,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -12109,6 +12965,10 @@
           "--test-launcher-jobs=1",
           "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "tab_capture_end2end_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -12129,6 +12989,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12147,6 +13011,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12165,6 +13033,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12180,6 +13052,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12199,6 +13075,10 @@
           "--gtest_filter=*Detection*",
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12541,6 +13421,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -12562,6 +13446,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -12584,6 +13472,10 @@
           "--test-launcher-jobs=1",
           "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "tab_capture_end2end_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -12604,6 +13496,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12622,6 +13518,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12640,6 +13540,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12655,6 +13559,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12674,6 +13582,10 @@
           "--gtest_filter=*Detection*",
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13016,6 +13928,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -13040,6 +13956,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -13065,6 +13985,10 @@
           "--test-launcher-jobs=1",
           "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "tab_capture_end2end_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -13088,6 +14012,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13109,6 +14037,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13130,6 +14062,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13148,6 +14084,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13170,6 +14110,10 @@
           "--gtest_filter=*Detection*",
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13188,6 +14132,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13536,6 +14484,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -13554,6 +14506,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -13573,6 +14529,10 @@
           "--test-launcher-jobs=1",
           "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "tab_capture_end2end_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -13590,6 +14550,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13605,6 +14569,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13620,6 +14588,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13632,6 +14604,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13648,6 +14624,10 @@
           "--gtest_filter=*Detection*",
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13660,6 +14640,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -13966,6 +14950,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -13986,6 +14974,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -14005,6 +14997,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14022,6 +15018,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14039,6 +15039,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14053,6 +15057,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14071,6 +15079,10 @@
           "--gtest_filter=*Detection*",
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14085,6 +15097,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14387,6 +15403,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -14407,6 +15427,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -14426,6 +15450,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14443,6 +15471,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14460,6 +15492,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14474,6 +15510,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14492,6 +15532,10 @@
           "--gtest_filter=*Detection*",
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14506,6 +15550,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14782,6 +15830,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -14802,6 +15854,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -14823,6 +15879,10 @@
           "--test-launcher-jobs=1",
           "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "tab_capture_end2end_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -14842,6 +15902,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14859,6 +15923,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14876,6 +15944,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14890,6 +15962,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14908,6 +15984,10 @@
           "--gtest_filter=*Detection*",
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14922,6 +16002,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15252,6 +16336,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -15272,6 +16360,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -15293,6 +16385,10 @@
           "--test-launcher-jobs=1",
           "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "tab_capture_end2end_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -15312,6 +16408,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15329,6 +16429,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15346,6 +16450,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15360,6 +16468,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15378,6 +16490,10 @@
           "--gtest_filter=*Detection*",
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15392,6 +16508,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15722,6 +16842,10 @@
           "--test-launcher-batch-limit=400",
           "--deqp-egl-display-type=angle-gl"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_egl_gl_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -15743,6 +16867,10 @@
           "--test-launcher-batch-limit=400",
           "--deqp-egl-display-type=angle-gl"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles2_gl_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -15764,6 +16892,10 @@
           "--test-launcher-batch-limit=400",
           "--deqp-egl-display-type=angle-gl"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles3_gl_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -15789,6 +16921,10 @@
           "--test-launcher-batch-limit=400",
           "--deqp-egl-display-type=angle-gl"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_egl_gl_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -15808,6 +16944,10 @@
           "--test-launcher-batch-limit=400",
           "--deqp-egl-display-type=angle-gl"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles2_gl_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -15827,6 +16967,10 @@
           "--test-launcher-batch-limit=400",
           "--deqp-egl-display-type=angle-gl"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles3_gl_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -15850,6 +16994,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -15870,6 +17018,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -15891,6 +17043,10 @@
           "--test-launcher-jobs=1",
           "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "tab_capture_end2end_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -15910,6 +17066,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15927,6 +17087,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15944,6 +17108,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15958,6 +17126,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -16289,6 +17461,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -16307,6 +17483,10 @@
         "args": [
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -16336,6 +17516,10 @@
           "--disable-software-compositing-fallback",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "vulkan_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -16353,6 +17537,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -16366,6 +17554,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -16541,6 +17733,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -16559,6 +17755,10 @@
         "args": [
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -16588,6 +17788,10 @@
           "--disable-software-compositing-fallback",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "vulkan_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -16605,6 +17809,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -16618,6 +17826,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -16832,6 +18044,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -16849,6 +18065,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -16861,6 +18081,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -16877,6 +18101,10 @@
           "--gtest_filter=*Detection*",
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -16889,6 +18117,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -16987,6 +18219,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -17006,6 +18242,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -17020,6 +18260,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -17038,6 +18282,10 @@
           "--gtest_filter=*Detection*",
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -17052,6 +18300,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -17158,6 +18410,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -17177,6 +18433,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -17191,6 +18451,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -17209,6 +18473,10 @@
           "--gtest_filter=*Detection*",
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -17223,6 +18491,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -17301,6 +18573,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -17319,6 +18595,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -17335,6 +18615,10 @@
         "args": [
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -17353,6 +18637,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=passthrough"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gl_tests_passthrough",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -17370,6 +18658,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -17387,6 +18679,10 @@
           "--use-gpu-in-tests",
           "--use-angle=d3d9"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gles2_conform_d3d9_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -17406,6 +18702,10 @@
           "--use-angle=gl",
           "--disable-gpu-sandbox"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gles2_conform_gl_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -17420,6 +18720,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -17433,6 +18737,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -17451,6 +18759,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_d3d9_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -17465,6 +18777,10 @@
         "test": "video_decode_accelerator_unittest"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -17717,6 +19033,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -17744,6 +19064,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -17769,6 +19093,10 @@
         "args": [
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -17796,6 +19124,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=passthrough"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gl_tests_passthrough",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -17822,6 +19154,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -17848,6 +19184,10 @@
           "--use-gpu-in-tests",
           "--use-angle=d3d9"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gles2_conform_d3d9_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -17876,6 +19216,10 @@
           "--use-angle=gl",
           "--disable-gpu-sandbox"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gles2_conform_gl_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -17899,6 +19243,10 @@
         }
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -17921,6 +19269,10 @@
         }
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -17948,6 +19300,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_d3d9_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -17976,6 +19332,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_gl_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -17999,6 +19359,10 @@
         }
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -18416,6 +19780,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -18434,6 +19802,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -18451,6 +19823,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -18468,6 +19844,10 @@
         "args": [
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -18486,6 +19866,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -18503,6 +19887,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=passthrough"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gl_tests_passthrough",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -18520,6 +19908,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -18536,6 +19928,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -18553,6 +19949,10 @@
           "--use-gpu-in-tests",
           "--use-angle=d3d9"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gles2_conform_d3d9_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -18572,6 +19972,10 @@
           "--use-angle=gl",
           "--disable-gpu-sandbox"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gles2_conform_gl_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -18586,6 +19990,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -18599,6 +20007,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -18617,6 +20029,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_d3d11_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -18636,6 +20052,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_d3d9_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -18655,6 +20075,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_gl_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -18669,6 +20093,10 @@
         "test": "video_decode_accelerator_unittest"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -19146,6 +20574,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -19165,6 +20597,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19183,6 +20619,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -19201,6 +20641,10 @@
         "args": [
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -19222,6 +20666,10 @@
           "--test-launcher-jobs=1",
           "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "tab_capture_end2end_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -19241,6 +20689,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19259,6 +20711,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=passthrough"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gl_tests_passthrough",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -19277,6 +20733,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19294,6 +20754,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19312,6 +20776,10 @@
           "--use-gpu-in-tests",
           "--use-angle=d3d9"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gles2_conform_d3d9_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -19332,6 +20800,10 @@
           "--use-angle=gl",
           "--disable-gpu-sandbox"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gles2_conform_gl_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -19347,6 +20819,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19361,6 +20837,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19380,6 +20860,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_d3d11_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -19400,6 +20884,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_d3d9_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -19415,6 +20903,10 @@
         "test": "video_decode_accelerator_unittest"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -19960,6 +21452,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -19979,6 +21475,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19997,6 +21497,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -20015,6 +21519,10 @@
         "args": [
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -20036,6 +21544,10 @@
           "--test-launcher-jobs=1",
           "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "tab_capture_end2end_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -20055,6 +21567,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20073,6 +21589,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=passthrough"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gl_tests_passthrough",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -20091,6 +21611,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20108,6 +21632,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20126,6 +21654,10 @@
           "--use-gpu-in-tests",
           "--use-angle=d3d9"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gles2_conform_d3d9_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -20146,6 +21678,10 @@
           "--use-angle=gl",
           "--disable-gpu-sandbox"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gles2_conform_gl_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -20161,6 +21697,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20175,6 +21715,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20194,6 +21738,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_d3d11_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -20214,6 +21762,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_d3d9_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -20234,6 +21786,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_gl_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -20249,6 +21805,10 @@
         "test": "video_decode_accelerator_unittest"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -20684,6 +22244,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -20702,6 +22266,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20719,6 +22287,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -20736,6 +22308,10 @@
         "args": [
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -20756,6 +22332,10 @@
           "--test-launcher-jobs=1",
           "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "tab_capture_end2end_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -20774,6 +22354,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20791,6 +22375,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=passthrough"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gl_tests_passthrough",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -20808,6 +22396,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20824,6 +22416,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20841,6 +22437,10 @@
           "--use-gpu-in-tests",
           "--use-angle=d3d9"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gles2_conform_d3d9_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -20860,6 +22460,10 @@
           "--use-angle=gl",
           "--disable-gpu-sandbox"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gles2_conform_gl_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -20874,6 +22478,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20887,6 +22495,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -20905,6 +22517,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_d3d11_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -20924,6 +22540,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_d3d9_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -20938,6 +22558,10 @@
         "test": "video_decode_accelerator_unittest"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -21435,6 +23059,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -21454,6 +23082,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21472,6 +23104,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -21490,6 +23126,10 @@
         "args": [
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -21511,6 +23151,10 @@
           "--test-launcher-jobs=1",
           "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "tab_capture_end2end_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -21530,6 +23174,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21548,6 +23196,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=passthrough"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gl_tests_passthrough",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -21566,6 +23218,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21583,6 +23239,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21601,6 +23261,10 @@
           "--use-gpu-in-tests",
           "--use-angle=d3d9"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gles2_conform_d3d9_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -21621,6 +23285,10 @@
           "--use-angle=gl",
           "--disable-gpu-sandbox"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gles2_conform_gl_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -21636,6 +23304,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21650,6 +23322,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -21669,6 +23345,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_d3d11_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -21689,6 +23369,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_d3d9_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -21709,6 +23393,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_gl_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -21724,6 +23412,10 @@
         "test": "video_decode_accelerator_unittest"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -22213,6 +23905,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -22240,6 +23936,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22266,6 +23966,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -22292,6 +23996,10 @@
         "args": [
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -22321,6 +24029,10 @@
           "--test-launcher-jobs=1",
           "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "tab_capture_end2end_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -22348,6 +24060,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22374,6 +24090,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=passthrough"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gl_tests_passthrough",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -22400,6 +24120,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22425,6 +24149,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22451,6 +24179,10 @@
           "--use-gpu-in-tests",
           "--use-angle=d3d9"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gles2_conform_d3d9_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -22479,6 +24211,10 @@
           "--use-angle=gl",
           "--disable-gpu-sandbox"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gles2_conform_gl_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -22502,6 +24238,10 @@
         }
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22524,6 +24264,10 @@
         }
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -22551,6 +24295,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_d3d11_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -22579,6 +24327,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_d3d9_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -22607,6 +24359,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_gl_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -22630,6 +24386,10 @@
         }
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -23337,6 +25097,10 @@
           "--test-launcher-batch-limit=400",
           "--deqp-egl-display-type=angle-d3d11"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles2_d3d11_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -23361,6 +25125,10 @@
           "--test-launcher-batch-limit=400",
           "--deqp-egl-display-type=angle-d3d11"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_egl_d3d11_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -23390,6 +25158,10 @@
           "--test-launcher-batch-limit=400",
           "--deqp-egl-display-type=angle-gl"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_egl_gl_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -23419,6 +25191,10 @@
           "--deqp-egl-display-type=angle-vulkan",
           "--test-launcher-batch-limit=400"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_egl_vulkan_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -23448,6 +25224,10 @@
           "--test-launcher-batch-limit=400",
           "--deqp-egl-display-type=angle-d3d11"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles2_d3d11_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -23477,6 +25257,10 @@
           "--test-launcher-batch-limit=400",
           "--deqp-egl-display-type=angle-gl"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles2_gl_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -23506,6 +25290,10 @@
           "--deqp-egl-display-type=angle-vulkan",
           "--test-launcher-batch-limit=400"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles2_vulkan_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -23535,6 +25323,10 @@
           "--test-launcher-batch-limit=400",
           "--deqp-egl-display-type=angle-d3d11"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles31_d3d11_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -23564,6 +25356,10 @@
           "--test-launcher-batch-limit=400",
           "--deqp-egl-display-type=angle-gl"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles31_gl_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -23593,6 +25389,10 @@
           "--test-launcher-batch-limit=400",
           "--deqp-egl-display-type=angle-d3d11"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles3_d3d11_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -23622,6 +25422,10 @@
           "--test-launcher-batch-limit=400",
           "--deqp-egl-display-type=angle-gl"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles3_gl_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -23651,6 +25455,10 @@
           "--deqp-egl-display-type=angle-vulkan",
           "--test-launcher-batch-limit=400"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles3_vulkan_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -23684,6 +25492,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -23704,6 +25516,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -23722,6 +25538,10 @@
         "args": [
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -23825,6 +25645,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -23844,6 +25668,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -23862,6 +25690,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -23880,6 +25712,10 @@
         "args": [
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -23899,6 +25735,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -23917,6 +25757,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=passthrough"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gl_tests_passthrough",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -23935,6 +25779,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -23952,6 +25800,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -23970,6 +25822,10 @@
           "--use-gpu-in-tests",
           "--use-angle=d3d9"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gles2_conform_d3d9_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -23990,6 +25846,10 @@
           "--use-angle=gl",
           "--disable-gpu-sandbox"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gles2_conform_gl_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -24005,6 +25865,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -24019,6 +25883,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -24038,6 +25906,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_d3d11_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -24058,6 +25930,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_d3d9_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -24078,6 +25954,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_gl_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -24459,6 +26339,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -24478,6 +26362,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -24496,6 +26384,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -24514,6 +26406,10 @@
         "args": [
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -24535,6 +26431,10 @@
           "--test-launcher-jobs=1",
           "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "tab_capture_end2end_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -24554,6 +26454,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -24572,6 +26476,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=passthrough"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gl_tests_passthrough",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -24590,6 +26498,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -24607,6 +26519,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -24625,6 +26541,10 @@
           "--use-gpu-in-tests",
           "--use-angle=d3d9"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gles2_conform_d3d9_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -24645,6 +26565,10 @@
           "--use-angle=gl",
           "--disable-gpu-sandbox"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gles2_conform_gl_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -24660,6 +26584,10 @@
         "test": "gles2_conform_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -24674,6 +26602,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -24693,6 +26625,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_d3d11_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -24713,6 +26649,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_d3d9_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -24733,6 +26673,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_gl_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -25142,6 +27086,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -25170,6 +27118,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -25197,6 +27149,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -25224,6 +27180,10 @@
         "args": [
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -25254,6 +27214,10 @@
           "--test-launcher-jobs=1",
           "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "tab_capture_end2end_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -25282,6 +27246,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -25309,6 +27277,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=passthrough"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gl_tests_passthrough",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -25336,6 +27308,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -25362,6 +27338,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -25389,6 +27369,10 @@
           "--use-gpu-in-tests",
           "--use-angle=d3d9"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gles2_conform_d3d9_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -25418,6 +27402,10 @@
           "--use-angle=gl",
           "--disable-gpu-sandbox"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gles2_conform_gl_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -25442,6 +27430,10 @@
         }
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -25465,6 +27457,10 @@
         }
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -25493,6 +27489,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_d3d11_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -25522,6 +27522,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_d3d9_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -25551,6 +27555,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_gl_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -26130,6 +28138,10 @@
           "--test-launcher-batch-limit=400",
           "--deqp-egl-display-type=angle-d3d11"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles2_d3d11_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -26151,6 +28163,10 @@
           "--deqp-egl-display-type=angle-vulkan",
           "--test-launcher-batch-limit=400"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles2_vulkan_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -26176,6 +28192,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -26204,6 +28224,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26231,6 +28255,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -26258,6 +28286,10 @@
         "args": [
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -26288,6 +28320,10 @@
           "--test-launcher-jobs=1",
           "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "tab_capture_end2end_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -26316,6 +28352,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26343,6 +28383,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=passthrough"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gl_tests_passthrough",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -26370,6 +28414,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26396,6 +28444,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26423,6 +28475,10 @@
           "--use-gpu-in-tests",
           "--use-angle=d3d9"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gles2_conform_d3d9_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -26452,6 +28508,10 @@
           "--use-angle=gl",
           "--disable-gpu-sandbox"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gles2_conform_gl_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -26476,6 +28536,10 @@
         }
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26499,6 +28563,10 @@
         }
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26527,6 +28595,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_d3d11_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -26556,6 +28628,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_d3d9_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -26585,6 +28661,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_gl_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -27164,6 +29244,10 @@
           "--test-launcher-batch-limit=400",
           "--deqp-egl-display-type=angle-d3d11"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_egl_d3d11_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -27194,6 +29278,10 @@
           "--test-launcher-batch-limit=400",
           "--deqp-egl-display-type=angle-gl"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_egl_gl_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -27224,6 +29312,10 @@
           "--deqp-egl-display-type=angle-vulkan",
           "--test-launcher-batch-limit=400"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_egl_vulkan_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -27254,6 +29346,10 @@
           "--test-launcher-batch-limit=400",
           "--deqp-egl-display-type=angle-d3d11"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles2_d3d11_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -27284,6 +29380,10 @@
           "--test-launcher-batch-limit=400",
           "--deqp-egl-display-type=angle-gl"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles2_gl_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -27314,6 +29414,10 @@
           "--deqp-egl-display-type=angle-vulkan",
           "--test-launcher-batch-limit=400"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles2_vulkan_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -27344,6 +29448,10 @@
           "--test-launcher-batch-limit=400",
           "--deqp-egl-display-type=angle-d3d11"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles31_d3d11_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -27374,6 +29482,10 @@
           "--test-launcher-batch-limit=400",
           "--deqp-egl-display-type=angle-gl"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles31_gl_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -27404,6 +29516,10 @@
           "--test-launcher-batch-limit=400",
           "--deqp-egl-display-type=angle-d3d11"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles3_d3d11_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -27434,6 +29550,10 @@
           "--test-launcher-batch-limit=400",
           "--deqp-egl-display-type=angle-gl"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles3_gl_tests",
         "should_retry_with_patch": false,
         "swarming": {
@@ -27464,6 +29584,10 @@
           "--deqp-egl-display-type=angle-vulkan",
           "--test-launcher-batch-limit=400"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "angle_deqp_gles3_vulkan_tests",
         "should_retry_with_patch": false,
         "swarming": {
diff --git a/testing/buildbot/chromium.gpu.json b/testing/buildbot/chromium.gpu.json
index aadd127..c7325c2 100644
--- a/testing/buildbot/chromium.gpu.json
+++ b/testing/buildbot/chromium.gpu.json
@@ -289,6 +289,10 @@
           "--test-launcher-retry-limit=0",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -307,6 +311,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -324,6 +332,10 @@
           "--use-gpu-in-tests",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -616,6 +628,10 @@
           "--test-launcher-retry-limit=0",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -637,6 +653,10 @@
           "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "tab_capture_end2end_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -655,6 +675,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -672,6 +696,10 @@
           "--use-gpu-in-tests",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -965,6 +993,10 @@
           "--no-xvfb"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -987,6 +1019,10 @@
           "--no-xvfb"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "tab_capture_end2end_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1006,6 +1042,10 @@
           "--use-cmd-decoder=validating"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1024,6 +1064,10 @@
           "--no-xvfb"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1325,6 +1369,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1342,6 +1390,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1357,6 +1409,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1637,6 +1693,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1663,6 +1723,10 @@
           "--test-launcher-jobs=1",
           "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "tab_capture_end2end_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1687,6 +1751,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1709,6 +1777,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2066,6 +2138,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2085,6 +2161,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2102,6 +2182,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2404,6 +2488,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2425,6 +2513,10 @@
           "--test-launcher-jobs=1",
           "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "tab_capture_end2end_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2444,6 +2536,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2461,6 +2557,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2763,6 +2863,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2781,6 +2885,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2798,6 +2906,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=passthrough"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gl_tests_passthrough",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2815,6 +2927,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2833,6 +2949,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_d3d11_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2847,6 +2967,10 @@
         "test": "video_decode_accelerator_unittest"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -3139,6 +3263,10 @@
           "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -3168,6 +3296,10 @@
           "--test-launcher-jobs=1",
           "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "tab_capture_end2end_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -3195,6 +3327,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3221,6 +3357,10 @@
           "--use-gpu-in-tests",
           "--use-cmd-decoder=passthrough"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "gl_tests_passthrough",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -3247,6 +3387,10 @@
         "args": [
           "--use-gpu-in-tests"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3274,6 +3418,10 @@
           "--use-test-data-path",
           "--test_video_data=test-25fps.h264:320:240:250:258:::1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "video_decode_accelerator_d3d11_unittest",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -3297,6 +3445,10 @@
         }
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json
index bae00e95..3387438 100644
--- a/testing/buildbot/chromium.linux.json
+++ b/testing/buildbot/chromium.linux.json
@@ -8,6 +8,10 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -19,6 +23,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -30,6 +38,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -41,6 +53,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -52,6 +68,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -63,6 +83,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -75,6 +99,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -86,6 +114,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -97,6 +129,10 @@
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -111,6 +147,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -122,6 +162,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -133,6 +177,10 @@
         "test": "cast_audio_backend_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -144,6 +192,10 @@
         "test": "cast_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -155,6 +207,10 @@
         "test": "cast_crash_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -172,12 +228,20 @@
           "--no-sandbox",
           "--test-launcher-jobs=1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "cast_shell_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -189,6 +253,10 @@
         "test": "cast_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -200,6 +268,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -211,6 +283,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -225,6 +301,10 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/cast-linux.content_browsertests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -241,6 +321,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -253,6 +337,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -264,6 +352,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -275,6 +367,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -286,6 +382,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -297,6 +397,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -308,6 +412,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -319,6 +427,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -330,6 +442,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -341,6 +457,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -352,6 +472,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -363,6 +487,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -374,6 +502,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -385,6 +517,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -396,6 +532,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -407,6 +547,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -418,6 +562,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -429,6 +577,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -440,6 +592,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -451,6 +607,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -462,6 +622,10 @@
         "test": "sandbox_linux_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -473,6 +637,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -484,6 +652,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -495,6 +667,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -506,6 +682,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -517,6 +697,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -528,6 +712,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -539,6 +727,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -550,6 +742,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -569,6 +765,10 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -580,6 +780,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -591,6 +795,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -602,6 +810,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -613,6 +825,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -624,6 +840,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -636,6 +856,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -647,6 +871,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -658,6 +886,10 @@
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -672,6 +904,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -683,6 +919,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -694,6 +934,10 @@
         "test": "cast_audio_backend_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -705,6 +949,10 @@
         "test": "cast_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -716,6 +964,10 @@
         "test": "cast_crash_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -727,6 +979,10 @@
         "test": "cast_graphics_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -744,12 +1000,20 @@
           "--no-sandbox",
           "--test-launcher-jobs=1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
         "test": "cast_shell_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -761,6 +1025,10 @@
         "test": "cast_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -772,6 +1040,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -783,6 +1055,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -797,6 +1073,10 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/cast-linux.content_browsertests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -813,6 +1093,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -825,6 +1109,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -836,6 +1124,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -847,6 +1139,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -858,6 +1154,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -869,6 +1169,10 @@
         "test": "exo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -880,6 +1184,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -891,6 +1199,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -902,6 +1214,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -913,6 +1229,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -924,6 +1244,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -935,6 +1259,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -946,6 +1274,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -957,6 +1289,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -968,6 +1304,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -979,6 +1319,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -990,6 +1334,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1001,6 +1349,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1012,6 +1364,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1023,6 +1379,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1034,6 +1394,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1045,6 +1409,10 @@
         "test": "sandbox_linux_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1056,6 +1424,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1067,6 +1439,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1078,6 +1454,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1089,6 +1469,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1100,6 +1484,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1111,6 +1499,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1122,6 +1514,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1133,6 +1529,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1156,6 +1556,10 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1167,6 +1571,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1178,6 +1586,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1189,6 +1601,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1200,6 +1616,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1211,6 +1631,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1222,6 +1646,10 @@
         "test": "cast_runner_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1236,6 +1664,10 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.content_unittests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1247,6 +1679,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1258,6 +1694,10 @@
         "test": "cr_fuchsia_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1269,6 +1709,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1280,6 +1724,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1291,6 +1739,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1302,6 +1754,10 @@
         "test": "fidlgen_js_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1313,6 +1769,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1324,6 +1784,10 @@
         "test": "http_service_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1335,6 +1799,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1349,6 +1817,10 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.mojo_unittests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1363,6 +1835,10 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.net_unittests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1374,6 +1850,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1385,6 +1865,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1396,6 +1880,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1407,6 +1895,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1421,6 +1913,10 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.ui_base_unittests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1432,6 +1928,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1443,6 +1943,10 @@
         "test": "web_engine_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1454,6 +1958,10 @@
         "test": "web_engine_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1568,6 +2076,10 @@
   "Linux Tests": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1579,6 +2091,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1590,6 +2106,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1601,6 +2121,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1612,6 +2136,10 @@
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1623,6 +2151,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1634,6 +2166,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1645,6 +2181,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1656,6 +2196,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1667,6 +2211,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1679,6 +2227,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1690,6 +2242,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1701,6 +2257,10 @@
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1717,6 +2277,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1729,6 +2293,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1743,6 +2311,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1754,6 +2326,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1765,6 +2341,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1776,6 +2356,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1787,6 +2371,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1798,6 +2386,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1809,6 +2401,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1820,6 +2416,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1831,6 +2431,10 @@
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1847,6 +2451,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1863,6 +2471,10 @@
           "--enable-features=VizDisplayCompositor,UseSkiaRenderer",
           "--gtest_filter=AuraWindowVideoCaptureDeviceBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "skia_renderer_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1875,6 +2487,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1886,6 +2502,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1897,6 +2517,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1908,6 +2532,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1919,6 +2547,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1930,6 +2562,10 @@
         "test": "dbus_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1941,6 +2577,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1952,6 +2592,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1963,6 +2607,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1974,6 +2622,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1985,6 +2637,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1996,6 +2652,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2007,6 +2667,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2018,6 +2682,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2029,6 +2697,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2040,6 +2712,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2051,6 +2727,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2062,6 +2742,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2073,6 +2757,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2085,6 +2773,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2096,6 +2788,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2107,6 +2803,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2118,6 +2818,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2129,6 +2833,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2140,6 +2848,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2151,6 +2863,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2162,6 +2878,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2173,6 +2893,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2184,6 +2908,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2195,6 +2923,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2206,6 +2938,10 @@
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2217,6 +2953,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2228,6 +2968,10 @@
         "test": "nacl_helper_nonsfi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2239,6 +2983,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2250,6 +2998,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2261,6 +3013,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2272,6 +3028,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2283,6 +3043,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2294,6 +3058,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2305,6 +3073,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2316,6 +3088,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2327,6 +3103,10 @@
         "test": "sandbox_linux_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2338,6 +3118,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2349,6 +3133,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2360,6 +3148,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2371,6 +3163,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2382,6 +3178,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2393,6 +3193,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2404,6 +3208,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2415,6 +3223,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2426,6 +3238,10 @@
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2437,6 +3253,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2448,6 +3268,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2459,6 +3283,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2470,6 +3298,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2481,6 +3313,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2492,6 +3328,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2503,6 +3343,10 @@
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2514,6 +3358,10 @@
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2525,6 +3373,10 @@
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2536,6 +3388,10 @@
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2800,6 +3656,10 @@
   "Linux Tests (dbg)(1)": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2811,6 +3671,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2822,6 +3686,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2833,6 +3701,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2844,6 +3716,10 @@
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2855,6 +3731,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2866,6 +3746,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2877,6 +3761,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2888,6 +3776,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2899,6 +3791,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2911,6 +3807,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2922,6 +3822,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2933,6 +3837,10 @@
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2949,6 +3857,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2961,6 +3873,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2975,6 +3891,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2986,6 +3906,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2997,6 +3921,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3008,6 +3936,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3019,6 +3951,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3030,6 +3966,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3041,6 +3981,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3052,6 +3996,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3063,6 +4011,10 @@
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3079,6 +4031,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -3095,6 +4051,10 @@
           "--enable-features=VizDisplayCompositor,UseSkiaRenderer",
           "--gtest_filter=AuraWindowVideoCaptureDeviceBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "skia_renderer_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -3107,6 +4067,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3118,6 +4082,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3129,6 +4097,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3140,6 +4112,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3151,6 +4127,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3162,6 +4142,10 @@
         "test": "dbus_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3173,6 +4157,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3184,6 +4172,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3195,6 +4187,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3206,6 +4202,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3217,6 +4217,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3228,6 +4232,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3239,6 +4247,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3250,6 +4262,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3261,6 +4277,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3272,6 +4292,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3283,6 +4307,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3294,6 +4322,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3305,6 +4337,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3317,6 +4353,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3328,6 +4368,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3339,6 +4383,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3350,6 +4398,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3361,6 +4413,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3372,6 +4428,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3383,6 +4443,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3394,6 +4458,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3405,6 +4473,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3416,6 +4488,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3427,6 +4503,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3438,6 +4518,10 @@
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3449,6 +4533,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3460,6 +4548,10 @@
         "test": "nacl_helper_nonsfi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3471,6 +4563,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3482,6 +4578,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3494,6 +4594,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3505,6 +4609,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3516,6 +4624,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3527,6 +4639,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3538,6 +4654,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3549,6 +4669,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3560,6 +4684,10 @@
         "test": "sandbox_linux_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3571,6 +4699,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3582,6 +4714,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3593,6 +4729,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3604,6 +4744,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3615,6 +4759,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3626,6 +4774,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3637,6 +4789,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3648,6 +4804,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3659,6 +4819,10 @@
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3670,6 +4834,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3681,6 +4849,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3692,6 +4864,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3703,6 +4879,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3714,6 +4894,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3725,6 +4909,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3736,6 +4924,10 @@
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3747,6 +4939,10 @@
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3758,6 +4954,10 @@
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3769,6 +4969,10 @@
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -3991,6 +5195,10 @@
   "Linux Tests (dbg)(1)(32)": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4002,6 +5210,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4013,6 +5225,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4024,6 +5240,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4035,6 +5255,10 @@
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4046,6 +5270,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4057,6 +5285,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4068,6 +5300,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4079,6 +5315,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4090,6 +5330,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -4102,6 +5346,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4113,6 +5361,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4124,6 +5376,10 @@
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4140,6 +5396,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -4152,6 +5412,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4166,6 +5430,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4177,6 +5445,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4188,6 +5460,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4199,6 +5475,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4210,6 +5490,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4221,6 +5505,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4232,6 +5520,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4243,6 +5535,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4254,6 +5550,10 @@
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4270,6 +5570,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -4286,6 +5590,10 @@
           "--enable-features=VizDisplayCompositor,UseSkiaRenderer",
           "--gtest_filter=AuraWindowVideoCaptureDeviceBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "skia_renderer_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -4298,6 +5606,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4309,6 +5621,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4320,6 +5636,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4331,6 +5651,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4342,6 +5666,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4353,6 +5681,10 @@
         "test": "dbus_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4364,6 +5696,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4375,6 +5711,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4386,6 +5726,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4397,6 +5741,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4408,6 +5756,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4419,6 +5771,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4430,6 +5786,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4441,6 +5801,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4452,6 +5816,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4463,6 +5831,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4474,6 +5846,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4485,6 +5861,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4496,6 +5876,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4508,6 +5892,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4519,6 +5907,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4530,6 +5922,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4541,6 +5937,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4552,6 +5952,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4563,6 +5967,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4574,6 +5982,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4585,6 +5997,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4596,6 +6012,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4607,6 +6027,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4618,6 +6042,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4629,6 +6057,10 @@
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4640,6 +6072,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4651,6 +6087,10 @@
         "test": "nacl_helper_nonsfi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4662,6 +6102,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4673,6 +6117,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4685,6 +6133,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4696,6 +6148,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4707,6 +6163,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4718,6 +6178,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4729,6 +6193,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4740,6 +6208,10 @@
         "test": "sandbox_linux_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4751,6 +6223,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4762,6 +6238,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4773,6 +6253,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4784,6 +6268,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4795,6 +6283,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4806,6 +6298,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4817,6 +6313,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4828,6 +6328,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4839,6 +6343,10 @@
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4850,6 +6358,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4861,6 +6373,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4872,6 +6388,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4883,6 +6403,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4894,6 +6418,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4905,6 +6433,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4916,6 +6448,10 @@
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4927,6 +6463,10 @@
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4938,6 +6478,10 @@
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4949,6 +6493,10 @@
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -5105,6 +6653,10 @@
     "gtest_tests": [
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5117,6 +6669,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5129,6 +6685,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5141,6 +6701,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5153,6 +6717,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5165,6 +6733,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5177,6 +6749,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5189,6 +6765,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5201,6 +6781,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5213,6 +6797,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -5226,6 +6814,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5238,6 +6830,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5250,6 +6846,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5267,6 +6867,10 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -5280,6 +6884,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5295,6 +6903,10 @@
           "--gtest_filter=-*UsingRealWebcam*"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5307,6 +6919,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5319,6 +6935,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5331,6 +6951,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5343,6 +6967,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5355,6 +6983,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5367,6 +6999,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5379,6 +7015,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5391,6 +7031,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5408,6 +7052,10 @@
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -5425,6 +7073,10 @@
           "--gtest_filter=AuraWindowVideoCaptureDeviceBrowserTest.*"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "skia_renderer_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -5438,6 +7090,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5450,6 +7106,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5462,6 +7122,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5474,6 +7138,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5486,6 +7154,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5498,6 +7170,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5510,6 +7186,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5522,6 +7202,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5534,6 +7218,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5546,6 +7234,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5558,6 +7250,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5570,6 +7266,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5582,6 +7282,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5594,6 +7298,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5606,6 +7314,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5618,6 +7330,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5630,6 +7346,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5642,6 +7362,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5654,6 +7378,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5667,6 +7395,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5679,6 +7411,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5691,6 +7427,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5703,6 +7443,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5715,6 +7459,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5727,6 +7475,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5739,6 +7491,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5751,6 +7507,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5763,6 +7523,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5775,6 +7539,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5787,6 +7555,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5799,6 +7571,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5811,6 +7587,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5823,6 +7603,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5835,6 +7619,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5847,6 +7635,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5859,6 +7651,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5871,6 +7667,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5883,6 +7683,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5895,6 +7699,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5907,6 +7715,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5919,6 +7731,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5931,6 +7747,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5943,6 +7763,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5955,6 +7779,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5967,6 +7795,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5979,6 +7811,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5991,6 +7827,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6003,6 +7843,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6015,6 +7859,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6027,6 +7875,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6039,6 +7891,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6051,6 +7907,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6063,6 +7923,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6075,6 +7939,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6087,6 +7955,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6099,6 +7971,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6111,6 +7987,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6123,6 +8003,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6135,6 +8019,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6147,6 +8035,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6159,6 +8051,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -6474,6 +8370,10 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6485,6 +8385,10 @@
         "test": "ozone_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6503,6 +8407,10 @@
     ],
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6514,6 +8422,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6525,6 +8437,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6536,6 +8452,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6547,6 +8467,10 @@
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6558,6 +8482,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6569,6 +8497,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6580,6 +8512,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6591,6 +8527,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6602,6 +8542,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -6614,6 +8558,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6625,6 +8573,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6636,6 +8588,10 @@
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6652,6 +8608,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -6664,6 +8624,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6678,6 +8642,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6689,6 +8657,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6700,6 +8672,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6711,6 +8687,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6722,6 +8702,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6733,6 +8717,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6744,6 +8732,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6755,6 +8747,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6766,6 +8762,10 @@
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6782,6 +8782,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -6798,6 +8802,10 @@
           "--enable-features=VizDisplayCompositor,UseSkiaRenderer",
           "--gtest_filter=AuraWindowVideoCaptureDeviceBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "skia_renderer_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -6810,6 +8818,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6821,6 +8833,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6832,6 +8848,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6843,6 +8863,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6854,6 +8878,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6865,6 +8893,10 @@
         "test": "dbus_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6876,6 +8908,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6887,6 +8923,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6898,6 +8938,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6909,6 +8953,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6920,6 +8968,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6931,6 +8983,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6942,6 +8998,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6953,6 +9013,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6964,6 +9028,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6975,6 +9043,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6986,6 +9058,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6997,6 +9073,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7008,6 +9088,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7020,6 +9104,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7031,6 +9119,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7042,6 +9134,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7053,6 +9149,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7064,6 +9164,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7075,6 +9179,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7086,6 +9194,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7097,6 +9209,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7108,6 +9224,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7119,6 +9239,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7130,6 +9254,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7141,6 +9269,10 @@
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7152,6 +9284,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7163,6 +9299,10 @@
         "test": "nacl_helper_nonsfi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7174,6 +9314,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7185,6 +9329,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7196,6 +9344,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7207,6 +9359,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7218,6 +9374,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7229,6 +9389,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7240,6 +9404,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7251,6 +9419,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7262,6 +9434,10 @@
         "test": "sandbox_linux_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7273,6 +9449,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7284,6 +9464,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7295,6 +9479,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7306,6 +9494,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7317,6 +9509,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7328,6 +9524,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7339,6 +9539,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7350,6 +9554,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7361,6 +9569,10 @@
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7372,6 +9584,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7383,6 +9599,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7394,6 +9614,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7405,6 +9629,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7416,6 +9644,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7427,6 +9659,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7438,6 +9674,10 @@
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7449,6 +9689,10 @@
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7460,6 +9704,10 @@
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7471,6 +9719,10 @@
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
diff --git a/testing/buildbot/chromium.mac.json b/testing/buildbot/chromium.mac.json
index a36a25b..0142c6ad 100644
--- a/testing/buildbot/chromium.mac.json
+++ b/testing/buildbot/chromium.mac.json
@@ -14,6 +14,10 @@
   "Mac10.10 Tests": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -26,6 +30,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -38,6 +46,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -50,6 +62,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -62,6 +78,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -74,6 +94,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -86,6 +110,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -98,6 +126,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -110,6 +142,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -123,6 +159,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -135,6 +175,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -151,6 +195,10 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/mac_window_server_killers.browser_tests.filter",
           "--gtest_shuffle"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -168,6 +216,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -181,6 +233,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -196,6 +252,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -208,6 +268,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -220,6 +284,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -232,6 +300,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -244,6 +316,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -256,6 +332,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -268,6 +348,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -280,6 +364,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -297,6 +385,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -310,6 +402,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -322,6 +418,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -334,6 +434,10 @@
         "test": "crashpad_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -346,6 +450,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -358,6 +466,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -370,6 +482,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -382,6 +498,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -394,6 +514,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -406,6 +530,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -418,6 +546,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -430,6 +562,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -442,6 +578,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -454,6 +594,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -466,6 +610,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -478,6 +626,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -490,6 +642,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -502,6 +658,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -514,6 +674,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -526,6 +690,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -539,6 +707,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -551,6 +723,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -563,6 +739,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -575,6 +755,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -587,6 +771,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -599,6 +787,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -611,6 +803,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -623,6 +819,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -635,6 +835,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -647,6 +851,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -659,6 +867,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -671,6 +883,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -683,6 +899,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -695,6 +915,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -707,6 +931,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -719,6 +947,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -731,6 +963,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -743,6 +979,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -755,6 +995,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -767,6 +1011,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -779,6 +1027,10 @@
         "test": "sandbox_mac_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -791,6 +1043,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -803,6 +1059,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -815,6 +1075,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -827,6 +1091,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -839,6 +1107,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -851,6 +1123,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -863,6 +1139,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -875,6 +1155,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -887,6 +1171,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -899,6 +1187,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -911,6 +1203,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -923,6 +1219,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -935,6 +1235,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -947,6 +1251,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1128,6 +1436,10 @@
   "Mac10.11 Tests": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1140,6 +1452,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1152,6 +1468,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1164,6 +1484,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1176,6 +1500,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1188,6 +1516,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1200,6 +1532,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1212,6 +1548,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1224,6 +1564,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1237,6 +1581,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1249,6 +1597,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1265,6 +1617,10 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/mac_window_server_killers.browser_tests.filter",
           "--gtest_shuffle"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1282,6 +1638,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1295,6 +1655,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1310,6 +1674,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1322,6 +1690,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1334,6 +1706,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1346,6 +1722,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1358,6 +1738,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1370,6 +1754,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1382,6 +1770,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1394,6 +1786,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1411,6 +1807,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1424,6 +1824,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1436,6 +1840,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1448,6 +1856,10 @@
         "test": "crashpad_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1460,6 +1872,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1472,6 +1888,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1484,6 +1904,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1496,6 +1920,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1508,6 +1936,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1520,6 +1952,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1532,6 +1968,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1544,6 +1984,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1556,6 +2000,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1568,6 +2016,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1580,6 +2032,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1592,6 +2048,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1604,6 +2064,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1616,6 +2080,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1628,6 +2096,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1640,6 +2112,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1653,6 +2129,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1665,6 +2145,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1677,6 +2161,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1689,6 +2177,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1701,6 +2193,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1713,6 +2209,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1725,6 +2225,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1737,6 +2241,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1749,6 +2257,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1761,6 +2273,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1773,6 +2289,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1785,6 +2305,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1797,6 +2321,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1809,6 +2337,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1821,6 +2353,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1833,6 +2369,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1845,6 +2385,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1857,6 +2401,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1869,6 +2417,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1881,6 +2433,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1893,6 +2449,10 @@
         "test": "sandbox_mac_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1905,6 +2465,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1917,6 +2481,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1929,6 +2497,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1941,6 +2513,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1953,6 +2529,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1965,6 +2545,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1977,6 +2561,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1989,6 +2577,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2001,6 +2593,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2013,6 +2609,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2025,6 +2625,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2037,6 +2641,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2049,6 +2657,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2061,6 +2673,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2242,6 +2858,10 @@
   "Mac10.12 Tests": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2254,6 +2874,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2266,6 +2890,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2278,6 +2906,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2290,6 +2922,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2302,6 +2938,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2314,6 +2954,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2326,6 +2970,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2338,6 +2986,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2351,6 +3003,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2363,6 +3019,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2379,6 +3039,10 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/mac_window_server_killers.browser_tests.filter",
           "--gtest_shuffle"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2396,6 +3060,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2409,6 +3077,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2424,6 +3096,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2436,6 +3112,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2448,6 +3128,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2460,6 +3144,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2472,6 +3160,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2484,6 +3176,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2496,6 +3192,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2508,6 +3208,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2525,6 +3229,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2538,6 +3246,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2550,6 +3262,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2562,6 +3278,10 @@
         "test": "crashpad_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2574,6 +3294,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2586,6 +3310,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2598,6 +3326,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2610,6 +3342,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2622,6 +3358,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2634,6 +3374,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2646,6 +3390,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2658,6 +3406,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2670,6 +3422,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2682,6 +3438,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2694,6 +3454,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2706,6 +3470,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2718,6 +3486,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2730,6 +3502,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2742,6 +3518,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2754,6 +3534,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2767,6 +3551,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2779,6 +3567,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2791,6 +3583,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2803,6 +3599,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2815,6 +3615,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2827,6 +3631,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2839,6 +3647,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2851,6 +3663,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2863,6 +3679,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2875,6 +3695,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2887,6 +3711,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2899,6 +3727,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2911,6 +3743,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2923,6 +3759,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2935,6 +3775,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2947,6 +3791,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2959,6 +3807,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2971,6 +3823,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2983,6 +3839,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2995,6 +3855,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3007,6 +3871,10 @@
         "test": "sandbox_mac_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3019,6 +3887,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3031,6 +3903,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3043,6 +3919,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3055,6 +3935,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3067,6 +3951,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3079,6 +3967,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3091,6 +3983,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3103,6 +3999,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3115,6 +4015,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3127,6 +4031,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3139,6 +4047,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3151,6 +4063,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3163,6 +4079,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3175,6 +4095,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3393,6 +4317,10 @@
   "Mac10.13 Tests": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3405,6 +4333,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3417,6 +4349,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3429,6 +4365,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3441,6 +4381,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3453,6 +4397,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3465,6 +4413,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3477,6 +4429,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3489,6 +4445,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -3502,6 +4462,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3514,6 +4478,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3530,6 +4498,10 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/mac_window_server_killers.browser_tests.filter",
           "--gtest_shuffle"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3547,6 +4519,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -3560,6 +4536,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3575,6 +4555,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3587,6 +4571,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3599,6 +4587,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3611,6 +4603,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3623,6 +4619,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3635,6 +4635,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3647,6 +4651,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3659,6 +4667,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3676,6 +4688,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -3689,6 +4705,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3701,6 +4721,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3713,6 +4737,10 @@
         "test": "crashpad_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3725,6 +4753,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3737,6 +4769,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3749,6 +4785,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3761,6 +4801,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3773,6 +4817,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3785,6 +4833,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3797,6 +4849,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3809,6 +4865,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3821,6 +4881,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3833,6 +4897,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3845,6 +4913,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3857,6 +4929,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3869,6 +4945,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3881,6 +4961,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3893,6 +4977,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3905,6 +4993,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3918,6 +5010,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3930,6 +5026,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3942,6 +5042,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3954,6 +5058,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3966,6 +5074,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3978,6 +5090,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3990,6 +5106,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4002,6 +5122,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4014,6 +5138,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4026,6 +5154,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4038,6 +5170,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4050,6 +5186,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4062,6 +5202,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4074,6 +5218,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4086,6 +5234,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4098,6 +5250,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4110,6 +5266,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4122,6 +5282,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4134,6 +5298,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4146,6 +5314,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4158,6 +5330,10 @@
         "test": "sandbox_mac_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4170,6 +5346,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4182,6 +5362,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4194,6 +5378,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4206,6 +5394,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4218,6 +5410,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4230,6 +5426,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4242,6 +5442,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4254,6 +5458,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4266,6 +5474,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4278,6 +5490,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4290,6 +5506,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4302,6 +5522,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4314,6 +5538,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4326,6 +5554,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4538,6 +5770,10 @@
   "Mac10.13 Tests (dbg)": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4550,6 +5786,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4562,6 +5802,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4574,6 +5818,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4586,6 +5834,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4598,6 +5850,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4610,6 +5866,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4622,6 +5882,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4634,6 +5898,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -4647,6 +5915,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4659,6 +5931,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4675,6 +5951,10 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/mac_window_server_killers.browser_tests.filter",
           "--gtest_shuffle"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4692,6 +5972,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -4705,6 +5989,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4720,6 +6008,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4732,6 +6024,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4744,6 +6040,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4756,6 +6056,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4768,6 +6072,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4780,6 +6088,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4792,6 +6104,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4804,6 +6120,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4821,6 +6141,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -4834,6 +6158,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4846,6 +6174,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4858,6 +6190,10 @@
         "test": "crashpad_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4870,6 +6206,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4882,6 +6222,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4894,6 +6238,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4906,6 +6254,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4918,6 +6270,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4930,6 +6286,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4942,6 +6302,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4954,6 +6318,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4966,6 +6334,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4978,6 +6350,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4990,6 +6366,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5002,6 +6382,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5014,6 +6398,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5026,6 +6414,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5038,6 +6430,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5050,6 +6446,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5063,6 +6463,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5075,6 +6479,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5087,6 +6495,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5099,6 +6511,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5111,6 +6527,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5123,6 +6543,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5135,6 +6559,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5147,6 +6575,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5159,6 +6591,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5171,6 +6607,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5183,6 +6623,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5195,6 +6639,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5207,6 +6655,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5219,6 +6671,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5231,6 +6687,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5243,6 +6703,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5255,6 +6719,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5267,6 +6735,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5279,6 +6751,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5291,6 +6767,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5303,6 +6783,10 @@
         "test": "sandbox_mac_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5315,6 +6799,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5327,6 +6815,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5339,6 +6831,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5351,6 +6847,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5363,6 +6863,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5375,6 +6879,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5387,6 +6895,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5399,6 +6911,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5411,6 +6927,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5423,6 +6943,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5435,6 +6959,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5447,6 +6975,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5459,6 +6991,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5471,6 +7007,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5677,6 +7217,10 @@
   "mac-dummy-rel": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5689,6 +7233,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5701,6 +7249,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5713,6 +7265,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5725,6 +7281,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5737,6 +7297,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5749,6 +7313,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5761,6 +7329,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5773,6 +7345,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -5786,6 +7362,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5798,6 +7378,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5814,6 +7398,10 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/mac_window_server_killers.browser_tests.filter",
           "--gtest_shuffle"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5831,6 +7419,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -5844,6 +7436,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5859,6 +7455,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5871,6 +7471,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5883,6 +7487,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5895,6 +7503,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5907,6 +7519,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5919,6 +7535,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5931,6 +7551,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5943,6 +7567,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5960,6 +7588,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -5973,6 +7605,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5985,6 +7621,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5997,6 +7637,10 @@
         "test": "crashpad_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6009,6 +7653,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6021,6 +7669,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6033,6 +7685,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6045,6 +7701,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6057,6 +7717,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6069,6 +7733,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6081,6 +7749,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6093,6 +7765,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6105,6 +7781,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6117,6 +7797,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6129,6 +7813,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6141,6 +7829,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6153,6 +7845,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6165,6 +7861,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6177,6 +7877,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6189,6 +7893,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6202,6 +7910,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6214,6 +7926,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6226,6 +7942,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6238,6 +7958,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6250,6 +7974,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6262,6 +7990,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6274,6 +8006,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6286,6 +8022,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6298,6 +8038,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6310,6 +8054,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6322,6 +8070,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6334,6 +8086,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6346,6 +8102,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6358,6 +8118,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6370,6 +8134,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6382,6 +8150,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6394,6 +8166,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6406,6 +8182,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6418,6 +8198,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6430,6 +8214,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6442,6 +8230,10 @@
         "test": "sandbox_mac_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6454,6 +8246,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6466,6 +8262,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6478,6 +8278,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6490,6 +8294,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6502,6 +8310,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6514,6 +8326,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6526,6 +8342,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6538,6 +8358,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6550,6 +8374,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6562,6 +8390,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6574,6 +8406,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6586,6 +8422,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6598,6 +8438,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6610,6 +8454,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json
index 1ee2b6f..7fba115 100644
--- a/testing/buildbot/chromium.memory.json
+++ b/testing/buildbot/chromium.memory.json
@@ -2651,6 +2651,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2665,6 +2669,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2680,6 +2688,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2694,6 +2706,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2708,6 +2724,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2722,6 +2742,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2736,6 +2760,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2750,6 +2778,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2764,6 +2796,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2778,6 +2814,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2794,6 +2834,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2808,6 +2852,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2822,6 +2870,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2839,6 +2891,10 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2854,6 +2910,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2869,6 +2929,10 @@
           "--gtest_filter=-*UsingRealWebcam*",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2883,6 +2947,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2897,6 +2965,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2911,6 +2983,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2925,6 +3001,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2939,6 +3019,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2953,6 +3037,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2968,6 +3056,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2982,6 +3074,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2999,6 +3095,10 @@
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -3014,6 +3114,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3029,6 +3133,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3043,6 +3151,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3057,6 +3169,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3071,6 +3187,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3085,6 +3205,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3099,6 +3223,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3113,6 +3241,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3127,6 +3259,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3141,6 +3277,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3155,6 +3295,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3169,6 +3313,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3183,6 +3331,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3199,6 +3351,10 @@
           "--use-gpu-in-tests",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3216,6 +3372,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3230,6 +3390,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3244,6 +3408,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3258,6 +3426,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3272,6 +3444,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3286,6 +3462,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3301,6 +3481,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3315,6 +3499,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3329,6 +3517,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3343,6 +3535,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3357,6 +3553,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3371,6 +3571,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3385,6 +3589,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3399,6 +3607,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3413,6 +3625,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3427,6 +3643,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3441,6 +3661,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3455,6 +3679,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3469,6 +3697,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3483,6 +3715,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3497,6 +3733,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3511,6 +3751,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3526,6 +3770,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3540,6 +3788,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3554,6 +3806,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3568,6 +3824,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3582,6 +3842,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3596,6 +3860,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3610,6 +3878,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3624,6 +3896,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3638,6 +3914,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3652,6 +3932,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3666,6 +3950,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3680,6 +3968,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3694,6 +3986,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3708,6 +4004,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3722,6 +4022,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3736,6 +4040,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3750,6 +4058,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3764,6 +4076,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3779,6 +4095,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3793,6 +4113,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3807,6 +4131,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3821,6 +4149,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3835,6 +4167,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3849,6 +4185,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3863,6 +4203,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3881,6 +4225,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3896,6 +4244,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3910,6 +4262,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3925,6 +4281,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3941,6 +4301,10 @@
   "Linux CFI": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3952,6 +4316,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3963,6 +4331,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3974,6 +4346,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3985,6 +4361,10 @@
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3996,6 +4376,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4007,6 +4391,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4018,6 +4406,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4029,6 +4421,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4040,6 +4436,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -4052,6 +4452,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4063,6 +4467,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4074,6 +4482,10 @@
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4090,6 +4502,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -4102,6 +4518,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4116,6 +4536,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4127,6 +4551,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4138,6 +4566,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4149,6 +4581,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4160,6 +4596,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4171,6 +4611,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4182,6 +4626,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4193,6 +4641,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4204,6 +4656,10 @@
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4220,6 +4676,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -4232,6 +4692,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4243,6 +4707,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4254,6 +4722,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4265,6 +4737,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4276,6 +4752,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4287,6 +4767,10 @@
         "test": "dbus_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4298,6 +4782,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4309,6 +4797,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4320,6 +4812,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4331,6 +4827,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4342,6 +4842,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4353,6 +4857,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4364,6 +4872,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4375,6 +4887,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4390,6 +4906,10 @@
           "--use-gpu-in-tests",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4408,6 +4928,10 @@
           "--use-gpu-in-tests",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4422,6 +4946,10 @@
         "use_xvfb": false
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4433,6 +4961,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4444,6 +4976,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4455,6 +4991,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4466,6 +5006,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4478,6 +5022,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4489,6 +5037,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4500,6 +5052,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4511,6 +5067,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4522,6 +5082,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4533,6 +5097,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4544,6 +5112,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4555,6 +5127,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4566,6 +5142,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4577,6 +5157,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4588,6 +5172,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4599,6 +5187,10 @@
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4610,6 +5202,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4621,6 +5217,10 @@
         "test": "nacl_helper_nonsfi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4632,6 +5232,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4643,6 +5247,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4654,6 +5262,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4665,6 +5277,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4676,6 +5292,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4687,6 +5307,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4698,6 +5322,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4709,6 +5337,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4720,6 +5352,10 @@
         "test": "sandbox_linux_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4731,6 +5367,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4742,6 +5382,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4753,6 +5397,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4764,6 +5412,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4775,6 +5427,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4786,6 +5442,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4797,6 +5457,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4808,6 +5472,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4819,6 +5487,10 @@
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4830,6 +5502,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4841,6 +5517,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4852,6 +5532,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4863,6 +5547,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4874,6 +5562,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4885,6 +5577,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4896,6 +5592,10 @@
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4907,6 +5607,10 @@
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4918,6 +5622,10 @@
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4936,6 +5644,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4950,6 +5662,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4964,6 +5680,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4978,6 +5698,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4992,6 +5716,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5006,6 +5734,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5020,6 +5752,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5034,6 +5770,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5048,6 +5788,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5062,6 +5806,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5076,6 +5824,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5090,6 +5842,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -5105,6 +5861,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5119,6 +5879,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5133,6 +5897,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5149,6 +5917,10 @@
           "--enable-features=VizDisplayCompositor",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "viz_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -5167,6 +5939,10 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -5182,6 +5958,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5197,6 +5977,10 @@
           "--gtest_filter=-*UsingRealWebcam*",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5211,6 +5995,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5225,6 +6013,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5239,6 +6031,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5253,6 +6049,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5267,6 +6067,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5281,6 +6085,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5295,6 +6103,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5309,6 +6121,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5324,6 +6140,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5338,6 +6158,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5355,6 +6179,10 @@
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -5371,6 +6199,10 @@
           "--enable-features=VizDisplayCompositor",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "viz_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -5387,6 +6219,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5402,6 +6238,10 @@
           "--enable-features=VizDisplayCompositor",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "viz_content_unittests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -5417,6 +6257,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5431,6 +6275,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5445,6 +6293,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5459,6 +6311,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5473,6 +6329,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5487,6 +6347,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5501,6 +6365,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5515,6 +6383,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5529,6 +6401,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5543,6 +6419,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5557,6 +6437,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5571,6 +6455,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5585,6 +6473,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5599,6 +6491,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5613,6 +6509,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5628,6 +6528,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5642,6 +6546,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5656,6 +6564,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5670,6 +6582,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5684,6 +6600,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5698,6 +6618,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5712,6 +6636,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5726,6 +6654,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5740,6 +6672,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5754,6 +6690,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5768,6 +6708,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5782,6 +6726,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5796,6 +6744,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5810,6 +6762,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5824,6 +6780,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5838,6 +6798,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5852,6 +6816,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5868,6 +6836,10 @@
           "--ozone-platform=headless",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5882,6 +6854,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5896,6 +6872,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5910,6 +6890,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5924,6 +6908,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5938,6 +6926,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5952,6 +6944,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5966,6 +6962,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5980,6 +6980,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5994,6 +6998,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6008,6 +7016,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6022,6 +7034,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6036,6 +7052,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6050,6 +7070,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6064,6 +7088,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6078,6 +7106,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6092,6 +7124,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6106,6 +7142,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6120,6 +7160,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6134,6 +7178,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6148,6 +7196,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6162,6 +7214,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6177,6 +7233,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6192,6 +7252,10 @@
           "--test-launcher-print-test-stdio=always"
         ],
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6206,6 +7270,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6220,6 +7288,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6234,6 +7306,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6248,6 +7324,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6262,6 +7342,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6280,6 +7364,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6295,6 +7383,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6310,6 +7402,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6325,6 +7421,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6340,6 +7440,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6355,6 +7459,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6370,6 +7478,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6385,6 +7497,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6400,6 +7516,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6415,6 +7535,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6430,6 +7554,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6445,6 +7573,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -6461,6 +7593,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6476,6 +7612,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6491,6 +7631,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6508,6 +7652,10 @@
           "--enable-features=VizDisplayCompositor",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "viz_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -6527,6 +7675,10 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -6543,6 +7695,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6559,6 +7715,10 @@
           "--gtest_filter=-*UsingRealWebcam*",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6574,6 +7734,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6589,6 +7753,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6604,6 +7772,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6619,6 +7791,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6634,6 +7810,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6649,6 +7829,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6664,6 +7848,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6679,6 +7867,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6694,6 +7886,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6709,6 +7905,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6727,6 +7927,10 @@
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -6744,6 +7948,10 @@
           "--enable-features=VizDisplayCompositor",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "viz_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -6761,6 +7969,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6778,6 +7990,10 @@
           "--enable-features=VizDisplayCompositor",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "viz_content_unittests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -6794,6 +8010,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6809,6 +8029,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6824,6 +8048,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6839,6 +8067,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6854,6 +8086,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6869,6 +8105,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6884,6 +8124,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6899,6 +8143,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6914,6 +8162,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6929,6 +8181,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6944,6 +8200,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6959,6 +8219,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6974,6 +8238,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -6989,6 +8257,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7004,6 +8276,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7020,6 +8296,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7035,6 +8315,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7050,6 +8334,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7065,6 +8353,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7080,6 +8372,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7095,6 +8391,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7110,6 +8410,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7125,6 +8429,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7140,6 +8448,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7155,6 +8467,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7170,6 +8486,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7185,6 +8505,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7200,6 +8524,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7215,6 +8543,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7230,6 +8562,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7245,6 +8581,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7260,6 +8600,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7277,6 +8621,10 @@
           "--ozone-platform=headless",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7292,6 +8640,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7307,6 +8659,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7322,6 +8678,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7337,6 +8697,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7352,6 +8716,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7367,6 +8735,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7382,6 +8754,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7397,6 +8773,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7412,6 +8792,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7427,6 +8811,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7442,6 +8830,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7457,6 +8849,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7472,6 +8868,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7487,6 +8887,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7502,6 +8906,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7517,6 +8925,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7532,6 +8944,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7547,6 +8963,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7562,6 +8982,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7577,6 +9001,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7593,6 +9021,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7609,6 +9041,10 @@
           "--test-launcher-print-test-stdio=always"
         ],
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7624,6 +9060,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7639,6 +9079,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7654,6 +9098,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7669,6 +9117,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7684,6 +9136,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7703,6 +9159,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7718,6 +9178,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7733,6 +9197,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7748,6 +9216,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7763,6 +9235,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7778,6 +9254,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7793,6 +9273,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7808,6 +9292,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7823,6 +9311,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7838,6 +9330,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -7854,6 +9350,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7869,6 +9369,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7884,6 +9388,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7902,6 +9410,10 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -7918,6 +9430,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7934,6 +9450,10 @@
           "--gtest_filter=-*UsingRealWebcam*",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7949,6 +9469,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7964,6 +9488,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7979,6 +9507,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7994,6 +9526,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8009,6 +9545,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8024,6 +9564,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8039,6 +9583,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8054,6 +9602,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8072,6 +9624,10 @@
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -8088,6 +9644,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8103,6 +9663,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8118,6 +9682,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8133,6 +9701,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8148,6 +9720,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8163,6 +9739,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8178,6 +9758,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8193,6 +9777,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8208,6 +9796,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8223,6 +9815,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8238,6 +9834,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8253,6 +9853,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8268,6 +9872,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8283,6 +9891,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8298,6 +9910,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8313,6 +9929,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8328,6 +9948,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8343,6 +9967,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8358,6 +9986,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8373,6 +10005,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8389,6 +10025,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8404,6 +10044,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8419,6 +10063,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8434,6 +10082,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8449,6 +10101,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8464,6 +10120,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8479,6 +10139,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8494,6 +10158,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8509,6 +10177,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8524,6 +10196,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8539,6 +10215,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8554,6 +10234,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8569,6 +10253,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8584,6 +10272,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8599,6 +10291,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8614,6 +10310,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8629,6 +10329,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8644,6 +10348,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8659,6 +10367,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8674,6 +10386,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8689,6 +10405,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8704,6 +10424,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8719,6 +10443,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8734,6 +10462,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8749,6 +10481,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8764,6 +10500,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8779,6 +10519,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8794,6 +10538,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8809,6 +10557,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8824,6 +10576,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8839,6 +10595,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8854,6 +10614,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8869,6 +10633,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8884,6 +10652,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8899,6 +10671,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8914,6 +10690,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8929,6 +10709,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8944,6 +10728,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8959,6 +10747,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8974,6 +10766,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -8993,6 +10789,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9007,6 +10807,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9021,6 +10825,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9035,6 +10843,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9049,6 +10861,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9063,6 +10879,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9077,6 +10897,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9091,6 +10915,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9105,6 +10933,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9119,6 +10951,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -9134,6 +10970,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9148,6 +10988,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9164,6 +11008,10 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -9179,6 +11027,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9194,6 +11046,10 @@
           "--gtest_filter=-*UsingRealWebcam*",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9208,6 +11064,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9222,6 +11082,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9236,6 +11100,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9250,6 +11118,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9264,6 +11136,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9278,6 +11154,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9292,6 +11172,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9306,6 +11190,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9323,6 +11211,10 @@
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -9338,6 +11230,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9352,6 +11248,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9366,6 +11266,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9380,6 +11284,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9394,6 +11302,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9408,6 +11320,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9422,6 +11338,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9436,6 +11356,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9450,6 +11374,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9464,6 +11392,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9478,6 +11410,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9492,6 +11428,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9506,6 +11446,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9520,6 +11464,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9536,6 +11484,10 @@
           "--use-gpu-in-tests",
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9553,6 +11505,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9567,6 +11523,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9581,6 +11541,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9595,6 +11559,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9609,6 +11577,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9623,6 +11595,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9638,6 +11614,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9652,6 +11632,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9666,6 +11650,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9680,6 +11668,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9694,6 +11686,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9708,6 +11704,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9722,6 +11722,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9736,6 +11740,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9750,6 +11758,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9764,6 +11776,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9778,6 +11794,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9792,6 +11812,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9806,6 +11830,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9820,6 +11848,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9835,6 +11867,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9849,6 +11885,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9863,6 +11903,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9877,6 +11921,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9891,6 +11939,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9905,6 +11957,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9919,6 +11975,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9933,6 +11993,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9947,6 +12011,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9961,6 +12029,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9975,6 +12047,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -9989,6 +12065,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10003,6 +12083,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10017,6 +12101,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10032,6 +12120,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10046,6 +12138,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10060,6 +12156,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10074,6 +12174,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10089,6 +12193,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10103,6 +12211,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10117,6 +12229,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10131,6 +12247,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10145,6 +12265,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10159,6 +12283,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10173,6 +12301,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10191,6 +12323,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10200,6 +12336,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10209,6 +12349,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10218,6 +12362,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10227,6 +12375,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10236,6 +12388,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10245,6 +12401,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10254,6 +12414,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10263,6 +12427,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -10273,6 +12441,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10282,6 +12454,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10293,6 +12469,10 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/mac_window_server_killers.browser_tests.filter",
           "--gtest_shuffle"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 20
@@ -10305,6 +12485,10 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -10315,6 +12499,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10325,6 +12513,10 @@
           "--gtest_filter=-*UsingRealWebcam*",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10334,6 +12526,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10343,6 +12539,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10352,6 +12552,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10361,6 +12565,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10370,6 +12578,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10379,6 +12591,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10388,6 +12604,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 6
@@ -10400,6 +12620,10 @@
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -10410,6 +12634,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10419,6 +12647,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10428,6 +12660,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10437,6 +12673,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10446,6 +12686,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10455,6 +12699,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10464,6 +12712,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10473,6 +12725,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10482,6 +12738,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10491,6 +12751,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10500,6 +12764,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10509,6 +12777,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10518,6 +12790,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10527,6 +12803,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10536,6 +12816,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10545,6 +12829,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10554,6 +12842,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10563,6 +12855,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10572,6 +12868,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 3
@@ -10582,6 +12882,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10591,6 +12895,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10600,6 +12908,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10609,6 +12921,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10618,6 +12934,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10627,6 +12947,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10636,6 +12960,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10645,6 +12973,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10654,6 +12986,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10663,6 +12999,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10672,6 +13012,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10681,6 +13025,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10690,6 +13038,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10699,6 +13051,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10708,6 +13064,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10717,6 +13077,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10726,6 +13090,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10735,6 +13103,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10744,6 +13116,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10753,6 +13129,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10762,6 +13142,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10771,6 +13155,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10780,6 +13168,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10789,6 +13181,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10798,6 +13194,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10807,6 +13207,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10816,6 +13220,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10825,6 +13233,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10834,6 +13246,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10843,6 +13259,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10852,6 +13272,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10861,6 +13285,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10870,6 +13298,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10879,6 +13311,10 @@
         "args": [
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -10988,6 +13424,10 @@
   "win-asan": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -10999,6 +13439,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11010,6 +13454,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11021,6 +13469,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11032,6 +13484,10 @@
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11043,6 +13499,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11054,6 +13514,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11065,6 +13529,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11076,6 +13544,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11087,6 +13559,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -11099,6 +13575,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11110,6 +13590,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11121,6 +13605,10 @@
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11137,6 +13625,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -11149,6 +13641,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11163,6 +13659,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11174,6 +13674,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11185,6 +13689,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11196,6 +13704,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11207,6 +13719,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11218,6 +13734,10 @@
         "test": "chrome_cleaner_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11229,6 +13749,10 @@
         "test": "chrome_elf_import_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11240,6 +13764,10 @@
         "test": "chrome_elf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11251,6 +13779,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11262,6 +13794,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11273,6 +13809,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11284,6 +13824,10 @@
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11300,6 +13844,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -11312,6 +13860,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11323,6 +13875,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11334,6 +13890,10 @@
         "test": "courgette_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11345,6 +13905,10 @@
         "test": "crashpad_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11356,6 +13920,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11367,6 +13935,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11378,6 +13950,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11389,6 +13965,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11400,6 +13980,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11411,6 +13995,10 @@
         "test": "elevation_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11422,6 +14010,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11433,6 +14025,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11444,6 +14040,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11455,6 +14055,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11466,6 +14070,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11477,6 +14085,10 @@
         "test": "gcp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11488,6 +14100,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11499,6 +14115,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11510,6 +14130,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11521,6 +14145,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11532,6 +14160,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11543,6 +14175,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11554,6 +14190,10 @@
         "test": "install_static_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11566,6 +14206,10 @@
         "test": "installer_util_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11578,6 +14222,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11589,6 +14237,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11600,6 +14252,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11611,6 +14267,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11622,6 +14282,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11633,6 +14297,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11644,6 +14312,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11655,6 +14327,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11666,6 +14342,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11677,6 +14357,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11688,6 +14372,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11699,6 +14387,10 @@
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11710,6 +14402,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11721,6 +14417,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11732,6 +14432,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11743,6 +14447,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11754,6 +14462,10 @@
         "test": "notification_helper_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11765,6 +14477,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11776,6 +14492,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11787,6 +14507,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11798,6 +14522,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11809,6 +14537,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11821,6 +14553,10 @@
         "test": "sbox_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11832,6 +14568,10 @@
         "test": "sbox_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11843,6 +14583,10 @@
         "test": "sbox_validation_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11854,6 +14598,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11865,6 +14613,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11877,6 +14629,10 @@
         "test": "setup_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11888,6 +14644,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11899,6 +14659,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11910,6 +14674,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11921,6 +14689,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11932,6 +14704,10 @@
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11943,6 +14719,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11954,6 +14734,10 @@
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11965,6 +14749,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11976,6 +14764,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11987,6 +14779,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11998,6 +14794,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12009,6 +14809,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12020,6 +14824,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12031,6 +14839,10 @@
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12042,6 +14854,10 @@
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12053,6 +14869,10 @@
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12064,6 +14884,10 @@
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
diff --git a/testing/buildbot/chromium.swarm.json b/testing/buildbot/chromium.swarm.json
index 4952cd4..a86ea63 100644
--- a/testing/buildbot/chromium.swarm.json
+++ b/testing/buildbot/chromium.swarm.json
@@ -686,6 +686,10 @@
   "Linux Swarm": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -698,6 +702,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -711,6 +719,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -723,6 +735,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -735,6 +751,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -747,6 +767,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -759,6 +783,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -775,12 +803,20 @@
   "Mac Swarm": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 2
@@ -788,30 +824,50 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -822,12 +878,20 @@
   "Windows Swarm": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 2
@@ -835,30 +899,50 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
diff --git a/testing/buildbot/chromium.webrtc.fyi.json b/testing/buildbot/chromium.webrtc.fyi.json
index 28d934b..7414f2c 100644
--- a/testing/buildbot/chromium.webrtc.fyi.json
+++ b/testing/buildbot/chromium.webrtc.fyi.json
@@ -19,6 +19,10 @@
         "args": [
           "--gtest_filter=WebRtc*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -39,6 +43,10 @@
         "args": [
           "--gtest_filter=WebRtc*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -79,6 +87,10 @@
           "--run-manual",
           "--test-launcher-jobs=1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "browser_tests_functional",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -97,6 +109,10 @@
           "--run-manual",
           "--test-launcher-jobs=1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -112,6 +128,10 @@
         "args": [
           "--gtest_filter=WebRtc*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -129,6 +149,10 @@
           "--run-manual",
           "--ui-test-action-max-timeout=120000"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "content_browsertests_stress",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -145,6 +169,10 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/webrtc.content_unittests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -157,6 +185,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -172,6 +204,10 @@
         "args": [
           "--gtest_filter=Webrtc*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -211,6 +247,10 @@
           "--run-manual",
           "--test-launcher-jobs=1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "browser_tests_functional",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -229,6 +269,10 @@
           "--run-manual",
           "--test-launcher-jobs=1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -244,6 +288,10 @@
         "args": [
           "--gtest_filter=WebRtc*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -261,6 +309,10 @@
           "--run-manual",
           "--ui-test-action-max-timeout=120000"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "content_browsertests_stress",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -277,6 +329,10 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/webrtc.content_unittests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -289,6 +345,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -304,6 +364,10 @@
         "args": [
           "--gtest_filter=Webrtc*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -343,6 +407,10 @@
           "--run-manual",
           "--test-launcher-jobs=1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "browser_tests_functional",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -361,6 +429,10 @@
           "--run-manual",
           "--test-launcher-jobs=1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -376,6 +448,10 @@
         "args": [
           "--gtest_filter=WebRtc*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -393,6 +469,10 @@
           "--run-manual",
           "--ui-test-action-max-timeout=120000"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "content_browsertests_stress",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -409,6 +489,10 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/webrtc.content_unittests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -421,6 +505,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -436,6 +524,10 @@
         "args": [
           "--gtest_filter=Webrtc*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -457,6 +549,10 @@
           "--run-manual",
           "--test-launcher-jobs=1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "browser_tests_functional",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -475,6 +571,10 @@
           "--run-manual",
           "--test-launcher-jobs=1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -490,6 +590,10 @@
         "args": [
           "--gtest_filter=WebRtc*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -507,6 +611,10 @@
           "--run-manual",
           "--ui-test-action-max-timeout=120000"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "content_browsertests_stress",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -523,6 +631,10 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/webrtc.content_unittests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -535,6 +647,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -550,6 +666,10 @@
         "args": [
           "--gtest_filter=Webrtc*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -571,6 +691,10 @@
           "--run-manual",
           "--test-launcher-jobs=1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "browser_tests_functional",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -589,6 +713,10 @@
           "--run-manual",
           "--test-launcher-jobs=1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -604,6 +732,10 @@
         "args": [
           "--gtest_filter=WebRtc*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -621,6 +753,10 @@
           "--run-manual",
           "--ui-test-action-max-timeout=120000"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "content_browsertests_stress",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -637,6 +773,10 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/webrtc.content_unittests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -649,6 +789,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -664,6 +808,10 @@
         "args": [
           "--gtest_filter=Webrtc*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
diff --git a/testing/buildbot/chromium.webrtc.json b/testing/buildbot/chromium.webrtc.json
index e9b3caf..acd79ed 100644
--- a/testing/buildbot/chromium.webrtc.json
+++ b/testing/buildbot/chromium.webrtc.json
@@ -8,6 +8,10 @@
         "args": [
           "--gtest_filter=WebRtc*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -19,6 +23,10 @@
           "--run-manual",
           "--test-launcher-jobs=1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "content_browsertests_sequential",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -42,6 +50,10 @@
           "--run-manual",
           "--test-launcher-jobs=1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "browser_tests_functional",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -59,6 +71,10 @@
           "--run-manual",
           "--test-launcher-jobs=1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -76,6 +92,10 @@
           "--test-launcher-jobs=1",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
@@ -85,6 +105,10 @@
         "args": [
           "--gtest_filter=WebRtc*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -101,6 +125,10 @@
           "--run-manual",
           "--test-launcher-jobs=1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "content_browsertests_sequential",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -118,6 +146,10 @@
           "--run-manual",
           "--ui-test-action-max-timeout=120000"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "content_browsertests_stress",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -133,6 +165,10 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/webrtc.content_unittests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -144,6 +180,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -158,6 +198,10 @@
         "args": [
           "--gtest_filter=Webrtc*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -185,6 +229,10 @@
           "--run-manual",
           "--test-launcher-jobs=1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "browser_tests_functional",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -197,6 +245,10 @@
           "--run-manual",
           "--test-launcher-jobs=1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -209,6 +261,10 @@
           "--test-launcher-jobs=1",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
@@ -218,6 +274,10 @@
         "args": [
           "--gtest_filter=WebRtc*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -229,6 +289,10 @@
           "--run-manual",
           "--test-launcher-jobs=1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "content_browsertests_sequential",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -241,6 +305,10 @@
           "--run-manual",
           "--ui-test-action-max-timeout=120000"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "content_browsertests_stress",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -251,12 +319,20 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/webrtc.content_unittests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -266,6 +342,10 @@
         "args": [
           "--gtest_filter=Webrtc*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -288,6 +368,10 @@
           "--run-manual",
           "--test-launcher-jobs=1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "browser_tests_functional",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -300,6 +384,10 @@
           "--run-manual",
           "--test-launcher-jobs=1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -312,6 +400,10 @@
           "--test-launcher-jobs=1",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
@@ -321,6 +413,10 @@
         "args": [
           "--gtest_filter=WebRtc*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -332,6 +428,10 @@
           "--run-manual",
           "--test-launcher-jobs=1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "content_browsertests_sequential",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -344,6 +444,10 @@
           "--run-manual",
           "--ui-test-action-max-timeout=120000"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "content_browsertests_stress",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -354,12 +458,20 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/webrtc.content_unittests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -369,6 +481,10 @@
         "args": [
           "--gtest_filter=Webrtc*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -384,6 +500,10 @@
           "--run-manual",
           "--test-launcher-jobs=1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "browser_tests_functional",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -396,6 +516,10 @@
           "--run-manual",
           "--test-launcher-jobs=1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -408,6 +532,10 @@
           "--test-launcher-jobs=1",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
@@ -417,6 +545,10 @@
         "args": [
           "--gtest_filter=WebRtc*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -428,6 +560,10 @@
           "--run-manual",
           "--test-launcher-jobs=1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "content_browsertests_sequential",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -440,6 +576,10 @@
           "--run-manual",
           "--ui-test-action-max-timeout=120000"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "content_browsertests_stress",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -450,12 +590,20 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/webrtc.content_unittests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -465,6 +613,10 @@
         "args": [
           "--gtest_filter=Webrtc*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -480,6 +632,10 @@
           "--run-manual",
           "--test-launcher-jobs=1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "browser_tests_functional",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -492,6 +648,10 @@
           "--run-manual",
           "--test-launcher-jobs=1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -504,6 +664,10 @@
           "--test-launcher-jobs=1",
           "--test-launcher-print-test-stdio=always"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
@@ -513,6 +677,10 @@
         "args": [
           "--gtest_filter=WebRtc*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -524,6 +692,10 @@
           "--run-manual",
           "--test-launcher-jobs=1"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "content_browsertests_sequential",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -536,6 +708,10 @@
           "--run-manual",
           "--ui-test-action-max-timeout=120000"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "content_browsertests_stress",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -546,12 +722,20 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/webrtc.content_unittests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -561,6 +745,10 @@
         "args": [
           "--gtest_filter=Webrtc*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
diff --git a/testing/buildbot/chromium.win.json b/testing/buildbot/chromium.win.json
index dd3a75cb..1abe0fcb 100644
--- a/testing/buildbot/chromium.win.json
+++ b/testing/buildbot/chromium.win.json
@@ -31,72 +31,120 @@
   "Win 7 Tests x64 (1)": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 10
@@ -108,6 +156,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -115,6 +167,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -124,72 +180,120 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_cleaner_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_elf_import_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_elf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 6
@@ -201,6 +305,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -208,138 +316,230 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "courgette_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "crashpad_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "elevation_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gcp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "install_static_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -351,6 +551,10 @@
         "test": "installer_util_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 3
@@ -358,126 +562,210 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -489,30 +777,50 @@
         "test": "sbox_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sbox_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sbox_validation_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -524,108 +832,180 @@
         "test": "setup_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -768,6 +1148,10 @@
   "Win10 Tests x64": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -780,6 +1164,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -792,6 +1180,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -804,6 +1196,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -816,6 +1212,10 @@
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -828,6 +1228,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -840,6 +1244,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -852,6 +1260,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -864,6 +1276,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -876,6 +1292,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -889,6 +1309,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -901,6 +1325,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -916,6 +1344,10 @@
         "args": [
           "--disable-features=WebRTC-H264WithOpenH264FFmpeg"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -933,6 +1365,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -946,6 +1382,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -961,6 +1401,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -973,6 +1417,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -985,6 +1433,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -997,6 +1449,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1009,6 +1465,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1021,6 +1481,10 @@
         "test": "chrome_cleaner_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1033,6 +1497,10 @@
         "test": "chrome_elf_import_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1045,6 +1513,10 @@
         "test": "chrome_elf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1057,6 +1529,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1069,6 +1545,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1081,6 +1561,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1096,6 +1580,10 @@
         "args": [
           "--disable-features=WebRTC-H264WithOpenH264FFmpeg"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1113,6 +1601,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -1126,6 +1618,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1138,6 +1634,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1150,6 +1650,10 @@
         "test": "courgette_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1162,6 +1666,10 @@
         "test": "crashpad_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1174,6 +1682,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1186,6 +1698,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1198,6 +1714,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1210,6 +1730,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1222,6 +1746,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1234,6 +1762,10 @@
         "test": "elevation_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1246,6 +1778,10 @@
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1258,6 +1794,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1270,6 +1810,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1282,6 +1826,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1294,6 +1842,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1306,6 +1858,10 @@
         "test": "gcp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1318,6 +1874,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1330,6 +1890,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1342,6 +1906,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1354,6 +1922,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1366,6 +1938,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1378,6 +1954,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1390,6 +1970,10 @@
         "test": "install_static_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1403,6 +1987,10 @@
         "test": "installer_util_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1416,6 +2004,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1428,6 +2020,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1440,6 +2036,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1452,6 +2052,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1464,6 +2068,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1476,6 +2084,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1488,6 +2100,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1500,6 +2116,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1512,6 +2132,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1524,6 +2148,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1536,6 +2164,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1548,6 +2180,10 @@
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1560,6 +2196,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1572,6 +2212,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1584,6 +2228,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1596,6 +2244,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1608,6 +2260,10 @@
         "test": "notification_helper_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1620,6 +2276,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1632,6 +2292,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1644,6 +2308,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1656,6 +2324,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1668,6 +2340,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1681,6 +2357,10 @@
         "test": "sbox_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1693,6 +2373,10 @@
         "test": "sbox_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1705,6 +2389,10 @@
         "test": "sbox_validation_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1717,6 +2405,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1729,6 +2421,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1742,6 +2438,10 @@
         "test": "setup_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1754,6 +2454,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1766,6 +2470,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1778,6 +2486,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1790,6 +2502,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1803,6 +2519,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1815,6 +2535,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1827,6 +2551,10 @@
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1839,6 +2567,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1851,6 +2583,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1863,6 +2599,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1875,6 +2615,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1887,6 +2631,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1899,6 +2647,10 @@
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1911,6 +2663,10 @@
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1923,6 +2679,10 @@
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1935,6 +2695,10 @@
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2116,6 +2880,10 @@
   "Win10 Tests x64 (dbg)": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2128,6 +2896,10 @@
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2140,6 +2912,10 @@
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2152,6 +2928,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2164,6 +2944,10 @@
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2176,6 +2960,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2188,6 +2976,10 @@
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2200,6 +2992,10 @@
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2212,6 +3008,10 @@
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2224,6 +3024,10 @@
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2237,6 +3041,10 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2249,6 +3057,10 @@
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2261,6 +3073,10 @@
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2276,6 +3092,10 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2288,6 +3108,10 @@
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2300,6 +3124,10 @@
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2312,6 +3140,10 @@
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2324,6 +3156,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2336,6 +3172,10 @@
         "test": "chrome_cleaner_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2348,6 +3188,10 @@
         "test": "chrome_elf_import_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2360,6 +3204,10 @@
         "test": "chrome_elf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2372,6 +3220,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2384,6 +3236,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2396,6 +3252,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2412,6 +3272,10 @@
           "--disable-features=WebRTC-H264WithOpenH264FFmpeg"
         ],
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2429,6 +3293,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -2442,6 +3310,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2454,6 +3326,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2466,6 +3342,10 @@
         "test": "courgette_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2478,6 +3358,10 @@
         "test": "crashpad_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2490,6 +3374,10 @@
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2502,6 +3390,10 @@
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2514,6 +3406,10 @@
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2526,6 +3422,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2538,6 +3438,10 @@
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2550,6 +3454,10 @@
         "test": "elevation_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2563,6 +3471,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2575,6 +3487,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2587,6 +3503,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2599,6 +3519,10 @@
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2611,6 +3535,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2623,6 +3551,10 @@
         "test": "gcp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2635,6 +3567,10 @@
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2647,6 +3583,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2659,6 +3599,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2671,6 +3615,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2683,6 +3631,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2695,6 +3647,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2707,6 +3663,10 @@
         "test": "install_static_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2721,6 +3681,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2734,6 +3698,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2746,6 +3714,10 @@
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2758,6 +3730,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2770,6 +3746,10 @@
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2782,6 +3762,10 @@
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2794,6 +3778,10 @@
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2806,6 +3794,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2818,6 +3810,10 @@
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2830,6 +3826,10 @@
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2842,6 +3842,10 @@
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2854,6 +3858,10 @@
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2866,6 +3874,10 @@
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2878,6 +3890,10 @@
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2890,6 +3906,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2902,6 +3922,10 @@
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2914,6 +3938,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2926,6 +3954,10 @@
         "test": "notification_helper_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2938,6 +3970,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2950,6 +3986,10 @@
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2962,6 +4002,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2974,6 +4018,10 @@
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2986,6 +4034,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2999,6 +4051,10 @@
         "test": "sbox_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3011,6 +4067,10 @@
         "test": "sbox_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3023,6 +4083,10 @@
         "test": "sbox_validation_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3035,6 +4099,10 @@
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3047,6 +4115,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3060,6 +4132,10 @@
         "test": "setup_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3072,6 +4148,10 @@
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3084,6 +4164,10 @@
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3096,6 +4180,10 @@
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3108,6 +4196,10 @@
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3121,6 +4213,10 @@
       },
       {
         "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3133,6 +4229,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3145,6 +4245,10 @@
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3157,6 +4261,10 @@
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3169,6 +4277,10 @@
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3181,6 +4293,10 @@
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3193,6 +4309,10 @@
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3205,6 +4325,10 @@
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3217,6 +4341,10 @@
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3229,6 +4357,10 @@
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3241,6 +4373,10 @@
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3253,6 +4389,10 @@
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3265,6 +4405,10 @@
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3454,6 +4598,10 @@
   "Win7 (32) Tests": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3466,6 +4614,10 @@
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3479,6 +4631,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3492,6 +4648,10 @@
         "test": "sbox_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3504,6 +4664,10 @@
         "test": "sbox_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3520,72 +4684,120 @@
   "Win7 Tests (1)": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 15
@@ -3597,6 +4809,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -3604,6 +4820,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -3613,72 +4833,120 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_cleaner_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_elf_import_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_elf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 6
@@ -3690,6 +4958,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -3697,138 +4969,230 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "courgette_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "crashpad_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "elevation_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gcp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "install_static_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3840,6 +5204,10 @@
         "test": "installer_util_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 3
@@ -3847,126 +5215,210 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3978,30 +5430,50 @@
         "test": "sbox_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sbox_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sbox_validation_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4013,108 +5485,180 @@
         "test": "setup_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -4270,60 +5814,100 @@
   "Win7 Tests (dbg)(1)": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "accessibility_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "angle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "aura_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_fuzzer_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_heap_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "blink_platform_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -4331,18 +5915,30 @@
         "test": "blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "boringssl_crypto_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "boringssl_ssl_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 20
@@ -4354,6 +5950,10 @@
           "--disable-blink-features=HTMLImports,ShadowDOMV0,CustomElementsV0",
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -4361,6 +5961,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -4370,72 +5974,120 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "capture_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cast_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cc_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_cleaner_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_elf_import_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chrome_elf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 6
@@ -4447,6 +6099,10 @@
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true
@@ -4454,138 +6110,230 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "courgette_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "crashpad_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cronet_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "cronet_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "crypto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "display_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "elevation_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "events_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "filesystem_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gcp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gfx_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "install_static_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4597,6 +6345,10 @@
         "test": "installer_util_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 4
@@ -4604,126 +6356,210 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ipc_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "latency_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "leveldb_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "libjingle_xmpp_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_service_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "media_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "message_center_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "midi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "mojo_core_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "mojo_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "native_theme_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "perfetto_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "printing_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4735,30 +6571,50 @@
         "test": "sbox_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sbox_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sbox_validation_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "service_manager_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -4770,36 +6626,60 @@
         "test": "setup_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "shell_dialogs_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "skia_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "snapshot_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "sql_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "storage_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "shards": 2
@@ -4807,72 +6687,120 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "traffic_annotation_auditor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ui_base_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "ui_touch_selection_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "url_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "views_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "viz_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "vr_common_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "vr_pixeltests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "wm_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "wtf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
diff --git a/testing/buildbot/client.v8.chromium.json b/testing/buildbot/client.v8.chromium.json
index 889b8b9..25e7cfcb 100644
--- a/testing/buildbot/client.v8.chromium.json
+++ b/testing/buildbot/client.v8.chromium.json
@@ -4,6 +4,10 @@
   "Linux - Future": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -15,6 +19,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -27,6 +35,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -38,6 +50,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -49,6 +65,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -60,6 +80,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -71,6 +95,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -82,6 +110,10 @@
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -93,6 +125,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -104,6 +140,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -115,6 +155,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -126,6 +170,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -137,6 +185,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -148,6 +200,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -159,6 +215,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -170,6 +230,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -181,6 +245,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -192,6 +260,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -203,6 +275,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -214,6 +290,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -225,6 +305,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -236,6 +320,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -247,6 +335,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -258,6 +350,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -269,6 +365,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -280,6 +380,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -291,6 +395,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -302,6 +410,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -313,6 +425,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -414,6 +530,10 @@
   "Linux - Future (dbg)": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -425,6 +545,10 @@
         "test": "app_shell_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -437,6 +561,10 @@
         "test": "browser_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -448,6 +576,10 @@
         "test": "chrome_app_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -459,6 +591,10 @@
         "test": "chromedriver_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -470,6 +606,10 @@
         "test": "components_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -481,6 +621,10 @@
         "test": "components_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -492,6 +636,10 @@
         "test": "compositor_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -503,6 +651,10 @@
         "test": "content_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -514,6 +666,10 @@
         "test": "content_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -525,6 +681,10 @@
         "test": "device_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -536,6 +696,10 @@
         "test": "extensions_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -547,6 +711,10 @@
         "test": "extensions_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -558,6 +726,10 @@
         "test": "gcm_unit_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -569,6 +741,10 @@
         "test": "gin_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -580,6 +756,10 @@
         "test": "google_apis_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -591,6 +771,10 @@
         "test": "gpu_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -602,6 +786,10 @@
         "test": "headless_browsertests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -613,6 +801,10 @@
         "test": "headless_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -625,6 +817,10 @@
         "test": "interactive_ui_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -636,6 +832,10 @@
         "test": "jingle_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -647,6 +847,10 @@
         "test": "media_blink_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -658,6 +862,10 @@
         "test": "nacl_loader_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -669,6 +877,10 @@
         "test": "net_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -680,6 +892,10 @@
         "test": "pdf_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -691,6 +907,10 @@
         "test": "ppapi_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -702,6 +922,10 @@
         "test": "remoting_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -713,6 +937,10 @@
         "test": "services_unittests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -724,6 +952,10 @@
         "test": "sync_integration_tests"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
diff --git a/testing/buildbot/client.v8.fyi.json b/testing/buildbot/client.v8.fyi.json
index 5030000..60439108 100644
--- a/testing/buildbot/client.v8.fyi.json
+++ b/testing/buildbot/client.v8.fyi.json
@@ -1086,6 +1086,10 @@
         "args": [
           "--enable-blink-features=LayoutNG"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests_ng",
         "swarming": {
           "can_use_on_swarming_builders": true,
diff --git a/testing/buildbot/generate_buildbot_json.py b/testing/buildbot/generate_buildbot_json.py
index d41c730..56180056 100755
--- a/testing/buildbot/generate_buildbot_json.py
+++ b/testing/buildbot/generate_buildbot_json.py
@@ -524,6 +524,14 @@
     result = self.update_and_cleanup_test(
         result, test_name, tester_name, tester_config, waterfall)
     self.add_common_test_properties(result, tester_config)
+
+    if not result.get('merge'):
+      # TODO(https://crbug.com/958376): Consider adding the ability to not have
+      # this default.
+      result['merge'] = {
+        'script': '//testing/merge_scripts/standard_gtest_merge.py',
+        'args': [],
+      }
     return result
 
   def generate_isolated_script_test(self, waterfall, tester_name, tester_config,
diff --git a/testing/buildbot/generate_buildbot_json_unittest.py b/testing/buildbot/generate_buildbot_json_unittest.py
index 937e85f2..86023cf 100755
--- a/testing/buildbot/generate_buildbot_json_unittest.py
+++ b/testing/buildbot/generate_buildbot_json_unittest.py
@@ -883,12 +883,20 @@
   "Fake Tester": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
         "test": "bar_test"
       },
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -909,6 +917,10 @@
         "args": [
           "--this-is-an-argument"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -918,6 +930,10 @@
         "args": [
           "--this-is-an-argument"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -935,6 +951,10 @@
   "Fake Tester": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -949,6 +969,10 @@
         "args": [
           "--variation"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "variation_test",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -972,6 +996,10 @@
   "Fake Tester": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -993,6 +1021,10 @@
           "--c_arg",
           "--bar"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1019,6 +1051,10 @@
         "args": [
           "--no-xvfb"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -1039,6 +1075,10 @@
         "args": [
           "--enable-features=Foo,Bar,Baz"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -1059,6 +1099,10 @@
         "args": [
           "--bar"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1365,6 +1409,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -1405,6 +1453,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -1431,6 +1483,10 @@
   "Fake Android M Tester": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": false
         },
@@ -1448,6 +1504,10 @@
   "Fake Tester": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1484,6 +1544,10 @@
   "Fake Tester": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2603,6 +2667,10 @@
   "Fake Tester": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2627,6 +2695,10 @@
   "Fake Tester": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2651,6 +2723,10 @@
   "Fake Tester": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2675,6 +2751,10 @@
   "Fake Tester": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2703,6 +2783,10 @@
           "--c_arg",
           "--mixin-argument"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -2720,6 +2804,10 @@
   "Fake Tester": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2745,6 +2833,10 @@
   "Fake Tester": {
     "gtest_tests": [
       {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3045,6 +3137,10 @@
     "gtest_tests": [
       {
         "test": "foo_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": False
         }
@@ -3059,6 +3155,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "cipd_packages": [
             {
@@ -3088,6 +3188,10 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "cipd_packages": [
             {
@@ -3123,6 +3227,10 @@
 TEST_QUERY_BOTS_TESTS_OUTPUT = {
   "Fake Android M Tester": [
     {
+      "merge": {
+        "args": [],
+        "script": "//testing/merge_scripts/standard_gtest_merge.py"
+      },
       "test": "foo_test",
       "swarming": {
         "can_use_on_swarming_builders": False
@@ -3136,6 +3244,10 @@
         "--gs-results-bucket=chromium-result-details",
         "--recover-devices"
       ],
+      "merge": {
+        "args": [],
+        "script": "//testing/merge_scripts/standard_gtest_merge.py"
+      },
       "swarming": {
         "cipd_packages": [
           {
@@ -3162,6 +3274,10 @@
         "--gs-results-bucket=chromium-result-details",
         "--recover-devices"
       ],
+      "merge": {
+        "args": [],
+        "script": "//testing/merge_scripts/standard_gtest_merge.py"
+      },
       "swarming": {
         "cipd_packages": [
           {
@@ -3196,10 +3312,16 @@
   "additional_compile_targets": ["bar_test"],
   "gtest_tests": [
     {
-      "test": "foo_test", "args": [
+      "test": "foo_test",
+      "args": [
         "--gs-results-bucket=chromium-result-details",
         "--recover-devices"
-      ], "swarming": {
+      ],
+      "merge": {
+        "args": [],
+        "script": "//testing/merge_scripts/standard_gtest_merge.py"
+      },
+      "swarming": {
         "cipd_packages": [
           {
             "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -3234,6 +3356,10 @@
       "--gs-results-bucket=chromium-result-details",
       "--recover-devices"
     ],
+    "merge": {
+      "args": [],
+      "script": "//testing/merge_scripts/standard_gtest_merge.py"
+    },
     "swarming": {
       "cipd_packages": [
         {
diff --git a/testing/buildbot/tryserver.chromium.linux.json b/testing/buildbot/tryserver.chromium.linux.json
index 390492f5..d0cc871 100644
--- a/testing/buildbot/tryserver.chromium.linux.json
+++ b/testing/buildbot/tryserver.chromium.linux.json
@@ -5,6 +5,10 @@
     "gtest_tests": [
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -17,6 +21,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -29,6 +37,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -41,6 +53,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -53,6 +69,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -65,6 +85,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -77,6 +101,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -89,6 +117,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -101,6 +133,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -113,6 +149,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webkit_unit_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -126,6 +166,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -138,6 +182,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -150,6 +198,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -167,6 +219,10 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "webui_html_imports_polyfill_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -180,6 +236,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -195,6 +255,10 @@
           "--gtest_filter=-*UsingRealWebcam*"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -207,6 +271,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -219,6 +287,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -231,6 +303,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -243,6 +319,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -255,6 +335,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -267,6 +351,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -279,6 +367,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -291,6 +383,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -308,6 +404,10 @@
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*"
         ],
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "name": "nonperfetto_content_browsertests",
         "swarming": {
           "can_use_on_swarming_builders": true,
@@ -321,6 +421,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -333,6 +437,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -345,6 +453,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -357,6 +469,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -369,6 +485,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -381,6 +501,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -393,6 +517,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -405,6 +533,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -417,6 +549,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -429,6 +565,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -441,6 +581,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -453,6 +597,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -465,6 +613,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -477,6 +629,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -489,6 +645,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -501,6 +661,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -513,6 +677,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -525,6 +693,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -537,6 +709,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -550,6 +726,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -562,6 +742,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -574,6 +758,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -586,6 +774,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -598,6 +790,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -610,6 +806,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -622,6 +822,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -634,6 +838,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -646,6 +854,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -658,6 +870,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -670,6 +886,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -682,6 +902,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -694,6 +918,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -706,6 +934,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -718,6 +950,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -730,6 +966,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -742,6 +982,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -754,6 +998,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -766,6 +1014,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -778,6 +1030,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -790,6 +1046,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -802,6 +1062,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -814,6 +1078,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -826,6 +1094,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -838,6 +1110,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -850,6 +1126,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -862,6 +1142,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -874,6 +1158,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -886,6 +1174,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -898,6 +1190,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -910,6 +1206,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -922,6 +1222,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -934,6 +1238,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -946,6 +1254,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -958,6 +1270,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -970,6 +1286,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -982,6 +1302,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -994,6 +1318,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1006,6 +1334,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1018,6 +1350,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1030,6 +1366,10 @@
       },
       {
         "isolate_coverage_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
diff --git a/testing/libfuzzer/libprotobuf-mutator.md b/testing/libfuzzer/libprotobuf-mutator.md
index 9f840ba..982bf37 100644
--- a/testing/libfuzzer/libprotobuf-mutator.md
+++ b/testing/libfuzzer/libprotobuf-mutator.md
@@ -1,4 +1,4 @@
-# Getting Started with libprotobuf-mutator in Chromium
+# Getting Started with libprotobuf-mutator (LPM) in Chromium
 
 *** note
 **Note:** Writing grammar fuzzers with libprotobuf-mutator requires greater
diff --git a/third_party/blink/public/mojom/web_feature/web_feature.mojom b/third_party/blink/public/mojom/web_feature/web_feature.mojom
index 8acc8fd..39eefa27 100644
--- a/third_party/blink/public/mojom/web_feature/web_feature.mojom
+++ b/third_party/blink/public/mojom/web_feature/web_feature.mojom
@@ -2280,6 +2280,10 @@
   kWebShareSuccessfulWithoutFiles = 2873,
   kWebShareUnsuccessfulContainingFiles = 2874,
   kWebShareUnsuccessfulWithoutFiles = 2875,
+  kVerticalScrollbarThumbScrollingWithMouse = 2876,
+  kVerticalScrollbarThumbScrollingWithTouch = 2877,
+  kHorizontalScrollbarThumbScrollingWithMouse = 2878,
+  kHorizontalScrollbarThumbScrollingWithTouch = 2879,
 
   // Add new features immediately above this line. Don't change assigned
   // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/public/platform/web_runtime_features.h b/third_party/blink/public/platform/web_runtime_features.h
index a2fdbaf7..2804a5e4 100644
--- a/third_party/blink/public/platform/web_runtime_features.h
+++ b/third_party/blink/public/platform/web_runtime_features.h
@@ -237,6 +237,7 @@
       bool);
   BLINK_PLATFORM_EXPORT static void EnableIdleDetection(bool);
   BLINK_PLATFORM_EXPORT static void EnableSkipTouchEventFilter(bool);
+  BLINK_PLATFORM_EXPORT static void EnableStaleWhileRevalidate(bool);
 
  private:
   WebRuntimeFeatures();
diff --git a/third_party/blink/renderer/core/css/style_engine_test.cc b/third_party/blink/renderer/core/css/style_engine_test.cc
index 3786273..967060c1 100644
--- a/third_party/blink/renderer/core/css/style_engine_test.cc
+++ b/third_party/blink/renderer/core/css/style_engine_test.cc
@@ -1689,7 +1689,7 @@
   Element* d3 = GetDocument().getElementById("d3");
 
   FirstLetterPseudoElement* fl1 =
-      ToFirstLetterPseudoElement(d1->GetPseudoElement(kPseudoIdFirstLetter));
+      To<FirstLetterPseudoElement>(d1->GetPseudoElement(kPseudoIdFirstLetter));
   EXPECT_TRUE(fl1);
 
   GetDocument().getElementById("f1")->firstChild()->remove();
@@ -1702,10 +1702,10 @@
 
   UpdateAllLifecyclePhases();
   EXPECT_FALSE(
-      ToFirstLetterPseudoElement(d1->GetPseudoElement(kPseudoIdFirstLetter)));
+      To<FirstLetterPseudoElement>(d1->GetPseudoElement(kPseudoIdFirstLetter)));
 
   FirstLetterPseudoElement* fl2 =
-      ToFirstLetterPseudoElement(d2->GetPseudoElement(kPseudoIdFirstLetter));
+      To<FirstLetterPseudoElement>(d2->GetPseudoElement(kPseudoIdFirstLetter));
   EXPECT_TRUE(fl2);
 
   GetDocument().getElementById("f2")->firstChild()->remove();
@@ -1718,10 +1718,10 @@
 
   UpdateAllLifecyclePhases();
   EXPECT_FALSE(
-      ToFirstLetterPseudoElement(d2->GetPseudoElement(kPseudoIdFirstLetter)));
+      To<FirstLetterPseudoElement>(d2->GetPseudoElement(kPseudoIdFirstLetter)));
 
   FirstLetterPseudoElement* fl3 =
-      ToFirstLetterPseudoElement(d3->GetPseudoElement(kPseudoIdFirstLetter));
+      To<FirstLetterPseudoElement>(d3->GetPseudoElement(kPseudoIdFirstLetter));
   EXPECT_TRUE(fl3);
 
   Element* f3 = GetDocument().getElementById("f3");
@@ -1734,7 +1734,8 @@
   EXPECT_TRUE(fl3->NeedsStyleRecalc());
 
   UpdateAllLifecyclePhases();
-  fl3 = ToFirstLetterPseudoElement(d3->GetPseudoElement(kPseudoIdFirstLetter));
+  fl3 =
+      To<FirstLetterPseudoElement>(d3->GetPseudoElement(kPseudoIdFirstLetter));
   EXPECT_TRUE(fl3);
   EXPECT_EQ(f3->lastChild()->GetLayoutObject(),
             fl3->RemainingTextLayoutObject());
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc
index 7c75243..9d4c1485 100644
--- a/third_party/blink/renderer/core/dom/element.cc
+++ b/third_party/blink/renderer/core/dom/element.cc
@@ -4259,11 +4259,11 @@
 
   bool text_node_changed =
       remaining_text_layout_object !=
-      ToFirstLetterPseudoElement(element)->RemainingTextLayoutObject();
+      To<FirstLetterPseudoElement>(element)->RemainingTextLayoutObject();
 
   if (phase == StyleUpdatePhase::kAttachLayoutTree) {
     // RemainingTextLayoutObject should have been cleared from DetachLayoutTree.
-    DCHECK(!ToFirstLetterPseudoElement(element)->RemainingTextLayoutObject());
+    DCHECK(!To<FirstLetterPseudoElement>(element)->RemainingTextLayoutObject());
     DCHECK(text_node_changed);
     scoped_refptr<ComputedStyle> pseudo_style = element->StyleForLayoutObject();
     if (PseudoElementLayoutObjectIsNeeded(pseudo_style.get()))
diff --git a/third_party/blink/renderer/core/dom/first_letter_pseudo_element.h b/third_party/blink/renderer/core/dom/first_letter_pseudo_element.h
index 1f44ca05..97118953 100644
--- a/third_party/blink/renderer/core/dom/first_letter_pseudo_element.h
+++ b/third_party/blink/renderer/core/dom/first_letter_pseudo_element.h
@@ -28,6 +28,7 @@
 #include "base/macros.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/pseudo_element.h"
+#include "third_party/blink/renderer/platform/wtf/casting.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 
 namespace blink {
@@ -64,8 +65,17 @@
   DISALLOW_COPY_AND_ASSIGN(FirstLetterPseudoElement);
 };
 
-DEFINE_ELEMENT_TYPE_CASTS(FirstLetterPseudoElement,
-                          IsFirstLetterPseudoElement());
+template <>
+inline bool IsElementOfType<const FirstLetterPseudoElement>(const Node& node) {
+  return node.IsFirstLetterPseudoElement();
+}
+
+template <>
+struct DowncastTraits<FirstLetterPseudoElement> {
+  static bool AllowFrom(const Node& node) {
+    return node.IsFirstLetterPseudoElement();
+  }
+};
 
 }  // namespace blink
 
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc
index 1afc957..bd41cde 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view.cc
+++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -3942,7 +3942,7 @@
 
   // Don't throttle display:none frames (see updateRenderThrottlingStatus).
   HTMLFrameOwnerElement* owner_element = frame_->DeprecatedLocalOwner();
-  if (hidden_for_throttling_ && owner_element &&
+  if (IsHiddenForThrottling() && owner_element &&
       !owner_element->GetLayoutObject()) {
     // No need to notify children because descendants of display:none frames
     // should remain throttled.
@@ -3976,11 +3976,8 @@
 
   // Note that we disallow throttling of 0x0 and display:none frames because
   // some sites use them to drive UI logic.
-  hidden_for_throttling_ = hidden && !Size().IsEmpty();
+  hidden_for_throttling_ = hidden;
   subtree_throttled_ = subtree_throttled;
-  HTMLFrameOwnerElement* owner_element = frame_->DeprecatedLocalOwner();
-  if (owner_element)
-    hidden_for_throttling_ &= !!owner_element->GetLayoutObject();
 
   bool is_throttled = CanThrottleRendering();
   bool became_unthrottled = was_throttled && !is_throttled;
@@ -4040,7 +4037,7 @@
   }
 
   if (FrameScheduler* frame_scheduler = frame_->GetFrameScheduler()) {
-    frame_scheduler->SetFrameVisible(!hidden_for_throttling_);
+    frame_scheduler->SetFrameVisible(!IsHiddenForThrottling());
     frame_scheduler->SetCrossOrigin(frame_->IsCrossOriginSubframe());
     frame_scheduler->TraceUrlChange(frame_->GetDocument()->Url().GetString());
   }
@@ -4137,7 +4134,22 @@
   // cross-origin frames must already communicate with asynchronous messages,
   // so they should be able to tolerate some delay in receiving replies from a
   // throttled peer.
-  return hidden_for_throttling_ && frame_->IsCrossOriginSubframe();
+  return IsHiddenForThrottling() && frame_->IsCrossOriginSubframe();
+}
+
+bool LocalFrameView::IsHiddenForThrottling() const {
+  // TODO(szager): hidden_for_throttling_ has a different meaning depending on
+  // whether this frame has a remote parent (i.e, if it's OOPIF). In the OOPIF
+  // case, it means "non-zero sized AND not display:none AND scrolled out of the
+  // parent document's viewport." For the non-OOPIF case, it just means
+  // "scrolled out of the parent document's viewport." Fixing this will
+  // require some moderately complex refactoring of render throttling.
+  if (!hidden_for_throttling_)
+    return false;
+  HTMLFrameOwnerElement* owner_element = frame_->DeprecatedLocalOwner();
+  if (owner_element)
+    return !Size().IsEmpty() && !!owner_element->GetLayoutObject();
+  return true;
 }
 
 void LocalFrameView::BeginLifecycleUpdates() {
@@ -4157,7 +4169,6 @@
   }
 
   SetupRenderThrottling();
-  UpdateRenderThrottlingStatus(hidden_for_throttling_, subtree_throttled_);
 
   // The compositor will "defer commits" for the main frame until we
   // explicitly request them.
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.h b/third_party/blink/renderer/core/frame/local_frame_view.h
index 788f603..04b368e 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view.h
+++ b/third_party/blink/renderer/core/frame/local_frame_view.h
@@ -608,7 +608,7 @@
   // Returns true if this frame could potentially skip rendering and avoid
   // scheduling visual updates.
   bool CanThrottleRendering() const;
-  bool IsHiddenForThrottling() const { return hidden_for_throttling_; }
+  bool IsHiddenForThrottling() const;
   void SetupRenderThrottling();
 
   void BeginLifecycleUpdates();
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
index 1a1fc054..bbeaed0 100644
--- a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
+++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
@@ -888,10 +888,8 @@
   if (GetTextFinder())
     GetTextFinder()->ClearActiveFindMatch();
 
-  GetFrame()->Loader().StartNavigation(
-      FrameLoadRequest(nullptr, request, /*frame_name=*/AtomicString(),
-                       kCheckContentSecurityPolicy),
-      frame_load_type);
+  GetFrame()->Loader().StartNavigation(FrameLoadRequest(nullptr, request),
+                                       frame_load_type);
 }
 
 void WebLocalFrameImpl::ReloadImage(const WebNode& web_node) {
@@ -918,9 +916,7 @@
     GetTextFinder()->ClearActiveFindMatch();
 
   GetFrame()->Loader().StartNavigation(
-      FrameLoadRequest(nullptr, request.ToResourceRequest(),
-                       /*frame_name=*/AtomicString(),
-                       kCheckContentSecurityPolicy),
+      FrameLoadRequest(nullptr, request.ToResourceRequest()),
       WebFrameLoadType::kStandard);
 }
 
diff --git a/third_party/blink/renderer/core/html/html_frame_owner_element.cc b/third_party/blink/renderer/core/html/html_frame_owner_element.cc
index 8836bb5b..17c94ad 100644
--- a/third_party/blink/renderer/core/html/html_frame_owner_element.cc
+++ b/third_party/blink/renderer/core/html/html_frame_owner_element.cc
@@ -478,14 +478,8 @@
     }
   }
 
-  ContentSecurityPolicyDisposition content_security_policy_disposition =
-      ContentSecurityPolicy::ShouldBypassMainWorld(&GetDocument())
-          ? kDoNotCheckContentSecurityPolicy
-          : kCheckContentSecurityPolicy;
   child_frame->Loader().StartNavigation(
-      FrameLoadRequest(&GetDocument(), request, AtomicString(),
-                       content_security_policy_disposition),
-      child_load_type);
+      FrameLoadRequest(&GetDocument(), request), child_load_type);
 
   return true;
 }
@@ -554,12 +548,18 @@
 }
 
 void HTMLFrameOwnerElement::StartVisibilityObserver() {
-  if (visibility_observer_)
-    return;
-  visibility_observer_ = IntersectionObserver::Create(
-      {}, {IntersectionObserver::kMinimumThreshold}, &GetDocument(),
-      WTF::BindRepeating(&HTMLFrameOwnerElement::OnViewportIntersectionChanged,
-                         WrapWeakPersistent(this)));
+  // When this method is called, it indicates that the caller wants to receive
+  // a notification at the next opportunity, even if nothing has changed.
+  // Un-observing and then re-observing will accomplish that.
+  if (visibility_observer_) {
+    visibility_observer_->unobserve(this);
+  } else {
+    visibility_observer_ = IntersectionObserver::Create(
+        {}, {IntersectionObserver::kMinimumThreshold}, &GetDocument(),
+        WTF::BindRepeating(
+            &HTMLFrameOwnerElement::OnViewportIntersectionChanged,
+            WrapWeakPersistent(this)));
+  }
   visibility_observer_->observe(this);
 }
 
diff --git a/third_party/blink/renderer/core/inspector/devtools_session.cc b/third_party/blink/renderer/core/inspector/devtools_session.cc
index 6435384..505c0303 100644
--- a/third_party/blink/renderer/core/inspector/devtools_session.cc
+++ b/third_party/blink/renderer/core/inspector/devtools_session.cc
@@ -20,10 +20,13 @@
 #include "third_party/blink/renderer/platform/heap/persistent.h"
 #include "third_party/blink/renderer/platform/web_test_support.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_utf8_adaptor.h"
+#include "third_party/inspector_protocol/encoding/encoding.h"
 
 namespace blink {
 
 namespace {
+using ::inspector_protocol_encoding::SpanFrom;
+using ::inspector_protocol_encoding::cbor::IsCBORMessage;
 const char kV8StateKey[] = "v8";
 bool ShouldInterruptForMethod(const String& method) {
   // Keep in sync with DevToolsSession::ShouldSendOnIO.
@@ -34,6 +37,7 @@
          method == "Debugger.setBreakpointsActive" ||
          method == "Performance.getMetrics" || method == "Page.crash" ||
          method == "Runtime.terminateExecution" ||
+         method == "Debugger.getStackTrace" ||
          method == "Emulation.setScriptExecutionDisabled";
 }
 
@@ -58,18 +62,13 @@
 }
 
 protocol::ProtocolMessage ToProtocolMessage(
-    std::unique_ptr<v8_inspector::StringBuffer> buffer,
-    bool binary) {
+    std::unique_ptr<v8_inspector::StringBuffer> buffer) {
   protocol::ProtocolMessage message;
-  if (binary) {
-    const auto& string = buffer->string();
-    DCHECK(string.is8Bit());
-    // TODO: add StringBuffer::takeBytes().
-    message.binary = std::vector<uint8_t>(
-        string.characters8(), string.characters8() + string.length());
-  } else {
-    message.json = ToCoreString(buffer->string());
-  }
+  const auto& string = buffer->string();
+  DCHECK(string.is8Bit());
+  // TODO: add StringBuffer::takeBytes().
+  message.binary = std::vector<uint8_t>(string.characters8(),
+                                        string.characters8() + string.length());
   return message;
 }
 
@@ -135,8 +134,7 @@
       inspector_backend_dispatcher_(new protocol::UberDispatcher(this)),
       session_state_(std::move(reattach_session_state)),
       v8_session_state_(kV8StateKey),
-      v8_session_state_json_(&v8_session_state_, /*default_value=*/String()),
-      uses_binary_protocol_(&v8_session_state_, false) {
+      v8_session_state_json_(&v8_session_state_, /*default_value=*/String()) {
   io_session_ =
       new IOSession(agent_->io_task_runner_, agent_->inspector_task_runner_,
                     WrapCrossThreadWeakPersistent(this), std::move(io_request));
@@ -208,9 +206,7 @@
 void DevToolsSession::DispatchProtocolCommandImpl(int call_id,
                                                   const String& method,
                                                   std::vector<uint8_t> data) {
-  bool binary_protocol = !data.empty() && data[0] == 0xD8;
-  if (binary_protocol)
-    uses_binary_protocol_.Set(true);
+  DCHECK(IsCBORMessage(SpanFrom(data)));
 
   // IOSession does not provide ordering guarantees relative to
   // Session, so a command may come to IOSession after Session is detached,
@@ -227,24 +223,12 @@
   agent_->client_->DebuggerTaskStarted();
   if (v8_inspector::V8InspectorSession::canDispatchMethod(
           ToV8InspectorStringView(method))) {
-    if (binary_protocol) {
-      // Binary protocol messages are passed using 8-bit StringView.
-      v8_session_->dispatchProtocolMessage(
-          v8_inspector::StringView(data.data(), data.size()));
-    } else {
-      String message = WTF::String::FromUTF8(
-          reinterpret_cast<const char*>(data.data()), data.size());
-      v8_session_->dispatchProtocolMessage(ToV8InspectorStringView(message));
-    }
+    // Binary protocol messages are passed using 8-bit StringView.
+    v8_session_->dispatchProtocolMessage(
+        v8_inspector::StringView(data.data(), data.size()));
   } else {
-    std::unique_ptr<protocol::Value> value;
-    if (binary_protocol) {
-      value = protocol::Value::parseBinary(data.data(), data.size());
-    } else {
-      String message = WTF::String::FromUTF8(
-          reinterpret_cast<const char*>(data.data()), data.size());
-      value = protocol::StringUtil::parseJSON(message);
-    }
+    std::unique_ptr<protocol::Value> value =
+        protocol::Value::parseBinary(data.data(), data.size());
     // Don't pass protocol message further - there is no passthrough.
     inspector_backend_dispatcher_->dispatch(call_id, method, std::move(value),
                                             protocol::ProtocolMessage());
@@ -274,8 +258,7 @@
 void DevToolsSession::sendProtocolResponse(
     int call_id,
     std::unique_ptr<protocol::Serializable> message) {
-  SendProtocolResponse(call_id,
-                       message->serialize(uses_binary_protocol_.Get()));
+  SendProtocolResponse(call_id, message->serialize(/*binary=*/true));
 }
 
 void DevToolsSession::fallThrough(int call_id,
@@ -291,8 +274,7 @@
   // We can potentially avoid copies if WebString would convert to utf8 right
   // from StringView, but it uses StringImpl itself, so we don't create any
   // extra copies here.
-  SendProtocolResponse(call_id, ToProtocolMessage(std::move(message),
-                                                  uses_binary_protocol_.Get()));
+  SendProtocolResponse(call_id, ToProtocolMessage(std::move(message)));
 }
 
 void DevToolsSession::SendProtocolResponse(
@@ -332,13 +314,13 @@
       std::unique_ptr<v8_inspector::StringBuffer> notification)
       : v8_notification_(std::move(notification)) {}
 
-  mojom::blink::DevToolsMessagePtr Serialize(bool binary) {
+  mojom::blink::DevToolsMessagePtr Serialize() {
     protocol::ProtocolMessage serialized;
     if (blink_notification_) {
-      serialized = blink_notification_->serialize(binary);
+      serialized = blink_notification_->serialize(/*binary=*/true);
       blink_notification_.reset();
     } else if (v8_notification_) {
-      serialized = ToProtocolMessage(std::move(v8_notification_), binary);
+      serialized = ToProtocolMessage(std::move(v8_notification_));
       v8_notification_.reset();
     }
     return WrapMessage(std::move(serialized));
@@ -375,8 +357,7 @@
   if (v8_session_)
     v8_session_state_json_.Set(ToCoreString(v8_session_->stateJSON()));
   for (wtf_size_t i = 0; i < notification_queue_.size(); ++i) {
-    auto serialized =
-        notification_queue_[i]->Serialize(uses_binary_protocol_.Get());
+    auto serialized = notification_queue_[i]->Serialize();
     host_ptr_->DispatchProtocolNotification(std::move(serialized),
                                             session_state_.TakeUpdates());
   }
diff --git a/third_party/blink/renderer/core/inspector/devtools_session.h b/third_party/blink/renderer/core/inspector/devtools_session.h
index 388f64676..8b91b32 100644
--- a/third_party/blink/renderer/core/inspector/devtools_session.h
+++ b/third_party/blink/renderer/core/inspector/devtools_session.h
@@ -97,7 +97,6 @@
   Vector<std::unique_ptr<Notification>> notification_queue_;
   InspectorAgentState v8_session_state_;
   InspectorAgentState::String v8_session_state_json_;
-  InspectorAgentState::Boolean uses_binary_protocol_;
 
   DISALLOW_COPY_AND_ASSIGN(DevToolsSession);
 };
diff --git a/third_party/blink/renderer/core/layout/layout_scrollbar.cc b/third_party/blink/renderer/core/layout/layout_scrollbar.cc
index b0bab3a..63074c96 100644
--- a/third_party/blink/renderer/core/layout/layout_scrollbar.cc
+++ b/third_party/blink/renderer/core/layout/layout_scrollbar.cc
@@ -138,9 +138,10 @@
   UpdateScrollbarPart(kTrackBGPart);
 }
 
-void LayoutScrollbar::SetPressedPart(ScrollbarPart part) {
+void LayoutScrollbar::SetPressedPart(ScrollbarPart part,
+                                     WebInputEvent::Type type) {
   ScrollbarPart old_part = pressed_part_;
-  Scrollbar::SetPressedPart(part);
+  Scrollbar::SetPressedPart(part, type);
 
   UpdateScrollbarPart(old_part);
   UpdateScrollbarPart(part);
diff --git a/third_party/blink/renderer/core/layout/layout_scrollbar.h b/third_party/blink/renderer/core/layout/layout_scrollbar.h
index 85de9892..0b477e0b 100644
--- a/third_party/blink/renderer/core/layout/layout_scrollbar.h
+++ b/third_party/blink/renderer/core/layout/layout_scrollbar.h
@@ -88,7 +88,7 @@
   void DisconnectFromScrollableArea() override;
 
   void SetHoveredPart(ScrollbarPart) override;
-  void SetPressedPart(ScrollbarPart) override;
+  void SetPressedPart(ScrollbarPart, WebInputEvent::Type) override;
 
   void StyleChanged() override;
 
diff --git a/third_party/blink/renderer/core/layout/layout_text_fragment.cc b/third_party/blink/renderer/core/layout/layout_text_fragment.cc
index d507061..5564cc1b 100644
--- a/third_party/blink/renderer/core/layout/layout_text_fragment.cc
+++ b/third_party/blink/renderer/core/layout/layout_text_fragment.cc
@@ -163,8 +163,7 @@
   if (!node)
     return nullptr;
 
-  if (node->IsFirstLetterPseudoElement()) {
-    FirstLetterPseudoElement* pseudo = ToFirstLetterPseudoElement(node);
+  if (auto* pseudo = DynamicTo<FirstLetterPseudoElement>(node)) {
     LayoutObject* next_layout_object =
         FirstLetterPseudoElement::FirstLetterTextLayoutObject(*pseudo);
     if (!next_layout_object)
diff --git a/third_party/blink/renderer/core/layout/scrollbars_test.cc b/third_party/blink/renderer/core/layout/scrollbars_test.cc
index d19a9dd7..fa3f9338 100644
--- a/third_party/blink/renderer/core/layout/scrollbars_test.cc
+++ b/third_party/blink/renderer/core/layout/scrollbars_test.cc
@@ -5,6 +5,7 @@
 #include "build/build_config.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h"
+#include "third_party/blink/public/platform/web_coalesced_input_event.h"
 #include "third_party/blink/public/platform/web_float_rect.h"
 #include "third_party/blink/public/platform/web_theme_engine.h"
 #include "third_party/blink/public/web/web_script_source.h"
@@ -106,6 +107,22 @@
     GetEventHandler().HandleMouseLeaveEvent(event);
   }
 
+  WebCoalescedInputEvent GenerateWheelGestureEvent(
+      WebInputEvent::Type type,
+      const IntPoint& position,
+      ScrollOffset offset = ScrollOffset()) {
+    return GenerateGestureEvent(type, WebGestureDevice::kTouchpad, position,
+                                offset);
+  }
+
+  WebCoalescedInputEvent GenerateTouchGestureEvent(
+      WebInputEvent::Type type,
+      const IntPoint& position,
+      ScrollOffset offset = ScrollOffset()) {
+    return GenerateGestureEvent(type, WebGestureDevice::kTouchscreen, position,
+                                offset);
+  }
+
   Cursor::Type CursorType() {
     return GetDocument()
         .GetFrame()
@@ -117,6 +134,26 @@
   ScrollbarTheme& GetScrollbarTheme() {
     return GetDocument().GetPage()->GetScrollbarTheme();
   }
+
+ protected:
+  WebCoalescedInputEvent GenerateGestureEvent(WebInputEvent::Type type,
+                                              WebGestureDevice device,
+                                              const IntPoint& position,
+                                              ScrollOffset offset) {
+    WebGestureEvent event(type, WebInputEvent::kNoModifiers, CurrentTimeTicks(),
+                          device);
+
+    event.SetPositionInWidget(WebFloatPoint(position.X(), position.Y()));
+
+    if (type == WebInputEvent::kGestureScrollUpdate) {
+      event.data.scroll_update.delta_x = offset.Width();
+      event.data.scroll_update.delta_y = offset.Height();
+    } else if (type == WebInputEvent::kGestureScrollBegin) {
+      event.data.scroll_begin.delta_x_hint = offset.Width();
+      event.data.scroll_begin.delta_y_hint = offset.Height();
+    }
+    return WebCoalescedInputEvent(event);
+  }
 };
 
 class ScrollbarsTestWithVirtualTimer : public ScrollbarsTest {
@@ -2192,6 +2229,234 @@
   EXPECT_EQ(scrollbar->PressedPart(), ScrollbarPart::kNoPart);
 }
 
+TEST_F(ScrollbarsTest, UseCounterNegativeWhenThumbIsNotScrolledWithMouse) {
+  ScopedOverlayScrollbarsForTest overlay_scrollbars(false);
+  WebView().MainFrameWidget()->Resize(WebSize(200, 200));
+  SimRequest request("https://example.com/test.html", "text/html");
+  LoadURL("https://example.com/test.html");
+  request.Complete(R"HTML(
+    <!DOCTYPE html>
+    <style>
+     #content { height: 350px; width: 350px; }
+    </style>
+    <div id='scrollable'>
+     <div id='content'></div>
+    </div>
+  )HTML");
+  Compositor().BeginFrame();
+
+  ScrollableArea* scrollable_area =
+      WebView().MainFrameImpl()->GetFrameView()->LayoutViewport();
+  EXPECT_TRUE(scrollable_area->VerticalScrollbar());
+  EXPECT_TRUE(scrollable_area->HorizontalScrollbar());
+  Scrollbar* vertical_scrollbar = scrollable_area->VerticalScrollbar();
+  Scrollbar* horizontal_scrollbar = scrollable_area->HorizontalScrollbar();
+  EXPECT_EQ(vertical_scrollbar->PressedPart(), ScrollbarPart::kNoPart);
+  EXPECT_EQ(horizontal_scrollbar->PressedPart(), ScrollbarPart::kNoPart);
+
+  // Scrolling the page with a mouse wheel won't trigger the UseCounter.
+  WebView().MainFrameWidget()->HandleInputEvent(
+      GenerateWheelGestureEvent(WebInputEvent::kGestureScrollBegin,
+                                IntPoint(100, 100), ScrollOffset(0, -100)));
+  WebView().MainFrameWidget()->HandleInputEvent(
+      GenerateWheelGestureEvent(WebInputEvent::kGestureScrollUpdate,
+                                IntPoint(100, 100), ScrollOffset(0, -100)));
+  WebView().MainFrameWidget()->HandleInputEvent(GenerateWheelGestureEvent(
+      WebInputEvent::kGestureScrollEnd, IntPoint(100, 100)));
+  EXPECT_FALSE(UseCounter::IsCounted(
+      GetDocument(), WebFeature::kVerticalScrollbarThumbScrollingWithMouse));
+
+  // Hovering over the vertical scrollbar won't trigger the UseCounter.
+  HandleMouseMoveEvent(195, 5);
+  EXPECT_FALSE(UseCounter::IsCounted(
+      GetDocument(), WebFeature::kVerticalScrollbarThumbScrollingWithMouse));
+
+  // Hovering over the horizontal scrollbar won't trigger the UseCounter.
+  HandleMouseMoveEvent(5, 195);
+  EXPECT_FALSE(UseCounter::IsCounted(
+      GetDocument(), WebFeature::kHorizontalScrollbarThumbScrollingWithMouse));
+
+  // Clicking on the vertical scrollbar won't trigger the UseCounter.
+  HandleMousePressEvent(195, 175);
+  EXPECT_EQ(vertical_scrollbar->PressedPart(),
+            ScrollbarPart::kForwardTrackPart);
+  HandleMouseReleaseEvent(195, 175);
+  EXPECT_FALSE(UseCounter::IsCounted(
+      GetDocument(), WebFeature::kVerticalScrollbarThumbScrollingWithMouse));
+
+  // Clicking on the horizontal scrollbar won't trigger the UseCounter.
+  HandleMousePressEvent(175, 195);
+  EXPECT_EQ(horizontal_scrollbar->PressedPart(),
+            ScrollbarPart::kForwardTrackPart);
+  HandleMouseReleaseEvent(175, 195);
+  EXPECT_FALSE(UseCounter::IsCounted(
+      GetDocument(), WebFeature::kHorizontalScrollbarThumbScrollingWithMouse));
+
+  // Clicking outside the scrollbar and then releasing over the thumb of the
+  // vertical scrollbar won't trigger the UseCounter.
+  HandleMousePressEvent(50, 50);
+  HandleMouseMoveEvent(195, 5);
+  HandleMouseReleaseEvent(195, 5);
+  EXPECT_FALSE(UseCounter::IsCounted(
+      GetDocument(), WebFeature::kVerticalScrollbarThumbScrollingWithMouse));
+
+  // Clicking outside the scrollbar and then releasing over the thumb of the
+  // horizontal scrollbar won't trigger the UseCounter.
+  HandleMousePressEvent(50, 50);
+  HandleMouseMoveEvent(5, 195);
+  HandleMouseReleaseEvent(5, 195);
+  EXPECT_FALSE(UseCounter::IsCounted(
+      GetDocument(), WebFeature::kHorizontalScrollbarThumbScrollingWithMouse));
+}
+
+TEST_F(ScrollbarsTest, UseCounterPositiveWhenThumbIsScrolledWithMouse) {
+  ScopedOverlayScrollbarsForTest overlay_scrollbars(false);
+  WebView().MainFrameWidget()->Resize(WebSize(200, 200));
+  SimRequest request("https://example.com/test.html", "text/html");
+  LoadURL("https://example.com/test.html");
+  request.Complete(R"HTML(
+    <!DOCTYPE html>
+    <style>
+     #content { height: 350px; width: 350px; }
+    </style>
+    <div id='scrollable'>
+     <div id='content'></div>
+    </div>
+  )HTML");
+  Compositor().BeginFrame();
+
+  ScrollableArea* scrollable_area =
+      WebView().MainFrameImpl()->GetFrameView()->LayoutViewport();
+  EXPECT_TRUE(scrollable_area->VerticalScrollbar());
+  EXPECT_TRUE(scrollable_area->HorizontalScrollbar());
+  Scrollbar* vertical_scrollbar = scrollable_area->VerticalScrollbar();
+  Scrollbar* horizontal_scrollbar = scrollable_area->HorizontalScrollbar();
+  EXPECT_EQ(vertical_scrollbar->PressedPart(), ScrollbarPart::kNoPart);
+  EXPECT_EQ(horizontal_scrollbar->PressedPart(), ScrollbarPart::kNoPart);
+
+  // Clicking the thumb on the vertical scrollbar will trigger the UseCounter.
+  HandleMousePressEvent(195, 5);
+  EXPECT_EQ(vertical_scrollbar->PressedPart(), ScrollbarPart::kThumbPart);
+  HandleMouseReleaseEvent(195, 5);
+  EXPECT_TRUE(UseCounter::IsCounted(
+      GetDocument(), WebFeature::kVerticalScrollbarThumbScrollingWithMouse));
+
+  // Clicking the thumb on the horizontal scrollbar will trigger the UseCounter.
+  HandleMousePressEvent(5, 195);
+  EXPECT_EQ(horizontal_scrollbar->PressedPart(), ScrollbarPart::kThumbPart);
+  HandleMouseReleaseEvent(5, 195);
+  EXPECT_TRUE(UseCounter::IsCounted(
+      GetDocument(), WebFeature::kHorizontalScrollbarThumbScrollingWithMouse));
+}
+
+TEST_F(ScrollbarsTest, UseCounterNegativeWhenThumbIsNotScrolledWithTouch) {
+  ScopedOverlayScrollbarsForTest overlay_scrollbars(false);
+  WebView().MainFrameWidget()->Resize(WebSize(200, 200));
+  SimRequest request("https://example.com/test.html", "text/html");
+  LoadURL("https://example.com/test.html");
+  request.Complete(R"HTML(
+    <!DOCTYPE html>
+    <style>
+     #content { height: 350px; width: 350px; }
+    </style>
+    <div id='scrollable'>
+     <div id='content'></div>
+    </div>
+  )HTML");
+  Compositor().BeginFrame();
+
+  ScrollableArea* scrollable_area =
+      WebView().MainFrameImpl()->GetFrameView()->LayoutViewport();
+  EXPECT_TRUE(scrollable_area->VerticalScrollbar());
+  EXPECT_TRUE(scrollable_area->HorizontalScrollbar());
+  Scrollbar* vertical_scrollbar = scrollable_area->VerticalScrollbar();
+  Scrollbar* horizontal_scrollbar = scrollable_area->HorizontalScrollbar();
+  EXPECT_EQ(vertical_scrollbar->PressedPart(), ScrollbarPart::kNoPart);
+  EXPECT_EQ(horizontal_scrollbar->PressedPart(), ScrollbarPart::kNoPart);
+
+  // Tapping on the vertical scrollbar won't trigger the UseCounter.
+  WebView().MainFrameWidget()->HandleInputEvent(GenerateTouchGestureEvent(
+      WebInputEvent::kGestureTapDown, IntPoint(195, 175)));
+  EXPECT_EQ(vertical_scrollbar->PressedPart(),
+            ScrollbarPart::kForwardTrackPart);
+  WebView().MainFrameWidget()->HandleInputEvent(GenerateTouchGestureEvent(
+      WebInputEvent::kGestureTapCancel, IntPoint(195, 175)));
+  EXPECT_FALSE(UseCounter::IsCounted(
+      GetDocument(), WebFeature::kVerticalScrollbarThumbScrollingWithTouch));
+
+  // Tapping on the horizontal scrollbar won't trigger the UseCounter.
+  WebView().MainFrameWidget()->HandleInputEvent(GenerateTouchGestureEvent(
+      WebInputEvent::kGestureTapDown, IntPoint(175, 195)));
+  EXPECT_EQ(horizontal_scrollbar->PressedPart(),
+            ScrollbarPart::kForwardTrackPart);
+  WebView().MainFrameWidget()->HandleInputEvent(GenerateTouchGestureEvent(
+      WebInputEvent::kGestureTapCancel, IntPoint(175, 195)));
+  EXPECT_FALSE(UseCounter::IsCounted(
+      GetDocument(), WebFeature::kHorizontalScrollbarThumbScrollingWithTouch));
+
+  // Tapping outside the scrollbar and then releasing over the thumb of the
+  // vertical scrollbar won't trigger the UseCounter.
+  WebView().MainFrameWidget()->HandleInputEvent(GenerateTouchGestureEvent(
+      WebInputEvent::kGestureTapDown, IntPoint(50, 50)));
+  WebView().MainFrameWidget()->HandleInputEvent(GenerateTouchGestureEvent(
+      WebInputEvent::kGestureTapCancel, IntPoint(195, 5)));
+  EXPECT_FALSE(UseCounter::IsCounted(
+      GetDocument(), WebFeature::kVerticalScrollbarThumbScrollingWithTouch));
+
+  // Tapping outside the scrollbar and then releasing over the thumb of the
+  // horizontal scrollbar won't trigger the UseCounter.
+  WebView().MainFrameWidget()->HandleInputEvent(GenerateTouchGestureEvent(
+      WebInputEvent::kGestureTapDown, IntPoint(50, 50)));
+  WebView().MainFrameWidget()->HandleInputEvent(GenerateTouchGestureEvent(
+      WebInputEvent::kGestureTapCancel, IntPoint(5, 195)));
+  EXPECT_FALSE(UseCounter::IsCounted(
+      GetDocument(), WebFeature::kHorizontalScrollbarThumbScrollingWithTouch));
+}
+
+TEST_F(ScrollbarsTest, UseCounterPositiveWhenThumbIsScrolledWithTouch) {
+  ScopedOverlayScrollbarsForTest overlay_scrollbars(false);
+  WebView().MainFrameWidget()->Resize(WebSize(200, 200));
+  SimRequest request("https://example.com/test.html", "text/html");
+  LoadURL("https://example.com/test.html");
+  request.Complete(R"HTML(
+    <!DOCTYPE html>
+    <style>
+     #content { height: 350px; width: 350px; }
+    </style>
+    <div id='scrollable'>
+     <div id='content'></div>
+    </div>
+  )HTML");
+  Compositor().BeginFrame();
+
+  ScrollableArea* scrollable_area =
+      WebView().MainFrameImpl()->GetFrameView()->LayoutViewport();
+  EXPECT_TRUE(scrollable_area->VerticalScrollbar());
+  EXPECT_TRUE(scrollable_area->HorizontalScrollbar());
+  Scrollbar* vertical_scrollbar = scrollable_area->VerticalScrollbar();
+  Scrollbar* horizontal_scrollbar = scrollable_area->HorizontalScrollbar();
+  EXPECT_EQ(vertical_scrollbar->PressedPart(), ScrollbarPart::kNoPart);
+  EXPECT_EQ(horizontal_scrollbar->PressedPart(), ScrollbarPart::kNoPart);
+
+  // Clicking the thumb on the vertical scrollbar will trigger the UseCounter.
+  WebView().MainFrameWidget()->HandleInputEvent(GenerateTouchGestureEvent(
+      WebInputEvent::kGestureTapDown, IntPoint(195, 5)));
+  EXPECT_EQ(vertical_scrollbar->PressedPart(), ScrollbarPart::kThumbPart);
+  WebView().MainFrameWidget()->HandleInputEvent(GenerateTouchGestureEvent(
+      WebInputEvent::kGestureTapCancel, IntPoint(195, 5)));
+  EXPECT_TRUE(UseCounter::IsCounted(
+      GetDocument(), WebFeature::kVerticalScrollbarThumbScrollingWithTouch));
+
+  // Clicking the thumb on the horizontal scrollbar will trigger the UseCounter.
+  WebView().MainFrameWidget()->HandleInputEvent(GenerateTouchGestureEvent(
+      WebInputEvent::kGestureTapDown, IntPoint(5, 195)));
+  EXPECT_EQ(horizontal_scrollbar->PressedPart(), ScrollbarPart::kThumbPart);
+  WebView().MainFrameWidget()->HandleInputEvent(GenerateTouchGestureEvent(
+      WebInputEvent::kGestureTapCancel, IntPoint(5, 195)));
+  EXPECT_TRUE(UseCounter::IsCounted(
+      GetDocument(), WebFeature::kHorizontalScrollbarThumbScrollingWithTouch));
+}
+
 // For infinite scrolling page (load more content when scroll to bottom), user
 // press on scrollbar button should keep scrolling after content loaded.
 // Disable on Android since VirtualTime not work for Android.
diff --git a/third_party/blink/renderer/core/loader/form_submission.cc b/third_party/blink/renderer/core/loader/form_submission.cc
index 020052f..ba5186d 100644
--- a/third_party/blink/renderer/core/loader/form_submission.cc
+++ b/third_party/blink/renderer/core/loader/form_submission.cc
@@ -284,33 +284,28 @@
 
 FrameLoadRequest FormSubmission::CreateFrameLoadRequest(
     Document* origin_document) {
-  FrameLoadRequest frame_request(origin_document);
-
-  if (!target_.IsEmpty())
-    frame_request.SetFrameName(target_);
-
+  ResourceRequest resource_request(RequestURL());
   ClientNavigationReason reason = ClientNavigationReason::kFormSubmissionGet;
   if (method_ == FormSubmission::kPostMethod) {
     reason = ClientNavigationReason::kFormSubmissionPost;
-    frame_request.GetResourceRequest().SetHttpMethod(http_names::kPOST);
-    frame_request.GetResourceRequest().SetHttpBody(form_data_);
+    resource_request.SetHttpMethod(http_names::kPOST);
+    resource_request.SetHttpBody(form_data_);
 
     // construct some user headers if necessary
     if (boundary_.IsEmpty()) {
-      frame_request.GetResourceRequest().SetHTTPContentType(content_type_);
+      resource_request.SetHTTPContentType(content_type_);
     } else {
-      frame_request.GetResourceRequest().SetHTTPContentType(
-          content_type_ + "; boundary=" + boundary_);
+      resource_request.SetHTTPContentType(content_type_ +
+                                          "; boundary=" + boundary_);
     }
   }
+
+  FrameLoadRequest frame_request(origin_document, resource_request);
+  if (!target_.IsEmpty())
+    frame_request.SetFrameName(target_);
   frame_request.SetClientRedirectReason(reason);
-
-  frame_request.GetResourceRequest().SetUrl(RequestURL());
-
   frame_request.SetForm(form_);
-
   frame_request.SetTriggeringEventInfo(triggering_event_info_);
-
   return frame_request;
 }
 
diff --git a/third_party/blink/renderer/core/loader/frame_load_request.cc b/third_party/blink/renderer/core/loader/frame_load_request.cc
index 4872223..df9520a0 100644
--- a/third_party/blink/renderer/core/loader/frame_load_request.cc
+++ b/third_party/blink/renderer/core/loader/frame_load_request.cc
@@ -14,9 +14,6 @@
 
 namespace blink {
 
-FrameLoadRequest::FrameLoadRequest(Document* origin_document)
-    : FrameLoadRequest(origin_document, ResourceRequest()) {}
-
 FrameLoadRequest::FrameLoadRequest(Document* origin_document,
                                    const ResourceRequest& resource_request)
     : FrameLoadRequest(origin_document, resource_request, AtomicString()) {}
@@ -24,24 +21,11 @@
 FrameLoadRequest::FrameLoadRequest(Document* origin_document,
                                    const ResourceRequest& resource_request,
                                    const AtomicString& frame_name)
-    : FrameLoadRequest(origin_document,
-                       resource_request,
-                       frame_name,
-                       kCheckContentSecurityPolicy) {}
-
-FrameLoadRequest::FrameLoadRequest(
-    Document* origin_document,
-    const ResourceRequest& resource_request,
-    const AtomicString& frame_name,
-    ContentSecurityPolicyDisposition
-        should_check_main_world_content_security_policy)
     : origin_document_(origin_document),
       resource_request_(resource_request),
       frame_name_(frame_name),
       client_redirect_(ClientRedirectPolicy::kNotClientRedirect),
-      should_send_referrer_(kMaybeSendReferrer),
-      should_check_main_world_content_security_policy_(
-          should_check_main_world_content_security_policy) {
+      should_send_referrer_(kMaybeSendReferrer) {
   // These flags are passed to a service worker which controls the page.
   resource_request_.SetFetchRequestMode(
       network::mojom::FetchRequestMode::kNavigate);
@@ -53,6 +37,12 @@
   if (const WebInputEvent* input_event = CurrentInputEvent::Get())
     SetInputStartTime(input_event->TimeStamp());
 
+  should_check_main_world_content_security_policy_ =
+      origin_document &&
+              ContentSecurityPolicy::ShouldBypassMainWorld(origin_document)
+          ? kDoNotCheckContentSecurityPolicy
+          : kCheckContentSecurityPolicy;
+
   if (origin_document) {
     DCHECK(!resource_request_.RequestorOrigin());
     resource_request_.SetRequestorOrigin(origin_document->GetSecurityOrigin());
@@ -64,11 +54,6 @@
       origin_document->GetPublicURLManager().Resolve(
           resource_request.Url(), MakeRequest(&blob_url_token_->data));
     }
-
-    if (ContentSecurityPolicy::ShouldBypassMainWorld(origin_document)) {
-      should_check_main_world_content_security_policy_ =
-          kDoNotCheckContentSecurityPolicy;
-    }
   }
 }
 
diff --git a/third_party/blink/renderer/core/loader/frame_load_request.h b/third_party/blink/renderer/core/loader/frame_load_request.h
index e90111d..990eb619 100644
--- a/third_party/blink/renderer/core/loader/frame_load_request.h
+++ b/third_party/blink/renderer/core/loader/frame_load_request.h
@@ -45,15 +45,10 @@
   STACK_ALLOCATED();
 
  public:
-  explicit FrameLoadRequest(Document* origin_document);
   FrameLoadRequest(Document* origin_document, const ResourceRequest&);
   FrameLoadRequest(Document* origin_document,
                    const ResourceRequest&,
                    const AtomicString& frame_name);
-  FrameLoadRequest(Document* origin_document,
-                   const ResourceRequest&,
-                   const AtomicString& frame_name,
-                   ContentSecurityPolicyDisposition);
 
   Document* OriginDocument() const { return origin_document_.Get(); }
 
diff --git a/third_party/blink/renderer/core/page/chrome_client_impl_test.cc b/third_party/blink/renderer/core/page/chrome_client_impl_test.cc
index eaa57d3..4864d37 100644
--- a/third_party/blink/renderer/core/page/chrome_client_impl_test.cc
+++ b/third_party/blink/renderer/core/page/chrome_client_impl_test.cc
@@ -90,7 +90,7 @@
 TEST_F(CreateWindowTest, CreateWindowFromPausedPage) {
   ScopedPagePauser pauser;
   LocalFrame* frame = To<WebLocalFrameImpl>(main_frame_)->GetFrame();
-  FrameLoadRequest request(frame->GetDocument());
+  FrameLoadRequest request(frame->GetDocument(), ResourceRequest());
   request.SetNavigationPolicy(kNavigationPolicyNewForegroundTab);
   WebWindowFeatures features;
   EXPECT_EQ(nullptr, chrome_client_impl_->CreateWindow(
diff --git a/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor_test.cc b/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor_test.cc
index 0526d49..30dc3f2 100644
--- a/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor_test.cc
+++ b/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor_test.cc
@@ -417,7 +417,7 @@
   Text* text = ToText(GetDocument().getElementById("text")->firstChild());
   DocumentMarkerVector markers = GetDocument().Markers().MarkersFor(
       *text, DocumentMarker::MarkerTypes::TextMatch());
-  EXPECT_EQ(1u, markers.size());
+  ASSERT_EQ(1u, markers.size());
   EXPECT_EQ(0u, markers.at(0)->StartOffset());
   EXPECT_EQ(19u, markers.at(0)->EndOffset());
 }
@@ -451,7 +451,7 @@
   Text* text1 = ToText(GetDocument().getElementById("text1")->firstChild());
   DocumentMarkerVector markers = GetDocument().Markers().MarkersFor(
       *text1, DocumentMarker::MarkerTypes::TextMatch());
-  EXPECT_EQ(1u, markers.size());
+  ASSERT_EQ(1u, markers.size());
   EXPECT_EQ(10u, markers.at(0)->StartOffset());
   EXPECT_EQ(19u, markers.at(0)->EndOffset());
 
@@ -459,7 +459,7 @@
   Text* text2 = ToText(GetDocument().getElementById("text2")->firstChild());
   markers = GetDocument().Markers().MarkersFor(
       *text2, DocumentMarker::MarkerTypes::TextMatch());
-  EXPECT_EQ(1u, markers.size());
+  ASSERT_EQ(1u, markers.size());
   EXPECT_EQ(0u, markers.at(0)->StartOffset());
   EXPECT_EQ(22u, markers.at(0)->EndOffset());
 }
@@ -495,7 +495,7 @@
   Text* text1 = ToText(GetDocument().getElementById("text1")->firstChild());
   DocumentMarkerVector markers = GetDocument().Markers().MarkersFor(
       *text1, DocumentMarker::MarkerTypes::TextMatch());
-  EXPECT_EQ(1u, markers.size());
+  ASSERT_EQ(1u, markers.size());
   EXPECT_EQ(10u, markers.at(0)->StartOffset());
   EXPECT_EQ(19u, markers.at(0)->EndOffset());
 
@@ -503,7 +503,7 @@
   Text* text2 = ToText(GetDocument().getElementById("text2")->firstChild());
   markers = GetDocument().Markers().MarkersFor(
       *text2, DocumentMarker::MarkerTypes::TextMatch());
-  EXPECT_EQ(1u, markers.size());
+  ASSERT_EQ(1u, markers.size());
   EXPECT_EQ(0u, markers.at(0)->StartOffset());
   EXPECT_EQ(22u, markers.at(0)->EndOffset());
 }
@@ -569,7 +569,7 @@
   Text* text1 = ToText(GetDocument().getElementById("text1")->firstChild());
   DocumentMarkerVector markers = GetDocument().Markers().MarkersFor(
       *text1, DocumentMarker::MarkerTypes::TextMatch());
-  EXPECT_EQ(1u, markers.size());
+  ASSERT_EQ(1u, markers.size());
   EXPECT_EQ(10u, markers.at(0)->StartOffset());
   EXPECT_EQ(19u, markers.at(0)->EndOffset());
 
@@ -577,7 +577,7 @@
   Text* text2 = ToText(GetDocument().getElementById("text2")->firstChild());
   markers = GetDocument().Markers().MarkersFor(
       *text2, DocumentMarker::MarkerTypes::TextMatch());
-  EXPECT_EQ(2u, markers.size());
+  ASSERT_EQ(2u, markers.size());
   EXPECT_EQ(0u, markers.at(0)->StartOffset());
   EXPECT_EQ(4u, markers.at(0)->EndOffset());
   EXPECT_EQ(13u, markers.at(1)->StartOffset());
@@ -610,6 +610,242 @@
   EXPECT_EQ(2u, GetDocument().Markers().Markers().size());
 }
 
+// Test a text range with both context terms in the same element.
+TEST_F(TextFragmentAnchorTest, TextRangeWithContext) {
+  SimRequest request(
+      "https://example.com/test.html#targetText=this-,is,test,-page",
+      "text/html");
+  LoadURL("https://example.com/test.html#targetText=this-,is,test,-page");
+  request.Complete(R"HTML(
+    <!DOCTYPE html>
+    <p id="text">This is a test page</p>
+  )HTML");
+  Compositor().BeginFrame();
+
+  RunAsyncMatchingTasks();
+
+  EXPECT_EQ(1u, GetDocument().Markers().Markers().size());
+
+  // Expect marker on "is a test".
+  Text* text = ToText(GetDocument().getElementById("text")->firstChild());
+  DocumentMarkerVector markers = GetDocument().Markers().MarkersFor(
+      *text, DocumentMarker::MarkerTypes::TextMatch());
+  ASSERT_EQ(1u, markers.size());
+  EXPECT_EQ(5u, markers.at(0)->StartOffset());
+  EXPECT_EQ(14u, markers.at(0)->EndOffset());
+}
+
+// Ensure that we do not match a text range if the prefix is not found.
+TEST_F(TextFragmentAnchorTest, PrefixNotFound) {
+  SimRequest request(
+      "https://example.com/test.html#targetText=prefix-,is,test,-page",
+      "text/html");
+  LoadURL("https://example.com/test.html#targetText=prefix-,is,test,-page");
+  request.Complete(R"HTML(
+    <!DOCTYPE html>
+    <p id="text">This is a test page</p>
+  )HTML");
+  Compositor().BeginFrame();
+
+  RunAsyncMatchingTasks();
+
+  EXPECT_EQ(0u, GetDocument().Markers().Markers().size());
+}
+
+// Ensure that we do not match a text range if the suffix is not found.
+TEST_F(TextFragmentAnchorTest, SuffixNotFound) {
+  SimRequest request(
+      "https://example.com/test.html#targetText=this-,is,test,-suffix",
+      "text/html");
+  LoadURL("https://example.com/test.html#targetText=this-,is,test,-suffix");
+  request.Complete(R"HTML(
+    <!DOCTYPE html>
+    <p id="text">This is a test page</p>
+  )HTML");
+  Compositor().BeginFrame();
+
+  RunAsyncMatchingTasks();
+
+  EXPECT_EQ(0u, GetDocument().Markers().Markers().size());
+}
+
+// Test a text range with context terms in different elements
+TEST_F(TextFragmentAnchorTest, TextRangeWithCrossElementContext) {
+  SimRequest request(
+      "https://example.com/test.html#targetText=header%202-,a,text,-footer%201",
+      "text/html");
+  LoadURL(
+      "https://example.com/"
+      "test.html#targetText=header%202-,a,text,-footer%201");
+  request.Complete(R"HTML(
+    <!DOCTYPE html>
+    <h1>Header 1</h1>
+    <p>A string of text</p>
+    <p>Footer 1</p>
+    <h1>Header 2</h1>
+    <p id="expected">A string of text</p>
+    <p>Footer 1</p>
+    <h1>Header 2</h1>
+    <p>A string of text</p>
+    <p>Footer 2</p>
+  )HTML");
+  Compositor().BeginFrame();
+
+  RunAsyncMatchingTasks();
+
+  EXPECT_EQ(1u, GetDocument().Markers().Markers().size());
+
+  // Expect marker on the expected "A string of text".
+  Text* text = ToText(GetDocument().getElementById("expected")->firstChild());
+  DocumentMarkerVector markers = GetDocument().Markers().MarkersFor(
+      *text, DocumentMarker::MarkerTypes::TextMatch());
+  ASSERT_EQ(1u, markers.size());
+  EXPECT_EQ(0u, markers.at(0)->StartOffset());
+  EXPECT_EQ(16u, markers.at(0)->EndOffset());
+}
+
+// Test context terms separated by elements and whitespace
+TEST_F(TextFragmentAnchorTest, CrossElementAndWhitespaceContext) {
+  SimRequest request(
+      "https://example.com/"
+      "test.html#targetText=list%202-,cat,-good%20cat",
+      "text/html");
+  LoadURL(
+      "https://example.com/"
+      "test.html#targetText=list%202-,cat,-good%20cat");
+  request.Complete(R"HTML(
+    <!DOCTYPE html>
+    <h1> List 1 </h1>
+    <div>
+      <p>Cat</p>
+      <p>&nbsp;Good cat</p>
+    </div>
+    <h1> List 2 </h1>
+    <div>
+      <p id="expected">Cat</p>
+      <p>&nbsp;Good cat</p>
+    </div>
+    <h1> List 2 </h1>
+    <div>
+      <p>Cat</p>
+      <p>&nbsp;Bad cat</p>
+    </div>
+  )HTML");
+  Compositor().BeginFrame();
+
+  RunAsyncMatchingTasks();
+
+  EXPECT_EQ(1u, GetDocument().Markers().Markers().size());
+
+  // Expect marker on the expected "cat".
+  Text* text = ToText(GetDocument().getElementById("expected")->firstChild());
+  DocumentMarkerVector markers = GetDocument().Markers().MarkersFor(
+      *text, DocumentMarker::MarkerTypes::TextMatch());
+  ASSERT_EQ(1u, markers.size());
+  EXPECT_EQ(0u, markers.at(0)->StartOffset());
+  EXPECT_EQ(3u, markers.at(0)->EndOffset());
+}
+
+// Test context terms separated by empty sibling and parent elements
+TEST_F(TextFragmentAnchorTest, CrossEmptySiblingAndParentElementContext) {
+  SimRequest request(
+      "https://example.com/"
+      "test.html#targetText=prefix-,match,-suffix",
+      "text/html");
+  LoadURL(
+      "https://example.com/"
+      "test.html#targetText=prefix-,match,-suffix");
+  request.Complete(R"HTML(
+    <!DOCTYPE html>
+    <div>
+      <p>prefix</p>
+    <div>
+    <p><br>&nbsp;</p>
+    <div id="expected">match</div>
+    <p><br>&nbsp;</p>
+    <div>
+      <p>suffix</p>
+    <div>
+  )HTML");
+  Compositor().BeginFrame();
+
+  RunAsyncMatchingTasks();
+
+  EXPECT_EQ(1u, GetDocument().Markers().Markers().size());
+
+  // Expect marker on "match".
+  Text* text = ToText(GetDocument().getElementById("expected")->firstChild());
+  DocumentMarkerVector markers = GetDocument().Markers().MarkersFor(
+      *text, DocumentMarker::MarkerTypes::TextMatch());
+  ASSERT_EQ(1u, markers.size());
+  EXPECT_EQ(0u, markers.at(0)->StartOffset());
+  EXPECT_EQ(5u, markers.at(0)->EndOffset());
+}
+
+// Ensure we scroll to text when its prefix and suffix are out of view.
+TEST_F(TextFragmentAnchorTest, DistantElementContext) {
+  SimRequest request(
+      "https://example.com/test.html#targetText=prefix-,cats,-suffix",
+      "text/html");
+  LoadURL("https://example.com/test.html#targetText=prefix-,cats,-suffix");
+  request.Complete(R"HTML(
+    <!DOCTYPE html>
+    <style>
+      p {
+        margin-top: 3000px;
+      }
+    </style>
+    <p>Cats</p>
+    <p>Prefix</p>
+    <p id="text">Cats</p>
+    <p>Suffix</p>
+  )HTML");
+  Compositor().BeginFrame();
+
+  RunAsyncMatchingTasks();
+
+  Element& p = *GetDocument().getElementById("text");
+  EXPECT_TRUE(ViewportRect().Contains(BoundingRectInFrame(p)))
+      << "<p> Element wasn't scrolled into view, viewport's scroll offset: "
+      << LayoutViewport()->GetScrollOffset().ToString();
+  EXPECT_EQ(1u, GetDocument().Markers().Markers().size());
+}
+
+// Test specifying just one of the prefix and suffix
+TEST_F(TextFragmentAnchorTest, OneContextTerm) {
+  SimRequest request(
+      "https://example.com/"
+      "test.html#targetText=test-,page&targetText=page,-with%20real%20content",
+      "text/html");
+  LoadURL(
+      "https://example.com/"
+      "test.html#targetText=test-,page&targetText=page,-with%20real%20content");
+  request.Complete(R"HTML(
+    <!DOCTYPE html>
+    <p id="text1">This is a test page</p>
+    <p id="text2">Not a page with real content</p>
+  )HTML");
+  Compositor().BeginFrame();
+
+  RunAsyncMatchingTasks();
+
+  // Expect marker on the first "page"
+  Text* text1 = ToText(GetDocument().getElementById("text1")->firstChild());
+  DocumentMarkerVector markers = GetDocument().Markers().MarkersFor(
+      *text1, DocumentMarker::MarkerTypes::TextMatch());
+  ASSERT_EQ(1u, markers.size());
+  EXPECT_EQ(15u, markers.at(0)->StartOffset());
+  EXPECT_EQ(19u, markers.at(0)->EndOffset());
+
+  // Expect marker on the second "page"
+  Text* text2 = ToText(GetDocument().getElementById("text2")->firstChild());
+  markers = GetDocument().Markers().MarkersFor(
+      *text2, DocumentMarker::MarkerTypes::TextMatch());
+  ASSERT_EQ(1u, markers.size());
+  EXPECT_EQ(6u, markers.at(0)->StartOffset());
+  EXPECT_EQ(10u, markers.at(0)->EndOffset());
+}
+
 }  // namespace
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/page/scrolling/text_fragment_finder.cc b/third_party/blink/renderer/core/page/scrolling/text_fragment_finder.cc
index d19e1593..6ebccdd 100644
--- a/third_party/blink/renderer/core/page/scrolling/text_fragment_finder.cc
+++ b/third_party/blink/renderer/core/page/scrolling/text_fragment_finder.cc
@@ -11,6 +11,7 @@
 #include "third_party/blink/renderer/core/dom/range.h"
 #include "third_party/blink/renderer/core/editing/ephemeral_range.h"
 #include "third_party/blink/renderer/core/editing/finder/find_buffer.h"
+#include "third_party/blink/renderer/core/editing/iterators/character_iterator.h"
 #include "third_party/blink/renderer/core/editing/position.h"
 #include "third_party/blink/renderer/core/page/scrolling/text_fragment_selector.h"
 
@@ -18,41 +19,101 @@
 
 namespace {
 
-EphemeralRangeInFlatTree FindMatchFromPosition(
-    String search_text,
-    Document& document,
-    PositionInFlatTree search_start) {
+const char kNoContext[] = "";
+
+EphemeralRangeInFlatTree FindMatchInRange(String search_text,
+                                          PositionInFlatTree search_start,
+                                          PositionInFlatTree search_end) {
+  const FindOptions find_options = kCaseInsensitive;
+  const EphemeralRangeInFlatTree search_range(search_start, search_end);
+  return FindBuffer::FindMatchInRange(search_range, search_text, find_options);
+}
+
+PositionInFlatTree NextTextPosition(PositionInFlatTree position,
+                                    PositionInFlatTree end_position) {
+  const TextIteratorBehavior options =
+      TextIteratorBehavior::Builder().SetEmitsSpaceForNbsp(true).Build();
+  CharacterIteratorInFlatTree char_it(position, end_position, options);
+
+  for (; char_it.length(); char_it.Advance(1)) {
+    if (!IsSpaceOrNewline(char_it.CharacterAt(0)))
+      return char_it.StartPosition();
+  }
+
+  return end_position;
+}
+
+// Find and return the range of |search_text| if the first text in the search
+// range is |search_text|, skipping over whitespace and element boundaries.
+EphemeralRangeInFlatTree FindImmediateMatch(String search_text,
+                                            PositionInFlatTree search_start,
+                                            PositionInFlatTree search_end) {
   if (search_text.IsEmpty())
     return EphemeralRangeInFlatTree();
 
-  PositionInFlatTree search_end;
-  if (document.documentElement() && document.documentElement()->lastChild()) {
-    search_end =
-        PositionInFlatTree::AfterNode(*document.documentElement()->lastChild());
-  } else {
-    search_end = PositionInFlatTree::LastPositionInNode(document);
+  search_start = NextTextPosition(search_start, search_end);
+  if (search_start == search_end)
+    return EphemeralRangeInFlatTree();
+
+  FindBuffer buffer(EphemeralRangeInFlatTree(search_start, search_end));
+  const FindOptions find_options = kCaseInsensitive;
+
+  std::unique_ptr<FindBuffer::Results> match_results =
+      buffer.FindMatches(search_text, find_options);
+
+  if (!match_results->IsEmpty() && match_results->front().start == 0u) {
+    FindBuffer::BufferMatchResult match = match_results->front();
+    return buffer.RangeFromBufferIndex(match.start, match.start + match.length);
   }
 
+  return EphemeralRangeInFlatTree();
+}
+
+EphemeralRangeInFlatTree FindMatchInRangeWithContext(
+    const String& search_text,
+    const String& prefix,
+    const String& suffix,
+    PositionInFlatTree search_start,
+    PositionInFlatTree search_end) {
   while (search_start != search_end) {
-    // Find in the whole block.
-    FindBuffer buffer(EphemeralRangeInFlatTree(search_start, search_end));
-    const FindOptions find_options = kCaseInsensitive;
+    EphemeralRangeInFlatTree potential_match;
 
-    std::unique_ptr<FindBuffer::Results> match_results =
-        buffer.FindMatches(search_text, find_options);
+    if (!prefix.IsEmpty()) {
+      EphemeralRangeInFlatTree prefix_match =
+          FindMatchInRange(prefix, search_start, search_end);
 
-    if (!match_results->IsEmpty()) {
-      FindBuffer::BufferMatchResult match = match_results->front();
-      return buffer.RangeFromBufferIndex(match.start,
-                                         match.start + match.length);
+      // No prefix_match in remaining range
+      if (prefix_match.IsNull())
+        return EphemeralRangeInFlatTree();
+
+      search_start = prefix_match.EndPosition();
+      potential_match =
+          FindImmediateMatch(search_text, search_start, search_end);
+
+      // No search_text match after current prefix_match
+      if (potential_match.IsNull())
+        continue;
+    } else {
+      potential_match = FindMatchInRange(search_text, search_start, search_end);
+
+      // No search_text match in remaining range
+      if (potential_match.IsNull())
+        return EphemeralRangeInFlatTree();
     }
 
-    // At this point, all text in the block collected above has been
-    // processed. Now we move to the next block if there's any,
-    // otherwise we should stop.
-    search_start = buffer.PositionAfterBlock();
-    if (search_start.IsNull())
-      break;
+    DCHECK(potential_match.IsNotNull());
+    search_start = potential_match.EndPosition();
+    if (!suffix.IsEmpty()) {
+      EphemeralRangeInFlatTree suffix_match =
+          FindImmediateMatch(suffix, search_start, search_end);
+
+      // No suffix match after current potential_match
+      if (suffix_match.IsNull())
+        continue;
+    }
+
+    // If we reach here without a return or continue, we have a full match.
+    return potential_match;
   }
 
   return EphemeralRangeInFlatTree();
@@ -67,27 +128,45 @@
 }
 
 void TextFragmentFinder::FindMatch(Document& document) {
-  // TODO(crbug.com/930156): Make FindMatch work asynchronously.
-  EphemeralRangeInFlatTree start_match =
-      FindMatchFromPosition(selector_.Start(), document,
-                            PositionInFlatTree::FirstPositionInNode(document));
-  if (start_match.IsNull())
-    return;
-
-  if (selector_.End().IsEmpty()) {
-    client_.DidFindMatch(start_match);
+  PositionInFlatTree search_start =
+      PositionInFlatTree::FirstPositionInNode(document);
+  PositionInFlatTree search_end;
+  if (document.documentElement() && document.documentElement()->lastChild()) {
+    search_end =
+        PositionInFlatTree::AfterNode(*document.documentElement()->lastChild());
   } else {
+    search_end = PositionInFlatTree::LastPositionInNode(document);
+  }
+
+  // TODO(crbug.com/930156): Make FindMatch work asynchronously.
+  EphemeralRangeInFlatTree match;
+  if (selector_.Type() == TextFragmentSelector::kExact) {
+    match = FindMatchInRangeWithContext(selector_.Start(), selector_.Prefix(),
+                                        selector_.Suffix(), search_start,
+                                        search_end);
+  } else {
+    EphemeralRangeInFlatTree start_match =
+        FindMatchInRangeWithContext(selector_.Start(), selector_.Prefix(),
+                                    kNoContext, search_start, search_end);
+    if (start_match.IsNull())
+      return;
+
     // TODO(crbug.com/924964): Determine what we should do if the start text and
     // end text are the same (and there are no context terms). This
     // implementation continues searching for the next instance of the text,
     // from the end of the first instance.
-    EphemeralRangeInFlatTree end_match = FindMatchFromPosition(
-        selector_.End(), document, start_match.EndPosition());
-    if (!end_match.IsNull()) {
-      client_.DidFindMatch(EphemeralRangeInFlatTree(start_match.StartPosition(),
-                                                    end_match.EndPosition()));
+    search_start = start_match.EndPosition();
+    EphemeralRangeInFlatTree end_match = FindMatchInRangeWithContext(
+        selector_.End(), kNoContext, selector_.Suffix(), search_start,
+        search_end);
+    if (end_match.IsNotNull()) {
+      match = EphemeralRangeInFlatTree(start_match.StartPosition(),
+                                       end_match.EndPosition());
     }
   }
+
+  if (match.IsNotNull())
+    client_.DidFindMatch(match);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/page/scrolling/text_fragment_selector.cc b/third_party/blink/renderer/core/page/scrolling/text_fragment_selector.cc
index b4ac4b79..57f61ae 100644
--- a/third_party/blink/renderer/core/page/scrolling/text_fragment_selector.cc
+++ b/third_party/blink/renderer/core/page/scrolling/text_fragment_selector.cc
@@ -7,11 +7,47 @@
 
 namespace blink {
 
-TextFragmentSelector TextFragmentSelector::Create(const String& target_text) {
+namespace {
+
+// The prefix and suffix terms are specified to begin/end with a '-' character.
+// These methods will find the prefix/suffix and return it without the '-', and
+// remove the prefix/suffix from the |target_text| string. If not found, we
+// return an empty string to indicate no prefix/suffix was specified or it
+// was malformed and should be ignored.
+String ExtractPrefix(String* target_text) {
+  size_t comma_pos = target_text->find(',');
+  size_t hyphen_pos = target_text->find('-');
+
+  if (hyphen_pos != kNotFound && hyphen_pos == comma_pos - 1) {
+    String prefix = target_text->Substring(0, hyphen_pos);
+    target_text->Remove(0, comma_pos + 1);
+    return prefix;
+  }
+  return "";
+}
+
+String ExtractSuffix(String* target_text) {
+  size_t last_comma_pos = target_text->ReverseFind(',');
+  size_t last_hyphen_pos = target_text->ReverseFind('-');
+
+  if (last_hyphen_pos != kNotFound && last_hyphen_pos == last_comma_pos + 1) {
+    String suffix = target_text->Substring(last_hyphen_pos + 1);
+    target_text->Truncate(last_comma_pos);
+    return suffix;
+  }
+  return "";
+}
+
+}  // namespace
+
+TextFragmentSelector TextFragmentSelector::Create(String target_text) {
   SelectorType type;
   String start;
   String end;
 
+  String prefix = ExtractPrefix(&target_text);
+  String suffix = ExtractSuffix(&target_text);
+
   size_t comma_pos = target_text.find(',');
 
   if (comma_pos == kNotFound) {
@@ -26,12 +62,16 @@
 
   return TextFragmentSelector(
       type, DecodeURLEscapeSequences(start, DecodeURLMode::kUTF8),
-      DecodeURLEscapeSequences(end, DecodeURLMode::kUTF8));
+      DecodeURLEscapeSequences(end, DecodeURLMode::kUTF8),
+      DecodeURLEscapeSequences(prefix, DecodeURLMode::kUTF8),
+      DecodeURLEscapeSequences(suffix, DecodeURLMode::kUTF8));
 }
 
 TextFragmentSelector::TextFragmentSelector(SelectorType type,
-                                           String start,
-                                           String end)
-    : type_(type), start_(start), end_(end) {}
+                                           const String& start,
+                                           const String& end,
+                                           const String& prefix,
+                                           const String& suffix)
+    : type_(type), start_(start), end_(end), prefix_(prefix), suffix_(suffix) {}
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/page/scrolling/text_fragment_selector.h b/third_party/blink/renderer/core/page/scrolling/text_fragment_selector.h
index a10d0cf9..bcc2ecc 100644
--- a/third_party/blink/renderer/core/page/scrolling/text_fragment_selector.h
+++ b/third_party/blink/renderer/core/page/scrolling/text_fragment_selector.h
@@ -14,7 +14,7 @@
 // TextFragmentAnchor, parsed into its components.
 class CORE_EXPORT TextFragmentSelector final {
  public:
-  static TextFragmentSelector Create(const String& target_text);
+  static TextFragmentSelector Create(String target_text);
 
   enum SelectorType {
     // An exact selector on the string start_.
@@ -23,17 +23,25 @@
     kRange,
   };
 
-  TextFragmentSelector(SelectorType type, String start, String end);
+  TextFragmentSelector(SelectorType type,
+                       const String& start,
+                       const String& end,
+                       const String& prefix,
+                       const String& suffix);
   ~TextFragmentSelector() = default;
 
   SelectorType Type() const { return type_; }
   String Start() const { return start_; }
   String End() const { return end_; }
+  String Prefix() const { return prefix_; }
+  String Suffix() const { return suffix_; }
 
  private:
   const SelectorType type_;
   String start_;
   String end_;
+  String prefix_;
+  String suffix_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/paint/image_paint_timing_detector_test.cc b/third_party/blink/renderer/core/paint/image_paint_timing_detector_test.cc
index e4e84ac..5a13c44 100644
--- a/third_party/blink/renderer/core/paint/image_paint_timing_detector_test.cc
+++ b/third_party/blink/renderer/core/paint/image_paint_timing_detector_test.cc
@@ -208,6 +208,23 @@
   EXPECT_TRUE(record->loaded);
 }
 
+TEST_F(ImagePaintTimingDetectorTest, LargestImagePaint_OpacityZero) {
+  SetBodyInnerHTML(R"HTML(
+    <style>
+    img {
+      opacity: 0;
+    }
+    </style>
+    <img id="target"></img>
+  )HTML");
+  SetImageAndPaint("target", 5, 5);
+  UpdateAllLifecyclePhasesAndInvokeCallbackIfAny();
+  EXPECT_EQ(CountVisibleImageRecords(), 0u);
+  EXPECT_EQ(CountVisibleBackgroundImageRecords(), 0u);
+  ImageRecord* record = FindLargestPaintCandidate();
+  EXPECT_FALSE(record);
+}
+
 TEST_F(ImagePaintTimingDetectorTest,
        IgnoreImageUntilInvalidatedRectSizeNonZero) {
   SetBodyInnerHTML(R"HTML(
diff --git a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc
index 67ef788..cabd4a9f 100644
--- a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc
+++ b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc
@@ -2832,7 +2832,8 @@
 
 void PaintLayerScrollableArea::DidScrollWithScrollbar(
     ScrollbarPart part,
-    ScrollbarOrientation orientation) {
+    ScrollbarOrientation orientation,
+    WebInputEvent::Type type) {
   WebFeature scrollbar_use_uma;
   switch (part) {
     case kBackButtonStartPart:
@@ -2861,7 +2862,26 @@
       return;
   }
 
-  UseCounter::Count(GetLayoutBox()->GetDocument(), scrollbar_use_uma);
+  Document& document = GetLayoutBox()->GetDocument();
+
+  // TODO(alpastew): Remove the UseCounters kScrollbarUseVerticalScrollbarThumb
+  // and kScrollbarUseHorizontalScrollbarThumb to avoid redundancy in metrics.
+  UseCounter::Count(document, scrollbar_use_uma);
+
+  if (scrollbar_use_uma == WebFeature::kScrollbarUseVerticalScrollbarThumb) {
+    WebFeature input_specific_uma =
+        (WebInputEvent::IsMouseEventType(type)
+             ? WebFeature::kVerticalScrollbarThumbScrollingWithMouse
+             : WebFeature::kVerticalScrollbarThumbScrollingWithTouch);
+    UseCounter::Count(document, input_specific_uma);
+  } else if (scrollbar_use_uma ==
+             WebFeature::kScrollbarUseHorizontalScrollbarThumb) {
+    WebFeature input_specific_uma =
+        (WebInputEvent::IsMouseEventType(type)
+             ? WebFeature::kHorizontalScrollbarThumbScrollingWithMouse
+             : WebFeature::kHorizontalScrollbarThumbScrollingWithTouch);
+    UseCounter::Count(document, input_specific_uma);
+  }
 }
 
 CompositorElementId PaintLayerScrollableArea::GetCompositorElementId() const {
diff --git a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h
index 41b18f68..23c5038 100644
--- a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h
+++ b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h
@@ -538,7 +538,9 @@
   // Should be called when the previous visual rects are no longer valid.
   void ClearPreviousVisualRects();
 
-  void DidScrollWithScrollbar(ScrollbarPart, ScrollbarOrientation) override;
+  void DidScrollWithScrollbar(ScrollbarPart,
+                              ScrollbarOrientation,
+                              WebInputEvent::Type) override;
   CompositorElementId GetCompositorElementId() const override;
 
   bool VisualViewportSuppliesScrollbars() const override;
diff --git a/third_party/blink/renderer/core/paint/paint_timing_detector.cc b/third_party/blink/renderer/core/paint/paint_timing_detector.cc
index 2aad79c..20b1d48 100644
--- a/third_party/blink/renderer/core/paint/paint_timing_detector.cc
+++ b/third_party/blink/renderer/core/paint/paint_timing_detector.cc
@@ -79,6 +79,8 @@
     return;
   if (!cached_image)
     return;
+  if (!object->HasNonZeroEffectiveOpacity())
+    return;
   PaintTimingDetector& detector = frame_view->GetPaintTimingDetector();
   detector.GetImagePaintTimingDetector().RecordBackgroundImage(
       *object, image->Size(), cached_image, current_paint_chunk_properties);
@@ -95,6 +97,8 @@
     return;
   if (!cached_image)
     return;
+  if (!object.HasNonZeroEffectiveOpacity())
+    return;
   PaintTimingDetector& detector = frame_view->GetPaintTimingDetector();
   detector.GetImagePaintTimingDetector().RecordImage(
       object, intrinsic_size, cached_image, current_paint_chunk_properties);
@@ -107,6 +111,8 @@
   LocalFrameView* frame_view = object.GetFrameView();
   if (!frame_view)
     return;
+  if (!object.HasNonZeroEffectiveOpacity())
+    return;
   PaintTimingDetector& detector = frame_view->GetPaintTimingDetector();
   detector.GetTextPaintTimingDetector().RecordText(
       object, current_paint_chunk_properties);
diff --git a/third_party/blink/renderer/core/paint/text_paint_timing_detector_test.cc b/third_party/blink/renderer/core/paint/text_paint_timing_detector_test.cc
index 6f36791..e5a101d 100644
--- a/third_party/blink/renderer/core/paint/text_paint_timing_detector_test.cc
+++ b/third_party/blink/renderer/core/paint/text_paint_timing_detector_test.cc
@@ -169,6 +169,19 @@
   EXPECT_EQ(TextRecordOfLargestTextPaint()->node_id, NodeIdOfText(only_text));
 }
 
+TEST_F(TextPaintTimingDetectorTest, LargestTextPaint_OpacityZero) {
+  SetBodyInnerHTML(R"HTML(
+    <style>
+    div {
+      opacity: 0;
+    }
+    </style>
+  )HTML");
+  AppendDivElementToBody("The only text");
+  UpdateAllLifecyclePhasesAndSimulateSwapTime();
+  EXPECT_EQ(CountVisibleTexts(), 0u);
+}
+
 TEST_F(TextPaintTimingDetectorTest, NodeRemovedBeforeAssigningSwapTime) {
   SetBodyInnerHTML(R"HTML(
     <div id="parent">
diff --git a/third_party/blink/renderer/core/scroll/scrollable_area.h b/third_party/blink/renderer/core/scroll/scrollable_area.h
index d2dde161..fcd745d 100644
--- a/third_party/blink/renderer/core/scroll/scrollable_area.h
+++ b/third_party/blink/renderer/core/scroll/scrollable_area.h
@@ -391,7 +391,9 @@
   virtual bool RestoreScrollAnchor(const SerializedAnchor&) { return false; }
   virtual ScrollAnchor* GetScrollAnchor() { return nullptr; }
 
-  virtual void DidScrollWithScrollbar(ScrollbarPart, ScrollbarOrientation) {}
+  virtual void DidScrollWithScrollbar(ScrollbarPart,
+                                      ScrollbarOrientation,
+                                      WebInputEvent::Type) {}
 
   // Returns the task runner to be used for scrollable area timers.
   // Ideally a frame-specific throttled one can be used.
diff --git a/third_party/blink/renderer/core/scroll/scrollbar.cc b/third_party/blink/renderer/core/scroll/scrollbar.cc
index cfae1db..51e9d5a 100644
--- a/third_party/blink/renderer/core/scroll/scrollbar.cc
+++ b/third_party/blink/renderer/core/scroll/scrollbar.cc
@@ -328,7 +328,7 @@
   hovered_part_ = part;
 }
 
-void Scrollbar::SetPressedPart(ScrollbarPart part) {
+void Scrollbar::SetPressedPart(ScrollbarPart part, WebInputEvent::Type type) {
   if (pressed_part_ != kNoPart
       // When we no longer have a pressed part, we can start drawing a hovered
       // state on the hovered part.
@@ -336,8 +336,8 @@
     SetNeedsPaintInvalidation(
         static_cast<ScrollbarPart>(pressed_part_ | hovered_part_ | part));
 
-  if (GetScrollableArea())
-    GetScrollableArea()->DidScrollWithScrollbar(part, Orientation());
+  if (GetScrollableArea() && part != kNoPart)
+    GetScrollableArea()->DidScrollWithScrollbar(part, Orientation(), type);
 
   pressed_part_ = part;
 }
@@ -348,7 +348,7 @@
   switch (evt.GetType()) {
     case WebInputEvent::kGestureTapDown: {
       IntPoint position = FlooredIntPoint(evt.PositionInRootFrame());
-      SetPressedPart(GetTheme().HitTest(*this, position));
+      SetPressedPart(GetTheme().HitTest(*this, position), evt.GetType());
       pressed_pos_ = Orientation() == kHorizontalScrollbar
                          ? ConvertFromRootFrame(position).X()
                          : ConvertFromRootFrame(position).Y();
@@ -367,7 +367,7 @@
           // Update the state on GSB for touchpad since GestureTapDown
           // is not generated by that device. Touchscreen uses the tap down
           // gesture since the scrollbar enters a visual active state.
-          SetPressedPart(kNoPart);
+          SetPressedPart(kNoPart, evt.GetType());
           pressed_pos_ = 0;
           return false;
         case WebGestureDevice::kTouchscreen:
@@ -403,7 +403,7 @@
     case WebInputEvent::kGestureFlingStart:
       scroll_pos_ = 0;
       pressed_pos_ = 0;
-      SetPressedPart(kNoPart);
+      SetPressedPart(kNoPart, evt.GetType());
       return false;
     case WebInputEvent::kGestureTap: {
       if (pressed_part_ != kThumbPart && pressed_part_ != kNoPart &&
@@ -417,7 +417,7 @@
       }
       scroll_pos_ = 0;
       pressed_pos_ = 0;
-      SetPressedPart(kNoPart);
+      SetPressedPart(kNoPart, evt.GetType());
       return false;
     }
     default:
@@ -484,7 +484,7 @@
 
 void Scrollbar::MouseUp(const WebMouseEvent& mouse_event) {
   bool is_captured = pressed_part_ == kThumbPart;
-  SetPressedPart(kNoPart);
+  SetPressedPart(kNoPart, mouse_event.GetType());
   pressed_pos_ = 0;
   dragging_document_ = false;
   StopTimerIfNeeded();
@@ -509,7 +509,7 @@
     return;
 
   IntPoint position = FlooredIntPoint(evt.PositionInRootFrame());
-  SetPressedPart(GetTheme().HitTest(*this, position));
+  SetPressedPart(GetTheme().HitTest(*this, position), evt.GetType());
   int pressed_pos = Orientation() == kHorizontalScrollbar
                         ? ConvertFromRootFrame(position).X()
                         : ConvertFromRootFrame(position).Y();
@@ -517,7 +517,7 @@
   if ((pressed_part_ == kBackTrackPart || pressed_part_ == kForwardTrackPart) &&
       GetTheme().ShouldCenterOnThumb(*this, evt)) {
     SetHoveredPart(kThumbPart);
-    SetPressedPart(kThumbPart);
+    SetPressedPart(kThumbPart, evt.GetType());
     drag_origin_ = current_pos_;
     int thumb_len = GetTheme().ThumbLength(*this);
     int desired_pos = pressed_pos;
diff --git a/third_party/blink/renderer/core/scroll/scrollbar.h b/third_party/blink/renderer/core/scroll/scrollbar.h
index a231d19..8b86ad3 100644
--- a/third_party/blink/renderer/core/scroll/scrollbar.h
+++ b/third_party/blink/renderer/core/scroll/scrollbar.h
@@ -116,7 +116,7 @@
   int PressedPos() const { return pressed_pos_; }
 
   virtual void SetHoveredPart(ScrollbarPart);
-  virtual void SetPressedPart(ScrollbarPart);
+  virtual void SetPressedPart(ScrollbarPart, WebInputEvent::Type);
 
   void SetProportion(int visible_size, int total_size);
   void SetPressedPos(int p) { pressed_pos_ = p; }
diff --git a/third_party/blink/renderer/core/scroll/scrollbar_theme_overlay_test.cc b/third_party/blink/renderer/core/scroll/scrollbar_theme_overlay_test.cc
index f23a44cc..e7ad2998 100644
--- a/third_party/blink/renderer/core/scroll/scrollbar_theme_overlay_test.cc
+++ b/third_party/blink/renderer/core/scroll/scrollbar_theme_overlay_test.cc
@@ -93,7 +93,7 @@
   mock_scrollable_area->ClearNeedsPaintInvalidationForScrollControls();
 
   // Pressing down should also cause an invalidation.
-  vertical_scrollbar->SetPressedPart(kThumbPart);
+  vertical_scrollbar->SetPressedPart(kThumbPart, WebInputEvent::kMouseDown);
   EXPECT_TRUE(vertical_scrollbar->ThumbNeedsRepaint());
   EXPECT_TRUE(mock_scrollable_area->VerticalScrollbarNeedsPaintInvalidation());
 
@@ -101,7 +101,7 @@
   mock_scrollable_area->ClearNeedsPaintInvalidationForScrollControls();
 
   // Release should cause invalidation.
-  vertical_scrollbar->SetPressedPart(kNoPart);
+  vertical_scrollbar->SetPressedPart(kNoPart, WebInputEvent::kMouseDown);
   EXPECT_TRUE(vertical_scrollbar->ThumbNeedsRepaint());
   EXPECT_TRUE(mock_scrollable_area->VerticalScrollbarNeedsPaintInvalidation());
 
diff --git a/third_party/blink/renderer/devtools/front_end/profiler/IsolateSelector.js b/third_party/blink/renderer/devtools/front_end/profiler/IsolateSelector.js
index eccc2ea8..ee2bcda8 100644
--- a/third_party/blink/renderer/devtools/front_end/profiler/IsolateSelector.js
+++ b/third_party/blink/renderer/devtools/front_end/profiler/IsolateSelector.js
@@ -8,7 +8,7 @@
  */
 Profiler.IsolateSelector = class extends UI.VBox {
   constructor() {
-    super(true);
+    super(false);
 
     /** @type {!UI.ListModel<!Profiler.IsolateSelector.ListItem>} */
     this._items = new UI.ListModel();
@@ -16,12 +16,18 @@
     this._list = new UI.ListControl(this._items, this, UI.ListMode.NonViewport);
     this.contentElement.appendChild(this._list.element);
 
-    this.registerRequiredCSS('profiler/profileLauncherView.css');
     /** @type {!Map<!SDK.IsolateManager.Isolate, !Profiler.IsolateSelector.ListItem>} */
     this._itemByIsolate = new Map();
 
-    SDK.isolateManager.observeIsolates(this);
+    this._totalElement = createElementWithClass('div', 'profile-memory-usage-item hbox');
+    this._totalValueDiv = this._totalElement.createChild('div', 'profile-memory-usage-item-size');
+    this._totalTrendDiv = this._totalElement.createChild('div', 'profile-memory-usage-item-trend');
+    this._totalElement.createChild('div').textContent = ls`Total JS heap size`;
+    const trendIntervalMinutes = Math.round(SDK.IsolateManager.MemoryTrendWindowMs / 60e3);
+    this._totalTrendDiv.title = ls`Total page JS heap size change trend over the last ${trendIntervalMinutes} minutes.`;
+    this._totalValueDiv.title = ls`Total page JS heap size across all VM instances.`;
 
+    SDK.isolateManager.observeIsolates(this);
     SDK.targetManager.addEventListener(SDK.TargetManager.Events.NameChanged, this._targetChanged, this);
     SDK.targetManager.addEventListener(SDK.TargetManager.Events.InspectedURLChanged, this._targetChanged, this);
   }
@@ -97,6 +103,40 @@
     const listItem = this._itemByIsolate.get(isolate);
     if (listItem)
       listItem.updateStats();
+    this._updateTotal();
+  }
+
+  _updateTotal() {
+    let total = 0;
+    let trend = 0;
+    for (const isolate of SDK.isolateManager.isolates()) {
+      total += isolate.usedHeapSize();
+      trend += isolate.usedHeapSizeGrowRate();
+    }
+    this._totalValueDiv.textContent = Number.bytesToString(total);
+    Profiler.IsolateSelector._formatTrendElement(trend, this._totalTrendDiv);
+  }
+
+  /**
+   * @param {number} trendValueMs
+   * @param {!Element} element
+   */
+  static _formatTrendElement(trendValueMs, element) {
+    const changeRateBytesPerSecond = trendValueMs * 1e3;
+    const changeRateThresholdBytesPerSecond = 1024;
+    if (Math.abs(changeRateBytesPerSecond) < changeRateThresholdBytesPerSecond)
+      return;
+    const changeRateText = Number.bytesToString(Math.abs(changeRateBytesPerSecond));
+    const changeText = changeRateBytesPerSecond > 0 ? ls`\u2B06${changeRateText}/s` : ls`\u2B07${changeRateText}/s`;
+    element.classList.toggle('increasing', changeRateBytesPerSecond > 0);
+    element.textContent = changeText;
+  }
+
+  /**
+   * @return {!Element}
+   */
+  totalMemoryElement() {
+    return this._totalElement;
   }
 
   /**
@@ -143,6 +183,7 @@
   }
 
   _update() {
+    this._updateTotal();
     this._list.invalidateRange(0, this._items.length);
   }
 };
@@ -154,12 +195,12 @@
   constructor(isolate) {
     this._isolate = isolate;
     const trendIntervalMinutes = Math.round(SDK.IsolateManager.MemoryTrendWindowMs / 60e3);
-    this.element = createElementWithClass('div', 'profile-isolate-item hbox');
-    this._heapDiv = this.element.createChild('div', 'profile-isolate-item-heap');
-    this._trendDiv = this.element.createChild('div', 'profile-isolate-item-trend');
-    this._trendDiv.setAttribute('title', ls`Heap size change trend over the last ${trendIntervalMinutes} minutes.`);
-    this._nameDiv = this.element.createChild('div', 'profile-isolate-item-name');
-    this._heapDiv.setAttribute('title', ls`Heap size in use by live JS objects.`);
+    this.element = createElementWithClass('div', 'profile-memory-usage-item hbox');
+    this._heapDiv = this.element.createChild('div', 'profile-memory-usage-item-size');
+    this._trendDiv = this.element.createChild('div', 'profile-memory-usage-item-trend');
+    this._nameDiv = this.element.createChild('div', 'profile-memory-usage-item-name');
+    this._heapDiv.title = ls`Heap size in use by live JS objects.`;
+    this._trendDiv.title = ls`Heap size change trend over the last ${trendIntervalMinutes} minutes.`;
     this.updateTitle();
   }
 
@@ -171,18 +212,8 @@
   }
 
   updateStats() {
-    this._heapDiv.removeChildren();
     this._heapDiv.textContent = Number.bytesToString(this._isolate.usedHeapSize());
-
-    const changeRateBytesPerSecond = this._isolate.usedHeapSizeGrowRate() * 1e3;
-    const changeRateThresholdBytesPerSecond = 1024;
-    if (Math.abs(changeRateBytesPerSecond) < changeRateThresholdBytesPerSecond || this._isolate.samplesCount() < 5)
-      return;
-    const changeRateText = changeRateBytesPerSecond > 0 ?
-        ls`\u2B06${Number.bytesToString(changeRateBytesPerSecond)}/s` :
-        ls`\u2B07${Number.bytesToString(-changeRateBytesPerSecond)}/s`;
-    this._trendDiv.classList.toggle('increasing', changeRateBytesPerSecond > 0);
-    this._trendDiv.textContent = changeRateText;
+    Profiler.IsolateSelector._formatTrendElement(this._isolate.usedHeapSizeGrowRate(), this._trendDiv);
   }
 
   updateTitle() {
diff --git a/third_party/blink/renderer/devtools/front_end/profiler/ProfileLauncherView.js b/third_party/blink/renderer/devtools/front_end/profiler/ProfileLauncherView.js
index 9b201bf6..b78bc66 100644
--- a/third_party/blink/renderer/devtools/front_end/profiler/ProfileLauncherView.js
+++ b/third_party/blink/renderer/devtools/front_end/profiler/ProfileLauncherView.js
@@ -37,15 +37,20 @@
    */
   constructor(profilesPanel) {
     super();
+    this.registerRequiredCSS('profiler/profileLauncherView.css');
+
     this._panel = profilesPanel;
     this.element.classList.add('profile-launcher-view');
 
+    const isolateSelector = new Profiler.IsolateSelector();
     this._contentElement = this.element.createChild('div', 'profile-launcher-view-content');
     this._innerContentElement = this._contentElement.createChild('div');
     const controlDiv = this._contentElement.createChild('div', 'vbox profile-launcher-control');
     controlDiv.createChild('h1').textContent = ls`Select JavaScript VM instance`;
+    controlDiv.appendChild(isolateSelector.totalMemoryElement());
     const targetDiv = controlDiv.createChild('div', 'vbox profile-launcher-target-list');
-    new Profiler.IsolateSelector().show(targetDiv);
+    isolateSelector.show(targetDiv);
+
     this._controlButton =
         UI.createTextButton('', this._controlButtonClicked.bind(this), 'profile-launcher-button', true /* primary */);
     this._contentElement.appendChild(this._controlButton);
diff --git a/third_party/blink/renderer/devtools/front_end/profiler/profileLauncherView.css b/third_party/blink/renderer/devtools/front_end/profiler/profileLauncherView.css
index 85a773f..c73652a 100644
--- a/third_party/blink/renderer/devtools/front_end/profiler/profileLauncherView.css
+++ b/third_party/blink/renderer/devtools/front_end/profiler/profileLauncherView.css
@@ -4,37 +4,42 @@
  * found in the LICENSE file.
  */
 
-.profile-isolate-item {
+.profile-memory-usage-item {
     padding: 4px;
     line-height: 16px;
     border-left: 2px solid transparent;
     overflow-x: hidden;
 }
 
-.profile-isolate-item:hover {
+.profile-launcher-target-list .profile-memory-usage-item:hover {
     background-color: hsla(0, 0%, 0%, 0.05);
 }
 
-.profile-isolate-item.selected {
+.profile-memory-usage-item.selected {
     border-color: #4285f4;
     background-color: #4285f420;
 }
 
-.profile-isolate-item > div {
+.profile-memory-usage-item > div {
     flex-shrink: 0;
     margin-right: 12px;
 }
 
-.profile-isolate-item-heap {
+.profile-memory-usage-item-size {
     width: 60px;
     text-align: right;
 }
 
-.profile-isolate-item-trend {
+.profile-memory-usage-item-trend {
     width: 80px;
     color: green;
 }
 
-.profile-isolate-item-trend.increasing {
+.profile-memory-usage-item-trend.increasing {
     color: red;
 }
+
+.profile-launcher-control > .profile-memory-usage-item {
+    margin-left: 1px;
+    margin-bottom: 6px;
+}
diff --git a/third_party/blink/renderer/modules/vr/navigator_vr.idl b/third_party/blink/renderer/modules/vr/navigator_vr.idl
index 6ec39bf..f196ca5 100644
--- a/third_party/blink/renderer/modules/vr/navigator_vr.idl
+++ b/third_party/blink/renderer/modules/vr/navigator_vr.idl
@@ -7,7 +7,7 @@
     ImplementedAs=NavigatorVR
 ] partial interface Navigator {
     // Latest API
-    [SecureContext, RuntimeEnabled=WebXR, MeasureAs=NavigatorXR] readonly attribute XR xr;
+    [SecureContext, RuntimeEnabled=WebXR, MeasureAs=NavigatorXR, SameObject] readonly attribute XR xr;
 
     // Legacy API
     [RuntimeEnabled=WebVR, CallWith=ScriptState] Promise<sequence<VRDisplay>> getVRDisplays();
diff --git a/third_party/blink/renderer/modules/xr/xr.cc b/third_party/blink/renderer/modules/xr/xr.cc
index b6d309e..837a69b 100644
--- a/third_party/blink/renderer/modules/xr/xr.cc
+++ b/third_party/blink/renderer/modules/xr/xr.cc
@@ -427,6 +427,8 @@
       query->mode == XRSession::kModeImmersiveAR) {
     frameProvider()->BeginImmersiveSession(session, std::move(session_ptr));
     if (environment_integration) {
+      // See Task Sources spreadsheet for more information:
+      // https://docs.google.com/spreadsheets/d/1b-dus1Ug3A8y0lX0blkmOjJILisUASdj8x9YN_XMwYc/view
       frameProvider()->GetDataProvider()->GetEnvironmentIntegrationProvider(
           mojo::MakeRequest(&environment_provider_,
                             GetExecutionContext()->GetTaskRunner(
@@ -436,16 +438,6 @@
     }
   } else {
     magic_window_provider_.Bind(std::move(session_ptr->data_provider));
-    if (environment_integration) {
-      // See https://bit.ly/2S0zRAS for task types.
-      magic_window_provider_->GetEnvironmentIntegrationProvider(
-          mojo::MakeRequest(&environment_provider_,
-                            GetExecutionContext()->GetTaskRunner(
-                                TaskType::kMiscPlatformAPI)));
-
-      environment_provider_.set_connection_error_handler(WTF::Bind(
-          &XR::OnEnvironmentProviderDisconnect, WrapWeakPersistent(this)));
-    }
   }
 
   query->resolver->Resolve(session);
diff --git a/third_party/blink/renderer/modules/xr/xr_frame.idl b/third_party/blink/renderer/modules/xr/xr_frame.idl
index 001a3fb..027c52a 100644
--- a/third_party/blink/renderer/modules/xr/xr_frame.idl
+++ b/third_party/blink/renderer/modules/xr/xr_frame.idl
@@ -8,7 +8,7 @@
     Exposed=Window,
     RuntimeEnabled=WebXR
 ] interface XRFrame {
-  readonly attribute XRSession session;
+  [SameObject] readonly attribute XRSession session;
 
   // More details about the real-world understanding APIs can be found here:
   // https://github.com/immersive-web/real-world-geometry/blob/master/plane-detection-explainer.md
diff --git a/third_party/blink/renderer/modules/xr/xr_frame_provider.cc b/third_party/blink/renderer/modules/xr/xr_frame_provider.cc
index 6b2d929b..67f4ce4 100644
--- a/third_party/blink/renderer/modules/xr/xr_frame_provider.cc
+++ b/third_party/blink/renderer/modules/xr/xr_frame_provider.cc
@@ -217,11 +217,10 @@
   if (!doc)
     return;
 
-  // This is cleared by either OnNonImmersiveFrameData (GetFrameData callback)
-  // or by OnNonImmersiveVSync (XRFrameProviderRequestCallback's invoke)
-  // Currently the only way for neither of these methods to be called is
-  // if we don't have a MagicWindowProvider and we have an AR Session
-  // which is guaranteed by our above DCheck.
+  // This is cleared by either OnNonImmersiveFrameData (GetFrameData callback,
+  // used if we have a magic window provider), or by OnNonImmersiveVSync
+  // (XRFrameProviderRequestCallback's invoke, used if there's no magic window
+  // provider).
   pending_non_immersive_vsync_ = true;
 
   // If we have a Magic Window provider, request frame data and flag that
diff --git a/third_party/blink/renderer/modules/xr/xr_input_source.idl b/third_party/blink/renderer/modules/xr/xr_input_source.idl
index 908e163a..ad23e109 100644
--- a/third_party/blink/renderer/modules/xr/xr_input_source.idl
+++ b/third_party/blink/renderer/modules/xr/xr_input_source.idl
@@ -21,7 +21,9 @@
 ] interface XRInputSource {
   readonly attribute XRHandedness handedness;
   readonly attribute XRTargetRayMode targetRayMode;
-  readonly attribute XRSpace targetRaySpace;
-  readonly attribute XRSpace? gripSpace;
+  [SameObject] readonly attribute XRSpace targetRaySpace;
+  [SameObject] readonly attribute XRSpace? gripSpace;
+
+  // TODO(https://crbug.com/955101): This should be tagged [SameObject].
   readonly attribute Gamepad? gamepad;
 };
diff --git a/third_party/blink/renderer/modules/xr/xr_input_source_event.idl b/third_party/blink/renderer/modules/xr/xr_input_source_event.idl
index 293379b0..2564a638 100644
--- a/third_party/blink/renderer/modules/xr/xr_input_source_event.idl
+++ b/third_party/blink/renderer/modules/xr/xr_input_source_event.idl
@@ -8,7 +8,7 @@
     RuntimeEnabled=WebXR,
     Constructor(DOMString type, XRInputSourceEventInit eventInitDict)
 ] interface XRInputSourceEvent : Event {
-  readonly attribute XRFrame frame;
-  readonly attribute XRInputSource inputSource;
-  readonly attribute long? buttonIndex;
+  [SameObject] readonly attribute XRFrame frame;
+  [SameObject] readonly attribute XRInputSource inputSource;
+  [SameObject] readonly attribute long? buttonIndex;
 };
diff --git a/third_party/blink/renderer/modules/xr/xr_pose.idl b/third_party/blink/renderer/modules/xr/xr_pose.idl
index 9a28215..cee232b 100644
--- a/third_party/blink/renderer/modules/xr/xr_pose.idl
+++ b/third_party/blink/renderer/modules/xr/xr_pose.idl
@@ -8,6 +8,6 @@
     Exposed=Window,
     RuntimeEnabled=WebXR
 ] interface XRPose {
-  readonly attribute XRRigidTransform transform;
+  [SameObject] readonly attribute XRRigidTransform transform;
   readonly attribute boolean emulatedPosition;
 };
diff --git a/third_party/blink/renderer/modules/xr/xr_presentation_context.idl b/third_party/blink/renderer/modules/xr/xr_presentation_context.idl
index 4d507e9e..6c586cb 100644
--- a/third_party/blink/renderer/modules/xr/xr_presentation_context.idl
+++ b/third_party/blink/renderer/modules/xr/xr_presentation_context.idl
@@ -9,5 +9,5 @@
     RuntimeEnabled=WebXR
 ] interface XRPresentationContext {
     // back-reference to the canvas
-    readonly attribute HTMLCanvasElement canvas;
+    [SameObject, SaveSameObject] readonly attribute HTMLCanvasElement canvas;
 };
diff --git a/third_party/blink/renderer/modules/xr/xr_ray.cc b/third_party/blink/renderer/modules/xr/xr_ray.cc
index 0be5ebc..3204b96b 100644
--- a/third_party/blink/renderer/modules/xr/xr_ray.cc
+++ b/third_party/blink/renderer/modules/xr/xr_ray.cc
@@ -100,10 +100,10 @@
     // (0,0,0) with direction (0,0,-1) into ray originating at |origin_| with
     // direction |direction_|.
 
-    matrix_ = std::make_unique<TransformationMatrix>();
+    TransformationMatrix matrix;
 
     // Translation from 0 to |origin_| is simply translation by |origin_|.
-    matrix_->Translate3d(origin_->x(), origin_->y(), origin_->z());
+    matrix.Translate3d(origin_->x(), origin_->y(), origin_->z());
 
     const blink::FloatPoint3D initialRayDirection =
         blink::FloatPoint3D{0.f, 0.f, -1.f};
@@ -122,23 +122,26 @@
       blink::FloatPoint3D axis = FloatPoint3D{1, 0, 0};
       cos_angle = -1;
 
-      matrix_->Rotate3d(axis.X(), axis.Y(), axis.Z(),
-                        rad2deg(std::acos(cos_angle)));
+      matrix.Rotate3d(axis.X(), axis.Y(), axis.Z(),
+                      rad2deg(std::acos(cos_angle)));
     } else {
       // Rotation needed - create it from axis-angle.
       blink::FloatPoint3D axis = initialRayDirection.Cross(desiredRayDirection);
 
-      matrix_->Rotate3d(axis.X(), axis.Y(), axis.Z(),
-                        rad2deg(std::acos(cos_angle)));
+      matrix.Rotate3d(axis.X(), axis.Y(), axis.Z(),
+                      rad2deg(std::acos(cos_angle)));
     }
+
+    matrix_ = transformationMatrixToDOMFloat32Array(matrix);
   }
 
-  return transformationMatrixToDOMFloat32Array(*matrix_);
+  return matrix_;
 }
 
 void XRRay::Trace(blink::Visitor* visitor) {
   visitor->Trace(origin_);
   visitor->Trace(direction_);
+  visitor->Trace(matrix_);
   ScriptWrappable::Trace(visitor);
 }
 
diff --git a/third_party/blink/renderer/modules/xr/xr_ray.h b/third_party/blink/renderer/modules/xr/xr_ray.h
index f30bbfaa..2652cd24 100644
--- a/third_party/blink/renderer/modules/xr/xr_ray.h
+++ b/third_party/blink/renderer/modules/xr/xr_ray.h
@@ -45,7 +45,7 @@
 
   Member<DOMPointReadOnly> origin_;
   Member<DOMPointReadOnly> direction_;
-  std::unique_ptr<TransformationMatrix> matrix_;
+  Member<DOMFloat32Array> matrix_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/xr/xr_ray.idl b/third_party/blink/renderer/modules/xr/xr_ray.idl
index 68d261a..3bdfaa9 100644
--- a/third_party/blink/renderer/modules/xr/xr_ray.idl
+++ b/third_party/blink/renderer/modules/xr/xr_ray.idl
@@ -12,7 +12,7 @@
     Constructor(DOMPointInit origin, DOMPointInit direction),
     Constructor(XRRigidTransform transform)
 ] interface XRRay {
-  readonly attribute DOMPointReadOnly origin;
-  readonly attribute DOMPointReadOnly direction;
-  readonly attribute Float32Array matrix;
+  [SameObject] readonly attribute DOMPointReadOnly origin;
+  [SameObject] readonly attribute DOMPointReadOnly direction;
+  [SameObject] readonly attribute Float32Array matrix;
 };
diff --git a/third_party/blink/renderer/modules/xr/xr_reference_space_event.idl b/third_party/blink/renderer/modules/xr/xr_reference_space_event.idl
index 63263126..7a290ac 100644
--- a/third_party/blink/renderer/modules/xr/xr_reference_space_event.idl
+++ b/third_party/blink/renderer/modules/xr/xr_reference_space_event.idl
@@ -9,6 +9,6 @@
     OriginTrialEnabled=WebXR,
     Constructor(DOMString type, XRReferenceSpaceEventInit eventInitDict)
 ] interface XRReferenceSpaceEvent : Event {
-  readonly attribute XRReferenceSpace referenceSpace;
-  readonly attribute XRRigidTransform transform;
+  [SameObject] readonly attribute XRReferenceSpace referenceSpace;
+  [SameObject] readonly attribute XRRigidTransform transform;
 };
diff --git a/third_party/blink/renderer/modules/xr/xr_rigid_transform.idl b/third_party/blink/renderer/modules/xr/xr_rigid_transform.idl
index 1abcda0..f76a795d1 100644
--- a/third_party/blink/renderer/modules/xr/xr_rigid_transform.idl
+++ b/third_party/blink/renderer/modules/xr/xr_rigid_transform.idl
@@ -10,8 +10,8 @@
     RuntimeEnabled=WebXR,
     Constructor(optional DOMPointInit position, optional DOMPointInit orientation)
 ] interface XRRigidTransform {
-  readonly attribute DOMPointReadOnly position;
-  readonly attribute DOMPointReadOnly orientation;
-  readonly attribute Float32Array matrix;
+  [SameObject] readonly attribute DOMPointReadOnly position;
+  [SameObject] readonly attribute DOMPointReadOnly orientation;
+  [SameObject] readonly attribute Float32Array matrix;
   [SameObject] readonly attribute XRRigidTransform inverse;
 };
diff --git a/third_party/blink/renderer/modules/xr/xr_session.idl b/third_party/blink/renderer/modules/xr/xr_session.idl
index bec991ce2..54b874a 100644
--- a/third_party/blink/renderer/modules/xr/xr_session.idl
+++ b/third_party/blink/renderer/modules/xr/xr_session.idl
@@ -22,8 +22,8 @@
     RuntimeEnabled=WebXR
 ] interface XRSession : EventTarget {
   readonly attribute XREnvironmentBlendMode environmentBlendMode;
-  readonly attribute XRRenderState renderState;
-  readonly attribute XRSpace viewerSpace;
+  [SameObject] readonly attribute XRRenderState renderState;
+  [SameObject] readonly attribute XRSpace viewerSpace;
 
   attribute EventHandler onblur;
   attribute EventHandler onfocus;
diff --git a/third_party/blink/renderer/modules/xr/xr_session_event.idl b/third_party/blink/renderer/modules/xr/xr_session_event.idl
index 46ef20f..0079794 100644
--- a/third_party/blink/renderer/modules/xr/xr_session_event.idl
+++ b/third_party/blink/renderer/modules/xr/xr_session_event.idl
@@ -9,5 +9,5 @@
     RuntimeEnabled=WebXR,
     Constructor(DOMString type, XRSessionEventInit eventInitDict)
 ] interface XRSessionEvent : Event {
-  readonly attribute XRSession session;
+  [SameObject] readonly attribute XRSession session;
 };
diff --git a/third_party/blink/renderer/modules/xr/xr_view.h b/third_party/blink/renderer/modules/xr/xr_view.h
index 4f215d6d..d032c7c 100644
--- a/third_party/blink/renderer/modules/xr/xr_view.h
+++ b/third_party/blink/renderer/modules/xr/xr_view.h
@@ -56,6 +56,7 @@
                                                          double canvas_width,
                                                          double canvas_height);
 
+  // TODO(crbug.com/958014): Remove UpdatePoseMatrix to ensure SameObject.
   void UpdatePoseMatrix(TransformationMatrix pose_matrix);
 
   // TODO(bajones): Should eventually represent this as a full transform.
diff --git a/third_party/blink/renderer/modules/xr/xr_view.idl b/third_party/blink/renderer/modules/xr/xr_view.idl
index aa17b8b..b82e9eb 100644
--- a/third_party/blink/renderer/modules/xr/xr_view.idl
+++ b/third_party/blink/renderer/modules/xr/xr_view.idl
@@ -14,6 +14,7 @@
     RuntimeEnabled=WebXR
 ] interface XRView {
   readonly attribute XREye eye;
-  readonly attribute Float32Array projectionMatrix;
+  [SameObject] readonly attribute Float32Array projectionMatrix;
+  // TODO(https://crbug.com/958014): Ensure that this can be SameObject.
   readonly attribute XRRigidTransform transform;
 };
diff --git a/third_party/blink/renderer/modules/xr/xr_viewer_pose.cc b/third_party/blink/renderer/modules/xr/xr_viewer_pose.cc
index 1748556..f4d53ee 100644
--- a/third_party/blink/renderer/modules/xr/xr_viewer_pose.cc
+++ b/third_party/blink/renderer/modules/xr/xr_viewer_pose.cc
@@ -14,6 +14,8 @@
     XRSession* session,
     std::unique_ptr<TransformationMatrix> pose_model_matrix)
     : XRPose(std::move(pose_model_matrix), session->EmulatedPosition()) {
+  // TODO(https://crbug.com/958014): Ensure that this copy doesn't still
+  // point to the underlying views objects from session.
   // session will update views if required
   // views array gets copied to views_
   views_ = session->views();
diff --git a/third_party/blink/renderer/modules/xr/xr_viewer_pose.idl b/third_party/blink/renderer/modules/xr/xr_viewer_pose.idl
index 4265678..5cb5d7a 100644
--- a/third_party/blink/renderer/modules/xr/xr_viewer_pose.idl
+++ b/third_party/blink/renderer/modules/xr/xr_viewer_pose.idl
@@ -9,5 +9,6 @@
     Exposed=Window,
     RuntimeEnabled=WebXR
 ] interface XRViewerPose : XRPose {
+  // TODO(https://crbug.com/958014): Ensure that this can be SameObject.
   readonly attribute FrozenArray<XRView> views;
 };
diff --git a/third_party/blink/renderer/modules/xr/xr_webgl_layer.idl b/third_party/blink/renderer/modules/xr/xr_webgl_layer.idl
index 12e69650..d1091dd 100644
--- a/third_party/blink/renderer/modules/xr/xr_webgl_layer.idl
+++ b/third_party/blink/renderer/modules/xr/xr_webgl_layer.idl
@@ -12,13 +12,13 @@
     Constructor(XRSession session, XRWebGLRenderingContext context, optional XRWebGLLayerInit layerInit),
     RaisesException=Constructor
 ] interface XRWebGLLayer : XRLayer {
-  [ImplementedAs=getXRWebGLRenderingContext] readonly attribute XRWebGLRenderingContext context;
+  [SameObject, SaveSameObject, ImplementedAs=getXRWebGLRenderingContext] readonly attribute XRWebGLRenderingContext context;
   readonly attribute boolean antialias;
   readonly attribute boolean ignoreDepthValues;
 
   readonly attribute unsigned long framebufferWidth;
   readonly attribute unsigned long framebufferHeight;
-  readonly attribute WebGLFramebuffer framebuffer;
+  [SameObject] readonly attribute WebGLFramebuffer framebuffer;
 
   XRViewport? getViewport(XRView view);
   void requestViewportScaling(double viewportScaleFactor);
diff --git a/third_party/blink/renderer/platform/bindings/v8_private_property.h b/third_party/blink/renderer/platform/bindings/v8_private_property.h
index 49fd7a79..9eb1a25d 100644
--- a/third_party/blink/renderer/platform/bindings/v8_private_property.h
+++ b/third_party/blink/renderer/platform/bindings/v8_private_property.h
@@ -49,6 +49,8 @@
   X(SameObject, NotificationVibrate)                  \
   X(SameObject, PerformanceLongTaskTimingAttribution) \
   X(SameObject, PushManagerSupportedContentEncodings) \
+  X(SameObject, XRPresentationContextCanvas)          \
+  X(SameObject, XRWebGLLayerContext)                  \
   SCRIPT_PROMISE_PROPERTIES(X, Promise)               \
   SCRIPT_PROMISE_PROPERTIES(X, Resolver)
 
diff --git a/third_party/blink/renderer/platform/exported/web_runtime_features.cc b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
index 899a849..8d64f78 100644
--- a/third_party/blink/renderer/platform/exported/web_runtime_features.cc
+++ b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
@@ -660,4 +660,8 @@
   RuntimeEnabledFeatures::SetSkipTouchEventFilterEnabled(enable);
 }
 
+void WebRuntimeFeatures::EnableStaleWhileRevalidate(bool enable) {
+  RuntimeEnabledFeatures::SetStaleWhileRevalidateEnabled(enable);
+}
+
 }  // namespace blink
diff --git a/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations.py b/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations.py
index ef05641..1b2e7607 100644
--- a/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations.py
+++ b/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations.py
@@ -84,16 +84,32 @@
     fs = host.filesystem
     web_tests_dir = port.web_tests_dir()
     virtual_suites = port.virtual_test_suites()
+    # Make sure ancestors come first (e.g. "virtual/foo/bar", "virtual/foo/bar/baz").
+    virtual_suites.sort(key=lambda s: s.name)
 
+    seen = set()
     failures = []
     for suite in virtual_suites:
+        suite_comps = suite.name.split(port.TEST_PATH_SEPARATOR)
+        # E.g. virtual/foo/fast/css/a.html will execute twice if
+        # both virtual/foo/fast and virtual/foo/fast/css are both defined.
+        for i in range(3, len(suite_comps)):
+            ancestor = port.TEST_PATH_SEPARATOR.join(suite_comps[:i])
+            if ancestor in seen:
+                failure = ('{} is a subset of {}; you will see tests under the '
+                           'former running multiple times (potentially with '
+                           'different args).'.format(suite.name, ancestor))
+                _log.error(failure)
+                failures.append(failure)
+        seen.add(suite.name)
+
         # A virtual test suite needs either
         # - a top-level README.md (e.g. virtual/foo/README.md)
         # - a README.txt for each covered dir/file (e.g.
         #   virtual/foo/http/tests/README.txt, virtual/foo/fast/README.txt, ...)
-        comps = [web_tests_dir] + suite.name.split('/') + ['README.txt']
+        comps = [web_tests_dir] + suite_comps + ['README.txt']
         path_to_readme_txt = fs.join(*comps)
-        comps = [web_tests_dir] + suite.name.split('/')[:2] + ['README.md']
+        comps = [web_tests_dir] + suite_comps[:2] + ['README.md']
         path_to_readme_md = fs.join(*comps)
         if not fs.exists(path_to_readme_txt) and not fs.exists(path_to_readme_md):
             failure = '{} and {} are both missing (each virtual suite must have one).'.format(
diff --git a/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations_unittest.py b/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations_unittest.py
index 3102a17..959b75c 100644
--- a/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations_unittest.py
+++ b/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations_unittest.py
@@ -34,6 +34,8 @@
 from blinkpy.common.host_mock import MockHost
 from blinkpy.common.system.log_testing import LoggingTestCase
 from blinkpy.web_tests import lint_test_expectations
+from blinkpy.web_tests.port.base import VirtualTestSuite
+from blinkpy.web_tests.port.test import WEB_TEST_DIR
 
 
 class FakePort(object):
@@ -139,7 +141,7 @@
 
         host.port_factory.get = lambda platform, options=None: port
         host.port_factory.all_port_names = lambda platform=None: [port.name()]
-        host.filesystem.write_text_file('/test.checkout/wtests/LeakExpectations', '-- syntax error')
+        host.filesystem.write_text_file(WEB_TEST_DIR + '/LeakExpectations', '-- syntax error')
 
         res = lint_test_expectations.lint(host, options)
 
@@ -167,20 +169,36 @@
 
 class CheckVirtualSuiteTest(unittest.TestCase):
 
-    def test_check_virtual_test_suites(self):
-        host = MockHost()
-        options = optparse.Values({'platform': 'test', 'debug_rwt_logging': False})
-        orig_get = host.port_factory.get
-        host.port_factory.get = lambda options: orig_get('test', options=options)
+    def setUp(self):
+        self.host = MockHost()
+        self.options = optparse.Values({'platform': 'test', 'debug_rwt_logging': False})
+        self.port = self.host.port_factory.get('test', options=self.options)
+        self.host.port_factory.get = lambda options=None: self.port
 
-        res = lint_test_expectations.check_virtual_test_suites(host, options)
-        self.assertTrue(res)
+    def test_check_virtual_test_suites_readme(self):
+        self.port.virtual_test_suites = lambda: [
+            VirtualTestSuite(prefix='foo', base='test', args='--foo'),
+            VirtualTestSuite(prefix='bar', base='test', args='--bar'),
+        ]
 
-        options = optparse.Values({'platform': 'test', 'debug_rwt_logging': False})
-        host.filesystem.exists = lambda path: True
-        res = lint_test_expectations.check_virtual_test_suites(host, options)
+        res = lint_test_expectations.check_virtual_test_suites(self.host, self.options)
+        self.assertEqual(len(res), 2)
+
+        self.host.filesystem.files[WEB_TEST_DIR + '/virtual/foo/README.md'] = ''
+        self.host.filesystem.files[WEB_TEST_DIR + '/virtual/bar/test/README.txt'] = ''
+        res = lint_test_expectations.check_virtual_test_suites(self.host, self.options)
         self.assertFalse(res)
 
+    def test_check_virtual_test_suites_inclusion(self):
+        self.port.virtual_test_suites = lambda: [
+            VirtualTestSuite(prefix='foo', base='test/sub', args='--foo'),
+            VirtualTestSuite(prefix='foo', base='test', args='--foo'),
+        ]
+
+        self.host.filesystem.exists = lambda _: True
+        res = lint_test_expectations.check_virtual_test_suites(self.host, self.options)
+        self.assertEqual(len(res), 1)
+
 
 class MainTest(unittest.TestCase):
 
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index e4060b9..8519771e 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -306,7 +306,7 @@
 crbug.com/887000 virtual/prefer_compositing_to_lcd_text/scrollbars/hidden-scrollbars-invisible.html [ Failure ]
 crbug.com/882975 virtual/threaded/fast/events/pinch/gesture-pinch-zoom-prevent-in-handler.html [ Failure Pass ]
 crbug.com/882975 virtual/threaded/fast/events/pinch/scroll-visual-viewport-send-boundary-events.html [ Failure Pass ]
-crbug.com/884239 virtual/threaded/animations/animationworklet/worklet-animation-local-time-undefined.html [ Failure Pass ]
+crbug.com/884239 virtual/threaded/animations/animationworklet/worklet-animation-local-time-undefined.html [ Timeout Failure Pass ]
 crbug.com/884239 virtual/disable-blink-gen-property-trees/animations/animationworklet/worklet-animation-local-time-undefined.html [ Skip ]
 # Subpixel rounding differences that are incorrect.
 crbug.com/836886 virtual/prefer_compositing_to_lcd_text/compositing/overflow/scaled-overflow.html [ Failure ]
@@ -4050,7 +4050,7 @@
 crbug.com/626703 external/wpt/media-source/mediasource-avtracks.html [ Failure Crash ]
 crbug.com/626703 external/wpt/media-source/mediasource-getvideoplaybackquality.html [ Timeout Failure ]
 crbug.com/626703 external/wpt/pointerevents/pointerevent_disabled_form_control-manual.html [ Timeout Pass ]
-crbug.com/626703 external/wpt/presentation-api/controlling-ua/getAvailability.https.html [ Timeout ]
+crbug.com/958104 external/wpt/presentation-api/controlling-ua/getAvailability.https.html [ Failure ]
 crbug.com/626703 external/wpt/requestidlecallback/callback-timeout.html [ Timeout ]
 crbug.com/626703 external/wpt/requestidlecallback/callback-xhr-sync.html [ Timeout ]
 crbug.com/626703 external/wpt/screen-orientation/onchange-event-subframe.html [ Timeout ]
@@ -6318,13 +6318,8 @@
 crbug.com/954998 [ Mac ] http/tests/devtools/tracing/timeline-js/timeline-js-line-level-profile-end-to-end.js [ Pass Timeout ]
 
 # Sheriff 2019-04-25
-crbug.com/956547 fast/dom/raf-throttling-out-of-view-cross-origin-page.html [ Pass Timeout ]
-crbug.com/956547 fast/dom/timer-throttling-out-of-view-cross-origin-page.html [ Pass Timeout ]
 crbug.com/956736 virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-not-inherited-from-map.html [ Pass Failure ]
 
-# Sheriff 2019-04-25
-crbug.com/956547 http/tests/dom/raf-throttling-out-of-view-cross-origin-page.html [ Pass Timeout ]
-
 # Sheriff 2019-04-30
 crbug.com/946534 [ Mac10.10 Mac10.11 ] external/wpt/animation-worklet/worklet-animation-with-scroll-timeline-root-scroller.https.html [ Pass Failure ]
 crbug.com/948785 [ Debug ] fast/events/pointerevents/pointer-event-consumed-touchstart-in-slop-region.html [ Pass Failure ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index 26ef64b..a9facb10 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -21,11 +21,6 @@
   },
   {
     "prefix": "threaded",
-    "base": "animations/animationworklet",
-    "args": ["--enable-threaded-compositing"]
-  },
-  {
-    "prefix": "threaded",
     "base": "external/wpt/animation-worklet",
     "args": ["--enable-threaded-compositing"]
   },
diff --git a/third_party/blink/web_tests/external/wpt/presentation-api/controlling-ua/getAvailability.https.html b/third_party/blink/web_tests/external/wpt/presentation-api/controlling-ua/getAvailability.https.html
index b6d8736..71b19e6a 100644
--- a/third_party/blink/web_tests/external/wpt/presentation-api/controlling-ua/getAvailability.https.html
+++ b/third_party/blink/web_tests/external/wpt/presentation-api/controlling-ua/getAvailability.https.html
@@ -17,6 +17,10 @@
     // Presentation Availability Tests - begin
     // ---------------------------------------
 
+    const catchNotSupported = err => {
+      assert_equals(err.name, 'NotSupportedError', 'getAvailability() rejects a Promise with a NotSupportedError exception, if the browser can find presentation displays only when starting a connection.')
+    };
+
     promise_test(t => {
         let availability;
 
@@ -24,39 +28,27 @@
         assert_true(request instanceof PresentationRequest, 'The request is an instance of PresentationRequest.');
 
         const promise = request.getAvailability();
-        assert_equals(promise, request.getAvailability(), 'If the PresentationRequest object has an unsettled Promise, getAvailability returns that Promise.');
-
-        function catchNotSupported(err) {
-            assert_equals(err.name, 'NotSupportedError', 'getAvailability() rejects a Promise with a NotSupportedError exception, if the browser can find presentation displays only when starting a connection.')
-        }
+        assert_true(promise instanceof Promise, 'PresentationRequest.getAvailability() returns a Promise.');
+        const samePromise = request.getAvailability();
+        assert_true(samePromise instanceof Promise, 'PresentationRequest.getAvailabilty() returns a Promise.');
+        assert_equals(promise, samePromise, 'If the PresentationRequest object has an unsettled Promise, getAvailability returns that Promise.');
 
         return promise.then(a => {
-            availability = a;
+          availability = a;
+          assert_true(availability instanceof PresentationAvailability, 'The promise is resolved with an instance of PresentationAvailability.');
+          assert_equals(typeof availability.value, 'boolean', 'The availability has an boolean value.');
 
-            assert_true(availability instanceof PresentationAvailability, 'The promise is resolved with an instance of PresentationAvailability.');
-            assert_equals(typeof availability.value, 'boolean', 'The availability has an boolean value.');
+          const request2 = new PresentationRequest('https://example.com');
+          return request2.getAvailability();
+        }).then(a => {
+          assert_not_equals(availability, a, 'A presentation availability object is newly created if the presentation request has a newly added presentation URLs.');
 
-            // The value of the presentation availability object is set to false, when the object is newly created.
-            const waitForChange = () => {
-                const eventWatcher = new EventWatcher(t, availability, 'change');
-                return eventWatcher.wait_for('change');
-            };
+          const newPromise = request.getAvailability();
+          assert_not_equals(promise, newPromise, 'If the Promise from a previous call to getAvailability has already been settled, getAvailability returns a new Promise.');
 
-            return (availability.value ? Promise.resolve() : waitForChange()).then(() => {
-                assert_true(availability.value, 'The availability value is true when any presentation display is available.');
-
-                const request2 = new PresentationRequest('https://example.com');
-                return request2.getAvailability();
-            }).then(a => {
-                assert_not_equals(availability, a, 'A presentation availability object is newly created if the presentation request has a newly added presentation URLs.');
-
-                const newPromise = request.getAvailability();
-                assert_not_equals(promise, newPromise, 'If the Promise from a previous call to getAvailability has already been settled, getAvailability returns a new Promise.');
-
-                return newPromise.then(newAvailability => {
-                    assert_equals(availability, newAvailability, 'Promises from a PresentationRequest\'s getAvailability are resolved with the same PresentationAvailability object.');
-                }, catchNotSupported);
-            }, catchNotSupported);
+          return newPromise.then(newAvailability => {
+            assert_equals(availability, newAvailability, 'Promises from a PresentationRequest\'s getAvailability are resolved with the same PresentationAvailability object.');
+          }, catchNotSupported);
         }, catchNotSupported);
     });
 </script>
diff --git a/third_party/blink/web_tests/fast/dom/raf-throttling-out-of-view-cross-origin-page.html b/third_party/blink/web_tests/fast/dom/raf-throttling-out-of-view-cross-origin-page.html
index 4949bb6..c827d6a 100644
--- a/third_party/blink/web_tests/fast/dom/raf-throttling-out-of-view-cross-origin-page.html
+++ b/third_party/blink/web_tests/fast/dom/raf-throttling-out-of-view-cross-origin-page.html
@@ -28,7 +28,9 @@
   let rafCount = e.data;
   // TODO(skyostil): Chrome always runs one animation frame while the layout
   // test harness does none. Find out where the difference is coming from.
-  assert_less_than_equal(rafCount, 1, "requestAnimationFrame() callback count")
+  throttlingTest.step(() => {
+    assert_less_than_equal(rafCount, 1, "requestAnimationFrame() callback count")
+  });
   throttlingTest.done();
 });
 </script>
diff --git a/third_party/blink/web_tests/fast/dom/timer-throttling-out-of-view-cross-origin-page.html b/third_party/blink/web_tests/fast/dom/timer-throttling-out-of-view-cross-origin-page.html
index 137d52d..2fafd8b 100644
--- a/third_party/blink/web_tests/fast/dom/timer-throttling-out-of-view-cross-origin-page.html
+++ b/third_party/blink/web_tests/fast/dom/timer-throttling-out-of-view-cross-origin-page.html
@@ -26,7 +26,9 @@
 
 addEventListener('message', (e) => {
   let timerDelay = e.data;
-  assert_greater_than(timerDelay, 900, "Timer interval")
+  throttlingTest.step(() => {
+    assert_greater_than(timerDelay, 900, "Timer interval")
+  });
   throttlingTest.done();
 });
 </script>
diff --git a/third_party/blink/web_tests/http/tests/dom/raf-throttling-out-of-view-cross-origin-page.html b/third_party/blink/web_tests/http/tests/dom/raf-throttling-out-of-view-cross-origin-page.html
index 0080d956..e8da561 100644
--- a/third_party/blink/web_tests/http/tests/dom/raf-throttling-out-of-view-cross-origin-page.html
+++ b/third_party/blink/web_tests/http/tests/dom/raf-throttling-out-of-view-cross-origin-page.html
@@ -48,7 +48,9 @@
     });
   } else {
     let rafCount = e.data;
-    assert_equals(rafCount, firstRafCount, "requestAnimationFrame() callback count")
+    throttlingTest.step(() => {
+      assert_equals(rafCount, firstRafCount, "requestAnimationFrame() callback count")
+    });
     throttlingTest.done();
   }
 });
diff --git a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/animationworklet-origin-trial-interfaces.html b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/animationworklet-origin-trial-interfaces.html
index b64a050..762b753 100644
--- a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/animationworklet-origin-trial-interfaces.html
+++ b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/animationworklet-origin-trial-interfaces.html
@@ -28,12 +28,12 @@
 OriginTrialsHelper.add_token(token);
 
 test(t => {
-  OriginTrialsHelper.check_interfaces(this, interfaces_to_check);
+  OriginTrialsHelper.check_interfaces_exist(this, interfaces_to_check);
 }, 'AnimationWorklet related interfaces in Origin-Trial enabled document.');
 
 test(t => {
   assert_own_property(CSS, 'animationWorklet');
-  OriginTrialsHelper.check_properties(this, properties_to_check);
+  OriginTrialsHelper.check_properties_exist(this, properties_to_check);
 }, 'AnimationWorklet related properties in Origin-Trial enabled document.');
 
 </script>
diff --git a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/auto-picture-in-picture-origin-trial-properties.html b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/auto-picture-in-picture-origin-trial-properties.html
index 8c843b42..9d3d6bc 100644
--- a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/auto-picture-in-picture-origin-trial-properties.html
+++ b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/auto-picture-in-picture-origin-trial-properties.html
@@ -11,7 +11,7 @@
 <script src="/resources/origin-trials-helper.js"></script>
 <script>
 test(t => {
-  OriginTrialsHelper.check_properties(this,
+  OriginTrialsHelper.check_properties_exist(this,
       { 'HTMLVideoElement': ['autoPictureInPicture'] });
 }, 'Auto Picture-in-Picture properties in Origin-Trial enabled document.');
 </script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/contacts-manager-trial-interfaces.html b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/contacts-manager-trial-interfaces.html
index 76f03ed..16c7c9d 100644
--- a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/contacts-manager-trial-interfaces.html
+++ b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/contacts-manager-trial-interfaces.html
@@ -10,6 +10,6 @@
 <script src="/resources/origin-trials-helper.js"></script>
 <script>
 test(() => {
-  OriginTrialsHelper.check_properties(this, { 'ContactsManager': ['select'] });
+  OriginTrialsHelper.check_properties_exist(this, { 'ContactsManager': ['select'] });
 }, 'Contact API interfaces and properties in Origin-Trial enabled document.');
 </script>
diff --git a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/cookiestore-origin-trial-interfaces.html b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/cookiestore-origin-trial-interfaces.html
index 7df2c0a2..3c27e19 100644
--- a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/cookiestore-origin-trial-interfaces.html
+++ b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/cookiestore-origin-trial-interfaces.html
@@ -11,7 +11,7 @@
 <script src="/serviceworker/resources/test-helpers.js"></script>
 <script>
 test(t => {
-  OriginTrialsHelper.check_properties(this, {
+  OriginTrialsHelper.check_properties_exist(this, {
      'CookieStore': ['get', 'getAll', 'set', 'delete', 'onchange'],
      'CookieChangeEvent': ['changed', 'deleted'],
   });
diff --git a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/eventtiming-origin-trial-interfaces.html b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/eventtiming-origin-trial-interfaces.html
index 435b04a..362286e7 100644
--- a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/eventtiming-origin-trial-interfaces.html
+++ b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/eventtiming-origin-trial-interfaces.html
@@ -10,7 +10,7 @@
 <script src="/resources/origin-trials-helper.js"></script>
 <script>
 test(t => {
-  OriginTrialsHelper.check_properties(this,
+  OriginTrialsHelper.check_properties_exist(this,
       {'PerformanceEventTiming': ['processingStart', 'cancelable'],
        'Performance': ['clearEventTimings', 'setEventTimingBufferMaxSize', 'oneventtimingbufferfull'],
        });
diff --git a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/genericsensor-origin-trial-interfaces.html b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/genericsensor-origin-trial-interfaces.html
index 91bd898..8150f0a 100644
--- a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/genericsensor-origin-trial-interfaces.html
+++ b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/genericsensor-origin-trial-interfaces.html
@@ -10,7 +10,7 @@
 <script src="../../resources/origin-trials-helper.js"></script>
 <script>
 test(t => {
-  OriginTrialsHelper.check_properties(this,
+  OriginTrialsHelper.check_properties_exist(this,
       {'Sensor': ['start', 'stop', 'hasReading', 'activated', 'timestamp', 'onerror', 'onreading', 'onactivate'],
        'Accelerometer': ['x', 'y', 'z'],
        'Gyroscope': ['x', 'y', 'z'],
diff --git a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/installedapp-origin-trial-interfaces-script-added.html b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/installedapp-origin-trial-interfaces-script-added.html
index 5465f78..b1a9e0f1 100644
--- a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/installedapp-origin-trial-interfaces-script-added.html
+++ b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/installedapp-origin-trial-interfaces-script-added.html
@@ -23,6 +23,6 @@
 OriginTrialsHelper.add_token(token);
 
 test(t => {
-  OriginTrialsHelper.check_properties(this, properties_to_check);
+  OriginTrialsHelper.check_properties_exist(this, properties_to_check);
 }, "InstalledApp related properties is on interfaces after adding trial token via script.");
 </script>
diff --git a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/installedapp-origin-trial-interfaces.html b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/installedapp-origin-trial-interfaces.html
index 142ec49..296a44da 100644
--- a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/installedapp-origin-trial-interfaces.html
+++ b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/installedapp-origin-trial-interfaces.html
@@ -10,7 +10,7 @@
 <script src="../../resources/origin-trials-helper.js"></script>
 <script>
 test(t => {
-  OriginTrialsHelper.check_properties(this,
+  OriginTrialsHelper.check_properties_exist(this,
       {'Navigator': ['getInstalledRelatedApps']});
 }, "InstalledApp related properties is on interfaces in Origin-Trial enabled document.");
 </script>
diff --git a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/isinputpending-origin-trial-interfaces.html b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/isinputpending-origin-trial-interfaces.html
index f89bfa0..f864b9b0 100644
--- a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/isinputpending-origin-trial-interfaces.html
+++ b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/isinputpending-origin-trial-interfaces.html
@@ -12,7 +12,7 @@
 
 <script>
 test(t => {
-  OriginTrialsHelper.check_properties(this,
+  OriginTrialsHelper.check_properties_exist(this,
       {
         'Navigator': ['scheduling'],
         'Scheduling': ['isInputPending'],
diff --git a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/resources/cookiestore-origin-trial-interfaces-serviceworker-enabled.php b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/resources/cookiestore-origin-trial-interfaces-serviceworker-enabled.php
index c2323c52..34067c79 100644
--- a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/resources/cookiestore-origin-trial-interfaces-serviceworker-enabled.php
+++ b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/resources/cookiestore-origin-trial-interfaces-serviceworker-enabled.php
@@ -8,7 +8,7 @@
               '/resources/origin-trials-helper.js');
 
 test(t => {
-  OriginTrialsHelper.check_properties(this, {
+  OriginTrialsHelper.check_properties_exist(this, {
      'CookieStore': ['get', 'getAll', 'set', 'delete', 'subscribeToChanges',
                      'getChangeSubscriptions'],
      'ExtendableCookieChangeEvent': ['changed', 'deleted'],
diff --git a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/rtc-jitter-buffer-delay-hint.html b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/rtc-jitter-buffer-delay-hint.html
index 2bea5de..4cf5ffb 100644
--- a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/rtc-jitter-buffer-delay-hint.html
+++ b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/rtc-jitter-buffer-delay-hint.html
@@ -20,7 +20,7 @@
 OriginTrialsHelper.add_token(token);
 
 test(t => {
-  OriginTrialsHelper.check_properties(
+  OriginTrialsHelper.check_properties_exist(
       this, {'RTCRtpReceiver': ['jitterBufferDelayHint']});
 }, 'RTCRtpReceiver jitterBufferDelayHint is in Origin-Trial enabled document');
 
diff --git a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/rtc-quic-transport-origin-trial-interfaces.html b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/rtc-quic-transport-origin-trial-interfaces.html
index 306a950..4ae1c795 100644
--- a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/rtc-quic-transport-origin-trial-interfaces.html
+++ b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/rtc-quic-transport-origin-trial-interfaces.html
@@ -29,7 +29,7 @@
 };
 
 test(t => {
-  OriginTrialsHelper.check_properties(this, properties_to_check);
+  OriginTrialsHelper.check_properties_exist(this, properties_to_check);
 }, 'RTCQuicTransport and RTCIceTransport properties are available.');
 
 </script>
diff --git a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/xr/webvr-gamepad-origin-trial-interfaces.html b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/xr/webvr-gamepad-origin-trial-interfaces.html
index c2f5dc0..b3872cf 100644
--- a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/xr/webvr-gamepad-origin-trial-interfaces.html
+++ b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/xr/webvr-gamepad-origin-trial-interfaces.html
@@ -36,13 +36,13 @@
 OriginTrialsHelper.add_token(token);
 
 test(t => {
-  OriginTrialsHelper.check_properties(this, properties_to_check);
+  OriginTrialsHelper.check_properties_exist(this, properties_to_check);
 }, 'The WebVR-specific Gamepad properties are available.');
 
 test(t => {
-  OriginTrialsHelper.check_interfaces(this, interfaces_to_check);
+  OriginTrialsHelper.check_interfaces_exist(this, interfaces_to_check);
   // Check the properties of the interfaces_to_check.
-  OriginTrialsHelper.check_properties(this, {
+  OriginTrialsHelper.check_properties_exist(this, {
     'GamepadPose': [
       'hasOrientation',
       'hasPosition',
diff --git a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/xr/webvr-origin-trial-interfaces.html b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/xr/webvr-origin-trial-interfaces.html
index 875094c..f6b1ebcf 100644
--- a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/xr/webvr-origin-trial-interfaces.html
+++ b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/xr/webvr-origin-trial-interfaces.html
@@ -27,11 +27,11 @@
 OriginTrialsHelper.add_token(token);
 
 test(t => {
-  OriginTrialsHelper.check_properties(this, properties_to_check);
+  OriginTrialsHelper.check_properties_exist(this, properties_to_check);
 }, 'WebVR properties are available.');
 
 test(t => {
-  OriginTrialsHelper.check_properties(this, {
+  OriginTrialsHelper.check_properties_exist(this, {
         'Navigator': ['getVRDisplays'],
         'VRDisplay':[
           'displayId',
diff --git a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/xr/webxr-origin-trial-interfaces.html b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/xr/webxr-origin-trial-interfaces.html
index 28c4ad3..103842d 100644
--- a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/xr/webxr-origin-trial-interfaces.html
+++ b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/xr/webxr-origin-trial-interfaces.html
@@ -5,57 +5,37 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../../resources/origin-trials-helper.js"></script>
 <script>
+
 let properties_to_check = {'Navigator': ['xr']};
 
-// Can only run these two tests if webXR is not enabled via a Chrome flag.
-// That is only the case when running this in a virtual test suite (by default,
-// runtime enabled features are on for layout tests).
-// To run in virtual test suite:
-// tools/run_web_tests.py virtual/origin-trials-runtimeflags-disabled/http/tests/origin_trials/webexposed
-if (!self.internals.runtimeFlags.webXREnabled) {
-  test(t => {
-    OriginTrialsHelper.check_properties_missing(this, properties_to_check);
-  }, "WebXR's entrypoint properties are not available without a token.");
-
-  // The WebXRDeviceM69 token has been disabled due to breaking webxr API
-  // changes made in M73.
-  // generated with command
-  // tools/origin_trials/generate_token.py http://127.0.0.1:8000 WebXRDeviceM69 --expire-timestamp=2000000000
-  let token_m69 = "AkvrKmuIjbDoP4zBBuZLWVMJLzFCV+2l8Iv2RPYCSbeSjFRRidSbIgW41p+jnCcOukYZ3tE4ZvQsR6qNhiIW5QoAAABWeyJvcmlnaW4iOiAiaHR0cDovLzEyNy4wLjAuMTo4MDAwIiwgImZlYXR1cmUiOiAiV2ViWFJEZXZpY2VNNjkiLCAiZXhwaXJ5IjogMjAwMDAwMDAwMH0=";
-  OriginTrialsHelper.add_token(token_m69);
-  test(t => {
-    OriginTrialsHelper.check_properties_missing(this, properties_to_check);
-  }, "WebXR's entrypoint properties are not available with WebXRDeviceM69 token.");
-}
-
-// generated with command
-// tools/origin_trials/generate_token.py http://127.0.0.1:8000 WebXRDeviceM73 --expire-timestamp=2000000000
-let token_m73 = "AkdUKG/76uPyi1gvtP+q4o8XF9C6DWpF45h6xzMHwBFS+cfXrgo0zMHkA1T9ovuz+VVtxacaS/dc8F8JeWpcqAoAAABWeyJvcmlnaW4iOiAiaHR0cDovLzEyNy4wLjAuMTo4MDAwIiwgImZlYXR1cmUiOiAiV2ViWFJEZXZpY2VNNzMiLCAiZXhwaXJ5IjogMjAwMDAwMDAwMH0=";
-OriginTrialsHelper.add_token(token_m73);
+// The WebXR APIs should not be present without the token.
 test(t => {
-  OriginTrialsHelper.check_properties(this, properties_to_check);
-}, "WebXR's entrypoint properties are available with WebXRDeviceM73 token.");
+  OriginTrialsHelper.check_properties_missing_unless_runtime_flag(this, properties_to_check, 'webXREnabled');
+}, "WebXR's entrypoint properties are not available without a token.");
+
+// Add the token, which was generated with the following command:
+// tools/origin_trials/generate_token.py http://127.0.0.1:8000 WebXRDeviceM73 --expire-timestamp=2000000000
+let token = "AkdUKG/76uPyi1gvtP+q4o8XF9C6DWpF45h6xzMHwBFS+cfXrgo0zMHkA1T9ovuz+VVtxacaS/dc8F8JeWpcqAoAAABWeyJvcmlnaW4iOiAiaHR0cDovLzEyNy4wLjAuMTo4MDAwIiwgImZlYXR1cmUiOiAiV2ViWFJEZXZpY2VNNzMiLCAiZXhwaXJ5IjogMjAwMDAwMDAwMH0=";
+OriginTrialsHelper.add_token(token);
+
+// The WebXR APIs should be available now.
+test(t => {
+  OriginTrialsHelper.check_properties_exist(this, properties_to_check);
+}, "WebXR's entrypoint properties are available with origin trial token.");
 
 
-// Ensure that no Gamepad Extensions are enabled.
+// Ensure that Gamepad Extensions are NOT enabled by the origin trial token.
+test(t => {
+    webvr_gamepad_properties = {
+    'Gamepad': ['pose', 'hand', 'displayId'],
+  };
+    OriginTrialsHelper.check_properties_missing_unless_runtime_flag(this, webvr_gamepad_properties, 'webVREnabled');
+}, "WebVR-specific Gamepad properties are not available with a token.");
 
-gamepad_properties_to_check = {
-  'Gamepad': ['pose', 'hand', 'displayId'],
-};
-
-gamepad_interfaces_to_check = [
-  'GamepadPose'
-];
-
-// Experimental web platform features are always enabled when this test is run
-// normally, so do not check in that case.
-if (!self.internals.runtimeFlags.webVREnabled) {
-  test(t => {
-    OriginTrialsHelper.check_properties_missing(this, gamepad_properties_to_check);
-  }, "WebVR-specific Gamepad properties are not available.");
-
-  test(t => {
-    OriginTrialsHelper.check_interfaces_missing(this, gamepad_interfaces_to_check);
-  }, "WebVR-specific Gamepad interfaces are not available.");
-}
+test(t => {
+  webvr_gamepad_interfaces = [
+    'GamepadPose'
+  ];
+    OriginTrialsHelper.check_interfaces_missing_unless_runtime_flag(this, webvr_gamepad_interfaces, 'webVREnabled');
+}, "WebVR-specific Gamepad interfaces are not available with a token.");
 </script>
diff --git a/third_party/blink/web_tests/http/tests/resources/origin-trials-helper.js b/third_party/blink/web_tests/http/tests/resources/origin-trials-helper.js
index 667696a9..1d4aa411 100644
--- a/third_party/blink/web_tests/http/tests/resources/origin-trials-helper.js
+++ b/third_party/blink/web_tests/http/tests/resources/origin-trials-helper.js
@@ -2,89 +2,133 @@
 // LayoutTests that are checking members exposed to script by origin trials.
 //
 // The current available methods are:
-// check_properties:
-//   Tests for the existence of the given property names, on the given interface
-//   names, on the global object. As well, it can test for properties of the
-//   global object itself, by giving 'global' as the interface name.
+// check_properties_exist:
+//   Tests that the given property names exist on the given interface
+//   names on the global object. It can also test for properties of the
+//   global object itself by giving 'global' as the interface name.
 // Example:
-//   OriginTrialsHelper.check_properties(
+//   OriginTrialsHelper.check_properties_exist(
 //     this,
 //     {'InstallEvent':['registerForeignFetch'], 'global':['onforeignfetch']});
 //
 // check_properties_missing:
-//   Tests that the given property names do not exist on the global object. That
-//   is, tests for the opposite of check_properties().
+//   Tests that the given property names do NOT exist on the given interface
+//   names on the global object.  It can also test for properties of the
+//   global object itself by giving 'global' as the interface name.
+//   In other words, tests for the opposite of check_properties_exist().
 // Example:
 //   OriginTrialsHelper.check_properties_missing(
 //     this,
 //     {'InstallEvent':['registerForeignFetch'], 'global':['onforeignfetch']});
 //
-// check_interfaces:
-//   Tests for the existence of the given interface names, on the global object.
+// check_properties_missing_unless_runtime_flag
+//   Tests that the given property names exist on the given interface
+//   names on the global object if and only if the specified runtime flag is
+//   enabled. It can also test for properties of the global object itself by
+//   giving 'global' as the interface name.
+//   Equivalent to calling check_properties_exist() if the specified runtime
+//   flag is enabled and calling check_properties_missing() otherwise.
 // Example:
-//   OriginTrialsHelper.check_interfaces(
+//   OriginTrialsHelper.check_properties_missing_unless_runtime_flag(
+//     this,
+//     {'InstallEvent':['registerForeignFetch'], 'global':['onforeignfetch']},
+//     'foreignFetchEnabled');
+//
+// check_interfaces_exist:
+//   Tests that the given interface names exist on the global object.
+// Example:
+//   OriginTrialsHelper.check_interfaces_exist(
 //     this,
 //     ['USBAlternateInterface', 'USBConfiguration']);
 //
 // check_interfaces_missing:
-//   Tests that the given interface names do not exist on the global object.
-//   That is, tests for the opposite of check_interfaces().
+//   Tests that the given interface names do NOT exist on the global object.
+//   In other words, tests for the opposite of check_interfaces_exist().
 // Example:
 //   OriginTrialsHelper.check_interfaces_missing(
 //     this,
 //     ['USBAlternateInterface', 'USBConfiguration']);
 //
+// check_interfaces_missing_unless_runtime_flag
+//   Tests that the given interface names exist on the global object if and
+//   only if the specified runtime flag is enabled.
+//   Equivalent to calling check_interfaces_exist() if the specified runtime
+//   flag is enabled and calling check_interfaces_missing() otherwise.
+// Example:
+//   OriginTrialsHelper.check_interfaces_missing_unless_runtime_flag(
+//     this,
+//     ['USBAlternateInterface', 'USBConfiguration'],
+//     'webUSBEnabled');
+//
 // add_token:
 //   Adds a trial token to the document, to enable a trial via script
 // Example:
 //   OriginTrialsHelper.add_token('token produced by generate_token.py');
+//
+// is_runtime_flag_enabled:
+//   Returns whether the specified runtime flag is enabled.
+//   Throws if the specified flag does not exist, making it more robust against
+//   typos and changes than checking self.internals.runtimeFlags directly.
+//   Prefer using other methods except in rare cases not covered by them.
+// Example:
+//   if (!OriginTrialsHelper.is_runtime_flag_enabled('webXREnabled')...
 'use strict';
 
 var OriginTrialsHelper = (function() {
-  return {
-    check_properties_impl: (global_object, property_filters, should_exist) => {
-      let interface_names = Object.getOwnPropertyNames(property_filters).sort();
-      interface_names.forEach(function(interface_name) {
-        let interface_prototype;
-        if (interface_name === 'global') {
-          interface_prototype = global_object;
-        } else {
-          let interface_object = global_object[interface_name];
-          if (interface_object) {
-            interface_prototype = interface_object.prototype;
-          }
+  function check_properties_impl(global_object, property_filters, should_exist) {
+    let interface_names = Object.getOwnPropertyNames(property_filters).sort();
+    interface_names.forEach(function(interface_name) {
+      let interface_prototype;
+      if (interface_name === 'global') {
+        interface_prototype = global_object;
+      } else {
+        let interface_object = global_object[interface_name];
+        if (interface_object) {
+          interface_prototype = interface_object.prototype;
         }
-        assert_true(interface_prototype !== undefined, 'Interface ' + interface_name + ' exists');
-        property_filters[interface_name].forEach(function(property_name) {
-          assert_equals(interface_prototype.hasOwnProperty(property_name),
-              should_exist,
-              'Property ' + property_name + ' exists on ' + interface_name);
-        });
+      }
+      assert_true(interface_prototype !== undefined, 'Interface ' + interface_name + ' exists');
+      property_filters[interface_name].forEach(function(property_name) {
+        assert_equals(interface_prototype.hasOwnProperty(property_name),
+            should_exist,
+            'Property ' + property_name + ' exists on ' + interface_name);
       });
-    },
+    });
+  }
 
-    check_properties: (global_object, property_filters) => {
-      OriginTrialsHelper.check_properties_impl(global_object, property_filters, true);
+  function check_interfaces_impl(global_object, interface_names, should_exist) {
+    interface_names.sort();
+    interface_names.forEach(function(interface_name) {
+      assert_equals(global_object.hasOwnProperty(interface_name), should_exist,
+        'Interface ' + interface_name + ' exists on provided object');
+    });
+  }
+
+  return {
+    check_properties_exist: (global_object, property_filters) => {
+      check_properties_impl(global_object, property_filters, true);
     },
 
     check_properties_missing: (global_object, property_filters) => {
-      OriginTrialsHelper.check_properties_impl(global_object, property_filters, false);
+      check_properties_impl(global_object, property_filters, false);
     },
 
-    check_interfaces_impl: (global_object, interface_names, should_exist) => {
-      interface_names.sort();
-      interface_names.forEach(function(interface_name) {
-        assert_equals(global_object.hasOwnProperty(interface_name), should_exist,
-          'Interface ' + interface_name + ' exists on provided object');
-      });
+    check_properties_missing_unless_runtime_flag: (global_object, property_filters, flag_name) => {
+      check_properties_impl(global_object, property_filters,
+                            OriginTrialsHelper.is_runtime_flag_enabled(flag_name));
     },
 
-    check_interfaces: (global_object, interface_names) => {
-      OriginTrialsHelper.check_interfaces_impl(global_object, interface_names, true);
+    check_interfaces_exist: (global_object, interface_names) => {
+      check_interfaces_impl(global_object, interface_names, true);
     },
 
     check_interfaces_missing: (global_object, interface_names) => {
-      OriginTrialsHelper.check_interfaces_impl(global_object, interface_names, false);
+      check_interfaces_impl(global_object, interface_names, false);
+    },
+
+    check_interfaces_missing_unless_runtime_flag: (global_object, interface_names, flag_name) => {
+      check_interfaces_impl(global_object, interface_names,
+                            OriginTrialsHelper.is_runtime_flag_enabled(flag_name));
     },
 
     add_token: (token_string) => {
@@ -92,6 +136,13 @@
       tokenElement.httpEquiv = 'origin-trial';
       tokenElement.content = token_string;
       document.head.appendChild(tokenElement);
+    },
+
+    is_runtime_flag_enabled: (flag_name) => {
+      if (!(flag_name in self.internals.runtimeFlags))
+        throw 'Runtime flag "' + flag_name + '" does not exist on self.internals.runtimeFlags';
+      let flagValue = self.internals.runtimeFlags[flag_name];
+      return flagValue;
     }
   }
 })();
diff --git a/third_party/blink/web_tests/presentation/presentationrequest-getavailability.html b/third_party/blink/web_tests/presentation/presentationrequest-getavailability.html
new file mode 100644
index 0000000..48d8c6c
--- /dev/null
+++ b/third_party/blink/web_tests/presentation/presentationrequest-getavailability.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+<body>
+<script src="../resources/testharness.js"></script>
+<script src="../resources/testharnessreport.js"></script>
+<script>
+
+const httpsUrl = "https://example.com";
+
+test(() => {
+  const request = new PresentationRequest(httpsUrl);
+  const promise = request.getAvailability();
+  assert_true(promise instanceof Promise);
+}, "Test that PresentationRequest.getAvailability() returns a Promise.");
+
+test(() => {
+  const request = new PresentationRequest(httpsUrl);
+  const promise = request.getAvailability();
+  assert_true(promise instanceof Promise);
+  const samePromise = request.getAvailability();
+  assert_true(samePromise instanceof Promise, "PresentationRequest.getAvailabilty() returns a Promise if called again on the same request.");
+  assert_equals(promise, samePromise, "If the PresentationRequest object has an unsettled Promise, getAvailability returns that Promise.");
+}, "Tests that PresentationRequest.getAvailability() returns the same unsettled Promise when called twice.");
+
+</script>
+</body>
+</html>
diff --git a/third_party/sqlite/fuzz/README.md b/third_party/sqlite/fuzz/README.md
new file mode 100644
index 0000000..a4485b6
--- /dev/null
+++ b/third_party/sqlite/fuzz/README.md
@@ -0,0 +1,57 @@
+"[Clusterfuzz](https://google.github.io/clusterfuzz/) is a scalable fuzzing
+infrastructure which finds security and stabilty issues in software". Chromium
+uses Clusterfuzz to find bugs in sqlite, among others.
+
+Given access to a clusterfuzz test case, this README will describe how one can
+reproduce and help diagnose sqlite bugs found by clusterfuzz.
+
+Example bug: https://crbug.com/956851
+
+# Simple automated repro
+TODO: Move to [here](https://google.github.io/clusterfuzz/using-clusterfuzz/)?
+If just trying to verify that the bug still repros on the current trunk:
+1. Open the relevant bug (ex. https://crbug.com/956851).
+2. Open the clusterfuzz "Detailed report" (ex. https://clusterfuzz.com/testcase?key=5756437473656832).
+3. Click on the "REDO TASK" button.
+4. Check on "Check if bug still reproduces", and click "Commit".
+5. The bottom of the clusterfuzz "Detailed report" from (2) should reflect that
+the "Redo task(s): progression" task has started.
+6. Wait for a few hours to a day, and this link should update to reflect that
+the "Progression task finished.". If the bug has been fixed in master, then it
+will automatically be closed. Otherwise, the bug still repro's, and the updated
+stack trace will be displayed in the "Detailed report".
+
+# Local repro context
+1. Run from your Chromium source directory.
+
+# Local repro using clusterfuzz testcase id
+If the fuzzer that identified this bug is public (ex. dbfuzz2), reproduce
+locally.
+1. Set ${TESTCASE_ID}, where TESTCASE_ID is the ID at the end of the clusterfuzz
+link (ex. `export TESTCASE_ID=5756437473656832`).
+2. `/google/data/ro/teams/clusterfuzz-tools/releases/clusterfuzz reproduce --current --skip-deps ${TESTCASE_ID}`,
+For more information, see the [Reproduce Tool on Github](https://github.com/google/clusterfuzz-tools).
+
+# Local repro using clusterfuzz testcase
+If the fuzzer is not public (ex. LPM-based fuzzers, including fts_lpm), or if
+more data is needed, reproduce a bit more manually by first building the target.
+To build the target, first set .gn args to match those in the clusterfuzz link,
+then build and run the fuzzer.
+
+1. `export FUZZER_NAME=sqlite3_fts3_lpm_fuzzer  # FUZZER_NAME is listed in the crbug as the Fuzz target binary`
+2. Download the clusterfuzz minimized testcase and set it's path to CLUSTERFUZZ_TESTCASE using `export CLUSTERFUZZ_TESTCASE=./clusterfuzz-testcase-minimized-sqlite3_fts3_lpm_fuzzer-5756437473656832`
+3. `gn gen args out/Fuzzer  # Set arguments to matches those in the clusterfuzz"Detailed report"'s "GN CONFIG (ARGS.GN)" section`
+4. `autoninja -C out/Fuzzer/ ${FUZZER_NAME}  # Build the fuzzer target`
+5. `./out/Fuzzer/${FUZZER_NAME} ${CLUSTERFUZZ_TESTCASE}  # Verify repro by running fuzzer`
+6. `LPM_DUMP_NATIVE_INPUT=1 SQL_SKIP_QUERIES=AlterTable ./out/Fuzzer/${FUZZER_NAME} ${CLUSTERFUZZ_TESTCASE}  # Try using different args to get SQL statements that will repro the bug`
+7. Optionally, take output from (6) into a repro.sql file for further testing.
+To do so, either copy the SQL query in the output from (6) into a .sql file, or
+run the final command in (6) with a `> repro.sql` at the end, and filter out
+non-sql content afterwards. Either way, ensure that the case continues to repro
+given filters placed in (6).
+
+# Local repro using SQL commands
+Please have a SQL query ready, preferably in .sql format. For this context,
+we'll refer to this query as repro.sql.
+1. `autoninja -C out/Fuzzer/ sqlite_shell  # Build the sqlite_shell`
+2. `out/Fuzzer/sqlite_shell < repro.sql  # Try running this sql query in sqlite`
\ No newline at end of file
diff --git a/third_party/sqlite/fuzz/sql_fuzzer.cc b/third_party/sqlite/fuzz/sql_fuzzer.cc
index 5b5c800..3cfd77f7 100644
--- a/third_party/sqlite/fuzz/sql_fuzzer.cc
+++ b/third_party/sqlite/fuzz/sql_fuzzer.cc
@@ -15,12 +15,15 @@
 
 using namespace sql_query_grammar;
 
-// TODO(mpdenton) Fuzzing tasks
-// 5. Definitely fix a lot of the syntax errors that SQlite spits out
-// 12. CORPUS Indexes on expressions (https://www.sqlite.org/expridx.html) and
+// Environment variable LPM_DUMP_NATIVE_INPUT can be used to print the
+// SQL queries used in the Clusterfuzz test case.
+
+// TODO(mpdenton): Fuzzing tasks
+// 1. Definitely fix a lot of the syntax errors that SQlite spits out
+// 2. CORPUS Indexes on expressions (https://www.sqlite.org/expridx.html) and
 // other places using functions on columns???
-// 17. Generate a nice big random, well-formed corpus.
-// 18. Possibly very difficult for fuzzer to find certain areas of code, because
+// 3. Generate a nice big random, well-formed corpus.
+// 4. Possibly very difficult for fuzzer to find certain areas of code, because
 // some protobufs need to be mutated together. For example, an index on an
 // expression is useless to change, if you don't change the SELECTs that use
 // that expression. May need to create a mechanism for the protobufs to
@@ -28,12 +31,10 @@
 // and then protobufs can simple reference those expressions later (similarly to
 // columns or tables, with just an index). This should be added if coverage
 // shows it is the case.
-
-// FIXME in the future
-// 1. Rest of the pragmas
-// 2. Make sure defensive config is off
-// 3. Fuzz the recover extension from the third patch
-// 5. Temp-file database, for better fuzzing of VACUUM and journalling.
+// 5. Add coverage for the rest of the pragmas
+// 6. Make sure defensive config is off
+// 7. Fuzz the recover extension from the third patch
+// 8. Temp-file database, for better fuzzing of VACUUM and journalling.
 
 DEFINE_BINARY_PROTO_FUZZER(const SQLQueries& sql_queries) {
   char* skip_queries = ::getenv("SQL_SKIP_QUERIES");
diff --git a/third_party/unrar/BUILD.gn b/third_party/unrar/BUILD.gn
index f315ffed..333a008 100644
--- a/third_party/unrar/BUILD.gn
+++ b/third_party/unrar/BUILD.gn
@@ -61,7 +61,12 @@
     }
 
     configs -= [ "//build/config/compiler:chromium_code" ]
-    configs += [ "//build/config/compiler:no_chromium_code" ]
+    configs += [
+      "//build/config/compiler:no_chromium_code",
+
+      # This must be after no_chromium_code for warning flags to be ordered correctly
+      ":unrar_warnings",
+    ]
 
     defines = [
       "_FILE_OFFSET_BITS=64",
@@ -83,3 +88,22 @@
     ]
   }
 }
+
+config("unrar_warnings") {
+  cflags = [
+    # unrar frequently drops parentheses around logical ops
+    "-Wno-logical-op-parentheses",
+
+    # unrar frequently has dangling elses
+    "-Wno-dangling-else",
+
+    # unrar has several non-exhaustive switch statements
+    "-Wno-switch",
+
+    # unrar has several unused functions
+    "-Wno-unused-function",
+
+    # unrar has missing braces for initialization in rarvm.cpp
+    "-Wno-missing-braces",
+  ]
+}
diff --git a/third_party/webxr_test_pages/webxr-samples/input-selection.html b/third_party/webxr_test_pages/webxr-samples/input-selection.html
index 80fcf3f6..9bc27ff 100644
--- a/third_party/webxr_test_pages/webxr-samples/input-selection.html
+++ b/third_party/webxr_test_pages/webxr-samples/input-selection.html
@@ -211,7 +211,11 @@
         document.querySelector('header').appendChild(xrButton.domElement);
 
         if (navigator.xr) {
-          navigator.xr.requestSession('inline').then(onSessionStarted);
+          const mode = 'inline';
+          navigator.xr.requestSession(mode).then((session) => {
+            session.mode = mode;
+            onSessionStarted(session);
+          });
         } else {
           initFallback();
         }
@@ -282,7 +286,9 @@
       }
 
       function onRequestSession() {
-        navigator.xr.requestSession('immersive-vr').then((session) => {
+        const mode = 'immersive-vr';
+        navigator.xr.requestSession(mode).then((session) => {
+          session.mode = mode;
           xrButton.setSession(session);
           onSessionStarted(session);
         });
diff --git a/tools/fuchsia/local-sdk.py b/tools/fuchsia/local-sdk.py
index 94fdb8c..671f4ead 100755
--- a/tools/fuchsia/local-sdk.py
+++ b/tools/fuchsia/local-sdk.py
@@ -33,9 +33,9 @@
 
 def BuildForArch(arch):
   build_dir = 'out/release-' + arch
-  Run('scripts/fx', '--dir', build_dir, 'set', 'sdk_image.' + arch,
-      '--with=//topaz/packages/sdk:topaz', '--args=is_debug=false',
-      '--args=build_sdk_archives=true')
+  Run('scripts/fx', '--dir', build_dir, 'set', 'terminal.' + arch,
+      '--with=//topaz/packages/sdk:topaz', '--with-base=//sdk/bundles:tools',
+      '--args=is_debug=false', '--args=build_sdk_archives=true')
   Run('scripts/fx', 'build', 'topaz/public/sdk:topaz', 'sdk:images_archive')
 
 
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index ec44b9e..3b140bd1 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -19139,6 +19139,8 @@
   <int value="1332" label="MANAGEMENT_INSTALLREPLACEMENTWEBAPP"/>
   <int value="1333" label="FILEMANAGERPRIVATE_GETANDROIDPICKERAPPS"/>
   <int value="1334" label="FILEMANAGERPRIVATE_SELECTANDROIDPICKERAPP"/>
+  <int value="1335" label="AUTOTESTPRIVATE_GETSHELFALIGNMENT"/>
+  <int value="1336" label="AUTOTESTPRIVATE_SETSHELFALIGNMENT"/>
 </enum>
 
 <enum name="ExtensionIconState">
@@ -22936,6 +22938,10 @@
   <int value="2873" label="WebShareSuccessfulWithoutFiles"/>
   <int value="2874" label="WebShareUnsuccessfulContainingFiles"/>
   <int value="2875" label="WebShareUnsuccessfulWithoutFiles"/>
+  <int value="2876" label="VerticalScrollbarThumbScrollingWithMouse"/>
+  <int value="2877" label="VerticalScrollbarThumbScrollingWithTouch"/>
+  <int value="2878" label="HorizontalScrollbarThumbScrollingWithMouse"/>
+  <int value="2879" label="HorizontalScrollbarThumbScrollingWithTouch"/>
 </enum>
 
 <enum name="FeaturePolicyFeature">
@@ -32354,6 +32360,7 @@
   <int value="-2009622663" label="WebRtcHWH264Encoding:enabled"/>
   <int value="-2008272679" label="disable-webrtc-hw-encoding"/>
   <int value="-2005089558" label="BackgroundVideoTrackOptimization:disabled"/>
+  <int value="-2004882388" label="AutofillPruneSuggestions:enabled"/>
   <int value="-2004231189" label="AppNotificationStatusMessaging:disabled"/>
   <int value="-2003354337"
       label="enable-search-button-in-omnibox-for-str-or-iip"/>
@@ -32378,7 +32385,6 @@
   <int value="-1971086581" label="print-scaling"/>
   <int value="-1965587041" label="omnibox-tab-switch-suggestions"/>
   <int value="-1964261747" label="WebVrVsyncAlign:disabled"/>
-  LoginCustomFlags
   <int value="-1963427770" label="EmojiHandwritingVoiceInput:disabled"/>
   <int value="-1963402827" label="enable-topchrome-md"/>
   <int value="-1962749353" label="SimplifiedNTP:enabled"/>
@@ -33229,6 +33235,7 @@
   <int value="-734301625"
       label="AutofillImportNonFocusableCreditCardForms:disabled"/>
   <int value="-731133967" label="AutofillSettingsCardTypeSplit:disabled"/>
+  <int value="-728461030" label="AutofillPruneSuggestions:disabled"/>
   <int value="-727860269" label="WebAuthenticationBle:disabled"/>
   <int value="-726892130" label="AndroidMessagesIntegration:disabled"/>
   <int value="-723224470" label="enable-password-force-saving:enabled"/>
@@ -40992,7 +40999,7 @@
 
 <enum name="NTPSearchSuggestionsRequestStatus">
   <int value="0" label="Unknown Error"/>
-  <int value="1" label="Sent"/>
+  <int value="1" label="ReceivedResponse"/>
   <int value="2" label="SignedOut"/>
   <int value="3" label="OptedOut"/>
   <int value="4" label="ImpressionCap"/>
@@ -56642,6 +56649,10 @@
   <int value="0" label="VAAPI_ERROR"/>
 </enum>
 
+<enum name="VAJDAWorkerDecoderFailure">
+  <int value="0" label="kVaapiError"/>
+</enum>
+
 <enum name="VAJEAEncoderResult">
   <int value="0" label="VAAPI_SUCCESS"/>
   <int value="1" label="VAAPI_ERROR"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index f65dca6c..1df53ff 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -37222,6 +37222,15 @@
   </summary>
 </histogram>
 
+<histogram name="Extensions.HomepageOverrides" expires_after="M85">
+  <owner>rdevlin.cronin@chromium.org</owner>
+  <owner>kelvinjiang@chromium.org</owner>
+  <summary>
+    The number of enabled extensions with a homepage override specified in their
+    manifest. Recorded once per profile at profile initialization.
+  </summary>
+</histogram>
+
 <histogram name="Extensions.HostedAppLaunchContainer" enum="AppLaunchContainer">
   <owner>benwells@chromium.org</owner>
   <summary>
@@ -38635,6 +38644,15 @@
   <summary>Length of the path under which a CRX is unpacked.</summary>
 </histogram>
 
+<histogram name="Extensions.SearchEngineOverrides" expires_after="M85">
+  <owner>rdevlin.cronin@chromium.org</owner>
+  <owner>kelvinjiang@chromium.org</owner>
+  <summary>
+    The number of enabled extensions with a search engine override specified in
+    their manifest. Recorded once per profile at profile initialization.
+  </summary>
+</histogram>
+
 <histogram name="Extensions.SettingsQuotaExceeded.BytesPerSetting"
     expires_after="2016-09-13">
   <obsolete>
@@ -38713,6 +38731,15 @@
   </summary>
 </histogram>
 
+<histogram name="Extensions.StartupPagesOverrides" expires_after="M85">
+  <owner>rdevlin.cronin@chromium.org</owner>
+  <owner>kelvinjiang@chromium.org</owner>
+  <summary>
+    The number of enabled extensions with startup page overrides specified in
+    their manifest. Recorded once per profile at profile initialization.
+  </summary>
+</histogram>
+
 <histogram name="Extensions.StorageFrontendInitTime" units="ms"
     expires_after="M77">
   <owner>rkaplow@chromium.org</owner>
@@ -54703,6 +54730,16 @@
   </summary>
 </histogram>
 
+<histogram name="Media.VAJDAWorker.DecoderFailure"
+    enum="VAJDAWorkerDecoderFailure" expires_after="2020-05-01">
+  <owner>andrescj@chromium.org</owner>
+  <owner>chromeos-gfx@chromium.org</owner>
+  <summary>
+    Count of VAAPI errors that occur inside the VaapiWrapper due to
+    functionality needed by the VaapiJpegDecodeAcceleratorWorker.
+  </summary>
+</histogram>
+
 <histogram name="Media.VAJEA.EncoderResult" enum="VAJEAEncoderResult"
     expires_after="M77">
   <owner>shenghao@chromium.org</owner>
@@ -76939,8 +76976,28 @@
   </summary>
 </histogram>
 
-<histogram name="NewTabPage.SearchSuggestions.RequestLatency" units="ms"
-    expires_after="M76">
+<histogram name="NewTabPage.SearchSuggestions.IndexClicked" expires_after="M78">
+  <owner>kmilka@chromium.org</owner>
+  <owner>ramyan@chromium.org</owner>
+  <summary>
+    The index of the search suggestion tile that was clicked on the local NTP.
+  </summary>
+</histogram>
+
+<histogram name="NewTabPage.SearchSuggestions.RequestLatency" units="ms">
+  <obsolete>
+    Deprecated 2019-03 as it doesn't correctly capture all request states.
+  </obsolete>
+  <owner>kmilka@chromium.org</owner>
+  <owner>ramyan@chromium.org</owner>
+  <summary>
+    The time it took until a request from the New Tab page for the search
+    suggestions script was served. Recorded only on the local NTP.
+  </summary>
+</histogram>
+
+<histogram name="NewTabPage.SearchSuggestions.RequestLatencyV2" units="ms"
+    expires_after="M78">
   <owner>kmilka@chromium.org</owner>
   <owner>ramyan@chromium.org</owner>
   <summary>
@@ -76951,6 +77008,10 @@
 
 <histogram name="NewTabPage.SearchSuggestions.RequestStatus"
     enum="NTPSearchSuggestionsRequestStatus" expires_after="M76">
+  <obsolete>
+    Deprecated 2019-03 as it grouped together requests that returned no
+    suggestions with those that failed completely, which is misleading.
+  </obsolete>
   <owner>kmilka@chromium.org</owner>
   <owner>ramyan@chromium.org</owner>
   <summary>
@@ -76959,6 +77020,24 @@
   </summary>
 </histogram>
 
+<histogram name="NewTabPage.SearchSuggestions.RequestStatusV2"
+    enum="NTPSearchSuggestionsRequestStatus" expires_after="M76">
+  <owner>kmilka@chromium.org</owner>
+  <owner>ramyan@chromium.org</owner>
+  <summary>
+    Whether a request was made for search suggestions on NTP load; and if a
+    request was not made, the reason why.
+  </summary>
+</histogram>
+
+<histogram name="NewTabPage.SearchSuggestions.ShownCount" expires_after="M78">
+  <owner>kmilka@chromium.org</owner>
+  <owner>ramyan@chromium.org</owner>
+  <summary>
+    The number of search suggestion tiles that were shown on the local NTP.
+  </summary>
+</histogram>
+
 <histogram name="NewTabPage.SearchURLs.Total" expires_after="2016-02-19">
   <obsolete>
     Deprecated 2016-02 (and not recorded for some time before that).
@@ -150575,11 +150654,27 @@
 
 <histogram_suffixes name="NewTabPage.SearchSuggestions.RequestLatency"
     separator=".">
+  <obsolete>
+    Deprecated April 2019, replaced by
+    NewTabPage.SearchSuggestions.RequestLatencyV2.
+  </obsolete>
   <suffix name="Failure" label="Failed to fetch search suggestions"/>
   <suffix name="Success" label="Successfully fetched search suggestions"/>
   <affected-histogram name="NewTabPage.SearchSuggestions.RequestLatency"/>
 </histogram_suffixes>
 
+<histogram_suffixes name="NewTabPage.SearchSuggestions.RequestLatencyV2"
+    separator=".">
+  <suffix name="Failure" label="Failed to fetch search suggestion data"/>
+  <suffix name="SuccessWithoutSuggestions"
+      label="Successfully fetched search suggestion data which did not
+             contain suggestions"/>
+  <suffix name="SuccessWithSuggestions"
+      label="Successfully fetched search suggestion data which contained
+             suggestions"/>
+  <affected-histogram name="NewTabPage.SearchSuggestions.RequestLatencyV2"/>
+</histogram_suffixes>
+
 <histogram_suffixes name="NewTabPageIconTypes" separator=".">
   <suffix name="IconsColor"
       label="Icons using a fallback color (favicon resolution too low)."/>
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config
index 1cbe92ac..6ed6550 100644
--- a/tools/perf/expectations.config
+++ b/tools/perf/expectations.config
@@ -6,7 +6,7 @@
 # tags: Android_Webview Android_but_not_webview Mac Win Linux
 # tags: ChromeOS Android Desktop Nexus_5 Nexus_5X Nexus_6P
 # tags: Nexus_7 Mac_10.11 Mac_10.12 Nexus6_Webview Nexus5X_Webview
-# tags: Pixel_2 Win_7 Win_10
+# tags: Pixel_2 Win_7 Win_10 Android_Go_Webview
 
 # Benchmark: blink_perf.bindings
 crbug.com/882881 [ Nexus_5 ] blink_perf.bindings/structured-clone-json-deserialize.html [ Skip ]
@@ -321,6 +321,8 @@
 crbug.com/954959 [ Linux ] v8.browsing_desktop/browse:media:pinterest:2018 [ Skip ]
 crbug.com/954959 [ Linux ] v8.browsing_desktop/browse:tools:maps [ Skip ]
 crbug.com/958422 [ Linux ] v8.browsing_desktop/browse:social:tumblr_infinite_scroll:2018 [ Skip ]
+crbug.com/958507 [ Mac ] v8.browsing_desktop/browse:social:tumblr_infinite_scroll:2018 [ Skip ]
+crbug.com/958507 [ Mac ] v8.browsing_desktop/browse:media:imgur [ Skip ]
 
 # Benchmark v8.browsing_desktop-future
 crbug.com/788796 [ Linux ] v8.browsing_desktop-future/browse:media:imgur [ Skip ]
@@ -329,8 +331,11 @@
 crbug.com/906654 [ All ] v8.browsing_desktop-future/browse:search:google [ Skip ]
 crbug.com/953371 [ Win ] v8.browsing_desktop-future/browse:social:twitter_infinite_scroll:2018 [ Skip ]
 crbug.com/958422 [ Linux ] v8.browsing_desktop-future/browse:social:tumblr_infinite_scroll:2018 [ Skip ]
+crbug.com/958507 [ Mac ] v8.browsing_desktop-future/browse:media:imgur [ Skip ]
+crbug.com/958507 [ Mac ] v8.browsing_desktop-future/browse:social:tumblr_infinite_scroll:2018 [ Skip ]
 
 # Benchmark: v8.browsing_mobile
+crbug.com/958034 [ Android_Go_Webview ] v8.browsing_mobile/* [ Skip ]
 crbug.com/714650 [ Android ] v8.browsing_mobile/browse:news:globo [ Skip ]
 crbug.com/767970 [ Android ] v8.browsing_mobile/browse:shopping:flipkart [ Skip ]
 crbug.com/708300 [ Android ] v8.browsing_mobile/browse:shopping:flipkart [ Skip ]
diff --git a/ui/keyboard/BUILD.gn b/ui/keyboard/BUILD.gn
index 1cbb657..b67d1d8 100644
--- a/ui/keyboard/BUILD.gn
+++ b/ui/keyboard/BUILD.gn
@@ -27,8 +27,8 @@
     "keyboard_controller.cc",
     "keyboard_controller.h",
     "keyboard_controller_observer.h",
-    "keyboard_event_filter.cc",
-    "keyboard_event_filter.h",
+    "keyboard_event_handler.cc",
+    "keyboard_event_handler.h",
     "keyboard_export.h",
     "keyboard_layout_delegate.h",
     "keyboard_layout_manager.cc",
@@ -157,7 +157,7 @@
     "container_floating_behavior_unittest.cc",
     "container_full_width_behavior_unittest.cc",
     "keyboard_controller_unittest.cc",
-    "keyboard_event_filter_unittest.cc",
+    "keyboard_event_handler_unittest.cc",
     "keyboard_ukm_recorder_unittest.cc",
     "keyboard_util_unittest.cc",
     "notification_manager_unittest.cc",
diff --git a/ui/keyboard/keyboard_controller.cc b/ui/keyboard/keyboard_controller.cc
index 156e25d..7202a02a 100644
--- a/ui/keyboard/keyboard_controller.cc
+++ b/ui/keyboard/keyboard_controller.cc
@@ -356,7 +356,7 @@
 
   aura::Window* keyboard_window = GetKeyboardWindow();
   if (keyboard_window) {
-    keyboard_window->RemovePreTargetHandler(&event_filter_);
+    keyboard_window->RemovePreTargetHandler(&event_handler_);
     if (keyboard_window->parent()) {
       DCHECK_EQ(parent_container_, keyboard_window->parent());
       parent_container_->RemoveChild(keyboard_window);
@@ -773,7 +773,7 @@
   DVLOG(1) << "LoadKeyboardWindow";
   aura::Window* keyboard_window = ui_->LoadKeyboardWindow(base::BindOnce(
       &KeyboardController::NotifyKeyboardWindowLoaded, base::Unretained(this)));
-  keyboard_window->AddPreTargetHandler(&event_filter_);
+  keyboard_window->AddPreTargetHandler(&event_handler_);
   keyboard_window->AddObserver(this);
   parent_container_->AddChild(keyboard_window);
 
diff --git a/ui/keyboard/keyboard_controller.h b/ui/keyboard/keyboard_controller.h
index 315d1ca..af5ca1df 100644
--- a/ui/keyboard/keyboard_controller.h
+++ b/ui/keyboard/keyboard_controller.h
@@ -22,7 +22,7 @@
 #include "ui/gfx/geometry/vector2d.h"
 #include "ui/keyboard/container_behavior.h"
 #include "ui/keyboard/display_util.h"
-#include "ui/keyboard/keyboard_event_filter.h"
+#include "ui/keyboard/keyboard_event_handler.h"
 #include "ui/keyboard/keyboard_export.h"
 #include "ui/keyboard/keyboard_layout_delegate.h"
 #include "ui/keyboard/keyboard_ukm_recorder.h"
@@ -439,7 +439,7 @@
 
   // If true, the keyboard is always visible even if no window has input focus.
   bool keyboard_locked_ = false;
-  KeyboardEventFilter event_filter_;
+  KeyboardEventHandler event_handler_;
 
   base::ObserverList<KeyboardControllerObserver>::Unchecked observer_list_;
 
diff --git a/ui/keyboard/keyboard_event_filter.cc b/ui/keyboard/keyboard_event_handler.cc
similarity index 67%
rename from ui/keyboard/keyboard_event_filter.cc
rename to ui/keyboard/keyboard_event_handler.cc
index 1d903f2..4a48ed6d 100644
--- a/ui/keyboard/keyboard_event_filter.cc
+++ b/ui/keyboard/keyboard_event_handler.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ui/keyboard/keyboard_event_filter.h"
+#include "ui/keyboard/keyboard_event_handler.h"
 
 #include "ui/events/event.h"
 #include "ui/gfx/geometry/vector2d.h"
@@ -10,7 +10,7 @@
 
 namespace keyboard {
 
-void KeyboardEventFilter::OnGestureEvent(ui::GestureEvent* event) {
+void KeyboardEventHandler::OnGestureEvent(ui::GestureEvent* event) {
   switch (event->type()) {
     case ui::ET_GESTURE_PINCH_BEGIN:
     case ui::ET_GESTURE_PINCH_END:
@@ -22,18 +22,18 @@
   }
 }
 
-void KeyboardEventFilter::OnMouseEvent(ui::MouseEvent* event) {
+void KeyboardEventHandler::OnMouseEvent(ui::MouseEvent* event) {
   ProcessPointerEvent(event);
 }
 
-void KeyboardEventFilter::OnTouchEvent(ui::TouchEvent* event) {
+void KeyboardEventHandler::OnTouchEvent(ui::TouchEvent* event) {
   ProcessPointerEvent(event);
 }
 
-void KeyboardEventFilter::ProcessPointerEvent(ui::LocatedEvent* event) {
+void KeyboardEventHandler::ProcessPointerEvent(ui::LocatedEvent* event) {
   auto* controller = KeyboardController::Get();
   if (controller->IsEnabled() && controller->HandlePointerEvent(*event))
     event->SetHandled();
 }
 
-}  // nemespace keyboard
+}  // namespace keyboard
diff --git a/ui/keyboard/keyboard_event_filter.h b/ui/keyboard/keyboard_event_handler.h
similarity index 60%
rename from ui/keyboard/keyboard_event_filter.h
rename to ui/keyboard/keyboard_event_handler.h
index d320132..e8b715d 100644
--- a/ui/keyboard/keyboard_event_filter.h
+++ b/ui/keyboard/keyboard_event_handler.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef UI_KEYBOARD_KEYBOARD_EVENT_FILTER_H_
-#define UI_KEYBOARD_KEYBOARD_EVENT_FILTER_H_
+#ifndef UI_KEYBOARD_KEYBOARD_EVENT_HANDLER_H_
+#define UI_KEYBOARD_KEYBOARD_EVENT_HANDLER_H_
 
 #include "base/macros.h"
 #include "ui/events/event.h"
@@ -12,12 +12,12 @@
 
 namespace keyboard {
 
-// EventFilter for the keyboard window, which intercepts events before they are
+// EventHandler for the keyboard window, which intercepts events before they are
 // processed by the keyboard window.
-class KEYBOARD_EXPORT KeyboardEventFilter : public ui::EventHandler {
+class KEYBOARD_EXPORT KeyboardEventHandler : public ui::EventHandler {
  public:
-  KeyboardEventFilter() = default;
-  ~KeyboardEventFilter() override = default;
+  KeyboardEventHandler() = default;
+  ~KeyboardEventHandler() override = default;
 
   // ui::EventHandler overrides:
   void OnGestureEvent(ui::GestureEvent* event) override;
@@ -27,9 +27,9 @@
  private:
   void ProcessPointerEvent(ui::LocatedEvent* event);
 
-  DISALLOW_COPY_AND_ASSIGN(KeyboardEventFilter);
+  DISALLOW_COPY_AND_ASSIGN(KeyboardEventHandler);
 };
 
 }  // namespace keyboard
 
-#endif  // UI_KEYBOARD_KEYBOARD_EVENT_FILTER_H_
+#endif  // UI_KEYBOARD_KEYBOARD_EVENT_HANDLER_H_
diff --git a/ui/keyboard/keyboard_event_filter_unittest.cc b/ui/keyboard/keyboard_event_handler_unittest.cc
similarity index 87%
rename from ui/keyboard/keyboard_event_filter_unittest.cc
rename to ui/keyboard/keyboard_event_handler_unittest.cc
index e859f61..520ed0d 100644
--- a/ui/keyboard/keyboard_event_filter_unittest.cc
+++ b/ui/keyboard/keyboard_event_handler_unittest.cc
@@ -2,15 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ui/keyboard/keyboard_event_filter.h"
+#include "ui/keyboard/keyboard_event_handler.h"
 
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/events/event.h"
 
 namespace keyboard {
 
-TEST(KeyboardEventFilterTest, FilterGestureEvents) {
-  KeyboardEventFilter filter;
+TEST(KeyboardEventHandlerTest, HandleGestureEvents) {
+  KeyboardEventHandler filter;
   ui::GestureEvent pinch_begin(
       15, 15, 0, base::TimeTicks(),
       ui::GestureEventDetails(ui::ET_GESTURE_PINCH_BEGIN));
@@ -33,4 +33,4 @@
   EXPECT_FALSE(tap.stopped_propagation());
 }
 
-}  // namespace keybaord
+}  // namespace keyboard
diff --git a/ui/ozone/platform/drm/gpu/vulkan_implementation_gbm.cc b/ui/ozone/platform/drm/gpu/vulkan_implementation_gbm.cc
index a12445dd..5ccb893a 100644
--- a/ui/ozone/platform/drm/gpu/vulkan_implementation_gbm.cc
+++ b/ui/ozone/platform/drm/gpu/vulkan_implementation_gbm.cc
@@ -14,6 +14,7 @@
 #include "gpu/vulkan/vulkan_surface.h"
 #include "gpu/vulkan/vulkan_util.h"
 #include "ui/gfx/gpu_fence.h"
+#include "ui/gfx/gpu_memory_buffer.h"
 
 namespace ui {
 
@@ -154,4 +155,21 @@
   return VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT;
 }
 
+bool VulkanImplementationGbm::CanImportGpuMemoryBuffer(
+    gfx::GpuMemoryBufferType memory_buffer_type) {
+  return false;
+}
+
+bool VulkanImplementationGbm::CreateImageFromGpuMemoryHandle(
+    VkDevice vk_device,
+    gfx::GpuMemoryBufferHandle gmb_handle,
+    gfx::Size size,
+    VkImage* vk_image,
+    VkImageCreateInfo* vk_image_info,
+    VkDeviceMemory* vk_device_memory,
+    VkDeviceSize* mem_allocation_size) {
+  NOTIMPLEMENTED();
+  return false;
+}
+
 }  // namespace ui
diff --git a/ui/ozone/platform/drm/gpu/vulkan_implementation_gbm.h b/ui/ozone/platform/drm/gpu/vulkan_implementation_gbm.h
index 7cd3b39c..e787a0e1 100644
--- a/ui/ozone/platform/drm/gpu/vulkan_implementation_gbm.h
+++ b/ui/ozone/platform/drm/gpu/vulkan_implementation_gbm.h
@@ -37,6 +37,16 @@
   gpu::SemaphoreHandle GetSemaphoreHandle(VkDevice vk_device,
                                           VkSemaphore vk_semaphore) override;
   VkExternalMemoryHandleTypeFlagBits GetExternalImageHandleType() override;
+  bool CanImportGpuMemoryBuffer(
+      gfx::GpuMemoryBufferType memory_buffer_type) override;
+  bool CreateImageFromGpuMemoryHandle(
+      VkDevice vk_device,
+      gfx::GpuMemoryBufferHandle gmb_handle,
+      gfx::Size size,
+      VkImage* vk_image,
+      VkImageCreateInfo* vk_image_info,
+      VkDeviceMemory* vk_device_memory,
+      VkDeviceSize* mem_allocation_size) override;
 
  private:
   gpu::VulkanInstance vulkan_instance_;
diff --git a/ui/ozone/platform/scenic/BUILD.gn b/ui/ozone/platform/scenic/BUILD.gn
index 36cff36..67d670f 100644
--- a/ui/ozone/platform/scenic/BUILD.gn
+++ b/ui/ozone/platform/scenic/BUILD.gn
@@ -30,6 +30,10 @@
     "scenic_window_canvas.h",
     "scenic_window_manager.cc",
     "scenic_window_manager.h",
+    "sysmem_buffer_collection.cc",
+    "sysmem_buffer_collection.h",
+    "sysmem_buffer_manager.cc",
+    "sysmem_buffer_manager.h",
   ]
 
   defines = [
@@ -45,6 +49,7 @@
     "//third_party/fuchsia-sdk/sdk:images",
     "//third_party/fuchsia-sdk/sdk:mem",
     "//third_party/fuchsia-sdk/sdk:scenic_cpp",
+    "//third_party/fuchsia-sdk/sdk:sysmem",
     "//third_party/fuchsia-sdk/sdk:ui_gfx",
     "//third_party/fuchsia-sdk/sdk:ui_scenic",
     "//ui/base",
diff --git a/ui/ozone/platform/scenic/client_native_pixmap_factory_scenic.cc b/ui/ozone/platform/scenic/client_native_pixmap_factory_scenic.cc
index 6227bb31..be96f8f 100644
--- a/ui/ozone/platform/scenic/client_native_pixmap_factory_scenic.cc
+++ b/ui/ozone/platform/scenic/client_native_pixmap_factory_scenic.cc
@@ -4,12 +4,113 @@
 
 #include "ui/ozone/platform/scenic/client_native_pixmap_factory_scenic.h"
 
-#include "ui/ozone/common/stub_client_native_pixmap_factory.h"
+#include <lib/zx/vmar.h>
+#include <lib/zx/vmo.h>
+#include <vector>
+
+#include "base/fuchsia/fuchsia_logging.h"
+#include "base/system/sys_info.h"
+#include "ui/gfx/client_native_pixmap.h"
+#include "ui/gfx/client_native_pixmap_factory.h"
+#include "ui/gfx/native_pixmap_handle.h"
 
 namespace ui {
 
+class ClientNativePixmapFuchsia : public gfx::ClientNativePixmap {
+ public:
+  explicit ClientNativePixmapFuchsia(gfx::NativePixmapHandle handle)
+      : handle_(std::move(handle)) {
+    DCHECK(!handle_.planes.empty());
+  }
+
+  ~ClientNativePixmapFuchsia() override {
+    if (mapping_)
+      Unmap();
+  }
+
+  bool Map() override {
+    if (mapping_)
+      return true;
+
+    if (!handle_.planes[0].vmo) {
+      NOTREACHED();
+      return false;
+    }
+
+    uintptr_t addr;
+
+    // Assume that last plane is at the end of the VMO.
+    mapping_size_ = handle_.planes.back().offset + handle_.planes.back().size;
+
+    // Verify that all planes fall within the mapped range.
+    for (auto& plane : handle_.planes) {
+      DCHECK_LE(plane.offset + plane.size, mapping_size_);
+    }
+
+    // Round mapping size to align with the page size.
+    size_t page_size = base::SysInfo::VMAllocationGranularity();
+    mapping_size_ = (mapping_size_ + page_size - 1) & ~(page_size - 1);
+
+    zx_status_t status =
+        zx::vmar::root_self()->map(0, handle_.planes[0].vmo, 0, mapping_size_,
+                                   ZX_VM_PERM_READ | ZX_VM_PERM_WRITE, &addr);
+    if (status != ZX_OK) {
+      ZX_DLOG(ERROR, status) << "zx_vmar_map";
+      return false;
+    }
+    mapping_ = reinterpret_cast<uint8_t*>(addr);
+
+    return true;
+  }
+
+  void Unmap() override {
+    DCHECK(mapping_);
+    zx_status_t status = zx::vmar::root_self()->unmap(
+        reinterpret_cast<uintptr_t>(mapping_), mapping_size_);
+    ZX_DCHECK(status == ZX_OK, status) << "zx_vmar_unmap";
+    mapping_ = nullptr;
+  }
+
+  void* GetMemoryAddress(size_t plane) const override {
+    DCHECK_LT(plane, handle_.planes.size());
+    DCHECK(mapping_);
+    return mapping_ + handle_.planes[plane].offset;
+  }
+
+  int GetStride(size_t plane) const override {
+    DCHECK_LT(plane, handle_.planes.size());
+    return handle_.planes[plane].stride;
+  }
+
+ private:
+  gfx::NativePixmapHandle handle_;
+
+  uint8_t* mapping_ = nullptr;
+  size_t mapping_size_ = 0;
+
+  DISALLOW_COPY_AND_ASSIGN(ClientNativePixmapFuchsia);
+};
+
+class ScenicClientNativePixmapFactory : public gfx::ClientNativePixmapFactory {
+ public:
+  ScenicClientNativePixmapFactory() = default;
+  ~ScenicClientNativePixmapFactory() override = default;
+
+  std::unique_ptr<gfx::ClientNativePixmap> ImportFromHandle(
+      gfx::NativePixmapHandle handle,
+      const gfx::Size& size,
+      gfx::BufferUsage usage) override {
+    if (handle.planes.empty())
+      return nullptr;
+    return std::make_unique<ClientNativePixmapFuchsia>(std::move(handle));
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ScenicClientNativePixmapFactory);
+};
+
 gfx::ClientNativePixmapFactory* CreateClientNativePixmapFactoryScenic() {
-  return CreateStubClientNativePixmapFactory();
+  return new ScenicClientNativePixmapFactory();
 }
 
 }  // namespace ui
diff --git a/ui/ozone/platform/scenic/ozone_platform_scenic.cc b/ui/ozone/platform/scenic/ozone_platform_scenic.cc
index 565d0efe..0635e97 100644
--- a/ui/ozone/platform/scenic/ozone_platform_scenic.cc
+++ b/ui/ozone/platform/scenic/ozone_platform_scenic.cc
@@ -24,6 +24,7 @@
 #include "ui/ozone/platform/scenic/scenic_surface_factory.h"
 #include "ui/ozone/platform/scenic/scenic_window.h"
 #include "ui/ozone/platform/scenic/scenic_window_manager.h"
+#include "ui/ozone/platform/scenic/sysmem_buffer_collection.h"
 #include "ui/ozone/platform_selection.h"
 #include "ui/ozone/public/cursor_factory_ozone.h"
 #include "ui/ozone/public/gpu_platform_support_host.h"
@@ -160,6 +161,11 @@
         base::ThreadTaskRunnerHandle::Get());
   }
 
+  bool IsNativePixmapConfigSupported(gfx::BufferFormat format,
+                                     gfx::BufferUsage usage) const override {
+    return SysmemBufferCollection::IsNativePixmapConfigSupported(format, usage);
+  }
+
  private:
   // base::MessageLoopCurrent::DestructionObserver implementation.
   void WillDestroyCurrentMessageLoop() override {
diff --git a/ui/ozone/platform/scenic/scenic_surface_factory.cc b/ui/ozone/platform/scenic/scenic_surface_factory.cc
index 24a771c..8237c592 100644
--- a/ui/ozone/platform/scenic/scenic_surface_factory.cc
+++ b/ui/ozone/platform/scenic/scenic_surface_factory.cc
@@ -23,6 +23,7 @@
 #include "ui/ozone/platform/scenic/scenic_window.h"
 #include "ui/ozone/platform/scenic/scenic_window_canvas.h"
 #include "ui/ozone/platform/scenic/scenic_window_manager.h"
+#include "ui/ozone/platform/scenic/sysmem_buffer_collection.h"
 
 #if BUILDFLAG(ENABLE_VULKAN)
 #include "ui/ozone/platform/scenic/vulkan_implementation_scenic.h"
@@ -63,53 +64,14 @@
   DISALLOW_COPY_AND_ASSIGN(GLOzoneEGLScenic);
 };
 
-// TODO(crbug.com/852011): Implement this class - currently it's just a stub.
-class ScenicPixmap : public gfx::NativePixmap {
- public:
-  explicit ScenicPixmap(gfx::AcceleratedWidget widget,
-                        gfx::Size size,
-                        gfx::BufferFormat format)
-      : size_(size), format_(format) {
-    NOTIMPLEMENTED_LOG_ONCE();
-  }
-
-  bool AreDmaBufFdsValid() const override { return false; }
-  int GetDmaBufFd(size_t plane) const override { return -1; }
-  int GetDmaBufPitch(size_t plane) const override { return 0; }
-  int GetDmaBufOffset(size_t plane) const override { return 0; }
-  uint64_t GetDmaBufModifier(size_t plane) const override { return 0; }
-  gfx::BufferFormat GetBufferFormat() const override { return format_; }
-  gfx::Size GetBufferSize() const override { return size_; }
-  uint32_t GetUniqueId() const override { return 0; }
-  bool ScheduleOverlayPlane(gfx::AcceleratedWidget widget,
-                            int plane_z_order,
-                            gfx::OverlayTransform plane_transform,
-                            const gfx::Rect& display_bounds,
-                            const gfx::RectF& crop_rect,
-                            bool enable_blend,
-                            std::unique_ptr<gfx::GpuFence> gpu_fence) override {
-    NOTIMPLEMENTED();
-    return false;
-  }
-  gfx::NativePixmapHandle ExportHandle() override {
-    NOTIMPLEMENTED();
-    return gfx::NativePixmapHandle();
-  }
-
- private:
-  ~ScenicPixmap() override {}
-
-  gfx::Size size_;
-  gfx::BufferFormat format_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScenicPixmap);
-};
-
 }  // namespace
 
 ScenicSurfaceFactory::ScenicSurfaceFactory(mojom::ScenicGpuHost* gpu_host)
     : gpu_host_(gpu_host),
       egl_implementation_(std::make_unique<GLOzoneEGLScenic>()),
+      sysmem_buffer_manager_(
+          base::fuchsia::ServiceDirectoryClient::ForCurrentProcess()
+              ->ConnectToServiceSync<fuchsia::sysmem::Allocator>()),
       weak_ptr_factory_(this) {
   // TODO(spang, crbug.com/923445): Add message loop to GPU tests.
   if (base::ThreadTaskRunnerHandle::IsSet())
@@ -160,7 +122,12 @@
     gfx::Size size,
     gfx::BufferFormat format,
     gfx::BufferUsage usage) {
-  return new ScenicPixmap(widget, size, format);
+  auto collection = sysmem_buffer_manager_.CreateCollection(vk_device, size,
+                                                            format, usage, 1);
+  if (!collection)
+    return nullptr;
+
+  return collection->CreateNativePixmap(0);
 }
 
 #if BUILDFLAG(ENABLE_VULKAN)
@@ -170,7 +137,8 @@
   if (!gpu_host_)
     LOG(FATAL) << "Vulkan implementation requires InitializeForGPU";
 
-  return std::make_unique<ui::VulkanImplementationScenic>(this);
+  return std::make_unique<ui::VulkanImplementationScenic>(
+      this, &sysmem_buffer_manager_);
 }
 #endif
 
diff --git a/ui/ozone/platform/scenic/scenic_surface_factory.h b/ui/ozone/platform/scenic/scenic_surface_factory.h
index b62f255..0228b166 100644
--- a/ui/ozone/platform/scenic/scenic_surface_factory.h
+++ b/ui/ozone/platform/scenic/scenic_surface_factory.h
@@ -17,6 +17,7 @@
 #include "base/threading/thread_checker.h"
 #include "gpu/vulkan/buildflags.h"
 #include "mojo/public/cpp/system/handle.h"
+#include "ui/ozone/platform/scenic/sysmem_buffer_manager.h"
 #include "ui/ozone/public/gl_ozone.h"
 #include "ui/ozone/public/interfaces/scenic_gpu_host.mojom.h"
 #include "ui/ozone/public/surface_factory_ozone.h"
@@ -91,6 +92,8 @@
   // Task runner for thread that |scenic_| and |gpu_host_| are bound on.
   scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner_;
 
+  SysmemBufferManager sysmem_buffer_manager_;
+
   THREAD_CHECKER(thread_checker_);
 
   base::WeakPtrFactory<ScenicSurfaceFactory> weak_ptr_factory_;
diff --git a/ui/ozone/platform/scenic/sysmem_buffer_collection.cc b/ui/ozone/platform/scenic/sysmem_buffer_collection.cc
new file mode 100644
index 0000000..fedc834
--- /dev/null
+++ b/ui/ozone/platform/scenic/sysmem_buffer_collection.cc
@@ -0,0 +1,388 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/ozone/platform/scenic/sysmem_buffer_collection.h"
+
+#include "base/bits.h"
+#include "base/fuchsia/fuchsia_logging.h"
+#include "gpu/vulkan/vulkan_device_queue.h"
+#include "gpu/vulkan/vulkan_function_pointers.h"
+#include "ui/gfx/native_pixmap.h"
+
+namespace ui {
+
+namespace {
+
+class SysmemNativePixmap : public gfx::NativePixmap {
+ public:
+  SysmemNativePixmap(scoped_refptr<SysmemBufferCollection> collection,
+                     gfx::NativePixmapHandle handle)
+      : collection_(collection), handle_(std::move(handle)) {}
+
+  bool AreDmaBufFdsValid() const override { return false; }
+  int GetDmaBufFd(size_t plane) const override {
+    NOTREACHED();
+    return -1;
+  }
+  int GetDmaBufPitch(size_t plane) const override {
+    NOTREACHED();
+    return 0;
+  }
+  int GetDmaBufOffset(size_t plane) const override {
+    NOTREACHED();
+    return 0;
+  }
+  uint64_t GetDmaBufModifier(size_t plane) const override {
+    NOTREACHED();
+    return 0;
+  }
+
+  gfx::BufferFormat GetBufferFormat() const override {
+    return collection_->format();
+  }
+  gfx::Size GetBufferSize() const override { return collection_->size(); }
+  uint32_t GetUniqueId() const override { return 0; }
+  bool ScheduleOverlayPlane(gfx::AcceleratedWidget widget,
+                            int plane_z_order,
+                            gfx::OverlayTransform plane_transform,
+                            const gfx::Rect& display_bounds,
+                            const gfx::RectF& crop_rect,
+                            bool enable_blend,
+                            std::unique_ptr<gfx::GpuFence> gpu_fence) override {
+    NOTIMPLEMENTED();
+
+    return false;
+  }
+  gfx::NativePixmapHandle ExportHandle() override {
+    return gfx::CloneHandleForIPC(handle_);
+  }
+
+ private:
+  ~SysmemNativePixmap() override = default;
+
+  // Keep reference to the collection to make sure it outlives the pixmap.
+  scoped_refptr<SysmemBufferCollection> collection_;
+  gfx::NativePixmapHandle handle_;
+
+  DISALLOW_COPY_AND_ASSIGN(SysmemNativePixmap);
+};
+
+size_t RoundUp(size_t value, size_t alignment) {
+  return ((value + alignment - 1) / alignment) * alignment;
+}
+
+VkFormat VkFormatForBufferFormat(gfx::BufferFormat buffer_format) {
+  switch (buffer_format) {
+    case gfx::BufferFormat::YUV_420_BIPLANAR:
+      return VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
+
+    case gfx::BufferFormat::R_8:
+      return VK_FORMAT_R8_UNORM;
+
+    case gfx::BufferFormat::RG_88:
+      return VK_FORMAT_R8G8_UNORM;
+
+    case gfx::BufferFormat::BGRA_8888:
+    case gfx::BufferFormat::BGRX_8888:
+      return VK_FORMAT_B8G8R8A8_UNORM;
+
+    case gfx::BufferFormat::RGBA_8888:
+    case gfx::BufferFormat::RGBX_8888:
+      return VK_FORMAT_R8G8B8A8_UNORM;
+
+    default:
+      NOTREACHED();
+      return VK_FORMAT_UNDEFINED;
+  }
+}
+
+}  // namespace
+
+// static
+bool SysmemBufferCollection::IsNativePixmapConfigSupported(
+    gfx::BufferFormat format,
+    gfx::BufferUsage usage) {
+  bool format_supported = format == gfx::BufferFormat::YUV_420_BIPLANAR ||
+                          format == gfx::BufferFormat::R_8 ||
+                          format == gfx::BufferFormat::RG_88 ||
+                          format == gfx::BufferFormat::RGBA_8888 ||
+                          format == gfx::BufferFormat::RGBX_8888 ||
+                          format == gfx::BufferFormat::BGRA_8888 ||
+                          format == gfx::BufferFormat::BGRX_8888;
+  bool usage_supported = usage == gfx::BufferUsage::SCANOUT ||
+                         usage == gfx::BufferUsage::SCANOUT_CPU_READ_WRITE ||
+                         usage == gfx::BufferUsage::GPU_READ_CPU_READ_WRITE;
+  return format_supported && usage_supported;
+}
+
+SysmemBufferCollection::SysmemBufferCollection()
+    : id_(gfx::SysmemBufferCollectionId::Create()) {}
+
+bool SysmemBufferCollection::Initialize(
+    fuchsia::sysmem::Allocator_Sync* allocator,
+    gfx::Size size,
+    gfx::BufferFormat format,
+    gfx::BufferUsage usage,
+    VkDevice vk_device,
+    size_t num_buffers) {
+  DCHECK(IsNativePixmapConfigSupported(format, usage));
+  DCHECK(!collection_);
+
+  // Currently all supported |usage| values require GPU access, which requires
+  // a valid VkDevice.
+  if (vk_device == VK_NULL_HANDLE)
+    return false;
+
+  size_ = size;
+  format_ = format;
+  usage_ = usage;
+  vk_device_ = vk_device;
+
+  fuchsia::sysmem::BufferCollectionTokenSyncPtr collection_token;
+  zx_status_t status =
+      allocator->AllocateSharedCollection(collection_token.NewRequest());
+  if (status != ZX_OK) {
+    ZX_DLOG(ERROR, status)
+        << "fuchsia.sysmem.Allocator.AllocateSharedCollection()";
+    return false;
+  }
+
+  fuchsia::sysmem::BufferCollectionTokenPtr vulkan_collection_token;
+  collection_token->Duplicate(ZX_RIGHT_SAME_RIGHTS,
+                              vulkan_collection_token.NewRequest());
+  status = collection_token->Sync();
+  if (status != ZX_OK) {
+    ZX_DLOG(ERROR, status) << "fuchsia.sysmem.BufferCollectionToken.Sync()";
+    return false;
+  }
+
+  status = allocator->BindSharedCollection(std::move(collection_token),
+                                           collection_.NewRequest());
+  if (status != ZX_OK) {
+    ZX_DLOG(ERROR, status) << "fuchsia.sysmem.Allocator.BindSharedCollection()";
+    return false;
+  }
+
+  fuchsia::sysmem::BufferCollectionConstraints constraints;
+  if (is_mappable()) {
+    constraints.usage.cpu =
+        fuchsia::sysmem::cpuUsageRead | fuchsia::sysmem::cpuUsageWrite;
+  }
+  constraints.min_buffer_count_for_camping = num_buffers;
+  constraints.image_format_constraints_count = 0;
+
+  status = collection_->SetConstraints(/*has_constraints=*/true,
+                                       std::move(constraints));
+  if (status != ZX_OK) {
+    ZX_DLOG(ERROR, status)
+        << "fuchsia.sysmem.BufferCollection.SetConstraints()";
+    return false;
+  }
+
+  zx::channel token_channel = vulkan_collection_token.Unbind().TakeChannel();
+  VkBufferCollectionCreateInfoFUCHSIA buffer_collection_create_info = {
+      VK_STRUCTURE_TYPE_BUFFER_COLLECTION_CREATE_INFO_FUCHSIA};
+  buffer_collection_create_info.collectionToken = token_channel.get();
+  if (vkCreateBufferCollectionFUCHSIA(vk_device_,
+                                      &buffer_collection_create_info, nullptr,
+                                      &vk_buffer_collection_) != VK_SUCCESS) {
+    vk_buffer_collection_ = VK_NULL_HANDLE;
+    DLOG(ERROR) << "vkCreateBufferCollectionFUCHSIA() failed";
+    return false;
+  }
+
+  // vkCreateBufferCollectionFUCHSIA() takes ownership of the token on success.
+  ignore_result(token_channel.release());
+
+  VkImageCreateInfo image_create_info;
+  InitializeImageCreateInfo(&image_create_info);
+
+  // sysmem currently doesn't support R8 and R8G8 images. To workaround this
+  // issue they are masqueraded as RGBA images with shorter rows.
+  if (format_ == gfx::BufferFormat::R_8) {
+    image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
+    image_create_info.extent.width = size_.width() / 4;
+  } else if (format_ == gfx::BufferFormat::RG_88) {
+    image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
+    image_create_info.extent.width = size_.width() / 2;
+  }
+
+  if (vkSetBufferCollectionConstraintsFUCHSIA(vk_device_, vk_buffer_collection_,
+                                              &image_create_info) !=
+      VK_SUCCESS) {
+    DLOG(ERROR) << "vkSetBufferCollectionConstraintsFUCHSIA() failed";
+    return false;
+  }
+
+  zx_status_t wait_status;
+  status = collection_->WaitForBuffersAllocated(&wait_status, &buffers_info_);
+  if (status != ZX_OK) {
+    ZX_DLOG(ERROR, status) << "fuchsia.sysmem.BufferCollection failed";
+    return false;
+  }
+
+  if (wait_status != ZX_OK) {
+    ZX_DLOG(ERROR, status) << "fuchsia.sysmem.BufferCollection::"
+                              "WaitForBuffersAllocated() failed.";
+    return false;
+  }
+
+  DCHECK_GE(buffers_info_.buffer_count, num_buffers);
+  DCHECK(buffers_info_.settings.has_image_format_constraints);
+
+  buffer_size_ = buffers_info_.settings.buffer_settings.size_bytes;
+
+  // CreateVkImage() should always be called on the same thread, but it may be
+  // different from the thread that called Initialize().
+  DETACH_FROM_THREAD(vulkan_thread_checker_);
+
+  return true;
+}
+
+scoped_refptr<gfx::NativePixmap> SysmemBufferCollection::CreateNativePixmap(
+    size_t buffer_index) {
+  CHECK_LT(buffer_index, num_buffers());
+
+  gfx::NativePixmapHandle handle;
+  handle.buffer_collection_id = id();
+  handle.buffer_index = buffer_index;
+
+  zx::vmo main_plane_vmo;
+  if (is_mappable()) {
+    DCHECK(buffers_info_.buffers[buffer_index].vmo.is_valid());
+    zx_status_t status = buffers_info_.buffers[buffer_index].vmo.duplicate(
+        ZX_RIGHT_SAME_RIGHTS, &main_plane_vmo);
+    if (status != ZX_OK) {
+      ZX_DLOG(ERROR, status) << "zx_handle_duplicate";
+      return nullptr;
+    }
+  }
+
+  const fuchsia::sysmem::ImageFormatConstraints& format =
+      buffers_info_.settings.image_format_constraints;
+
+  size_t stride = RoundUp(format.min_bytes_per_row, format.coded_width_divisor);
+  size_t plane_offset = buffers_info_.buffers[buffer_index].vmo_usable_start;
+  size_t plane_size = stride * format.min_coded_height;
+  handle.planes.emplace_back(stride, plane_offset, plane_size,
+                             std::move(main_plane_vmo));
+
+  // For YUV images add a second plane.
+  if (format_ == gfx::BufferFormat::YUV_420_BIPLANAR) {
+    size_t uv_plane_offset = plane_offset + plane_size;
+    size_t uv_plane_size = plane_size / 2;
+    handle.planes.emplace_back(stride, uv_plane_offset, uv_plane_size,
+                               zx::vmo());
+    DCHECK_LE(uv_plane_offset + uv_plane_size, buffer_size_);
+  }
+
+  return new SysmemNativePixmap(this, std::move(handle));
+}
+
+bool SysmemBufferCollection::CreateVkImage(size_t buffer_index,
+                                           VkDevice vk_device,
+                                           VkImage* vk_image,
+                                           VkImageCreateInfo* vk_image_info,
+                                           VkDeviceMemory* vk_device_memory,
+                                           VkDeviceSize* mem_allocation_size) {
+  DCHECK_CALLED_ON_VALID_THREAD(vulkan_thread_checker_);
+  DCHECK_LT(buffer_index, num_buffers());
+
+  if (vk_device_ != vk_device) {
+    DLOG(FATAL) << "Tried to import NativePixmap that was created for a "
+                   "different VkDevice.";
+    return false;
+  }
+
+  VkBufferCollectionPropertiesFUCHSIA properties = {
+      VK_STRUCTURE_TYPE_BUFFER_COLLECTION_PROPERTIES_FUCHSIA};
+  if (vkGetBufferCollectionPropertiesFUCHSIA(vk_device_, vk_buffer_collection_,
+                                             &properties) != VK_SUCCESS) {
+    DLOG(ERROR) << "vkGetBufferCollectionPropertiesFUCHSIA_ failed";
+    return false;
+  }
+
+  InitializeImageCreateInfo(vk_image_info);
+  if (vkCreateImage(vk_device_, vk_image_info, nullptr, vk_image) !=
+      VK_SUCCESS) {
+    DLOG(ERROR) << "Failed to create VkImage.";
+    return false;
+  }
+
+  VkMemoryRequirements requirements;
+  vkGetImageMemoryRequirements(vk_device, *vk_image, &requirements);
+
+  uint32_t viable_memory_types =
+      properties.memoryTypeBits & requirements.memoryTypeBits;
+  uint32_t memory_type =
+      base::bits::CountLeadingZeroBits32(viable_memory_types);
+
+  VkImportMemoryBufferCollectionFUCHSIA buffer_collection_info = {
+      VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA};
+  buffer_collection_info.collection = vk_buffer_collection_;
+  buffer_collection_info.index = buffer_index;
+
+  VkMemoryAllocateInfo alloc_info = {VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
+                                     &buffer_collection_info};
+  alloc_info.allocationSize = buffer_size_;
+  alloc_info.memoryTypeIndex = memory_type;
+
+  if (vkAllocateMemory(vk_device_, &alloc_info, nullptr, vk_device_memory) !=
+      VK_SUCCESS) {
+    DLOG(ERROR) << "Failed to create import sysmem buffer.";
+    vkDestroyImage(vk_device_, *vk_image, nullptr);
+    *vk_image = VK_NULL_HANDLE;
+    return false;
+  }
+
+  if (vkBindImageMemory(vk_device_, *vk_image, *vk_device_memory, 0u) !=
+      VK_SUCCESS) {
+    DLOG(ERROR) << "Failed to bind sysmem buffer to an image.";
+    vkDestroyImage(vk_device_, *vk_image, nullptr);
+    *vk_image = VK_NULL_HANDLE;
+    vkFreeMemory(vk_device_, *vk_device_memory, nullptr);
+    *vk_device_memory = VK_NULL_HANDLE;
+    return false;
+  }
+
+  *mem_allocation_size = buffer_size_;
+
+  return true;
+}
+
+void SysmemBufferCollection::SetOnDeletedCallback(
+    base::OnceClosure on_deleted) {
+  DCHECK(!on_deleted_);
+  on_deleted_ = std::move(on_deleted);
+}
+
+SysmemBufferCollection::~SysmemBufferCollection() {
+  if (vk_buffer_collection_ != VK_NULL_HANDLE) {
+    vkDestroyBufferCollectionFUCHSIA(vk_device_, vk_buffer_collection_,
+                                     nullptr);
+  }
+
+  collection_->Close();
+
+  if (on_deleted_)
+    std::move(on_deleted_).Run();
+}
+
+void SysmemBufferCollection::InitializeImageCreateInfo(
+    VkImageCreateInfo* vk_image_info) {
+  *vk_image_info = {VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO};
+  vk_image_info->imageType = VK_IMAGE_TYPE_2D;
+  vk_image_info->format = VkFormatForBufferFormat(format_);
+  vk_image_info->extent = VkExtent3D{size_.width(), size_.height(), 1};
+  vk_image_info->mipLevels = 1;
+  vk_image_info->arrayLayers = 1;
+  vk_image_info->samples = VK_SAMPLE_COUNT_1_BIT;
+  vk_image_info->tiling =
+      is_mappable() ? VK_IMAGE_TILING_LINEAR : VK_IMAGE_TILING_OPTIMAL;
+  vk_image_info->usage = VK_IMAGE_USAGE_SAMPLED_BIT;
+  vk_image_info->sharingMode = VK_SHARING_MODE_EXCLUSIVE;
+  vk_image_info->initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+}
+
+}  // namespace ui
\ No newline at end of file
diff --git a/ui/ozone/platform/scenic/sysmem_buffer_collection.h b/ui/ozone/platform/scenic/sysmem_buffer_collection.h
new file mode 100644
index 0000000..7b83780
--- /dev/null
+++ b/ui/ozone/platform/scenic/sysmem_buffer_collection.h
@@ -0,0 +1,113 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_OZONE_PLATFORM_SCENIC_SYSMEM_BUFFER_COLLECTION_H_
+#define UI_OZONE_PLATFORM_SCENIC_SYSMEM_BUFFER_COLLECTION_H_
+
+#include <fuchsia/sysmem/cpp/fidl.h>
+#include <vulkan/vulkan.h>
+
+#include "base/callback.h"
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/threading/thread_checker.h"
+#include "gpu/vulkan/fuchsia/vulkan_fuchsia_ext.h"
+#include "ui/gfx/buffer_types.h"
+#include "ui/gfx/geometry/size.h"
+#include "ui/gfx/native_pixmap_handle.h"
+
+namespace gfx {
+class NativePixmap;
+}  // namespace gfx
+
+namespace ui {
+
+// SysmemBufferCollection keeps sysmem.BufferCollection interface along with the
+// corresponding VkBufferCollectionFUCHSIA. It allows to create either
+// gfx::NativePixmap or VkImage from the buffers in the collection.
+// A collection can be initialized and used on any thread.  CreateVkImage() must
+// be called on the same thread (because it may be be safe to use
+// VkBufferCollectionFUCHSIA concurrently on different threads).
+class SysmemBufferCollection
+    : public base::RefCountedThreadSafe<SysmemBufferCollection> {
+ public:
+  static bool IsNativePixmapConfigSupported(gfx::BufferFormat format,
+                                            gfx::BufferUsage usage);
+
+  SysmemBufferCollection();
+
+  bool Initialize(fuchsia::sysmem::Allocator_Sync* allocator,
+                  gfx::Size size,
+                  gfx::BufferFormat format,
+                  gfx::BufferUsage usage,
+                  VkDevice vk_device,
+                  size_t num_buffers);
+
+  // Must not be called more than once.
+  void SetOnDeletedCallback(base::OnceClosure on_deleted);
+
+  // Creates a NativePixmap the buffer with the specified index. Returned
+  // NativePixmap holds a reference to the collection, so the collection is not
+  // deleted until all NativePixmap are destroyed.
+  scoped_refptr<gfx::NativePixmap> CreateNativePixmap(size_t buffer_index);
+
+  // Creates a new Vulkan image for the buffer with the specified index.
+  bool CreateVkImage(size_t buffer_index,
+                     VkDevice vk_device,
+                     VkImage* vk_image,
+                     VkImageCreateInfo* vk_image_info,
+                     VkDeviceMemory* vk_device_memory,
+                     VkDeviceSize* mem_allocation_size);
+
+  gfx::SysmemBufferCollectionId id() const { return id_; }
+  size_t num_buffers() const { return buffers_info_.buffer_count; }
+  gfx::Size size() const { return size_; }
+  gfx::BufferFormat format() const { return format_; }
+  size_t buffer_size() const {
+    return buffers_info_.settings.buffer_settings.size_bytes;
+  }
+
+ private:
+  friend class base::RefCountedThreadSafe<SysmemBufferCollection>;
+
+  ~SysmemBufferCollection();
+
+  void InitializeImageCreateInfo(VkImageCreateInfo* vk_image_info);
+
+  bool is_mappable() const {
+    return usage_ == gfx::BufferUsage::SCANOUT_CPU_READ_WRITE ||
+           usage_ == gfx::BufferUsage::GPU_READ_CPU_READ_WRITE;
+  }
+
+  const gfx::SysmemBufferCollectionId id_;
+
+  gfx::Size size_;
+  gfx::BufferFormat format_ = gfx::BufferFormat::RGBA_8888;
+  gfx::BufferUsage usage_ = gfx::BufferUsage::GPU_READ_CPU_READ_WRITE;
+
+  fuchsia::sysmem::BufferCollectionSyncPtr collection_;
+  fuchsia::sysmem::BufferCollectionInfo_2 buffers_info_;
+
+  // Vulkan device for which the collection was initialized.
+  VkDevice vk_device_ = VK_NULL_HANDLE;
+
+  // Handle for the Vulkan object that holds the same logical buffer collection
+  // that is referenced by |collection_|.
+  VkBufferCollectionFUCHSIA vk_buffer_collection_ = VK_NULL_HANDLE;
+
+  // Thread checker used to verify that CreateVkImage() is always called from
+  // the same thread. It may be unsafe to use vk_buffer_collection_ on different
+  // threads.
+  THREAD_CHECKER(vulkan_thread_checker_);
+
+  size_t buffer_size_ = 0;
+
+  base::OnceClosure on_deleted_;
+
+  DISALLOW_COPY_AND_ASSIGN(SysmemBufferCollection);
+};
+
+}  // namespace ui
+
+#endif  // UI_OZONE_PLATFORM_SCENIC_SYSMEM_BUFFER_COLLECTION_H_
\ No newline at end of file
diff --git a/ui/ozone/platform/scenic/sysmem_buffer_manager.cc b/ui/ozone/platform/scenic/sysmem_buffer_manager.cc
new file mode 100644
index 0000000..1e040ec
--- /dev/null
+++ b/ui/ozone/platform/scenic/sysmem_buffer_manager.cc
@@ -0,0 +1,62 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/ozone/platform/scenic/sysmem_buffer_manager.h"
+
+#include <zircon/rights.h>
+
+#include "base/bind.h"
+#include "base/hash/hash.h"
+#include "ui/ozone/platform/scenic/sysmem_buffer_collection.h"
+
+namespace ui {
+
+SysmemBufferManager::SysmemBufferManager(
+    fuchsia::sysmem::AllocatorSyncPtr allocator)
+    : allocator_(std::move(allocator)) {}
+
+SysmemBufferManager::~SysmemBufferManager() {
+  base::AutoLock auto_lock(collections_lock_);
+  DCHECK(collections_.empty());
+}
+
+scoped_refptr<SysmemBufferCollection> SysmemBufferManager::CreateCollection(
+    VkDevice vk_device,
+    gfx::Size size,
+    gfx::BufferFormat format,
+    gfx::BufferUsage usage,
+    size_t num_buffers) {
+  auto result = base::MakeRefCounted<SysmemBufferCollection>();
+  if (!result->Initialize(allocator_.get(), size, format, usage, vk_device,
+                          num_buffers)) {
+    return nullptr;
+  }
+
+  {
+    base::AutoLock auto_lock(collections_lock_);
+    collections_[result->id()] = result.get();
+  }
+
+  result->SetOnDeletedCallback(
+      base::BindOnce(&SysmemBufferManager::OnCollectionDestroyed,
+                     base::Unretained(this), result->id()));
+
+  return result;
+}
+
+scoped_refptr<SysmemBufferCollection> SysmemBufferManager::GetCollectionById(
+    gfx::SysmemBufferCollectionId id) {
+  base::AutoLock auto_lock(collections_lock_);
+  auto it = collections_.find(id);
+  return it == collections_.end() ? nullptr : it->second;
+}
+
+void SysmemBufferManager::OnCollectionDestroyed(
+    gfx::SysmemBufferCollectionId id) {
+  base::AutoLock auto_lock(collections_lock_);
+  int erased = collections_.erase(id);
+  DCHECK_EQ(erased, 1);
+}
+
+}  // namespace ui
diff --git a/ui/ozone/platform/scenic/sysmem_buffer_manager.h b/ui/ozone/platform/scenic/sysmem_buffer_manager.h
new file mode 100644
index 0000000..c90ce76
--- /dev/null
+++ b/ui/ozone/platform/scenic/sysmem_buffer_manager.h
@@ -0,0 +1,57 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_OZONE_PLATFORM_SCENIC_SYSMEM_BUFFER_MANAGER_H_
+#define UI_OZONE_PLATFORM_SCENIC_SYSMEM_BUFFER_MANAGER_H_
+
+#include <fuchsia/sysmem/cpp/fidl.h>
+#include <vulkan/vulkan.h>
+
+#include <unordered_map>
+
+#include "base/containers/small_map.h"
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/synchronization/lock.h"
+#include "base/unguessable_token.h"
+#include "ui/gfx/buffer_types.h"
+#include "ui/gfx/geometry/size.h"
+#include "ui/gfx/native_pixmap_handle.h"
+
+namespace ui {
+
+class SysmemBufferCollection;
+
+class SysmemBufferManager {
+ public:
+  explicit SysmemBufferManager(fuchsia::sysmem::AllocatorSyncPtr allocator);
+  ~SysmemBufferManager();
+
+  scoped_refptr<SysmemBufferCollection> CreateCollection(
+      VkDevice vk_device,
+      gfx::Size size,
+      gfx::BufferFormat format,
+      gfx::BufferUsage usage,
+      size_t num_buffers);
+
+  scoped_refptr<SysmemBufferCollection> GetCollectionById(
+      gfx::SysmemBufferCollectionId id);
+
+ private:
+  void OnCollectionDestroyed(gfx::SysmemBufferCollectionId id);
+
+  fuchsia::sysmem::AllocatorSyncPtr allocator_;
+
+  base::small_map<std::unordered_map<gfx::SysmemBufferCollectionId,
+                                     SysmemBufferCollection*,
+                                     base::UnguessableTokenHash>>
+      collections_ GUARDED_BY(collections_lock_);
+  base::Lock collections_lock_;
+
+  DISALLOW_COPY_AND_ASSIGN(SysmemBufferManager);
+};
+
+}  // namespace ui
+
+#endif  // UI_OZONE_PLATFORM_SCENIC_SYSMEM_BUFFER_MANAGER_H_
\ No newline at end of file
diff --git a/ui/ozone/platform/scenic/vulkan_implementation_scenic.cc b/ui/ozone/platform/scenic/vulkan_implementation_scenic.cc
index a0f167a..3102ce8d 100644
--- a/ui/ozone/platform/scenic/vulkan_implementation_scenic.cc
+++ b/ui/ozone/platform/scenic/vulkan_implementation_scenic.cc
@@ -22,16 +22,20 @@
 #include "gpu/vulkan/vulkan_util.h"
 #include "mojo/public/cpp/system/platform_handle.h"
 #include "ui/gfx/gpu_fence.h"
+#include "ui/gfx/gpu_memory_buffer.h"
 #include "ui/ozone/platform/scenic/scenic_surface.h"
 #include "ui/ozone/platform/scenic/scenic_surface_factory.h"
 #include "ui/ozone/platform/scenic/scenic_window.h"
 #include "ui/ozone/platform/scenic/scenic_window_manager.h"
+#include "ui/ozone/platform/scenic/sysmem_buffer_collection.h"
 
 namespace ui {
 
 VulkanImplementationScenic::VulkanImplementationScenic(
-    ScenicSurfaceFactory* scenic_surface_factory)
-    : scenic_surface_factory_(scenic_surface_factory) {}
+    ScenicSurfaceFactory* scenic_surface_factory,
+    SysmemBufferManager* sysmem_buffer_manager)
+    : scenic_surface_factory_(scenic_surface_factory),
+      sysmem_buffer_manager_(sysmem_buffer_manager) {}
 
 VulkanImplementationScenic::~VulkanImplementationScenic() = default;
 
@@ -111,7 +115,9 @@
 std::vector<const char*>
 VulkanImplementationScenic::GetRequiredDeviceExtensions() {
   return {VK_KHR_SWAPCHAIN_EXTENSION_NAME,
-          VK_FUCHSIA_EXTERNAL_SEMAPHORE_EXTENSION_NAME};
+          VK_FUCHSIA_EXTERNAL_MEMORY_EXTENSION_NAME,
+          VK_FUCHSIA_EXTERNAL_SEMAPHORE_EXTENSION_NAME,
+          VK_FUCHSIA_BUFFER_COLLECTION_EXTENSION_NAME};
 }
 
 VkFence VulkanImplementationScenic::CreateVkFenceForGpuFence(
@@ -199,4 +205,45 @@
   return VK_EXTERNAL_MEMORY_HANDLE_TYPE_TEMP_ZIRCON_VMO_BIT_FUCHSIA;
 }
 
+bool VulkanImplementationScenic::CanImportGpuMemoryBuffer(
+    gfx::GpuMemoryBufferType memory_buffer_type) {
+  return memory_buffer_type == gfx::NATIVE_PIXMAP;
+}
+
+bool VulkanImplementationScenic::CreateImageFromGpuMemoryHandle(
+    VkDevice vk_device,
+    gfx::GpuMemoryBufferHandle gmb_handle,
+    gfx::Size size,
+    VkImage* vk_image,
+    VkImageCreateInfo* vk_image_info,
+    VkDeviceMemory* vk_device_memory,
+    VkDeviceSize* mem_allocation_size) {
+  if (gmb_handle.type != gfx::NATIVE_PIXMAP)
+    return false;
+
+  if (!gmb_handle.native_pixmap_handle.buffer_collection_id) {
+    DLOG(ERROR) << "NativePixmapHandle.buffer_collection_id is not set.";
+    return false;
+  }
+
+  auto collection = sysmem_buffer_manager_->GetCollectionById(
+      gmb_handle.native_pixmap_handle.buffer_collection_id.value());
+  if (!collection) {
+    DLOG(ERROR) << "Tried to use an unknown buffer collection ID";
+    return false;
+  }
+
+  if (gmb_handle.native_pixmap_handle.buffer_index >=
+          collection->num_buffers() ||
+      size != collection->size()) {
+    DLOG(ERROR)
+        << "Can't import GpuMemoryBuffer to an image with a different size.";
+    return false;
+  }
+
+  return collection->CreateVkImage(gmb_handle.native_pixmap_handle.buffer_index,
+                                   vk_device, vk_image, vk_image_info,
+                                   vk_device_memory, mem_allocation_size);
+}
+
 }  // namespace ui
diff --git a/ui/ozone/platform/scenic/vulkan_implementation_scenic.h b/ui/ozone/platform/scenic/vulkan_implementation_scenic.h
index 7b0149b..f5dc09b 100644
--- a/ui/ozone/platform/scenic/vulkan_implementation_scenic.h
+++ b/ui/ozone/platform/scenic/vulkan_implementation_scenic.h
@@ -15,10 +15,12 @@
 namespace ui {
 
 class ScenicSurfaceFactory;
+class SysmemBufferManager;
 
 class VulkanImplementationScenic : public gpu::VulkanImplementation {
  public:
-  VulkanImplementationScenic(ScenicSurfaceFactory* scenic_surface_factory);
+  VulkanImplementationScenic(ScenicSurfaceFactory* scenic_surface_factory,
+                             SysmemBufferManager* sysmem_buffer_manager);
   ~VulkanImplementationScenic() override;
 
   // VulkanImplementation:
@@ -41,9 +43,21 @@
   gpu::SemaphoreHandle GetSemaphoreHandle(VkDevice vk_device,
                                           VkSemaphore vk_semaphore) override;
   VkExternalMemoryHandleTypeFlagBits GetExternalImageHandleType() override;
+  bool CanImportGpuMemoryBuffer(
+      gfx::GpuMemoryBufferType memory_buffer_type) override;
+  bool CreateImageFromGpuMemoryHandle(
+      VkDevice vk_device,
+      gfx::GpuMemoryBufferHandle gmb_handle,
+      gfx::Size size,
+      VkImage* vk_image,
+      VkImageCreateInfo* vk_image_info,
+      VkDeviceMemory* vk_device_memory,
+      VkDeviceSize* mem_allocation_size) override;
 
  private:
   ScenicSurfaceFactory* const scenic_surface_factory_;
+  SysmemBufferManager* const sysmem_buffer_manager_;
+
   gpu::VulkanInstance vulkan_instance_;
 
   PFN_vkCreateImagePipeSurfaceFUCHSIA vkCreateImagePipeSurfaceFUCHSIA_ =