diff --git a/AUTHORS b/AUTHORS
index d1cdac9f..ab6b550c 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -963,6 +963,7 @@
 Tom Harwood <tfh@skip.org>
 Tomas Popela <tomas.popela@gmail.com>
 Torsten Kurbad <google@tk-webart.de>
+Toshihito Kikuchi <leamovret@gmail.com>
 Trent Willis <trentmwillis@gmail.com>
 Trevor Perrin <unsafe@trevp.net>
 Tripta Gupta <tripta.g@samsung.com>
diff --git a/DEPS b/DEPS
index 579eebe..b7abf33 100644
--- a/DEPS
+++ b/DEPS
@@ -175,11 +175,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': 'd2f18734aa842d7349fdb7d99707a92b4206f84b',
+  'skia_revision': '456f9b5fe9d222e254d738c0d78499444091b89f',
   # 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': '4b1eadeba8e77ba813d0f48f2e48c69668894fd0',
+  'v8_revision': 'fbadeeaf76d8a5000c7c5cd6e913be73ad46d524',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -187,15 +187,15 @@
   # 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': '852653954526386c86f120f6120b70fb74904b94',
+  'angle_revision': '55228e53750d7af59750d9cd0a348423ffde9bd3',
   # 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': 'a095711c5d771437d7f9bfcbd78a82062e19c55e',
+  'swiftshader_revision': '51b2800bb317d9ab6026e6123c62f013dd5cf5e4',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': 'a40862f237fc1d14779e6f6924e954ebcc8d18a3',
+  'pdfium_revision': '8ecb862ae74dda3e98cfe7e027d0b7800514ee0f',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling BoringSSL
   # and whatever else without interference from each other.
@@ -246,7 +246,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling devtools-frontend
   # and whatever else without interference from each other.
-  'devtools_frontend_revision': 'daac106699e16d3dbcea640b412af097f051a8e1',
+  'devtools_frontend_revision': '61f8ad8b69f9c5c4f261faa7a7232247c2b6bd44',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libprotobuf-mutator
   # and whatever else without interference from each other.
@@ -302,11 +302,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': '2de34c1791f301f8ec647afd9011dd3afd502465',
+  'dawn_revision': '56f1678437ba88107630c97033615eaf22eb996c',
   # 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': '7e5e609bc7a1f355471497fdd0d63b3025de2350',
+  'quiche_revision': 'c7e392d65eb927dc0c8a60f4a2f542a9b7a9b885',
   # 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.
@@ -652,6 +652,17 @@
       'condition': 'checkout_android',
   },
 
+  'src/third_party/android_protoc': {
+      'packages': [
+          {
+              'package': 'chromium/third_party/android_protoc',
+              'version': 'k9khK3dY-WuKXtL8tfQRcsvo2H1qS6C4-G5ckDZ4yyMC',
+          },
+      ],
+      'condition': 'checkout_android',
+      'dep_type': 'cipd',
+  },
+
   'src/third_party/android_ndk': {
       'url': Var('chromium_git') + '/android_ndk.git' + '@' + '27c0a8d090c666a50e40fceb4ee5b40b1a2d3f87',
       'condition': 'checkout_android_native_support',
@@ -888,7 +899,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '3ccfc90f5032339a302fbcf84b483b62a74ea02e',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '99df04e8aa2421d6872d2177e92f5444d3467c82',
 
   'src/third_party/devtools-frontend/src':
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
@@ -1222,7 +1233,7 @@
     Var('chromium_git') + '/external/github.com/cisco/openh264' + '@' + '6f26bce0b1c4e8ce0e13332f7c0083788def5fdf',
 
   'src/third_party/openscreen/src':
-    Var('chromium_git') + '/openscreen' + '@' + 'af823daff93a9c8b76ac658c8941878631874e9e',
+    Var('chromium_git') + '/openscreen' + '@' + '1bdc5980b3a43ad053849a82d2962cb7f66ed7e3',
 
   'src/third_party/openxr/src': {
     'url': Var('chromium_git') + '/external/github.com/KhronosGroup/OpenXR-SDK' + '@' + '9e97b73e7dd2bfc07745489d728f6a36665c648f',
@@ -1239,7 +1250,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '7c0409aa38146f35e3575b287930487277394ba0',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '7e47609cf293761567803b76069f59c6a6cb46dd',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1443,7 +1454,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'ec18cc3262922e7dcdbe70243c6f40606f979144',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '3c91b31162b88a3b38f227a0c681115f2a20a1dd',
+    Var('webrtc_git') + '/src.git' + '@' + '987ef482582660003d21ecfb7096943cba623373',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1518,7 +1529,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@ca451d58ac8dc15a3c9065bd921b3611f0f11abd',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@59ccb910d00387566eb7671cd2e15a1130eb2476',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/WATCHLISTS b/WATCHLISTS
index 706ae4b..cb879251c 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -1254,8 +1254,7 @@
                   '|chrome/browser/ui/webui/media_router/' \
                   '|chrome/common/media_router/' \
                   '|chrome/test/data/webui/media_router/' \
-                  '|chrome/test/media_router/' \
-                  '|chrome/utility/media_router/'
+                  '|chrome/test/media_router/'
     },
     'message_loop': {
       'filepath': 'base/message_'
diff --git a/android_webview/tools/cts_utils.py b/android_webview/tools/cts_utils.py
index 5bd2100..167174f 100755
--- a/android_webview/tools/cts_utils.py
+++ b/android_webview/tools/cts_utils.py
@@ -305,7 +305,7 @@
     deps_file = os.path.join(self._root_dir, DEPS_FILE)
     with open(deps_file) as f:
       contents = f.read()
-    dd = gclient_eval.Parse(contents, False, deps_file)
+    dd = gclient_eval.Parse(contents, deps_file)
     return gclient_eval.GetCIPD(dd, CTS_DEP_NAME, CTS_DEP_PACKAGE)
 
   def update_cts_cipd_rev(self, new_version):
diff --git a/android_webview/tools/system_webview_shell/apk/src/org/chromium/webview_shell/StartupTimeActivity.java b/android_webview/tools/system_webview_shell/apk/src/org/chromium/webview_shell/StartupTimeActivity.java
index 49462017..0d78e19 100644
--- a/android_webview/tools/system_webview_shell/apk/src/org/chromium/webview_shell/StartupTimeActivity.java
+++ b/android_webview/tools/system_webview_shell/apk/src/org/chromium/webview_shell/StartupTimeActivity.java
@@ -20,13 +20,38 @@
 import java.util.LinkedList;
 
 /**
- * This activity is designed for startup time testing of the WebView.
+ * An activity to measure the startup time of WebView in various scenarios.
+ *
+ * Example run:
+ *   # Compile dex file for optimized run.
+ *   adb shell cmd package compile -m speed -f <webview_package_name>
+ *   adb shell killall org.chromium.webview_shell
+ *   # Run scenario: CREATE (1). There are other scenarios you can try.
+ *   adb shell am start -n org.chromium.webview_shell/.StartupTimeActivity \
+ *     -a android.intent.action.VIEW --ei "target" 1
+ *   adb logcat | grep WebViewShell
+ *
+ * Then you will see a tuple of durations in ms that the scenario blocked UI thread for each loop in
+ * the logcat. Here are empirical sample results for WebView 80 on an internal Go device:
+ * +-------------+-------+-----------------+
+ * | target name | index | results (ms)    |
+ * +-------------+-------+-----------------+
+ * | DO_NOTHING  | 0     | (empty)         |
+ * | CREATE      | 1     | (620, 50)       |
+ * | ADD_VIEW    | 2     | (620, 150)      |
+ * | LOAD        | 3     | (620, 150, 140) |
+ * | WORKAROUND  | 4     | (220, 155)      |
+ * +-------------+-------+-----------------+
+ *
+ * Note that you need to run this multiple times and ignore the first few runs
+ * to get an accurate measurement.
  */
 public class StartupTimeActivity extends Activity {
     private static final String TAG = "WebViewShell";
     // Only records the tasks that affect the rendering performance of 30 FPS.
     private static final long MIN_TIME_TO_RECORD_MS = 33;
     private static final long TIME_TO_FINISH_APP_MS = 5000;
+    private static final long TIME_TO_WAIT_BEFORE_START_MS = 2000;
 
     private static final String TARGET_KEY = "target";
 
@@ -41,6 +66,15 @@
 
     private Handler mHandler;
 
+    @IntDef({Target.DO_NOTHING, Target.CREATE, Target.ADD_VIEW, Target.LOAD, Target.WORKAROUND})
+    @interface Target {
+        int DO_NOTHING = 0;
+        int CREATE = 1;
+        int ADD_VIEW = 2;
+        int LOAD = 3;
+        int WORKAROUND = 4;
+    }
+
     private Runnable mUiBlockingTaskTracker = new Runnable() {
         @Override
         public void run() {
@@ -76,36 +110,35 @@
         }
     };
 
-    @IntDef({Target.DO_NOTHING, Target.CREATE, Target.ADD_VIEW, Target.LOAD, Target.WORKAROUND})
-    @interface Target {
-        int DO_NOTHING = 0;
-        int CREATE = 1;
-        int ADD_VIEW = 2;
-        int LOAD = 3;
-        int WORKAROUND = 4;
-    }
-
     private @Target int getTarget() {
+        final int defaultTarget = Target.CREATE;
         Intent intent = getIntent();
-        if (intent == null) return Target.CREATE;
+        if (intent == null) return defaultTarget;
         Bundle extras = intent.getExtras();
-        if (extras == null) return Target.CREATE;
-        return extras.getInt(TARGET_KEY, Target.CREATE);
+        if (extras == null) return defaultTarget;
+        return extras.getInt(TARGET_KEY, defaultTarget);
     }
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        @Target
-        int target = getTarget();
-        getWindow().setTitle(
-                getResources().getString(R.string.title_activity_startup_time));
+        getWindow().setTitle(getResources().getString(R.string.title_activity_startup_time));
         mLayout = new LinearLayout(this);
         setContentView(mLayout);
         mHandler = new Handler();
+        @Target
+        int target = getTarget();
+        Log.i(TAG, "Target: " + target);
+        // There are other posted tasks caused by the activity. Give it some delay to avoid
+        // recording them.
+        mHandler.postDelayed(() -> { runScenario(target); }, TIME_TO_WAIT_BEFORE_START_MS);
+    }
+
+    private void runScenario(@Target int target) {
         mUiBlockingTaskTracker.run();
         switch (target) {
             case Target.DO_NOTHING: {
+                // This is the baseline. It should output an empty result.
                 break;
             }
             case Target.CREATE: {
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 127b917..40599de 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -622,12 +622,6 @@
     "shelf/login_shelf_gesture_controller.h",
     "shelf/login_shelf_view.cc",
     "shelf/login_shelf_view.h",
-    "shelf/overflow_bubble.cc",
-    "shelf/overflow_bubble.h",
-    "shelf/overflow_bubble_view.cc",
-    "shelf/overflow_bubble_view.h",
-    "shelf/overflow_button.cc",
-    "shelf/overflow_button.h",
     "shelf/scroll_arrow_view.cc",
     "shelf/scroll_arrow_view.h",
     "shelf/scrollable_shelf_view.cc",
@@ -2365,8 +2359,6 @@
     "session/test_pref_service_provider.h",
     "session/test_session_controller_client.cc",
     "session/test_session_controller_client.h",
-    "shelf/overflow_bubble_view_test_api.cc",
-    "shelf/overflow_bubble_view_test_api.h",
     "shelf/shelf_button_pressed_metric_tracker_test_api.cc",
     "shelf/shelf_button_pressed_metric_tracker_test_api.h",
     "shelf/shelf_focus_cycler.cc",
diff --git a/ash/accelerators/accelerator_controller_unittest.cc b/ash/accelerators/accelerator_controller_unittest.cc
index c9937e8c..8dc7b5b3 100644
--- a/ash/accelerators/accelerator_controller_unittest.cc
+++ b/ash/accelerators/accelerator_controller_unittest.cc
@@ -825,7 +825,7 @@
   views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
   params.bounds = gfx::Rect(5, 5, 20, 20);
   views::Widget* widget = new views::Widget;
-  params.context = CurrentContext();
+  params.context = GetContext();
   widget->Init(std::move(params));
   widget->Show();
   widget->Activate();
diff --git a/ash/app_list/app_list_presenter_delegate_unittest.cc b/ash/app_list/app_list_presenter_delegate_unittest.cc
index da10420..f51e6d8 100644
--- a/ash/app_list/app_list_presenter_delegate_unittest.cc
+++ b/ash/app_list/app_list_presenter_delegate_unittest.cc
@@ -221,7 +221,7 @@
   void CreateAndOpenAppList() {
     app_list_view_ = new AppListView(app_list_test_delegate_.get());
     app_list_view_->InitView(
-        false /*is_tablet_mode*/, CurrentContext(),
+        false /*is_tablet_mode*/, GetContext(),
         base::BindRepeating(&UpdateActivationForAppListView, app_list_view_,
                             /*is_tablet_mode=*/false));
     app_list_view_->Show(false /*is_side_shelf*/, false /*is_tablet_mode*/);
diff --git a/ash/autoclick/autoclick_drag_event_rewriter_unittest.cc b/ash/autoclick/autoclick_drag_event_rewriter_unittest.cc
index 98f2ec8..2c46eaf 100644
--- a/ash/autoclick/autoclick_drag_event_rewriter_unittest.cc
+++ b/ash/autoclick/autoclick_drag_event_rewriter_unittest.cc
@@ -69,16 +69,16 @@
   void SetUp() override {
     AshTestBase::SetUp();
     generator_ = AshTestBase::GetEventGenerator();
-    CurrentContext()->GetHost()->GetEventSource()->AddEventRewriter(
+    GetContext()->GetHost()->GetEventSource()->AddEventRewriter(
         &drag_event_rewriter_);
-    CurrentContext()->GetHost()->GetEventSource()->AddEventRewriter(
+    GetContext()->GetHost()->GetEventSource()->AddEventRewriter(
         &event_recorder_);
   }
 
   void TearDown() override {
-    CurrentContext()->GetHost()->GetEventSource()->RemoveEventRewriter(
+    GetContext()->GetHost()->GetEventSource()->RemoveEventRewriter(
         &event_recorder_);
-    CurrentContext()->GetHost()->GetEventSource()->RemoveEventRewriter(
+    GetContext()->GetHost()->GetEventSource()->RemoveEventRewriter(
         &drag_event_rewriter_);
     generator_ = nullptr;
     AshTestBase::TearDown();
diff --git a/ash/autoclick/autoclick_unittest.cc b/ash/autoclick/autoclick_unittest.cc
index 1c22315..8bb04a9b 100644
--- a/ash/autoclick/autoclick_unittest.cc
+++ b/ash/autoclick/autoclick_unittest.cc
@@ -1196,7 +1196,7 @@
   widget->SetFullscreen(true);
   EXPECT_TRUE(widget->IsActive());
   views::Widget* popup_widget = views::Widget::CreateWindowWithContext(
-      nullptr, CurrentContext(), gfx::Rect(200, 200, 200, 200));
+      nullptr, GetContext(), gfx::Rect(200, 200, 200, 200));
   popup_widget->Show();
 
   cursor_manager->HideCursor();
diff --git a/ash/components/shortcut_viewer/views/keyboard_shortcut_view_unittest.cc b/ash/components/shortcut_viewer/views/keyboard_shortcut_view_unittest.cc
index edd782f..8744e71 100644
--- a/ash/components/shortcut_viewer/views/keyboard_shortcut_view_unittest.cc
+++ b/ash/components/shortcut_viewer/views/keyboard_shortcut_view_unittest.cc
@@ -29,9 +29,7 @@
   KeyboardShortcutViewTest() = default;
   ~KeyboardShortcutViewTest() override = default;
 
-  views::Widget* Toggle() {
-    return KeyboardShortcutView::Toggle(CurrentContext());
-  }
+  views::Widget* Toggle() { return KeyboardShortcutView::Toggle(GetContext()); }
 
   // ash::AshTestBase:
   void SetUp() override {
diff --git a/ash/drag_drop/drag_drop_controller_unittest.cc b/ash/drag_drop/drag_drop_controller_unittest.cc
index 9f9db21..9550007 100644
--- a/ash/drag_drop/drag_drop_controller_unittest.cc
+++ b/ash/drag_drop/drag_drop_controller_unittest.cc
@@ -357,7 +357,7 @@
     views::Widget::InitParams params;
     params.type = views::Widget::InitParams::TYPE_WINDOW_FRAMELESS;
     params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
-    params.context = CurrentContext();
+    params.context = GetContext();
     widget->Init(std::move(params));
     widget->Show();
     return widget;
diff --git a/ash/drag_drop/drag_drop_unittest.cc b/ash/drag_drop/drag_drop_unittest.cc
index da979501..897447e 100644
--- a/ash/drag_drop/drag_drop_unittest.cc
+++ b/ash/drag_drop/drag_drop_unittest.cc
@@ -126,12 +126,12 @@
   draggable_view->set_drag_controller(NULL);
   draggable_view->SetBounds(0, 0, 100, 100);
   views::Widget* source =
-      CreateWidget(draggable_view, gfx::Rect(0, 0, 100, 100), CurrentContext());
+      CreateWidget(draggable_view, gfx::Rect(0, 0, 100, 100), GetContext());
 
   TargetView* target_view = new TargetView();
   target_view->SetBounds(0, 0, 100, 100);
   views::Widget* target =
-      CreateWidget(target_view, gfx::Rect(400, 0, 100, 100), CurrentContext());
+      CreateWidget(target_view, gfx::Rect(400, 0, 100, 100), GetContext());
 
   // Make sure they're on the different root windows.
   EXPECT_EQ(root_windows[0], source->GetNativeView()->GetRootWindow());
diff --git a/ash/events/select_to_speak_event_handler_unittest.cc b/ash/events/select_to_speak_event_handler_unittest.cc
index acd41180..e035af5 100644
--- a/ash/events/select_to_speak_event_handler_unittest.cc
+++ b/ash/events/select_to_speak_event_handler_unittest.cc
@@ -104,7 +104,7 @@
     aura::Env::GetInstance()->set_throttle_input_on_resize_for_testing(false);
     delegate_ = std::make_unique<TestDelegate>();
     generator_ = AshTestBase::GetEventGenerator();
-    CurrentContext()->AddPreTargetHandler(&event_capturer_);
+    GetContext()->AddPreTargetHandler(&event_capturer_);
 
     controller_ = Shell::Get()->accessibility_controller();
     controller_->SetSelectToSpeakEnabled(true);
@@ -112,7 +112,7 @@
   }
 
   void TearDown() override {
-    CurrentContext()->RemovePreTargetHandler(&event_capturer_);
+    GetContext()->RemovePreTargetHandler(&event_capturer_);
     generator_ = nullptr;
     controller_ = nullptr;
     AshTestBase::TearDown();
diff --git a/ash/events/spoken_feedback_event_rewriter_unittest.cc b/ash/events/spoken_feedback_event_rewriter_unittest.cc
index 5ababd2..89a2e24 100644
--- a/ash/events/spoken_feedback_event_rewriter_unittest.cc
+++ b/ash/events/spoken_feedback_event_rewriter_unittest.cc
@@ -72,16 +72,16 @@
     ash::AshTestBase::SetUp();
     generator_ = AshTestBase::GetEventGenerator();
     spoken_feedback_event_rewriter_->set_delegate(&delegate_);
-    CurrentContext()->GetHost()->GetEventSource()->AddEventRewriter(
+    GetContext()->GetHost()->GetEventSource()->AddEventRewriter(
         spoken_feedback_event_rewriter_.get());
-    CurrentContext()->GetHost()->GetEventSource()->AddEventRewriter(
+    GetContext()->GetHost()->GetEventSource()->AddEventRewriter(
         &event_recorder_);
   }
 
   void TearDown() override {
-    CurrentContext()->GetHost()->GetEventSource()->RemoveEventRewriter(
+    GetContext()->GetHost()->GetEventSource()->RemoveEventRewriter(
         &event_recorder_);
-    CurrentContext()->GetHost()->GetEventSource()->RemoveEventRewriter(
+    GetContext()->GetHost()->GetEventSource()->RemoveEventRewriter(
         spoken_feedback_event_rewriter_.get());
     spoken_feedback_event_rewriter_->set_delegate(nullptr);
     generator_ = nullptr;
diff --git a/ash/events/switch_access_event_handler_unittest.cc b/ash/events/switch_access_event_handler_unittest.cc
index 16b0327b..ca6cfe7c 100644
--- a/ash/events/switch_access_event_handler_unittest.cc
+++ b/ash/events/switch_access_event_handler_unittest.cc
@@ -75,7 +75,7 @@
     delegate_ = std::make_unique<TestDelegate>();
 
     generator_ = AshTestBase::GetEventGenerator();
-    CurrentContext()->AddPreTargetHandler(&event_capturer_);
+    GetContext()->AddPreTargetHandler(&event_capturer_);
 
     controller_ = Shell::Get()->accessibility_controller();
     base::CommandLine::ForCurrentProcess()->AppendSwitch(
@@ -86,7 +86,7 @@
   }
 
   void TearDown() override {
-    CurrentContext()->RemovePreTargetHandler(&event_capturer_);
+    GetContext()->RemovePreTargetHandler(&event_capturer_);
     generator_ = nullptr;
     controller_ = nullptr;
     AshTestBase::TearDown();
diff --git a/ash/extended_desktop_unittest.cc b/ash/extended_desktop_unittest.cc
index df3fa8ea..9bdf320 100644
--- a/ash/extended_desktop_unittest.cc
+++ b/ash/extended_desktop_unittest.cc
@@ -156,7 +156,7 @@
     views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
     params.bounds = bounds;
     views::Widget* widget = new views::Widget;
-    params.context = CurrentContext();
+    params.context = GetContext();
     widget->Init(std::move(params));
     widget->Show();
     return widget;
@@ -235,8 +235,7 @@
 
   // Open system modal. Make sure it's on 2nd root window and active.
   views::Widget* modal_widget = views::Widget::CreateWindowWithContext(
-      new ModalWidgetDelegate(), CurrentContext(),
-      gfx::Rect(1200, 100, 100, 100));
+      new ModalWidgetDelegate(), GetContext(), gfx::Rect(1200, 100, 100, 100));
   modal_widget->Show();
   EXPECT_TRUE(wm::IsActiveWindow(modal_widget->GetNativeView()));
   EXPECT_EQ(root_windows[1], modal_widget->GetNativeView()->GetRootWindow());
diff --git a/ash/focus_cycler_unittest.cc b/ash/focus_cycler_unittest.cc
index 3117bda4..4589c95 100644
--- a/ash/focus_cycler_unittest.cc
+++ b/ash/focus_cycler_unittest.cc
@@ -283,7 +283,7 @@
   widget_params.delegate = test_widget_delegate.get();
   widget_params.ownership =
       views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
-  widget_params.context = CurrentContext();
+  widget_params.context = GetContext();
   browser_widget->Init(std::move(widget_params));
   browser_widget->Show();
 
diff --git a/ash/frame/caption_buttons/frame_caption_button_container_view_unittest.cc b/ash/frame/caption_buttons/frame_caption_button_container_view_unittest.cc
index 1254bcc..356ae85f 100644
--- a/ash/frame/caption_buttons/frame_caption_button_container_view_unittest.cc
+++ b/ash/frame/caption_buttons/frame_caption_button_container_view_unittest.cc
@@ -71,7 +71,7 @@
                                minimize_allowed == MINIMIZE_ALLOWED,
                                close_button_visible == CLOSE_BUTTON_VISIBLE);
     params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
-    params.context = CurrentContext();
+    params.context = GetContext();
     widget->Init(std::move(params));
     return widget;
   }
diff --git a/ash/frame/caption_buttons/frame_size_button_unittest.cc b/ash/frame/caption_buttons/frame_size_button_unittest.cc
index 20c87879..eaecba07 100644
--- a/ash/frame/caption_buttons/frame_size_button_unittest.cc
+++ b/ash/frame/caption_buttons/frame_size_button_unittest.cc
@@ -112,7 +112,7 @@
         views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
     params.delegate = delegate;
     params.bounds = gfx::Rect(10, 10, 100, 100);
-    params.context = CurrentContext();
+    params.context = GetContext();
     widget->Init(std::move(params));
     widget->Show();
 
diff --git a/ash/home_screen/home_screen_controller_unittest.cc b/ash/home_screen/home_screen_controller_unittest.cc
index 998bd23..44f2f1501 100644
--- a/ash/home_screen/home_screen_controller_unittest.cc
+++ b/ash/home_screen/home_screen_controller_unittest.cc
@@ -163,7 +163,7 @@
 
   // Create a touch event and drag it twice and verify the histograms are
   // recorded as expected.
-  auto* compositor = CurrentContext()->layer()->GetCompositor();
+  auto* compositor = GetContext()->layer()->GetCompositor();
   auto* generator = GetEventGenerator();
   generator->set_current_screen_location(gfx::Point(200, 1));
   generator->PressTouch();
diff --git a/ash/metrics/demo_session_metrics_recorder.cc b/ash/metrics/demo_session_metrics_recorder.cc
index 5a65378..fd974ef 100644
--- a/ash/metrics/demo_session_metrics_recorder.cc
+++ b/ash/metrics/demo_session_metrics_recorder.cc
@@ -32,6 +32,10 @@
 // How often to sample.
 constexpr auto kSamplePeriod = base::TimeDelta::FromSeconds(1);
 
+// Redefining chromeos::default_web_apps::kHelpAppId as ash can't depend on
+// chrome.
+constexpr char kHelpAppId[] = "nbljnnecbjbmifnoehiemkgefbnpoeak";
+
 // How many periods to wait for user activity before discarding samples.
 // This timeout is low because demo sessions tend to be very short. If we
 // recorded samples for a full minute while the device is in between uses, we
@@ -64,7 +68,7 @@
     return DemoModeApp::kBrowser;
   if (app_id == extension_misc::kFilesManagerAppId)
     return DemoModeApp::kFiles;
-  if (app_id == extension_misc::kGeniusAppId)
+  if (app_id == kHelpAppId || app_id == extension_misc::kGeniusAppId)
     return DemoModeApp::kGetHelp;
   if (app_id == extension_misc::kGoogleKeepAppId)
     return DemoModeApp::kGoogleKeep;
diff --git a/ash/metrics/presentation_time_recorder_unittest.cc b/ash/metrics/presentation_time_recorder_unittest.cc
index f04677ed..f28c6ed 100644
--- a/ash/metrics/presentation_time_recorder_unittest.cc
+++ b/ash/metrics/presentation_time_recorder_unittest.cc
@@ -25,7 +25,7 @@
 TEST_F(PresentationTimeRecorderTest, Histogram) {
   base::HistogramTester histogram_tester;
 
-  auto* compositor = CurrentContext()->layer()->GetCompositor();
+  auto* compositor = GetContext()->layer()->GetCompositor();
   auto test_recorder = CreatePresentationTimeHistogramRecorder(
       compositor, kName, kMaxLatencyName);
   // Flush pending draw callbask by waiting for presentation until it times out.
@@ -72,7 +72,7 @@
 
 TEST_F(PresentationTimeRecorderTest, NoSuccessNoHistogram) {
   base::HistogramTester histogram_tester;
-  auto* compositor = CurrentContext()->layer()->GetCompositor();
+  auto* compositor = GetContext()->layer()->GetCompositor();
   auto test_recorder = CreatePresentationTimeHistogramRecorder(
       compositor, kName, kMaxLatencyName);
   PresentationTimeRecorder::TestApi test_api(test_recorder.get());
@@ -91,7 +91,7 @@
 
 TEST_F(PresentationTimeRecorderTest, DelayedHistogram) {
   base::HistogramTester histogram_tester;
-  auto* compositor = CurrentContext()->layer()->GetCompositor();
+  auto* compositor = GetContext()->layer()->GetCompositor();
   auto test_recorder = CreatePresentationTimeHistogramRecorder(
       compositor, kName, kMaxLatencyName);
   test_recorder->RequestNext();
@@ -109,7 +109,7 @@
 }
 
 TEST_F(PresentationTimeRecorderTest, Failure) {
-  auto* compositor = CurrentContext()->layer()->GetCompositor();
+  auto* compositor = GetContext()->layer()->GetCompositor();
   auto test_recorder = CreatePresentationTimeHistogramRecorder(
       compositor, kName, kMaxLatencyName);
   PresentationTimeRecorder::TestApi test_api(test_recorder.get());
diff --git a/ash/public/cpp/shelf_config.h b/ash/public/cpp/shelf_config.h
index d3b1e07f..78009e03 100644
--- a/ash/public/cpp/shelf_config.h
+++ b/ash/public/cpp/shelf_config.h
@@ -91,9 +91,6 @@
   // The radius of shelf control buttons.
   int control_border_radius() const;
 
-  // The margin around the overflow button on the shelf.
-  int overflow_button_margin() const;
-
   // The spacing between the edge of the shelf and the control buttons. When
   // shelf is horizontal, the left/right edges of the shelf are considered a
   // primary axis edge. When shelf is vertical, the top/bottom edges are
@@ -251,8 +248,7 @@
   const int shelf_status_area_hit_region_padding_;
   const int shelf_status_area_hit_region_padding_dense_;
 
-  // The margin on either side of the group of app icons (including the overflow
-  // button).
+  // The margin on either side of the group of app icons.
   const int app_icon_group_margin_;
 
   const SkColor shelf_control_permanent_highlight_background_;
diff --git a/ash/quick_answers/quick_answers_controller_impl.cc b/ash/quick_answers/quick_answers_controller_impl.cc
index 690cb9d8e..04ebafd 100644
--- a/ash/quick_answers/quick_answers_controller_impl.cc
+++ b/ash/quick_answers/quick_answers_controller_impl.cc
@@ -73,7 +73,8 @@
     quick_answer_with_no_result.title.push_back(
         std::make_unique<chromeos::quick_answers::QuickAnswerText>(query_));
     quick_answer_with_no_result.first_answer_row.push_back(
-        std::make_unique<chromeos::quick_answers::QuickAnswerText>(kNoResult));
+        std::make_unique<chromeos::quick_answers::QuickAnswerResultText>(
+            kNoResult));
     quick_answers_ui_controller_->RenderQuickAnswersViewWithResult(
         anchor_bounds_, quick_answer_with_no_result);
   }
diff --git a/ash/root_window_controller_unittest.cc b/ash/root_window_controller_unittest.cc
index 339cd45..aeb9b057 100644
--- a/ash/root_window_controller_unittest.cc
+++ b/ash/root_window_controller_unittest.cc
@@ -70,7 +70,7 @@
 class DeleteOnBlurDelegate : public aura::test::TestWindowDelegate,
                              public aura::client::FocusChangeObserver {
  public:
-  DeleteOnBlurDelegate() : window_(NULL) {}
+  DeleteOnBlurDelegate() : window_(nullptr) {}
   ~DeleteOnBlurDelegate() override = default;
 
   void SetWindow(aura::Window* window) {
@@ -105,7 +105,7 @@
  public:
   views::Widget* CreateTestWidget(const gfx::Rect& bounds) {
     views::Widget* widget =
-        views::Widget::CreateWindowWithContext(nullptr, CurrentContext());
+        views::Widget::CreateWindowWithContext(nullptr, GetContext());
     // Any initial bounds are constrained to the screen work area or the parent.
     // See Widget::InitialBounds() & Widget::SetBoundsConstrained(). Explicitly
     // setting the bounds here will allow the view to be positioned such that it
@@ -117,7 +117,7 @@
 
   views::Widget* CreateModalWidget(const gfx::Rect& bounds) {
     views::Widget* widget = views::Widget::CreateWindowWithContext(
-        new TestDelegate(true), CurrentContext());
+        new TestDelegate(true), GetContext());
     // See the above comment.
     widget->SetBounds(bounds);
     widget->Show();
@@ -182,7 +182,7 @@
   Widget::InitParams params;
   params.bounds = gfx::Rect(650, 10, 100, 100);
   params.type = Widget::InitParams::TYPE_CONTROL;
-  params.context = CurrentContext();
+  params.context = GetContext();
   unparented_control->Init(std::move(params));
   EXPECT_EQ(root_windows[1],
             unparented_control->GetNativeView()->GetRootWindow());
@@ -396,7 +396,7 @@
   RootWindowController* controller = Shell::GetPrimaryRootWindowController();
   EXPECT_TRUE(Shell::Get()->session_controller()->IsActiveUserSessionStarted());
   EXPECT_EQ(GetLayoutManager(controller, kShellWindowId_SystemModalContainer),
-            controller->GetSystemModalLayoutManager(NULL));
+            controller->GetSystemModalLayoutManager(nullptr));
 
   views::Widget* session_modal_widget =
       CreateModalWidget(gfx::Rect(300, 10, 100, 100));
@@ -438,7 +438,7 @@
   RootWindowController* controller = Shell::GetPrimaryRootWindowController();
   EXPECT_EQ(
       GetLayoutManager(controller, kShellWindowId_LockSystemModalContainer),
-      controller->GetSystemModalLayoutManager(NULL));
+      controller->GetSystemModalLayoutManager(nullptr));
 
   aura::Window* lock_container =
       controller->GetContainer(kShellWindowId_LockScreenContainer);
@@ -455,7 +455,7 @@
   EXPECT_EQ(1, session_controller->NumberOfLoggedInUsers());
   EXPECT_TRUE(session_controller->IsActiveUserSessionStarted());
   EXPECT_EQ(GetLayoutManager(controller, kShellWindowId_SystemModalContainer),
-            controller->GetSystemModalLayoutManager(NULL));
+            controller->GetSystemModalLayoutManager(nullptr));
 
   views::Widget* session_modal_widget =
       CreateModalWidget(gfx::Rect(300, 10, 100, 100));
@@ -477,14 +477,14 @@
               controller->GetSystemModalLayoutManager(
                   session_modal_widget->GetNativeWindow()));
     EXPECT_EQ(GetLayoutManager(controller, kShellWindowId_SystemModalContainer),
-              controller->GetSystemModalLayoutManager(NULL));
+              controller->GetSystemModalLayoutManager(nullptr));
     session_modal_widget->Close();
 
     BlockUserSession(static_cast<UserSessionBlockReason>(block_reason));
 
     EXPECT_EQ(
         GetLayoutManager(controller, kShellWindowId_LockSystemModalContainer),
-        controller->GetSystemModalLayoutManager(NULL));
+        controller->GetSystemModalLayoutManager(nullptr));
 
     views::Widget* lock_modal_widget = CreateModalWidgetWithParent(
         gfx::Rect(300, 10, 100, 100), lock_container);
@@ -521,18 +521,18 @@
   w3->Activate();
   EXPECT_EQ(w2->GetNativeWindow(), controller->GetWindowForFullscreenMode());
 
-  // If the topmost window is not fullscreen, it returns NULL.
+  // If the topmost window is not fullscreen, it returns nullptr.
   w1->Activate();
-  EXPECT_EQ(NULL, controller->GetWindowForFullscreenMode());
+  EXPECT_EQ(nullptr, controller->GetWindowForFullscreenMode());
   w1->Close();
   w3->Close();
 
   // Only w2 remains, if minimized GetWindowForFullscreenMode should return
-  // NULL.
+  // nullptr.
   w2->Activate();
   EXPECT_EQ(w2->GetNativeWindow(), controller->GetWindowForFullscreenMode());
   w2->Minimize();
-  EXPECT_EQ(NULL, controller->GetWindowForFullscreenMode());
+  EXPECT_EQ(nullptr, controller->GetWindowForFullscreenMode());
 }
 
 TEST_F(RootWindowControllerTest, MultipleDisplaysGetWindowForFullscreenMode) {
@@ -554,20 +554,20 @@
             controllers[1]->GetRootWindow());
 
   w1->Activate();
-  EXPECT_EQ(NULL, controllers[0]->GetWindowForFullscreenMode());
-  EXPECT_EQ(NULL, controllers[1]->GetWindowForFullscreenMode());
+  EXPECT_EQ(nullptr, controllers[0]->GetWindowForFullscreenMode());
+  EXPECT_EQ(nullptr, controllers[1]->GetWindowForFullscreenMode());
 
   w2->Activate();
   EXPECT_EQ(w2->GetNativeWindow(),
             controllers[0]->GetWindowForFullscreenMode());
-  EXPECT_EQ(NULL, controllers[1]->GetWindowForFullscreenMode());
+  EXPECT_EQ(nullptr, controllers[1]->GetWindowForFullscreenMode());
 
   // Verify that the first root window controller remains in fullscreen mode
   // when a window on the other display is activated.
   w3->Activate();
   EXPECT_EQ(w2->GetNativeWindow(),
             controllers[0]->GetWindowForFullscreenMode());
-  EXPECT_EQ(NULL, controllers[1]->GetWindowForFullscreenMode());
+  EXPECT_EQ(nullptr, controllers[1]->GetWindowForFullscreenMode());
 }
 
 // Test that ForWindow() works with multiple displays and child widgets.
@@ -628,7 +628,7 @@
 // Tracks whether OnWindowDestroying() has been invoked.
 class DestroyedWindowObserver : public aura::WindowObserver {
  public:
-  DestroyedWindowObserver() : destroyed_(false), window_(NULL) {}
+  DestroyedWindowObserver() : destroyed_(false), window_(nullptr) {}
   ~DestroyedWindowObserver() override { Shutdown(); }
 
   void SetWindow(Window* window) {
@@ -649,7 +649,7 @@
     if (!window_)
       return;
     window_->RemoveObserver(this);
-    window_ = NULL;
+    window_ = nullptr;
   }
 
   bool destroyed_;
diff --git a/ash/rotator/screen_rotation_animation_unittest.cc b/ash/rotator/screen_rotation_animation_unittest.cc
index 3c94556..72a5ead 100644
--- a/ash/rotator/screen_rotation_animation_unittest.cc
+++ b/ash/rotator/screen_rotation_animation_unittest.cc
@@ -76,7 +76,7 @@
   // finishes all of its animation before destroying its layer.
   std::unique_ptr<ui::Layer> layer = std::make_unique<ui::Layer>();
 
-  ui::Layer* root_layer = CurrentContext()->layer();
+  ui::Layer* root_layer = GetContext()->layer();
   layer->SetBounds(gfx::Rect(root_layer->bounds().size()));
   root_layer->Add(layer.get());
 
diff --git a/ash/screen_util_unittest.cc b/ash/screen_util_unittest.cc
index 48c0651..f21c8cf 100644
--- a/ash/screen_util_unittest.cc
+++ b/ash/screen_util_unittest.cc
@@ -31,10 +31,10 @@
 TEST_F(ScreenUtilTest, Bounds) {
   UpdateDisplay("600x600,500x500");
   views::Widget* primary = views::Widget::CreateWindowWithContext(
-      nullptr, CurrentContext(), gfx::Rect(10, 10, 100, 100));
+      nullptr, GetContext(), gfx::Rect(10, 10, 100, 100));
   primary->Show();
   views::Widget* secondary = views::Widget::CreateWindowWithContext(
-      nullptr, CurrentContext(), gfx::Rect(610, 10, 100, 100));
+      nullptr, GetContext(), gfx::Rect(610, 10, 100, 100));
   secondary->Show();
 
   // Maximized bounds.
@@ -73,7 +73,7 @@
 TEST_F(ScreenUtilTest, StabilityTest) {
   UpdateDisplay("600x600,500x500");
   views::Widget* secondary = views::Widget::CreateWindowWithContext(
-      nullptr, CurrentContext(), gfx::Rect(610, 10, 100, 100));
+      nullptr, GetContext(), gfx::Rect(610, 10, 100, 100));
   EXPECT_EQ(Shell::GetAllRootWindows()[1],
             secondary->GetNativeView()->GetRootWindow());
   secondary->Show();
@@ -88,10 +88,10 @@
   UpdateDisplay("600x600,500x500");
 
   views::Widget* primary = views::Widget::CreateWindowWithContext(
-      nullptr, CurrentContext(), gfx::Rect(10, 10, 100, 100));
+      nullptr, GetContext(), gfx::Rect(10, 10, 100, 100));
   primary->Show();
   views::Widget* secondary = views::Widget::CreateWindowWithContext(
-      nullptr, CurrentContext(), gfx::Rect(610, 10, 100, 100));
+      nullptr, GetContext(), gfx::Rect(610, 10, 100, 100));
   secondary->Show();
 
   gfx::Rect r1(10, 10, 100, 100);
@@ -115,7 +115,7 @@
   display_manager()->SetUnifiedDesktopEnabled(true);
 
   views::Widget* widget = views::Widget::CreateWindowWithContext(
-      nullptr, CurrentContext(), gfx::Rect(10, 10, 100, 100));
+      nullptr, GetContext(), gfx::Rect(10, 10, 100, 100));
   aura::Window* window = widget->GetNativeWindow();
 
   UpdateDisplay("500x400");
@@ -144,7 +144,7 @@
   display_manager()->SetUnifiedDesktopEnabled(true);
 
   views::Widget* widget = views::Widget::CreateWindowWithContext(
-      nullptr, CurrentContext(), gfx::Rect(10, 10, 100, 100));
+      nullptr, GetContext(), gfx::Rect(10, 10, 100, 100));
   aura::Window* window = widget->GetNativeWindow();
 
   display::DisplayIdList list = display_manager()->GetCurrentDisplayIdList();
@@ -207,7 +207,7 @@
 
   gfx::Rect bounds(1555, 0, 45, 1066);
   views::Widget* widget =
-      views::Widget::CreateWindowWithContext(nullptr, CurrentContext(), bounds);
+      views::Widget::CreateWindowWithContext(nullptr, GetContext(), bounds);
   aura::Window* window = widget->GetNativeWindow();
 
   gfx::Rect snapped_bounds =
diff --git a/ash/shelf/contextual_tooltip.cc b/ash/shelf/contextual_tooltip.cc
index 85a1c4b..22f0c47 100644
--- a/ash/shelf/contextual_tooltip.cc
+++ b/ash/shelf/contextual_tooltip.cc
@@ -137,7 +137,8 @@
       Shell::Get()->session_controller()->GetLastActiveUserPrefService(),
       prefs::kContextualTooltips);
   base::DictionaryValue* nudges_dict = update.Get();
-  nudges_dict->Clear();
+  if (nudges_dict && !nudges_dict->empty())
+    nudges_dict->Clear();
 }
 
 void OverrideClockForTesting(base::Clock* test_clock) {
diff --git a/ash/shelf/home_to_overview_nudge_controller.cc b/ash/shelf/home_to_overview_nudge_controller.cc
index d6ddf2c..d0690d9 100644
--- a/ash/shelf/home_to_overview_nudge_controller.cc
+++ b/ash/shelf/home_to_overview_nudge_controller.cc
@@ -11,6 +11,7 @@
 #include "ash/shelf/hotseat_widget.h"
 #include "ash/shelf/scrollable_shelf_view.h"
 #include "ash/shelf/shelf.h"
+#include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/style/ash_color_provider.h"
 #include "ash/wm/mru_window_tracker.h"
diff --git a/ash/shelf/hotseat_widget.cc b/ash/shelf/hotseat_widget.cc
index e2eb20f7..3f55575 100644
--- a/ash/shelf/hotseat_widget.cc
+++ b/ash/shelf/hotseat_widget.cc
@@ -374,10 +374,6 @@
   set_manually_extended(false);
 }
 
-bool HotseatWidget::IsShowingOverflowBubble() const {
-  return GetShelfView()->IsShowingOverflowBubble();
-}
-
 bool HotseatWidget::IsExtended() const {
   DCHECK(GetShelfView()->shelf()->IsHorizontalAlignment());
   const int extended_y =
@@ -391,17 +387,6 @@
   return GetWindowBoundsInScreen().y() == extended_y;
 }
 
-void HotseatWidget::FocusOverflowShelf(bool last_element) {
-  if (!IsShowingOverflowBubble())
-    return;
-  Shell::Get()->focus_cycler()->FocusWidget(
-      GetShelfView()->overflow_bubble()->bubble_view()->GetWidget());
-  views::View* to_focus =
-      GetShelfView()->overflow_shelf()->FindFirstOrLastFocusableChild(
-          last_element);
-  to_focus->RequestFocus();
-}
-
 void HotseatWidget::FocusFirstOrLastFocusableChild(bool last) {
   GetShelfView()->FindFirstOrLastFocusableChild(last)->RequestFocus();
 }
diff --git a/ash/shelf/hotseat_widget.h b/ash/shelf/hotseat_widget.h
index 2f2b6fb..c6c5d59 100644
--- a/ash/shelf/hotseat_widget.h
+++ b/ash/shelf/hotseat_widget.h
@@ -51,16 +51,9 @@
   // ShelfConfig::Observer:
   void OnShelfConfigUpdated() override;
 
-  // Whether the overflow menu/bubble is currently being shown.
-  bool IsShowingOverflowBubble() const;
-
   // Whether the widget is in the extended position.
   bool IsExtended() const;
 
-  // Focuses the first or the last app shortcut inside the overflow shelf.
-  // Does nothing if the overflow shelf is not currently shown.
-  void FocusOverflowShelf(bool last_element);
-
   // Finds the first or last focusable app shortcut and focuses it.
   void FocusFirstOrLastFocusableChild(bool last);
 
diff --git a/ash/shelf/hotseat_widget_unittest.cc b/ash/shelf/hotseat_widget_unittest.cc
index 8497cab..44a16e9 100644
--- a/ash/shelf/hotseat_widget_unittest.cc
+++ b/ash/shelf/hotseat_widget_unittest.cc
@@ -932,6 +932,12 @@
   window->Show();
   wm::ActivateWindow(window.get());
 
+  // TODO(manucornet): This is flaky when the shelf is always auto-hidden.
+  // Investigate and fix (sometimes fails when the assistant is enabled,
+  // sometimes not).
+  if (shelf_auto_hide_behavior() == ShelfAutoHideBehavior::kNever)
+    return;
+
   // Press the home button, the hotseat should transition directly to
   // kShownHomeLauncher.
   {
diff --git a/ash/shelf/overflow_bubble.cc b/ash/shelf/overflow_bubble.cc
deleted file mode 100644
index 1d094eeb..0000000
--- a/ash/shelf/overflow_bubble.cc
+++ /dev/null
@@ -1,107 +0,0 @@
-// 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.
-
-#include "ash/shelf/overflow_bubble.h"
-
-#include "ash/focus_cycler.h"
-#include "ash/shelf/overflow_bubble_view.h"
-#include "ash/shelf/overflow_button.h"
-#include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_view.h"
-#include "ash/shelf/shelf_widget.h"
-#include "ash/shell.h"
-#include "ash/system/tray/tray_background_view.h"
-#include "ui/aura/window.h"
-#include "ui/gfx/geometry/rect.h"
-#include "ui/views/widget/widget.h"
-
-namespace ash {
-
-OverflowBubble::OverflowBubble(Shelf* shelf)
-    : shelf_(shelf), bubble_(nullptr), overflow_button_(nullptr) {
-  DCHECK(shelf_);
-  Shell::Get()->AddPreTargetHandler(this);
-}
-
-OverflowBubble::~OverflowBubble() {
-  Hide();
-  Shell::Get()->RemovePreTargetHandler(this);
-}
-
-void OverflowBubble::Show(OverflowButton* overflow_button,
-                          ShelfView* shelf_view) {
-  DCHECK(overflow_button);
-  DCHECK(shelf_view);
-
-  Hide();
-
-  bubble_ = new OverflowBubbleView(
-      shelf_view, overflow_button,
-      shelf_view->shelf_widget()->GetShelfBackgroundColor());
-  overflow_button_ = overflow_button;
-
-  views::Widget* widget = bubble_->GetWidget();
-  TrayBackgroundView::InitializeBubbleAnimations(widget);
-  widget->AddObserver(this);
-  // Show the bubble without activating it so that if the keyboard focus is on
-  // the overflow button, it remains there and allows toggling with the
-  // keyboard.
-  widget->ShowInactive();
-  widget->GetFocusManager()->set_arrow_key_traversal_enabled_for_widget(true);
-  Shell::Get()->focus_cycler()->AddWidget(widget);
-}
-
-void OverflowBubble::Hide() {
-  if (!IsShowing())
-    return;
-
-  Shell::Get()->focus_cycler()->RemoveWidget(bubble_->GetWidget());
-  bubble_->GetWidget()->RemoveObserver(this);
-  bubble_->GetWidget()->Close();
-  bubble_ = nullptr;
-  overflow_button_ = nullptr;
-}
-
-void OverflowBubble::ProcessPressedEvent(ui::LocatedEvent* event) {
-  if (!IsShowing() || bubble_->shelf_view()->IsShowingMenu())
-    return;
-
-  const gfx::Point screen_location = event->target()->GetScreenLocation(*event);
-  if (bubble_->GetBoundsInScreen().Contains(screen_location) ||
-      overflow_button_->GetBoundsInScreen().Contains(screen_location)) {
-    return;
-  }
-
-  // Do not hide the shelf if one of the buttons on the main shelf was pressed,
-  // since the user might want to drag an item onto the overflow bubble.
-  // The button itself will close the overflow bubble on the release event.
-  if (bubble_->shelf_view()
-          ->main_shelf()
-          ->GetVisibleItemsBoundsInScreen()
-          .Contains(screen_location)) {
-    return;
-  }
-
-  Hide();
-}
-
-void OverflowBubble::OnMouseEvent(ui::MouseEvent* event) {
-  if (event->type() == ui::ET_MOUSE_PRESSED)
-    ProcessPressedEvent(event);
-}
-
-void OverflowBubble::OnTouchEvent(ui::TouchEvent* event) {
-  if (event->type() == ui::ET_TOUCH_PRESSED)
-    ProcessPressedEvent(event);
-}
-
-void OverflowBubble::OnWidgetDestroying(views::Widget* widget) {
-  DCHECK(widget == bubble_->GetWidget());
-  // Update the overflow button in the parent ShelfView.
-  overflow_button_->SchedulePaint();
-  bubble_ = nullptr;
-  overflow_button_ = nullptr;
-}
-
-}  // namespace ash
diff --git a/ash/shelf/overflow_bubble.h b/ash/shelf/overflow_bubble.h
deleted file mode 100644
index 7e951e9..0000000
--- a/ash/shelf/overflow_bubble.h
+++ /dev/null
@@ -1,65 +0,0 @@
-// 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.
-
-#ifndef ASH_SHELF_OVERFLOW_BUBBLE_H_
-#define ASH_SHELF_OVERFLOW_BUBBLE_H_
-
-#include "ash/ash_export.h"
-#include "base/macros.h"
-#include "ui/events/event_handler.h"
-#include "ui/views/widget/widget_observer.h"
-
-namespace views {
-class Widget;
-}
-
-namespace ui {
-class LocatedEvent;
-}
-
-namespace ash {
-class OverflowBubbleView;
-class OverflowButton;
-class Shelf;
-class ShelfView;
-
-// OverflowBubble shows shelf items that won't fit on the main shelf in a
-// separate bubble.
-class ASH_EXPORT OverflowBubble : public ui::EventHandler,
-                                  public views::WidgetObserver {
- public:
-  // |shelf| is the shelf that spawns the bubble.
-  explicit OverflowBubble(Shelf* shelf);
-  ~OverflowBubble() override;
-
-  // Shows an bubble pointing to |overflow_button| with |shelf_view| as its
-  // content.  This |shelf_view| is different than the main shelf's view and
-  // only contains the overflow items.
-  void Show(OverflowButton* overflow_button, ShelfView* shelf_view);
-
-  void Hide();
-
-  bool IsShowing() const { return !!bubble_; }
-  OverflowBubbleView* bubble_view() { return bubble_; }
-
- private:
-  void ProcessPressedEvent(ui::LocatedEvent* event);
-
-  // ui::EventHandler:
-  void OnMouseEvent(ui::MouseEvent* event) override;
-  void OnTouchEvent(ui::TouchEvent* event) override;
-
-  // views::WidgetObserver:
-  void OnWidgetDestroying(views::Widget* widget) override;
-
-  Shelf* shelf_;
-  OverflowBubbleView* bubble_;       // Owned by views hierarchy.
-  OverflowButton* overflow_button_;  // Owned by ShelfView.
-
-  DISALLOW_COPY_AND_ASSIGN(OverflowBubble);
-};
-
-}  // namespace ash
-
-#endif  // ASH_SHELF_OVERFLOW_BUBBLE_H_
diff --git a/ash/shelf/overflow_bubble_view.cc b/ash/shelf/overflow_bubble_view.cc
deleted file mode 100644
index 9a60267..0000000
--- a/ash/shelf/overflow_bubble_view.cc
+++ /dev/null
@@ -1,735 +0,0 @@
-// 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.
-
-#include "ash/shelf/overflow_bubble_view.h"
-
-#include <algorithm>
-
-#include "ash/public/cpp/shelf_config.h"
-#include "ash/public/cpp/shell_window_ids.h"
-#include "ash/shelf/scroll_arrow_view.h"
-#include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_container_view.h"
-#include "ash/shelf/shelf_view.h"
-#include "ash/shelf/shelf_widget.h"
-#include "ash/system/status_area_widget.h"
-#include "ash/wm/window_util.h"
-#include "base/i18n/rtl.h"
-#include "ui/compositor/scoped_layer_animation_settings.h"
-#include "ui/display/display.h"
-#include "ui/display/screen.h"
-#include "ui/events/event.h"
-#include "ui/gfx/geometry/insets.h"
-#include "ui/gfx/scoped_canvas.h"
-#include "ui/views/layout/layout_provider.h"
-#include "ui/views/view_model.h"
-#include "ui/views/widget/widget.h"
-
-namespace ash {
-namespace {
-
-// Padding between the end of the shelf in overflow mode and the arrow button
-// (if any).
-int GetDistanceToArrowButton() {
-  return ShelfConfig::Get()->button_spacing();
-}
-
-// Distance between overflow bubble and the main shelf.
-constexpr int kDistanceToMainShelf = 4;
-
-// Sum of the shelf button size and the gap between shelf buttons.
-int GetUnit() {
-  return ShelfConfig::Get()->button_size() +
-         ShelfConfig::Get()->button_spacing();
-}
-
-// Decides whether the current first visible shelf icon of the overflow shelf
-// should be hidden or fully shown when gesture scroll ends.
-int GetGestureDragTheshold() {
-  return ShelfConfig::Get()->button_size() / 2;
-}
-
-int GetBubbleCornerRadius() {
-  return ShelfConfig::Get()->button_size() / 2;
-}
-
-}  // namespace
-
-////////////////////////////////////////////////////////////////////////////////
-// OverflowScrollArrowView impl
-
-class OverflowBubbleView::OverflowScrollArrowView : public ScrollArrowView {
- public:
-  OverflowScrollArrowView(ArrowType arrow_type,
-                          bool is_horizontal_alignment,
-                          Shelf* shelf,
-                          ShelfButtonDelegate* button_delegate)
-      : ScrollArrowView(arrow_type,
-                        is_horizontal_alignment,
-                        shelf,
-                        button_delegate) {}
-  ~OverflowScrollArrowView() override = default;
-
-  // views::View:
-  void PaintButtonContents(gfx::Canvas* canvas) override {
-    ScrollArrowView::PaintButtonContents(canvas);
-
-    float ring_radius_dp = width() / 2;
-    gfx::PointF circle_center(width() / 2.f, height() / 2.f);
-
-    {
-      gfx::ScopedCanvas scoped_canvas(canvas);
-      const float dsf = canvas->UndoDeviceScaleFactor();
-      cc::PaintFlags fg_flags;
-      fg_flags.setAntiAlias(true);
-      fg_flags.setColor(
-          ShelfConfig::Get()->shelf_control_permanent_highlight_background());
-
-      const float radius = std::ceil(ring_radius_dp * dsf);
-      canvas->DrawCircle(gfx::ScalePoint(circle_center, dsf), radius, fg_flags);
-    }
-  }
-
-  const char* GetClassName() const override {
-    return "OverflowScrollArrowView";
-  }
-};
-
-////////////////////////////////////////////////////////////////////////////////
-// OverflowShelfContainerView impl
-
-class OverflowBubbleView::OverflowShelfContainerView
-    : public ShelfContainerView {
- public:
-  OverflowShelfContainerView(ShelfView* shelf_view,
-                             OverflowBubbleView* bubble_view);
-  ~OverflowShelfContainerView() override = default;
-
-  // Update the shelf icons' opacity.
-  void UpdateShelfIconsOpacity();
-
-  // views::View:
-  void Layout() override;
-  const char* GetClassName() const override;
-
-  int first_visible_index() const { return first_visible_index_; }
-  int last_visible_index() const { return last_visible_index_; }
-
- private:
-  // Update the opacity of shelf icons on both edges based on the drag offset.
-  void UpdateOpacityOfEdgeIcons(int offset_distance);
-
-  // Set all of shelf icons within the bounds of the shelf container view to be
-  // fully opaque.
-  void ShowShelfIconsWithinBounds();
-
-  // Parent view. Not owned.
-  OverflowBubbleView* bubble_view_;
-
-  // The index of the leftmost/rightmost shelf icon within the bounds of
-  // |shelf_container_view_|. Different from the |first_visible_index_| or
-  // |last_visible_index_| in ShelfView which specifies the range of shelf icons
-  // belonging to the shelf view, the two attributes in OverflowBubbleView
-  // indicate the shelf icons not hidden by the parent view.
-  int first_visible_index_ = -1;
-  int last_visible_index_ = -1;
-
-  DISALLOW_COPY_AND_ASSIGN(OverflowShelfContainerView);
-};
-
-OverflowBubbleView::OverflowShelfContainerView::OverflowShelfContainerView(
-    ShelfView* shelf_view,
-    OverflowBubbleView* bubble_view)
-    : ShelfContainerView(shelf_view), bubble_view_(bubble_view) {}
-
-void OverflowBubbleView::OverflowShelfContainerView::Layout() {
-  shelf_view_->SetBoundsRect(gfx::Rect(CalculateIdealSize()));
-}
-
-const char* OverflowBubbleView::OverflowShelfContainerView::GetClassName()
-    const {
-  return "OverflowShelfContainerView";
-}
-
-void OverflowBubbleView::OverflowShelfContainerView::UpdateShelfIconsOpacity() {
-  gfx::Vector2dF scroll_offset = bubble_view_->scroll_offset();
-  LayoutStrategy layout_strategy = bubble_view_->layout_strategy();
-
-  int updated_first_visible_index = shelf_view_->first_visible_index();
-  if (layout_strategy == NOT_SHOW_ARROW_BUTTONS) {
-    first_visible_index_ = updated_first_visible_index;
-    last_visible_index_ = shelf_view_->last_visible_index();
-    return;
-  }
-
-  const bool is_horizontal_aligned =
-      shelf_view_->shelf()->IsHorizontalAlignment();
-
-  const int scroll_distance =
-      is_horizontal_aligned ? scroll_offset.x() : scroll_offset.y();
-  updated_first_visible_index += scroll_distance / GetUnit();
-  if (layout_strategy == SHOW_LEFT_ARROW_BUTTON ||
-      layout_strategy == SHOW_BUTTONS) {
-    updated_first_visible_index++;
-  }
-
-  const int offset = (is_horizontal_aligned ? bubble_view_->bounds().width()
-                                            : bubble_view_->bounds().height()) -
-                     2 * GetUnit();
-  int updated_last_visible_index =
-      updated_first_visible_index + offset / GetUnit();
-  if (layout_strategy == SHOW_BUTTONS)
-    updated_last_visible_index--;
-
-  if (updated_first_visible_index != first_visible_index_ ||
-      updated_last_visible_index != last_visible_index_) {
-    first_visible_index_ = updated_first_visible_index;
-    last_visible_index_ = updated_last_visible_index;
-    ShowShelfIconsWithinBounds();
-  }
-
-  UpdateOpacityOfEdgeIcons(scroll_distance);
-}
-
-void OverflowBubbleView::OverflowShelfContainerView::UpdateOpacityOfEdgeIcons(
-    int offset_distance) {
-  const int remainder = offset_distance % GetUnit();
-  const int complement = GetUnit() - remainder;
-
-  views::ViewModel* shelf_view_model = shelf_view_->view_model();
-
-  // Calculate the opacity of the leftmost visible shelf icon.
-  views::View* leftmost_view = shelf_view_model->view_at(first_visible_index_);
-  leftmost_view->layer()->SetOpacity(
-      remainder >= kFadingZone ? 0 : (1.0f - remainder / (float)kFadingZone));
-
-  // Instead of the shelf icon denoted by |last_visible_index_|, we should
-  // update the opacity of the icon right after if any. Because
-  // |last_visible_index_| is calculated with flooring.
-  if (last_visible_index_ + 1 < shelf_view_model->view_size()) {
-    views::View* rightmost_view =
-        shelf_view_model->view_at(last_visible_index_ + 1);
-    rightmost_view->layer()->SetOpacity(complement >= kFadingZone
-                                            ? 0.f
-                                            : (kFadingZone - complement) /
-                                                  (float)(kFadingZone));
-  }
-}
-
-void OverflowBubbleView::OverflowShelfContainerView::
-    ShowShelfIconsWithinBounds() {
-  for (int i = first_visible_index_; i <= last_visible_index_; i++) {
-    views::View* shelf_icon = shelf_view_->view_model()->view_at(i);
-    shelf_icon->layer()->SetOpacity(1);
-  }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// OverflowBubbleView
-
-OverflowBubbleView::OverflowBubbleView(ShelfView* shelf_view,
-                                       views::View* anchor,
-                                       SkColor background_color)
-    : ShelfBubble(anchor, shelf_view->shelf()->alignment(), background_color),
-      shelf_view_(shelf_view) {
-  DCHECK(shelf_view_);
-  DCHECK(GetShelf());
-
-  const int shelf_size = ShelfConfig::Get()->shelf_size();
-  set_border_radius(views::LayoutProvider::Get()->GetCornerRadiusMetric(
-      views::EMPHASIS_MAXIMUM, {shelf_size, shelf_size}));
-  SetArrow(views::BubbleBorder::NONE);
-  SetBackground(nullptr);
-  set_shadow(views::BubbleBorder::NO_ASSETS);
-  set_close_on_deactivate(false);
-  set_accept_events(true);
-  set_margins(gfx::Insets(0, 0));
-
-  // Makes bubble view has a layer and clip its children layers.
-  SetPaintToLayer();
-  layer()->SetFillsBoundsOpaquely(false);
-  layer()->SetMasksToBounds(true);
-  layer()->SetRoundedCornerRadius(
-      gfx::RoundedCornersF(GetBubbleCornerRadius()));
-
-  // Initialize the left arrow button.
-  left_arrow_ = AddChildView(std::make_unique<OverflowScrollArrowView>(
-      ScrollArrowView::kLeft, GetShelf()->IsHorizontalAlignment(), GetShelf(),
-      this));
-
-  // Initialize the right arrow button.
-  right_arrow_ = AddChildView(std::make_unique<OverflowScrollArrowView>(
-      ScrollArrowView::kRight, GetShelf()->IsHorizontalAlignment(), GetShelf(),
-      this));
-
-  // Initialize the shelf container view.
-  shelf_container_view_ = AddChildView(
-      std::make_unique<OverflowShelfContainerView>(shelf_view, this));
-  shelf_container_view_->Initialize();
-
-  CreateBubble();
-}
-
-OverflowBubbleView::~OverflowBubbleView() = default;
-
-bool OverflowBubbleView::ProcessGestureEvent(const ui::GestureEvent& event) {
-  // Handle scroll-related events, but don't do anything special for begin and
-  // end.
-  if (event.type() == ui::ET_GESTURE_SCROLL_BEGIN) {
-    return true;
-  }
-
-  // Make sure that no visible shelf button is partially shown after gestures.
-  if (event.type() == ui::ET_GESTURE_END ||
-      event.type() == ui::ET_GESTURE_SCROLL_END) {
-    int current_scroll_distance = GetShelf()->IsHorizontalAlignment()
-                                      ? scroll_offset_.x()
-                                      : scroll_offset_.y();
-    const int residue = current_scroll_distance % GetUnit();
-
-    // if it does not need to adjust the location of the shelf view,
-    // return early.
-    if (current_scroll_distance == CalculateScrollUpperBound() || residue == 0)
-      return true;
-
-    int offset =
-        residue > GetGestureDragTheshold() ? GetUnit() - residue : -residue;
-    if (GetShelf()->IsHorizontalAlignment())
-      ScrollByXOffset(offset, /*animate=*/true);
-    else
-      ScrollByYOffset(offset, /*animate=*/true);
-    return true;
-  }
-
-  if (event.type() != ui::ET_GESTURE_SCROLL_UPDATE)
-    return false;
-
-  if (GetShelf()->IsHorizontalAlignment())
-    ScrollByXOffset(-event.details().scroll_x(), /*animate=*/false);
-  else
-    ScrollByYOffset(-event.details().scroll_y(), /*animate=*/false);
-  return true;
-}
-
-int OverflowBubbleView::ScrollByXOffset(float x_offset, bool animating) {
-  const float old_x = scroll_offset_.x();
-  const float x = CalculateLayoutStrategyAfterScroll(x_offset);
-  scroll_offset_.set_x(x);
-  Layout();
-  const float diff = x - old_x;
-  if (animating)
-    StartShelfScrollAnimation(diff);
-  return diff;
-}
-
-int OverflowBubbleView::ScrollByYOffset(float y_offset, bool animating) {
-  const int old_y = scroll_offset_.y();
-  const int y = CalculateLayoutStrategyAfterScroll(y_offset);
-  scroll_offset_.set_y(y);
-  Layout();
-  const float diff = y - old_y;
-  if (animating)
-    StartShelfScrollAnimation(diff);
-  return diff;
-}
-
-int OverflowBubbleView::GetFirstVisibleIndex() const {
-  return shelf_container_view_->first_visible_index();
-}
-
-int OverflowBubbleView::GetLastVisibleIndex() const {
-  return shelf_container_view_->last_visible_index();
-}
-
-int OverflowBubbleView::CalculateScrollUpperBound() const {
-  const bool is_horizontal = GetShelf()->IsHorizontalAlignment();
-
-  // Calculate the length of the available space.
-  const gfx::Rect content_size = GetContentsBounds();
-  const int available_length =
-      (is_horizontal ? content_size.width() : content_size.height()) -
-      2 * kEndPadding;
-
-  // Calculate the length of the preferred size.
-  const gfx::Size shelf_preferred_size(
-      shelf_container_view_->GetPreferredSize());
-  const int preferred_length = (is_horizontal ? shelf_preferred_size.width()
-                                              : shelf_preferred_size.height());
-
-  DCHECK_GE(preferred_length, available_length);
-  return preferred_length - available_length;
-}
-
-float OverflowBubbleView::CalculateLayoutStrategyAfterScroll(float scroll) {
-  const float old_scroll = GetShelf()->IsHorizontalAlignment()
-                               ? scroll_offset_.x()
-                               : scroll_offset_.y();
-
-  const float scroll_upper_bound =
-      static_cast<float>(CalculateScrollUpperBound());
-  scroll = std::min(scroll_upper_bound, std::max(0.f, old_scroll + scroll));
-  if (layout_strategy_ != NOT_SHOW_ARROW_BUTTONS) {
-    if (scroll <= 0.f)
-      layout_strategy_ = SHOW_RIGHT_ARROW_BUTTON;
-    else if (scroll >= scroll_upper_bound)
-      layout_strategy_ = SHOW_LEFT_ARROW_BUTTON;
-    else
-      layout_strategy_ = SHOW_BUTTONS;
-  }
-  return scroll;
-}
-
-void OverflowBubbleView::AdjustToEnsureIconsFullyVisible(
-    gfx::Rect* bubble_bounds) const {
-  if (layout_strategy_ == NOT_SHOW_ARROW_BUTTONS)
-    return;
-
-  int width = GetShelf()->IsHorizontalAlignment() ? bubble_bounds->width()
-                                                  : bubble_bounds->height();
-  const int rd = width % GetUnit();
-  width -= rd;
-
-  // Offset to ensure that the bubble view is shown at the center of the screen.
-  if (GetShelf()->IsHorizontalAlignment()) {
-    bubble_bounds->set_width(width);
-    bubble_bounds->Offset(rd / 2, 0);
-  } else {
-    bubble_bounds->set_height(width);
-    bubble_bounds->Offset(0, rd / 2);
-  }
-}
-
-void OverflowBubbleView::StartShelfScrollAnimation(float scroll_distance) {
-  const gfx::Transform current_transform = shelf_view()->GetTransform();
-  gfx::Transform reverse_transform = current_transform;
-  if (GetShelf()->IsHorizontalAlignment())
-    reverse_transform.Translate(gfx::Vector2dF(scroll_distance, 0));
-  else
-    reverse_transform.Translate(gfx::Vector2dF(0, scroll_distance));
-  shelf_view()->layer()->SetTransform(reverse_transform);
-  ui::ScopedLayerAnimationSettings animation_settings(
-      shelf_view()->layer()->GetAnimator());
-  animation_settings.SetTweenType(gfx::Tween::EASE_OUT);
-  animation_settings.SetPreemptionStrategy(
-      ui::LayerAnimator::IMMEDIATELY_SET_NEW_TARGET);
-  shelf_view()->layer()->SetTransform(current_transform);
-}
-
-void OverflowBubbleView::UpdateLayoutStrategy() {
-  const int available_length =
-      GetShelf()->IsHorizontalAlignment() ? width() : height();
-  gfx::Size preferred_size = shelf_container_view_->GetPreferredSize();
-  int preferred_length = GetShelf()->IsHorizontalAlignment()
-                             ? preferred_size.width()
-                             : preferred_size.height();
-  preferred_length += 2 * kEndPadding;
-  const int scroll_length = GetShelf()->IsHorizontalAlignment()
-                                ? scroll_offset_.x()
-                                : scroll_offset_.y();
-
-  if (preferred_length <= available_length) {
-    // Enough space to accommodate all of shelf buttons. So hide arrow buttons.
-    layout_strategy_ = NOT_SHOW_ARROW_BUTTONS;
-  } else if (scroll_length == 0) {
-    // No invisible shelf buttons at the left side. So hide the left button.
-    layout_strategy_ = SHOW_RIGHT_ARROW_BUTTON;
-  } else if (scroll_length == CalculateScrollUpperBound()) {
-    // If there is no invisible shelf button at the right side, hide the right
-    // button.
-    layout_strategy_ = SHOW_LEFT_ARROW_BUTTON;
-  } else {
-    // There are invisible shelf buttons at both sides. So show two buttons.
-    layout_strategy_ = SHOW_BUTTONS;
-  }
-}
-
-void OverflowBubbleView::ScrollToNewPage(bool forward) {
-  // Implement the arrow button handler in the same way with scrolling the
-  // bubble view. The key is to calculate the suitable scroll distance.
-  int offset = (GetShelf()->IsHorizontalAlignment() ? bounds().width()
-                                                    : bounds().height()) -
-               2 * GetUnit();
-  DCHECK_GT(offset, 0);
-
-  if (!forward)
-    offset = -offset;
-
-  if (GetShelf()->IsHorizontalAlignment())
-    ScrollByXOffset(offset, true);
-  else
-    ScrollByYOffset(offset, true);
-}
-
-void OverflowBubbleView::ScrollToBeginning() {
-  scroll_offset_ = gfx::Vector2dF();
-  Layout();
-}
-
-void OverflowBubbleView::ScrollToEnd() {
-  scroll_offset_ = GetShelf()->IsHorizontalAlignment()
-                       ? gfx::Vector2dF(CalculateScrollUpperBound(), 0)
-                       : gfx::Vector2dF(0, CalculateScrollUpperBound());
-  Layout();
-}
-
-gfx::Size OverflowBubbleView::CalculatePreferredSize() const {
-  gfx::Rect monitor_rect =
-      display::Screen::GetScreen()
-          ->GetDisplayNearestPoint(GetAnchorRect().CenterPoint())
-          .work_area();
-  monitor_rect.Inset(gfx::Insets(kMinimumMargin));
-
-  gfx::Size preferred_size = shelf_container_view_->GetPreferredSize();
-  int preferred_length = GetShelf()->IsHorizontalAlignment()
-                             ? preferred_size.width()
-                             : preferred_size.height();
-  preferred_length += 2 * kEndPadding;
-
-  if (GetShelf()->IsHorizontalAlignment()) {
-    preferred_size.set_width(std::min(preferred_length, monitor_rect.width()));
-  } else {
-    preferred_size.set_height(
-        std::min(preferred_length, monitor_rect.height()));
-  }
-  return preferred_size;
-}
-
-void OverflowBubbleView::Layout() {
-  UpdateLayoutStrategy();
-
-  const gfx::Size shelf_button_size(ShelfConfig::Get()->button_size(),
-                                    ShelfConfig::Get()->button_size());
-  const gfx::Size arrow_button_size(GetArrowButtonSize(), GetArrowButtonSize());
-
-  bool is_horizontal = GetShelf()->IsHorizontalAlignment();
-  gfx::Rect shelf_container_bounds = GetLocalBounds();
-
-  // Transpose and layout as if it is horizontal.
-  if (!is_horizontal)
-    shelf_container_bounds.Transpose();
-
-  // The bounds of |left_arrow_| and |right_arrow_| in the parent coordinates.
-  gfx::Rect left_arrow_bounds, right_arrow_bounds;
-
-  // Widen the shelf container view a little bit to ensure enough space for
-  // the fading out zone.
-  const int fading_zone_inset =
-      std::max(0, kFadingZone - GetDistanceToArrowButton() - kEndPadding);
-
-  // Calculates the bounds of the left arrow button. If the left arrow button
-  // should not show, |left_arrow_bounds| should be empty.
-  if (layout_strategy_ == SHOW_LEFT_ARROW_BUTTON ||
-      layout_strategy_ == SHOW_BUTTONS) {
-    left_arrow_bounds = gfx::Rect(shelf_button_size);
-    left_arrow_bounds.ClampToCenteredSize(arrow_button_size);
-    shelf_container_bounds.Inset(ShelfConfig::Get()->button_size() +
-                                     GetDistanceToArrowButton() -
-                                     fading_zone_inset,
-                                 0, 0, 0);
-  }
-
-  if (layout_strategy_ == SHOW_RIGHT_ARROW_BUTTON ||
-      layout_strategy_ == SHOW_BUTTONS) {
-    shelf_container_bounds.Inset(0, 0, ShelfConfig::Get()->button_size(), 0);
-    right_arrow_bounds =
-        gfx::Rect(shelf_container_bounds.top_right(), shelf_button_size);
-    right_arrow_bounds.ClampToCenteredSize(arrow_button_size);
-    shelf_container_bounds.Inset(
-        0, 0, GetDistanceToArrowButton() - fading_zone_inset, 0);
-  }
-
-  shelf_container_bounds.Inset(kEndPadding, 0, kEndPadding, 0);
-
-  // Adjust the bounds when not showing in the horizontal alignment.
-  if (!GetShelf()->IsHorizontalAlignment()) {
-    left_arrow_bounds.Transpose();
-    right_arrow_bounds.Transpose();
-    shelf_container_bounds.Transpose();
-  }
-
-  // Draw |left_arrow| if it should show.
-  left_arrow_->SetVisible(!left_arrow_bounds.IsEmpty());
-  if (left_arrow_->GetVisible())
-    left_arrow_->SetBoundsRect(left_arrow_bounds);
-
-  // Draw |right_arrow| if it should show.
-  right_arrow_->SetVisible(!right_arrow_bounds.IsEmpty());
-  if (right_arrow_->GetVisible())
-    right_arrow_->SetBoundsRect(right_arrow_bounds);
-
-  // Draw |shelf_container_view_|.
-  shelf_container_view_->SetBoundsRect(shelf_container_bounds);
-
-  // When the left button shows, the origin of |shelf_container_view_| changes.
-  // So translate |shelf_container_view| to show the shelf view correctly.
-  gfx::Vector2d translate_vector;
-  if (!left_arrow_bounds.IsEmpty()) {
-    translate_vector =
-        GetShelf()->IsHorizontalAlignment()
-            ? gfx::Vector2d(shelf_container_bounds.x() - kEndPadding, 0)
-            : gfx::Vector2d(0, shelf_container_bounds.y() - kEndPadding);
-  }
-
-  shelf_container_view_->TranslateShelfView(scroll_offset_ + translate_vector);
-  shelf_container_view_->UpdateShelfIconsOpacity();
-}
-
-void OverflowBubbleView::ChildPreferredSizeChanged(views::View* child) {
-  // When contents size is changed, ContentsBounds should be updated before
-  // calculating scroll offset.
-  SizeToContents();
-
-  // Ensures |shelf_view_| is still visible.
-  if (GetShelf()->IsHorizontalAlignment())
-    ScrollByXOffset(0, /*animate=*/false);
-  else
-    ScrollByYOffset(0, /*animate=*/false);
-}
-
-bool OverflowBubbleView::OnMouseWheel(const ui::MouseWheelEvent& event) {
-  // The MouseWheelEvent was changed to support both X and Y offsets
-  // recently, but the behavior of this function was retained to continue
-  // using Y offsets only. Might be good to simply scroll in both
-  // directions as in OverflowBubbleView::OnScrollEvent.
-  if (GetShelf()->IsHorizontalAlignment())
-    ScrollByXOffset(-event.y_offset(), /*animate=*/false);
-  else
-    ScrollByYOffset(-event.y_offset(), /*animate=*/false);
-
-  return true;
-}
-
-const char* OverflowBubbleView::GetClassName() const {
-  return "OverflowBubbleView";
-}
-
-void OverflowBubbleView::ScrollRectToVisible(const gfx::Rect& rect) {
-  const bool is_horizontal_alignment = GetShelf()->IsHorizontalAlignment();
-
-  // |rect| should be a shelf app icon's bounds in OverflowBubbleView's
-  // coordinates. Calculates the index of this app icon.
-  const int start_location = is_horizontal_alignment ? rect.x() : rect.y();
-  const int shelf_container_start_location =
-      is_horizontal_alignment ? shelf_container_view_->bounds().x()
-                              : shelf_container_view_->bounds().y();
-  const int index =
-      (start_location - shelf_container_start_location) / GetUnit() +
-      shelf_view_->first_visible_index();
-
-  if (index <= GetLastVisibleIndex() && index >= GetFirstVisibleIndex())
-    return;
-
-  if (index == shelf_view_->last_visible_index())
-    ScrollToEnd();
-  else if (index == shelf_view_->first_visible_index())
-    ScrollToBeginning();
-  else if (index > GetLastVisibleIndex())
-    ScrollToNewPage(/*forward=*/true);
-  else if (index < GetFirstVisibleIndex())
-    ScrollToNewPage(/*forward=*/false);
-}
-
-void OverflowBubbleView::OnShelfButtonAboutToRequestFocusFromTabTraversal(
-    ShelfButton* button,
-    bool reverse) {}
-
-void OverflowBubbleView::ButtonPressed(views::Button* sender,
-                                       const ui::Event& event,
-                                       views::InkDrop* ink_drop) {
-  // Verfies that |sender| is either |left_arrow_| or |right_arrow_|.
-  views::View* sender_view = sender;
-  DCHECK((sender_view == left_arrow_) || (sender_view == right_arrow_));
-
-  ScrollToNewPage(sender_view == right_arrow_);
-}
-
-void OverflowBubbleView::OnScrollEvent(ui::ScrollEvent* event) {
-  if (GetShelf()->IsHorizontalAlignment())
-    ScrollByXOffset(static_cast<int>(-event->x_offset()), /*animate=*/false);
-  else
-    ScrollByYOffset(static_cast<int>(-event->y_offset()), /*animate=*/false);
-  event->SetHandled();
-}
-
-gfx::Rect OverflowBubbleView::GetBubbleBounds() {
-  const gfx::Size content_size = GetPreferredSize();
-  const gfx::Rect anchor_rect = GetAnchorRect();
-  const int distance_to_overflow_button =
-      kDistanceToMainShelf +
-      (ShelfConfig::Get()->shelf_size() - ShelfConfig::Get()->control_size()) /
-          2;
-  gfx::Rect monitor_rect =
-      display::Screen::GetScreen()
-          ->GetDisplayNearestPoint(anchor_rect.CenterPoint())
-          .work_area();
-  // Make sure no part of the bubble touches a screen edge.
-  monitor_rect.Inset(gfx::Insets(kMinimumMargin));
-
-  gfx::Rect bounds;
-  if (GetShelf()->IsHorizontalAlignment()) {
-    bounds = gfx::Rect(
-        base::i18n::IsRTL() ? anchor_rect.x()
-                            : anchor_rect.right() - content_size.width(),
-        anchor_rect.y() - distance_to_overflow_button - content_size.height(),
-        content_size.width(), content_size.height());
-    if (bounds.x() < monitor_rect.x())
-      bounds.Offset(monitor_rect.x() - bounds.x(), 0);
-    if (bounds.right() > monitor_rect.right())
-      bounds.set_width(monitor_rect.right() - bounds.x());
-  } else {
-    bounds = gfx::Rect(0, anchor_rect.bottom() - content_size.height(),
-                       content_size.width(), content_size.height());
-    if (GetShelf()->alignment() == ShelfAlignment::kLeft)
-      bounds.set_x(anchor_rect.right() + distance_to_overflow_button);
-    else
-      bounds.set_x(anchor_rect.x() - distance_to_overflow_button -
-                   content_size.width());
-    if (bounds.y() < monitor_rect.y())
-      bounds.Offset(0, monitor_rect.y() - bounds.y());
-    if (bounds.bottom() > monitor_rect.bottom())
-      bounds.set_height(monitor_rect.bottom() - bounds.y());
-  }
-
-  AdjustToEnsureIconsFullyVisible(&bounds);
-  return bounds;
-}
-
-bool OverflowBubbleView::CanActivate() const {
-  if (!GetWidget())
-    return false;
-
-  // Do not activate the bubble unless the current active window is the hotseat
-  // window or the status widget window.
-  aura::Window* active_window = window_util::GetActiveWindow();
-  aura::Window* bubble_window = GetWidget()->GetNativeWindow();
-  aura::Window* hotseat_window =
-      GetShelf()->shelf_widget()->hotseat_widget()->GetNativeWindow();
-  aura::Window* status_area_window =
-      GetShelf()->shelf_widget()->status_area_widget()->GetNativeWindow();
-  return active_window == bubble_window || active_window == hotseat_window ||
-         active_window == status_area_window;
-}
-
-bool OverflowBubbleView::ShouldCloseOnPressDown() {
-  return false;
-}
-
-bool OverflowBubbleView::ShouldCloseOnMouseExit() {
-  return false;
-}
-
-int OverflowBubbleView::GetArrowButtonSize() {
-  static int kArrowButtonSize = ShelfConfig::Get()->control_size();
-  return kArrowButtonSize;
-}
-
-Shelf* OverflowBubbleView::GetShelf() {
-  return shelf_view_->shelf();
-}
-
-const Shelf* OverflowBubbleView::GetShelf() const {
-  return shelf_view_->shelf();
-}
-
-}  // namespace ash
diff --git a/ash/shelf/overflow_bubble_view.h b/ash/shelf/overflow_bubble_view.h
deleted file mode 100644
index ee1e99f..0000000
--- a/ash/shelf/overflow_bubble_view.h
+++ /dev/null
@@ -1,153 +0,0 @@
-// 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.
-
-#ifndef ASH_SHELF_OVERFLOW_BUBBLE_VIEW_H_
-#define ASH_SHELF_OVERFLOW_BUBBLE_VIEW_H_
-
-#include "ash/ash_export.h"
-#include "ash/shelf/shelf_bubble.h"
-#include "ash/shelf/shelf_button_delegate.h"
-#include "base/macros.h"
-#include "ui/views/animation/ink_drop_host_view.h"
-#include "ui/views/controls/button/button.h"
-
-namespace ash {
-class Shelf;
-class ShelfView;
-
-// OverflowBubbleView hosts a ShelfView to display overflown items.
-// Exports to access this class from OverflowBubbleViewTestAPI.
-class ASH_EXPORT OverflowBubbleView : public ShelfBubble,
-                                      public ShelfButtonDelegate {
- public:
-  enum LayoutStrategy {
-    // The arrow buttons are not shown. It means that there is enough space to
-    // accommodate all of shelf icons.
-    NOT_SHOW_ARROW_BUTTONS,
-
-    // Only the left arrow button is shown.
-    SHOW_LEFT_ARROW_BUTTON,
-
-    // Only the right arrow button is shown.
-    SHOW_RIGHT_ARROW_BUTTON,
-
-    // Both buttons are shown.
-    SHOW_BUTTONS
-  };
-
-  // |anchor| is the overflow button on the main shelf. |shelf_view| is the
-  // ShelfView containing the overflow items.
-  OverflowBubbleView(ShelfView* shelf_view,
-                     views::View* anchor,
-                     SkColor background_color);
-  ~OverflowBubbleView() override;
-
-  // Handles events for scrolling the bubble. Returns whether the event
-  // has been consumed.
-  bool ProcessGestureEvent(const ui::GestureEvent& event);
-
-  // These return the actual offset (sometimes reduced by the clamping).
-  // |animating| indicates whether animation is needed for scrolling. |x_offset|
-  // or |y_offset| has to be float. Otherwise the slow gesture drag is neglected
-  int ScrollByXOffset(float x_offset, bool animating);
-  int ScrollByYOffset(float y_offset, bool animating);
-
-  int GetFirstVisibleIndex() const;
-  int GetLastVisibleIndex() const;
-
-  // views::BubbleDialogDelegateView:
-  gfx::Rect GetBubbleBounds() override;
-  bool CanActivate() const override;
-
-  ShelfView* shelf_view() { return shelf_view_; }
-  View* left_arrow() { return left_arrow_; }
-  View* right_arrow() { return right_arrow_; }
-  LayoutStrategy layout_strategy() const { return layout_strategy_; }
-  gfx::Vector2dF scroll_offset() const { return scroll_offset_; }
-
-  // ShelfBubble:
-  bool ShouldCloseOnPressDown() override;
-  bool ShouldCloseOnMouseExit() override;
-
-  static int GetArrowButtonSize();
-
-  // Padding at the two ends of the shelf in overflow mode.
-  static constexpr int kEndPadding = 4;
-
-  // Minimum margin around the bubble so that it doesn't hug the screen edges.
-  static constexpr int kMinimumMargin = 8;
-
-  static constexpr int kFadingZone = 16;
-
- private:
-  friend class OverflowBubbleViewTestAPI;
-
-  class OverflowScrollArrowView;
-  class OverflowShelfContainerView;
-
-  // Returns the maximum scroll distance.
-  int CalculateScrollUpperBound() const;
-
-  // Updates the overflow bubble view's layout strategy after scrolling by the
-  // distance of |scroll|. Returns the adapted scroll offset.
-  float CalculateLayoutStrategyAfterScroll(float scroll);
-
-  // Ensures that the width of |bubble_bounds| (if it is not horizontally
-  // aligned, adjust |bubble_bounds|'s height) is the multiple of the sum of
-  // kShelfButtonSize and kShelfButtonSpacing. It helps that all of shelf icons
-  // are fully visible.
-  void AdjustToEnsureIconsFullyVisible(gfx::Rect* bubble_bounds) const;
-
-  // Creates the animation for scrolling shelf by |scroll_distance|.
-  void StartShelfScrollAnimation(float scroll_distance);
-
-  // Update the layout strategy based on the available space.
-  void UpdateLayoutStrategy();
-
-  // Scrolls to a new page of shelf icons. |forward| indicates whether the next
-  // page or previous page is shown.
-  void ScrollToNewPage(bool forward);
-
-  void ScrollToBeginning();
-  void ScrollToEnd();
-
-  // views::View:
-  gfx::Size CalculatePreferredSize() const override;
-  void Layout() override;
-  void ChildPreferredSizeChanged(views::View* child) override;
-  bool OnMouseWheel(const ui::MouseWheelEvent& event) override;
-  const char* GetClassName() const override;
-  void ScrollRectToVisible(const gfx::Rect& rect) override;
-
-  // ShelfButtonDelegate:
-  void OnShelfButtonAboutToRequestFocusFromTabTraversal(ShelfButton* button,
-                                                        bool reverse) override;
-  void ButtonPressed(views::Button* sender,
-                     const ui::Event& event,
-                     views::InkDrop* ink_drop) override;
-
-  // ui::EventHandler:
-  void OnScrollEvent(ui::ScrollEvent* event) override;
-
-  Shelf* GetShelf();
-  const Shelf* GetShelf() const;
-
-  mutable LayoutStrategy layout_strategy_;
-
-  // Child views Owned by views hierarchy.
-  View* left_arrow_ = nullptr;
-  View* right_arrow_ = nullptr;
-  OverflowShelfContainerView* shelf_container_view_ = nullptr;
-
-  // Not owned.
-  ShelfView* shelf_view_;
-
-  gfx::Vector2dF scroll_offset_;
-
-  DISALLOW_COPY_AND_ASSIGN(OverflowBubbleView);
-};
-
-}  // namespace ash
-
-#endif  // ASH_SHELF_OVERFLOW_BUBBLE_VIEW_H_
diff --git a/ash/shelf/overflow_bubble_view_test_api.cc b/ash/shelf/overflow_bubble_view_test_api.cc
deleted file mode 100644
index 86c810f..0000000
--- a/ash/shelf/overflow_bubble_view_test_api.cc
+++ /dev/null
@@ -1,22 +0,0 @@
-// 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.
-
-#include "ash/shelf/overflow_bubble_view_test_api.h"
-
-#include "ash/shelf/overflow_bubble_view.h"
-#include "ash/shelf/shelf_view.h"
-
-namespace ash {
-
-OverflowBubbleViewTestAPI::OverflowBubbleViewTestAPI(
-    OverflowBubbleView* bubble_view)
-    : bubble_view_(bubble_view) {}
-
-OverflowBubbleViewTestAPI::~OverflowBubbleViewTestAPI() = default;
-
-views::BubbleFrameView* OverflowBubbleViewTestAPI::GetBubbleFrameView() {
-  return bubble_view_->GetBubbleFrameView();
-}
-
-}  // namespace ash
diff --git a/ash/shelf/overflow_bubble_view_test_api.h b/ash/shelf/overflow_bubble_view_test_api.h
deleted file mode 100644
index 0a2f375..0000000
--- a/ash/shelf/overflow_bubble_view_test_api.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// 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.
-
-#ifndef ASH_SHELF_OVERFLOW_BUBBLE_VIEW_TEST_API_H_
-#define ASH_SHELF_OVERFLOW_BUBBLE_VIEW_TEST_API_H_
-
-#include "base/macros.h"
-
-namespace views {
-class BubbleFrameView;
-}
-
-namespace ash {
-class OverflowBubbleView;
-
-class OverflowBubbleViewTestAPI {
- public:
-  explicit OverflowBubbleViewTestAPI(OverflowBubbleView* bubble_view);
-  ~OverflowBubbleViewTestAPI();
-
-  // Returns the NonClientFrameView for the bubble.
-  views::BubbleFrameView* GetBubbleFrameView();
-
- private:
-  OverflowBubbleView* bubble_view_;
-
-  DISALLOW_COPY_AND_ASSIGN(OverflowBubbleViewTestAPI);
-};
-
-}  // namespace ash
-
-#endif  // ASH_SHELF_OVERFLOW_BUBBLE_VIEW_TEST_API_H_
diff --git a/ash/shelf/overflow_button.cc b/ash/shelf/overflow_button.cc
deleted file mode 100644
index 5fd1b00e..0000000
--- a/ash/shelf/overflow_button.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-// 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.
-
-#include "ash/shelf/overflow_button.h"
-
-#include <memory>
-
-#include "ash/public/cpp/shelf_config.h"
-#include "ash/resources/vector_icons/vector_icons.h"
-#include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_button_delegate.h"
-#include "ash/shelf/shelf_view.h"
-#include "ash/strings/grit/ash_strings.h"
-#include "chromeos/constants/chromeos_switches.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/gfx/canvas.h"
-#include "ui/gfx/image/image_skia_operations.h"
-#include "ui/gfx/paint_vector_icon.h"
-#include "ui/gfx/skbitmap_operations.h"
-#include "ui/views/controls/image_view.h"
-#include "ui/views/layout/fill_layout.h"
-
-namespace ash {
-
-OverflowButton::OverflowButton(ShelfView* shelf_view)
-    : ShelfControlButton(shelf_view->shelf(), shelf_view),
-      shelf_view_(shelf_view) {
-  SetAccessibleName(l10n_util::GetStringUTF16(IDS_ASH_SHELF_OVERFLOW_NAME));
-
-  horizontal_dots_image_view_ = new views::ImageView();
-  horizontal_dots_image_view_->SetImage(
-      gfx::CreateVectorIcon(kShelfOverflowHorizontalDotsIcon,
-                            ShelfConfig::Get()->shelf_icon_color()));
-  SetLayoutManager(std::make_unique<views::FillLayout>());
-  AddChildView(horizontal_dots_image_view_);
-}
-
-OverflowButton::~OverflowButton() = default;
-
-bool OverflowButton::ShouldEnterPushedState(const ui::Event& event) {
-  if (shelf_view_->IsShowingOverflowBubble())
-    return false;
-
-  // We bypass out direct superclass on purpose here.
-  return Button::ShouldEnterPushedState(event);
-}
-
-void OverflowButton::NotifyClick(const ui::Event& event) {
-  // For this button, do not call the superclass's handler to avoid the ink
-  // drop.
-  shelf_button_delegate()->ButtonPressed(this, event, nullptr);
-}
-
-const char* OverflowButton::GetClassName() const {
-  return "ash/OverflowButton";
-}
-
-}  // namespace ash
diff --git a/ash/shelf/overflow_button.h b/ash/shelf/overflow_button.h
deleted file mode 100644
index 33f1024f..0000000
--- a/ash/shelf/overflow_button.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// 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.
-
-#ifndef ASH_SHELF_OVERFLOW_BUTTON_H_
-#define ASH_SHELF_OVERFLOW_BUTTON_H_
-
-#include "ash/ash_export.h"
-#include "ash/shelf/shelf_control_button.h"
-#include "base/macros.h"
-#include "ui/gfx/geometry/rect.h"
-#include "ui/gfx/image/image_skia.h"
-#include "ui/views/controls/button/button.h"
-
-namespace views {
-class ImageView;
-}
-
-namespace ash {
-class ShelfView;
-
-// Shelf overflow button.
-class ASH_EXPORT OverflowButton : public ShelfControlButton {
- public:
-  // |shelf_view| is the view containing this button.
-  explicit OverflowButton(ShelfView* shelf_view);
-  ~OverflowButton() override;
-
-  // views::Button
-  bool ShouldEnterPushedState(const ui::Event& event) override;
-  void NotifyClick(const ui::Event& event) override;
-  const char* GetClassName() const override;
-
- private:
-  friend class OverflowButtonTestApi;
-
-  const gfx::ImageSkia horizontal_dots_image_;
-  views::ImageView* horizontal_dots_image_view_;
-  // Owned by RootWindowController.
-  ShelfView* shelf_view_;
-
-  DISALLOW_COPY_AND_ASSIGN(OverflowButton);
-};
-
-}  // namespace ash
-
-#endif  // ASH_SHELF_OVERFLOW_BUTTON_H_
diff --git a/ash/shelf/scrollable_shelf_view.cc b/ash/shelf/scrollable_shelf_view.cc
index 2afb2b3..d06d6c7 100644
--- a/ash/shelf/scrollable_shelf_view.cc
+++ b/ash/shelf/scrollable_shelf_view.cc
@@ -14,6 +14,7 @@
 #include "ash/shelf/shelf_navigation_widget.h"
 #include "ash/shelf/shelf_tooltip_manager.h"
 #include "ash/shelf/shelf_widget.h"
+#include "ash/shell.h"
 #include "ash/system/status_area_widget.h"
 #include "ash/wm/tablet_mode/tablet_mode_controller.h"
 #include "base/metrics/histogram_functions.h"
@@ -1328,9 +1329,9 @@
     return display_centering_edge_padding;
   }
 
-  const int icons_size = shelf_view_->GetSizeOfAppIcons(
-                             shelf_view_->number_of_visible_apps(), false) +
-                         2 * ShelfConfig::Get()->GetAppIconEndPadding();
+  const int icons_size =
+      shelf_view_->GetSizeOfAppIcons(shelf_view_->number_of_visible_apps()) +
+      2 * ShelfConfig::Get()->GetAppIconEndPadding();
 
   const gfx::Rect available_local_bounds =
       GetAvailableLocalBounds(use_target_bounds);
@@ -1386,9 +1387,9 @@
 
 gfx::Insets ScrollableShelfView::CalculatePaddingForDisplayCentering(
     bool use_target_bounds) const {
-  const int icons_size = shelf_view_->GetSizeOfAppIcons(
-                             shelf_view_->number_of_visible_apps(), false) +
-                         2 * ShelfConfig::Get()->GetAppIconEndPadding();
+  const int icons_size =
+      shelf_view_->GetSizeOfAppIcons(shelf_view_->number_of_visible_apps()) +
+      2 * ShelfConfig::Get()->GetAppIconEndPadding();
   const gfx::Rect display_bounds =
       screen_util::GetDisplayBoundsWithShelf(GetWidget()->GetNativeWindow());
   const int display_size_primary = GetShelf()->PrimaryAxisValue(
diff --git a/ash/shelf/shelf_config.cc b/ash/shelf/shelf_config.cc
index 264fe03..7f745aa4 100644
--- a/ash/shelf/shelf_config.cc
+++ b/ash/shelf/shelf_config.cc
@@ -229,10 +229,6 @@
              : control_size() / 2;
 }
 
-int ShelfConfig::overflow_button_margin() const {
-  return (button_size() - control_size()) / 2;
-}
-
 int ShelfConfig::control_button_edge_spacing(bool is_primary_axis_edge) const {
   if (is_primary_axis_edge)
     return Shell::Get()->IsInTabletMode() ? 8 : 6;
diff --git a/ash/shelf/shelf_container_view.cc b/ash/shelf/shelf_container_view.cc
index 0df107a..f404f8b5 100644
--- a/ash/shelf/shelf_container_view.cc
+++ b/ash/shelf/shelf_container_view.cc
@@ -55,8 +55,7 @@
 gfx::Size ShelfContainerView::CalculateIdealSize() const {
   const int width =
       ShelfView::GetSizeOfAppIcons(shelf_view_->last_visible_index() -
-                                       shelf_view_->first_visible_index() + 1,
-                                   false);
+                                   shelf_view_->first_visible_index() + 1);
   const int height = ShelfConfig::Get()->button_size();
   return shelf_view_->shelf()->IsHorizontalAlignment()
              ? gfx::Size(width, height)
diff --git a/ash/shelf/shelf_focus_cycler.cc b/ash/shelf/shelf_focus_cycler.cc
index e82af66..eb270de 100644
--- a/ash/shelf/shelf_focus_cycler.cc
+++ b/ash/shelf/shelf_focus_cycler.cc
@@ -32,18 +32,8 @@
         FocusShelf(reverse);
       break;
     case SourceView::kShelfView:
-      if (reverse) {
-        FocusNavigation(reverse);
-      } else {
-        if (shelf_->hotseat_widget()->IsShowingOverflowBubble())
-          FocusOverflowShelf(reverse);
-        else
-          FocusStatusArea(reverse);
-      }
-      break;
-    case SourceView::kShelfOverflowView:
       if (reverse)
-        FocusShelf(reverse);
+        FocusNavigation(reverse);
       else
         FocusStatusArea(reverse);
       break;
@@ -59,10 +49,7 @@
         // Login/lock screen or OOBE.
         Shell::Get()->system_tray_notifier()->NotifyFocusOut(reverse);
       } else if (reverse) {
-        if (shelf_->hotseat_widget()->IsShowingOverflowBubble())
-          FocusOverflowShelf(reverse);
-        else
-          FocusShelf(reverse);
+        FocusShelf(reverse);
       } else {
         FocusNavigation(reverse);
       }
@@ -100,10 +87,6 @@
   }
 }
 
-void ShelfFocusCycler::FocusOverflowShelf(bool last_element) {
-  shelf_->hotseat_widget()->FocusOverflowShelf(last_element);
-}
-
 void ShelfFocusCycler::FocusStatusArea(bool last_element) {
   StatusAreaWidget* status_area_widget = shelf_->GetStatusAreaWidget();
   status_area_widget->status_area_widget_delegate()
diff --git a/ash/shelf/shelf_focus_cycler.h b/ash/shelf/shelf_focus_cycler.h
index 169a087..7733d5f 100644
--- a/ash/shelf/shelf_focus_cycler.h
+++ b/ash/shelf/shelf_focus_cycler.h
@@ -15,7 +15,6 @@
 enum class SourceView {
   kShelfNavigationView = 0,
   kShelfView,
-  kShelfOverflowView,
   kStatusAreaView,
 };
 
@@ -37,9 +36,6 @@
   // Focuses the shelf widget (app shortcuts).
   void FocusShelf(bool last_element);
 
-  // Focuses the overflow shelf (app shortcuts in the overflow menu).
-  void FocusOverflowShelf(bool last_element);
-
   // Focuses the status area widget.
   void FocusStatusArea(bool last_element);
 
diff --git a/ash/shelf/shelf_layout_manager.cc b/ash/shelf/shelf_layout_manager.cc
index 08cf600..39618fc7 100644
--- a/ash/shelf/shelf_layout_manager.cc
+++ b/ash/shelf/shelf_layout_manager.cc
@@ -1795,9 +1795,6 @@
   if (shelf_widget_->IsShowingMenu())
     return SHELF_AUTO_HIDE_SHOWN;
 
-  if (shelf_->hotseat_widget()->IsShowingOverflowBubble())
-    return SHELF_AUTO_HIDE_SHOWN;
-
   if (shelf_widget_->IsActive() || shelf_->navigation_widget()->IsActive() ||
       shelf_->hotseat_widget()->IsActive() ||
       (shelf_widget_->status_area_widget() &&
@@ -2181,11 +2178,6 @@
   if (!IsVisible())
     return false;
 
-  // Do not show the fullscreen app list until the overflow bubble has been
-  // closed.
-  if (shelf_->hotseat_widget()->IsShowingOverflowBubble())
-    return false;
-
   // If the app list is already open, swiping up on the shelf should keep it
   // open.
   if (Shell::Get()->app_list_controller()->IsVisible())
@@ -2219,10 +2211,6 @@
       !Shell::Get()->IsInTabletMode())
     return false;
 
-  // Also disable shelf drags until the overflow shelf is closed.
-  if (shelf_->hotseat_widget()->IsShowingOverflowBubble())
-    return false;
-
   drag_status_ = kDragInProgress;
   drag_auto_hide_state_ =
       (!Shell::Get()->overview_controller()->InOverviewSession() &&
diff --git a/ash/shelf/shelf_navigation_widget.cc b/ash/shelf/shelf_navigation_widget.cc
index c50a85f..b070bc6 100644
--- a/ash/shelf/shelf_navigation_widget.cc
+++ b/ash/shelf/shelf_navigation_widget.cc
@@ -624,6 +624,7 @@
         home_button_metrics_reporter_.get());
     bounds_animator_->AnimateViewTo(home_button, home_button_bounds);
   } else {
+    bounds_animator_->StopAnimatingView(home_button);
     home_button->SetBoundsRect(home_button_bounds);
   }
 
diff --git a/ash/shelf/shelf_unittest.cc b/ash/shelf/shelf_unittest.cc
index bbbf889..f1c12b7 100644
--- a/ash/shelf/shelf_unittest.cc
+++ b/ash/shelf/shelf_unittest.cc
@@ -8,7 +8,6 @@
 #include "ash/root_window_controller.h"
 #include "ash/session/session_controller_impl.h"
 #include "ash/session/test_session_controller_client.h"
-#include "ash/shelf/overflow_button.h"
 #include "ash/shelf/shelf.h"
 #include "ash/shelf/shelf_app_button.h"
 #include "ash/shelf/shelf_controller.h"
@@ -102,37 +101,6 @@
   shelf_model()->RemoveItemAt(index);
 }
 
-TEST_F(ShelfTest, ShowOverflowBubble) {
-  // No overflow bubble when scrollable shelf enabled.
-  // TODO(https://crbug.com/1002576): revisit when scrollable shelf is launched.
-  if (chromeos::switches::ShouldShowScrollableShelf())
-    return;
-
-  ShelfWidget* shelf_widget = GetPrimaryShelf()->shelf_widget();
-
-  // Add app buttons until overflow occurs.
-  ShelfItem item;
-  item.type = TYPE_APP;
-  item.status = STATUS_RUNNING;
-  while (!shelf_view()->GetOverflowButton()->GetVisible()) {
-    item.id = ShelfID(base::NumberToString(shelf_model()->item_count()));
-    shelf_model()->Add(item);
-    ASSERT_LT(shelf_model()->item_count(), 10000);
-  }
-
-  // Shows overflow bubble.
-  test_api()->ShowOverflowBubble();
-  EXPECT_TRUE(shelf_widget->hotseat_widget()->IsShowingOverflowBubble());
-
-  // Remove one of the first items in the main shelf view.
-  ASSERT_GT(shelf_model()->item_count(), 2);
-  shelf_model()->RemoveItemAt(2);
-
-  // Waits for all transitions to finish and there should be no crash.
-  test_api()->RunMessageLoopUntilAnimationsDone();
-  EXPECT_FALSE(shelf_widget->hotseat_widget()->IsShowingOverflowBubble());
-}
-
 // Tests if shelf is hidden on secondary display after the primary display is
 // changed.
 TEST_F(ShelfTest, ShelfHiddenOnScreenOnSecondaryDisplay) {
diff --git a/ash/shelf/shelf_view.cc b/ash/shelf/shelf_view.cc
index a65c9151..bbacfcc 100644
--- a/ash/shelf/shelf_view.cc
+++ b/ash/shelf/shelf_view.cc
@@ -18,7 +18,6 @@
 #include "ash/public/cpp/window_properties.h"
 #include "ash/scoped_root_window_for_new_windows.h"
 #include "ash/screen_util.h"
-#include "ash/shelf/overflow_button.h"
 #include "ash/shelf/shelf.h"
 #include "ash/shelf/shelf_app_button.h"
 #include "ash/shelf/shelf_application_menu_model.h"
@@ -94,22 +93,6 @@
 constexpr int kSeparatorSize = 20;
 constexpr int kSeparatorThickness = 1;
 
-// Inset from the bubble bounds to the bounds beyond which dragging triggers
-// scrolling.
-constexpr int kScrollTriggerBoundsInsetDips = 28;
-
-// Time delay after which the scrolling speed will be increased.
-constexpr base::TimeDelta kDragScrollSpeedIncreaseDelay =
-    base::TimeDelta::FromSeconds(1);
-
-// Time interval at which to scroll the overflow bubble for dragging.
-constexpr base::TimeDelta kDragScrollInterval =
-    base::TimeDelta::FromMilliseconds(17);
-
-// How far to scroll the overflow bubble each time.
-constexpr int kDragSlowScrollDeltaDips = 3;
-constexpr int kDragFastScrollDeltaDips = 6;
-
 // Helper to check if tablet mode is enabled.
 bool IsTabletModeEnabled() {
   return Shell::Get()->tablet_mode_controller() &&
@@ -164,11 +147,6 @@
       focusable_views.push_back(shelf_view_->view_model()->view_at(i));
     }
 
-    if (!shelf_view_->is_overflow_mode() &&
-        shelf_view_->GetOverflowButton()->GetVisible()) {
-      focusable_views.push_back(shelf_view_->GetOverflowButton());
-    }
-
     // Where are we starting from?
     int start_index = 0;
     for (size_t i = 0; i < focusable_views.size(); ++i) {
@@ -340,27 +318,19 @@
   model_->RemoveObserver(this);
 
   // Resets the shelf tooltip delegate when the main shelf gets destroyed.
-  if (!is_overflow_mode() && !chromeos::switches::ShouldShowScrollableShelf())
+  if (!chromeos::switches::ShouldShowScrollableShelf())
     shelf_->tooltip()->set_shelf_tooltip_delegate(nullptr);
 }
 
-int ShelfView::GetSizeOfAppIcons(int count, bool with_overflow) {
-  const int control_size = ShelfConfig::Get()->control_size();
+int ShelfView::GetSizeOfAppIcons(int count) {
   const int button_spacing = ShelfConfig::Get()->button_spacing();
-  const int overflow_button_margin =
-      ShelfConfig::Get()->overflow_button_margin();
 
   if (count == 0)
-    return with_overflow ? control_size + 2 * overflow_button_margin : 0;
+    return 0;
 
   const int app_size = count * ShelfConfig::Get()->button_size();
-  int overflow_size = 0;
   int total_padding = button_spacing * (count - 1);
-  if (with_overflow) {
-    overflow_size += control_size;
-    total_padding += button_spacing + 2 * overflow_button_margin;
-  }
-  return app_size + total_padding + overflow_size;
+  return app_size + total_padding;
 }
 
 void ShelfView::Init() {
@@ -383,15 +353,10 @@
     // Add child view so it has the same ordering as in the |view_model_|.
     AddChildViewAt(child, index);
   }
-  overflow_button_ = new OverflowButton(this);
-  ConfigureChildView(overflow_button_);
-  AddChildView(overflow_button_);
 
   // We'll layout when our bounds change.
 
-  if (chromeos::switches::ShouldShowScrollableShelf()) {
-    overflow_button_->SetVisible(false);
-  } else if (!is_overflow_mode()) {
+  if (!chromeos::switches::ShouldShowScrollableShelf()) {
     // Add the main shelf view as ShelfTooltipDelegate when scrollable shelf
     // is not enabled.
     shelf_->tooltip()->set_shelf_tooltip_delegate(this);
@@ -403,10 +368,6 @@
   if (index < 0 || last_visible_index_ < 0 || index >= view_model_->view_size())
     return gfx::Rect();
 
-  // Map items in the overflow bubble to the overflow button.
-  if (index > last_visible_index_)
-    return GetMirroredRect(overflow_button_->bounds());
-
   const gfx::Rect& ideal_bounds(view_model_->ideal_bounds(index));
   ShelfAppButton* button = GetShelfAppButton(id);
   gfx::Rect icon_bounds = button->GetIconBounds();
@@ -421,14 +382,6 @@
          shelf_menu_model_adapter_->IsShowingMenu();
 }
 
-bool ShelfView::IsShowingOverflowBubble() const {
-  return overflow_bubble_.get() && overflow_bubble_->IsShowing();
-}
-
-OverflowButton* ShelfView::GetOverflowButton() const {
-  return overflow_button_;
-}
-
 void ShelfView::UpdateVisibleShelfItemBoundsUnion() {
   visible_shelf_item_bounds_union_.SetRect(0, 0, 0, 0);
   for (int i = std::max(0, first_visible_index_); i <= last_visible_index_;
@@ -437,11 +390,6 @@
     if (ShouldShowTooltipForChildView(child))
       visible_shelf_item_bounds_union_.Union(child->GetMirroredBounds());
   }
-  // Also include the overflow button if it is visible.
-  if (overflow_button_->GetVisible()) {
-    visible_shelf_item_bounds_union_.Union(
-        overflow_button_->GetMirroredBounds());
-  }
 }
 
 bool ShelfView::ShouldShowTooltipForView(const views::View* view) const {
@@ -451,11 +399,7 @@
   if (view->parent() == this)
     return ShouldShowTooltipForChildView(view);
 
-  if (view->parent() != overflow_shelf())
-    return false;
-
-  return overflow_shelf() &&
-         overflow_shelf()->ShouldShowTooltipForChildView(view);
+  return false;
 }
 
 ShelfAppButton* ShelfView::GetShelfAppButton(const ShelfID& id) {
@@ -517,9 +461,6 @@
   if (view->parent() == this)
     return GetTitleForChildView(view);
 
-  if (view->parent() == overflow_shelf())
-    return overflow_shelf()->GetTitleForChildView(view);
-
   return base::string16();
 }
 
@@ -527,40 +468,9 @@
   if (event.target() == GetWidget()->GetNativeWindow())
     return this;
 
-  ShelfView* overflow_shelf_view = overflow_shelf();
-  if (overflow_shelf_view &&
-      (event.target() == overflow_shelf_view->GetWidget()->GetNativeWindow())) {
-    return overflow_shelf_view;
-  }
-
   return nullptr;
 }
 
-void ShelfView::ToggleOverflowBubble() {
-  if (IsShowingOverflowBubble()) {
-    overflow_bubble_->Hide();
-    return;
-  }
-
-  if (!overflow_bubble_)
-    overflow_bubble_.reset(new OverflowBubble(shelf_));
-
-  ShelfView* overflow_view =
-      new ShelfView(model_, shelf_, /*drag_and_drop_host=*/nullptr,
-                    /*shelf_button_delegate=*/nullptr);
-  overflow_view->overflow_mode_ = true;
-  overflow_view->Init();
-  overflow_view->set_owner_overflow_bubble(overflow_bubble_.get());
-  aura::Window* root_window = GetWidget()->GetNativeWindow()->GetRootWindow();
-  overflow_view->OnShelfAlignmentChanged(root_window, shelf_->alignment());
-  overflow_view->main_shelf_ = this;
-  UpdateOverflowRange(overflow_view);
-
-  overflow_bubble_->Show(overflow_button_, overflow_view);
-
-  shelf_->UpdateVisibilityState();
-}
-
 gfx::Rect ShelfView::GetVisibleItemsBoundsInScreen() {
   gfx::Size preferred_size = GetPreferredSize();
   gfx::Point origin(GetMirroredXWithWidthInView(0, preferred_size.width()), 0);
@@ -577,17 +487,6 @@
   }
 
   int last_button_index = last_visible_index_;
-  if (!is_overflow_mode() && overflow_button_ && overflow_button_->GetVisible())
-    ++last_button_index;
-
-  // When an item is dragged off from the overflow bubble, it is moved to last
-  // position and and changed to invisible. Overflow bubble size should be
-  // shrunk to fit only for visible items.
-  // If |dragged_to_another_shelf_| is set, there will be no
-  // invisible items in the shelf.
-  if (is_overflow_mode() && dragged_off_shelf_ && !dragged_to_another_shelf_ &&
-      RemovableByRipOff(view_model_->GetIndexOfView(drag_view_)) == REMOVABLE)
-    last_button_index--;
 
   const gfx::Rect last_button_bounds =
       last_button_index >= first_visible_index_
@@ -616,10 +515,6 @@
   if (shelf_->is_tablet_mode_animation_running() &&
       !chromeos::switches::ShouldShowScrollableShelf()) {
     AnimateToIdealBounds();
-    if (IsShowingOverflowBubble()) {
-      overflow_bubble_->bubble_view()->shelf_view()->OnBoundsChanged(
-          previous_bounds);
-    }
     return;
   }
 
@@ -627,9 +522,6 @@
 
   LayoutToIdealBounds();
   shelf_->NotifyShelfIconPositionsChanged();
-
-  if (IsShowingOverflowBubble())
-    overflow_bubble_->Hide();
 }
 
 bool ShelfView::OnKeyPressed(const ui::KeyEvent& event) {
@@ -724,24 +616,14 @@
     ShelfButton* button,
     bool reverse) {
   if (ShouldFocusOut(reverse, button)) {
-    shelf_->shelf_focus_cycler()->FocusOut(
-        reverse, is_overflow_mode() ? SourceView::kShelfOverflowView
-                                    : SourceView::kShelfView);
+    shelf_->shelf_focus_cycler()->FocusOut(reverse, SourceView::kShelfView);
   }
 }
 
 void ShelfView::ButtonPressed(views::Button* sender,
                               const ui::Event& event,
                               views::InkDrop* ink_drop) {
-  if (sender == overflow_button_) {
-    ToggleOverflowBubble();
-    shelf_button_pressed_metric_tracker_.ButtonPressed(event, sender,
-                                                       SHELF_ACTION_NONE);
-    return;
-  }
 
-  // None of the checks in ShouldEventActivateButton() affects overflow button.
-  // So, it is safe to be checked after handling overflow button.
   if (!ShouldEventActivateButton(sender, event)) {
     ink_drop->SnapToHidden();
     return;
@@ -815,15 +697,6 @@
       base::BindOnce(&ShelfView::AfterItemSelected, weak_factory_.GetWeakPtr(),
                      item, sender, base::Passed(ui::Event::Clone(event)),
                      ink_drop));
-
-  // Close the overflow bubble if an item on either shelf is clicked and no
-  // context menu is showing on the overflow shelf. Press events elsewhere will
-  // close the overflow shelf via OverflowBubble's EventHandler functionality.
-  ShelfView* shelf_view = main_shelf_ ? main_shelf_ : this;
-  if (shelf_view->IsShowingOverflowBubble() &&
-      !overflow_shelf()->IsShowingMenu()) {
-    shelf_view->ToggleOverflowBubble();
-  }
 }
 
 bool ShelfView::IsShowingMenuForView(const views::View* view) const {
@@ -987,9 +860,7 @@
 views::View* ShelfView::FindLastFocusableChild() {
   if (view_model_->view_size() == 0)
     return nullptr;
-  return (!is_overflow_mode() && overflow_button_->GetVisible())
-             ? overflow_button_
-             : view_model_->view_at(last_visible_index());
+  return view_model_->view_at(last_visible_index());
 }
 
 views::View* ShelfView::FindFirstOrLastFocusableChild(bool last) {
@@ -1011,14 +882,6 @@
   if (shelf_->ProcessGestureEvent(copy_event))
     return true;
 
-  // If the event hasn't been processed yet and the overflow shelf is showing,
-  // give the bubble a chance to process the event.
-  if (is_overflow_mode() &&
-      main_shelf_->overflow_bubble()->bubble_view()->ProcessGestureEvent(
-          copy_event)) {
-    return true;
-  }
-
   return false;
 }
 
@@ -1026,8 +889,6 @@
     const views::View* child_view) const {
   DCHECK_EQ(this, child_view->parent());
 
-  if (child_view == overflow_button_)
-    return true;
   // Don't show a tooltip for a view that's currently being dragged.
   if (child_view == drag_view_)
     return false;
@@ -1059,7 +920,7 @@
 
   // When scrollable shelf is enabled, the padding is handled in
   // ScrollableShelfView.
-  if (!is_overflow_mode() && !chromeos::switches::ShouldShowScrollableShelf()) {
+  if (!chromeos::switches::ShouldShowScrollableShelf()) {
     // Now add the necessary padding to center app icons.
     const gfx::Rect display_bounds =
         screen_util::GetDisplayBoundsWithShelf(GetWidget()->GetNativeWindow());
@@ -1067,8 +928,7 @@
         display_bounds.size().width(), display_bounds.size().height());
 
     const int available_size_for_app_icons = GetAvailableSpaceForAppIcons();
-    const int icons_size = GetSizeOfAppIcons(number_of_visible_apps(),
-                                             app_centering_strategy.overflow);
+    const int icons_size = GetSizeOfAppIcons(number_of_visible_apps());
     int padding_for_centering = 0;
 
     if (app_centering_strategy.center_on_screen) {
@@ -1093,11 +953,6 @@
   }
 
   for (int i = 0; i < view_model()->view_size(); ++i) {
-    if (is_overflow_mode() && i < first_visible_index()) {
-      view_model()->set_ideal_bounds(i, gfx::Rect(x, y, 0, 0));
-      continue;
-    }
-
     const int button_size = ShelfConfig::Get()->button_size();
 
     view_model()->set_ideal_bounds(i,
@@ -1124,10 +979,6 @@
     }
   }
 
-  if (is_overflow_mode()) {
-    UpdateAllButtonsVisibilityInOverflowMode();
-    return;
-  }
   // In the main shelf, the first visible index is either the first app, or -1
   // if there are no apps.
   first_visible_index_ = view_model()->view_size() == 0 ? -1 : 0;
@@ -1141,15 +992,6 @@
       continue;
     view_model()->view_at(i)->SetVisible(i <= last_visible_index());
   }
-
-  overflow_button_->SetVisible(app_centering_strategy.overflow);
-  if (app_centering_strategy.overflow) {
-    if (overflow_bubble() && overflow_bubble()->IsShowing())
-      UpdateOverflowRange(overflow_bubble()->bubble_view()->shelf_view());
-  } else {
-    if (overflow_bubble())
-      overflow_bubble()->Hide();
-  }
 }
 
 views::View* ShelfView::CreateViewForItem(const ShelfItem& item) {
@@ -1177,15 +1019,6 @@
   return view;
 }
 
-void ShelfView::UpdateOverflowRange(ShelfView* overflow_view) const {
-  const int first_overflow_index = last_visible_index_ + 1;
-  DCHECK_LE(first_overflow_index, model_->item_count() - 1);
-  DCHECK_LT(model_->item_count() - 1, view_model_->view_size());
-
-  overflow_view->first_visible_index_ = first_overflow_index;
-  overflow_view->last_visible_index_ = model_->item_count() - 1;
-}
-
 int ShelfView::GetAvailableSpaceForAppIcons() const {
   return shelf()->PrimaryAxisValue(width(), height());
 }
@@ -1213,9 +1046,6 @@
   // on the whole screen width, in which case we do that. Or, when space
   // becomes a little tight (which happens especially when the status area
   // is wider because of extra panels), we center apps on the available space.
-  // This is only relevant for the main shelf.
-  if (is_overflow_mode())
-    return strategy;
 
   const int total_available_size = shelf()->PrimaryAxisValue(width(), height());
   StatusAreaWidget* status_widget = shelf_widget()->status_area_widget();
@@ -1234,7 +1064,7 @@
       screen_size -
       2 * (status_widget_size + ShelfConfig::Get()->app_icon_group_margin());
 
-  if (GetSizeOfAppIcons(view_model()->view_size(), false) <
+  if (GetSizeOfAppIcons(view_model()->view_size()) <
       available_space_for_screen_centering) {
     // Everything fits in the center of the screen.
     last_visible_index_ = view_model()->view_size() - 1;
@@ -1247,7 +1077,7 @@
   // We know that replacing the last app that fits with the overflow button
   // will not change the outcome, so we ignore that case for now.
   while (last_visible_index() < view_model()->view_size() - 1) {
-    if (GetSizeOfAppIcons(last_visible_index() + 2, false) <=
+    if (GetSizeOfAppIcons(last_visible_index() + 2) <=
         available_size_for_app_icons) {
       last_visible_index_++;
     } else {
@@ -1262,21 +1092,6 @@
   return strategy;
 }
 
-void ShelfView::UpdateAllButtonsVisibilityInOverflowMode() {
-  // The overflow button is not shown in overflow mode.
-  overflow_button_->SetVisible(false);
-  DCHECK_LT(last_visible_index(), view_model()->view_size());
-  for (int i = 0; i < view_model()->view_size(); ++i) {
-    bool visible = i >= first_visible_index() && i <= last_visible_index();
-    // To track the dragging of |drag_view_| continuously, its visibility
-    // should be always true regardless of its position.
-    if (dragged_to_another_shelf_ && view_model()->view_at(i) == drag_view())
-      view_model()->view_at(i)->SetVisible(true);
-    else
-      view_model()->view_at(i)->SetVisible(visible);
-  }
-}
-
 void ShelfView::DestroyDragIconProxy() {
   drag_image_.reset();
   drag_image_offset_ = gfx::Vector2d(0, 0);
@@ -1306,9 +1121,7 @@
   // Check if the application is pinned - if not, we have to pin it so
   // that we can re-arrange the shelf order accordingly. Note that items have
   // to be pinned to give them the same (order) possibilities as a shortcut.
-  // When an item is dragged from overflow to shelf, IsShowingOverflowBubble()
-  // returns true. At this time, we don't need to pin the item.
-  if (!IsShowingOverflowBubble() && !model_->IsAppPinned(app_id)) {
+  if (!model_->IsAppPinned(app_id)) {
     ShelfModel::ScopedUserTriggeredMutation user_triggered(model_);
     model_->PinAppWithID(app_id);
     drag_and_drop_item_pinned_ = true;
@@ -1416,16 +1229,6 @@
     }
   }
 
-  const int target_index = with_next ? src_index + 1 : src_index - 1;
-  // TODO(manucornet): Remove this restriction once we get rid of overflow
-  // bubbles in favor of a scrollable shelf.
-  const int first_swappable_index = std::max(first_visible_index_, 0);
-  const int last_swappable_index = last_visible_index_;
-  if (target_index > last_swappable_index ||
-      target_index < first_swappable_index) {
-    return;
-  }
-
   // Swapping items in the model is sufficient, everything will then be
   // reflected in the views.
   if (model_->Swap(src_index, with_next))
@@ -1509,7 +1312,6 @@
 
   CalculateIdealBounds();
   views::ViewModelUtils::SetViewBoundsToIdealBounds(*view_model_);
-  LayoutOverflowButton();
   UpdateVisibleShelfItemBoundsUnion();
 }
 
@@ -1524,34 +1326,6 @@
     OnBoundsChanged(GetBoundsInScreen());
 }
 
-void ShelfView::LayoutOverflowButton() const {
-  // If we don't have any views, the overflow button can't be visible. No need
-  // to do any work in that case.
-  if (view_model_->view_size() == 0)
-    return;
-
-  int x = 0;
-  int y = 0;
-  if (last_visible_index_ != -1) {
-    const int offset = ShelfConfig::Get()->overflow_button_margin();
-    x = shelf_->PrimaryAxisValue(
-        offset + view_model_->ideal_bounds(last_visible_index_).right(),
-        offset + view_model_->ideal_bounds(last_visible_index_).x());
-    y = shelf_->PrimaryAxisValue(
-        offset + view_model_->ideal_bounds(last_visible_index_).y(),
-        offset + view_model_->ideal_bounds(last_visible_index_).bottom());
-
-    // Add button spacing to correctly position overflow button next to app
-    // buttons.
-    x = shelf_->PrimaryAxisValue(x + ShelfConfig::Get()->button_spacing(), x);
-    y = shelf_->PrimaryAxisValue(y, y + ShelfConfig::Get()->button_spacing());
-  }
-
-  overflow_button_->SetBoundsRect(
-      gfx::Rect(x, y, ShelfConfig::Get()->control_size(),
-                ShelfConfig::Get()->control_size()));
-}
-
 void ShelfView::AnimateToIdealBounds() {
   CalculateIdealBounds();
 
@@ -1563,7 +1337,6 @@
     if (view->border())
       view->SetBorder(views::NullBorder());
   }
-  LayoutOverflowButton();
   UpdateVisibleShelfItemBoundsUnion();
 }
 
@@ -1627,46 +1400,6 @@
     return;
   }
 
-  // Scroll the overflow bubble as the user drags near either end. There could
-  // be nowhere to scroll to in that direction (for that matter, the overflow
-  // bubble may not even span the screen), but for simplicity, ignore that
-  // possibility here and just let ScrollForUserDrag repeatedly do nothing.
-  if (is_overflow_mode()) {
-    const gfx::Rect bubble_bounds =
-        owner_overflow_bubble_->bubble_view()->GetBubbleBounds();
-    gfx::Point screen_location(event.location());
-    ConvertPointToScreen(drag_view_, &screen_location);
-    const int primary_coordinate =
-        shelf_->PrimaryAxisValue(screen_location.x(), screen_location.y());
-
-    int new_drag_scroll_dir = 0;
-    if (primary_coordinate <
-        shelf_->PrimaryAxisValue(bubble_bounds.x(), bubble_bounds.y()) +
-            kScrollTriggerBoundsInsetDips) {
-      new_drag_scroll_dir = -1;
-    } else if (primary_coordinate >
-               shelf_->PrimaryAxisValue(bubble_bounds.right(),
-                                        bubble_bounds.bottom()) -
-                   kScrollTriggerBoundsInsetDips) {
-      new_drag_scroll_dir = 1;
-    }
-
-    if (new_drag_scroll_dir != drag_scroll_dir_) {
-      drag_scroll_dir_ = new_drag_scroll_dir;
-      scrolling_timer_.Stop();
-      speed_up_drag_scrolling_.Stop();
-      if (new_drag_scroll_dir != 0) {
-        scrolling_timer_.Start(
-            FROM_HERE, kDragScrollInterval,
-            base::BindRepeating(
-                &ShelfView::ScrollForUserDrag, base::Unretained(this),
-                new_drag_scroll_dir * kDragSlowScrollDeltaDips));
-        speed_up_drag_scrolling_.Start(FROM_HERE, kDragScrollSpeedIncreaseDelay,
-                                       this, &ShelfView::SpeedUpDragScrolling);
-      }
-    }
-  }
-
   // Calculates the drag point in screen before MoveDragViewTo is called.
   gfx::Point drag_point_in_screen(event.location());
   ConvertPointToScreen(drag_view_, &drag_point_in_screen);
@@ -1681,37 +1414,6 @@
   }
 }
 
-void ShelfView::ScrollForUserDrag(int offset) {
-  DCHECK(dragging());
-  DCHECK(drag_view_);
-  DCHECK(is_overflow_mode());
-
-  const gfx::Point position(drag_view_->origin());
-  const int new_primary_coordinate =
-      shelf_->IsHorizontalAlignment()
-          ? position.x() +
-                owner_overflow_bubble_->bubble_view()->ScrollByXOffset(
-                    offset,
-                    /*animate=*/false)
-          : position.y() +
-                owner_overflow_bubble_->bubble_view()->ScrollByYOffset(
-                    offset,
-                    /*animate=*/false);
-  bounds_animator_->StopAnimatingView(drag_view_);
-  MoveDragViewTo(new_primary_coordinate);
-}
-
-void ShelfView::SpeedUpDragScrolling() {
-  DCHECK(dragging());
-  DCHECK(drag_view_);
-  DCHECK(is_overflow_mode());
-
-  scrolling_timer_.Start(
-      FROM_HERE, kDragScrollInterval,
-      base::BindRepeating(&ShelfView::ScrollForUserDrag, base::Unretained(this),
-                          drag_scroll_dir_ * kDragFastScrollDeltaDips));
-}
-
 void ShelfView::MoveDragViewTo(int primary_axis_coordinate) {
   const int current_index = view_model_->GetIndexOfView(drag_view_);
   const std::pair<int, int> indices(GetDragRange(current_index));
@@ -1751,15 +1453,6 @@
   bounds_animator_->StopAnimatingView(drag_view_);
 }
 
-void ShelfView::EndDragOnOtherShelf(bool cancel) {
-  if (is_overflow_mode()) {
-    main_shelf_->EndDrag(cancel);
-  } else {
-    DCHECK(overflow_bubble_->IsShowing());
-    overflow_bubble_->bubble_view()->shelf_view()->EndDrag(cancel);
-  }
-}
-
 void ShelfView::CreateDragIconProxy(
     const gfx::Point& location_in_screen_coordinates,
     const gfx::ImageSkia& icon,
@@ -1803,19 +1496,6 @@
     // If the shelf/overflow bubble bounds contains |screen_location| we insert
     // the item back into the shelf.
     if (GetBoundsForDragInsertInScreen().Contains(screen_location)) {
-      if (dragged_to_another_shelf_) {
-        // During the dragging an item from Shelf to Overflow, it can enter here
-        // directly because both are located very closely.
-        EndDragOnOtherShelf(true /* cancel */);
-
-        // Stops the animation of |drag_view_| and sets its bounds explicitly
-        // because ContinueDrag() stops its animation. Without this, unexpected
-        // bounds will be set.
-        bounds_animator_->StopAnimatingView(drag_view_);
-        int drag_view_index = view_model_->GetIndexOfView(drag_view_);
-        drag_view_->SetBoundsRect(view_model_->ideal_bounds(drag_view_index));
-        dragged_to_another_shelf_ = false;
-      }
 
       if (chromeos::switches::ShouldShowScrollableShelf()) {
         drag_and_drop_host_->CreateDragIconProxyByLocationWithNoAnimation(
@@ -1832,54 +1512,7 @@
       if (!chromeos::switches::ShouldShowScrollableShelf())
         drag_view_->layer()->SetOpacity(1.0f);
 
-      // The size of Overflow bubble should be updated immediately when an item
-      // is re-inserted.
-      if (is_overflow_mode())
-        PreferredSizeChanged();
       return false;
-    } else if (is_overflow_mode() &&
-               main_shelf_->GetBoundsForDragInsertInScreen().Contains(
-                   screen_location)) {
-      // The item was dragged from the overflow shelf to the main shelf.
-      if (!dragged_to_another_shelf_) {
-        dragged_to_another_shelf_ = true;
-        drag_image_->SetOpacity(1.0f);
-        main_shelf_->StartDrag(dragged_app_id, screen_location);
-      } else {
-        main_shelf_->Drag(screen_location);
-      }
-    } else if (!is_overflow_mode() && overflow_bubble_ &&
-               overflow_bubble_->IsShowing() &&
-               overflow_bubble_->bubble_view()
-                   ->shelf_view()
-                   ->GetBoundsForDragInsertInScreen()
-                   .Contains(screen_location)) {
-      // The item was dragged from the main shelf to the overflow shelf.
-      if (!dragged_to_another_shelf_) {
-        dragged_to_another_shelf_ = true;
-        drag_image_->SetOpacity(1.0f);
-        overflow_bubble_->bubble_view()->shelf_view()->StartDrag(
-            dragged_app_id, screen_location);
-      } else {
-        overflow_bubble_->bubble_view()->shelf_view()->Drag(screen_location);
-      }
-    } else if (dragged_to_another_shelf_) {
-      // Makes the |drag_image_| partially disappear again.
-      dragged_to_another_shelf_ = false;
-      drag_image_->SetOpacity(kDraggedImageOpacity);
-
-      EndDragOnOtherShelf(true /* cancel */);
-      if (!is_overflow_mode()) {
-        // During dragging, the position of the dragged item is moved to the
-        // back. If the overflow bubble is showing, a copy of the dragged item
-        // will appear at the end of the overflow shelf. Decrement the last
-        // visible index of the overflow shelf to hide this copy.
-        overflow_bubble_->bubble_view()->shelf_view()->last_visible_index_--;
-      }
-
-      bounds_animator_->StopAnimatingView(drag_view_);
-      int drag_view_index = view_model_->GetIndexOfView(drag_view_);
-      drag_view_->SetBoundsRect(view_model_->ideal_bounds(drag_view_index));
     }
     // Move our proxy view item.
     UpdateDragIconProxy(screen_location);
@@ -1887,18 +1520,9 @@
   }
 
   // Mark the item as dragged off the shelf if the drag distance exceeds
-  // |kRipOffDistance|, or if it's dragged between the main and overflow shelf.
+  // |kRipOffDistance|.
   int delta = CalculateShelfDistance(screen_location);
   bool dragged_off_shelf = delta > kRipOffDistance;
-  dragged_off_shelf |=
-      (is_overflow_mode() &&
-       main_shelf_->GetBoundsForDragInsertInScreen().Contains(screen_location));
-  dragged_off_shelf |= (!is_overflow_mode() && overflow_bubble_ &&
-                        overflow_bubble_->IsShowing() &&
-                        overflow_bubble_->bubble_view()
-                            ->shelf_view()
-                            ->GetBoundsForDragInsertInScreen()
-                            .Contains(screen_location));
 
   if (dragged_off_shelf) {
     // When scrollable shelf is enabled, replaces a proxy icon provided by
@@ -1929,16 +1553,6 @@
       if (current_index != model_->item_count() - 1) {
         model_->Move(current_index, model_->item_count() - 1);
         StartFadeInLastVisibleItem();
-
-        // During dragging, the position of the dragged item is moved to the
-        // back. If the overflow bubble is showing, a copy of the dragged item
-        // will appear at the end of the overflow shelf. Decrement the last
-        // visible index of the overflow shelf to hide this copy.
-        if (overflow_bubble_ && overflow_bubble_->IsShowing())
-          overflow_bubble_->bubble_view()->shelf_view()->last_visible_index_--;
-      } else if (is_overflow_mode()) {
-        // Overflow bubble should be shrunk when an item is ripped off.
-        PreferredSizeChanged();
       }
       // Make the item partially disappear to show that it will get removed if
       // dropped.
@@ -1970,11 +1584,7 @@
   bool snap_back = false;
   // Items which cannot be dragged off will be handled as a cancel.
   if (!cancel) {
-    if (dragged_to_another_shelf_) {
-      dragged_to_another_shelf_ = false;
-      EndDragOnOtherShelf(false /* cancel */);
-      drag_view_->layer()->SetOpacity(1.0f);
-    } else if (RemovableByRipOff(current_index) != REMOVABLE) {
+    if (RemovableByRipOff(current_index) != REMOVABLE) {
       // Make sure we do not try to remove un-removable items like items which
       // were not pinned or have to be always there.
       cancel = true;
@@ -1987,12 +1597,7 @@
     }
   }
   if (cancel || snap_back) {
-    if (dragged_to_another_shelf_) {
-      dragged_to_another_shelf_ = false;
-      // Other shelf handles revert of dragged item.
-      EndDragOnOtherShelf(false /* true */);
-      drag_view_->layer()->SetOpacity(1.0f);
-    } else if (!cancelling_drag_model_changed_) {
+    if (!cancelling_drag_model_changed_) {
       // Only do something if the change did not come through a model change.
       gfx::Rect drag_bounds = drag_image_->GetBoundsInScreen();
       gfx::Point relative_to = GetBoundsInScreen().origin();
@@ -2066,8 +1671,7 @@
       max_index = i;
     }
   }
-  min_index =
-      std::max(min_index, is_overflow_mode() ? first_visible_index_ : 0);
+  min_index = std::max(min_index, 0);
   max_index = std::min(max_index, last_visible_index_);
   return std::pair<int, int>(min_index, max_index);
 }
@@ -2090,16 +1694,6 @@
 }
 
 void ShelfView::StartFadeInLastVisibleItem() {
-  // If overflow button is visible and there is a valid new last item, fading
-  // the new last item in after sliding animation is finished.
-  if (overflow_button_->GetVisible() && last_visible_index_ >= 0) {
-    views::View* last_visible_view = view_model_->view_at(last_visible_index_);
-    last_visible_view->layer()->SetOpacity(0);
-    bounds_animator_->SetAnimationDelegate(
-        last_visible_view,
-        std::unique_ptr<gfx::AnimationDelegate>(
-            new StartFadeAnimationDelegate(this, last_visible_view)));
-  }
 }
 
 gfx::Rect ShelfView::GetMenuAnchorRect(const views::View& source,
@@ -2109,10 +1703,7 @@
   if (ShelfItemForView(&source) || !context_menu)
     return source.GetBoundsInScreen();
 
-  const gfx::Rect shelf_bounds_in_screen =
-      is_overflow_mode()
-          ? owner_overflow_bubble_->bubble_view()->GetBubbleBounds()
-          : GetBoundsInScreen();
+  const gfx::Rect shelf_bounds_in_screen = GetBoundsInScreen();
   gfx::Point origin;
   switch (shelf_->alignment()) {
     case ShelfAlignment::kBottom:
@@ -2181,39 +1772,19 @@
 
 gfx::Rect ShelfView::GetBoundsForDragInsertInScreen() {
   gfx::Size preferred_size;
-  if (is_overflow_mode()) {
-    DCHECK(owner_overflow_bubble_);
-    gfx::Rect bubble_bounds =
-        owner_overflow_bubble_->bubble_view()->GetBubbleBounds();
-    preferred_size = bubble_bounds.size();
-  } else {
-    const int last_button_index = view_model_->view_size() - 1;
-    gfx::Rect last_button_bounds =
-        view_model_->view_at(last_button_index)->bounds();
-    if (overflow_button_->GetVisible()) {
-      // When overflow button is visible, last_button_bounds should be
-      // overflow button's bounds.
-      last_button_bounds = overflow_button_->bounds();
-    }
+  const int last_button_index = view_model_->view_size() - 1;
+  gfx::Rect last_button_bounds =
+      view_model_->view_at(last_button_index)->bounds();
 
-    if (shelf_->IsHorizontalAlignment()) {
-      preferred_size = gfx::Size(last_button_bounds.right(),
-                                 ShelfConfig::Get()->hotseat_size());
-    } else {
-      preferred_size = gfx::Size(ShelfConfig::Get()->hotseat_size(),
-                                 last_button_bounds.bottom());
-    }
+  if (shelf_->IsHorizontalAlignment()) {
+    preferred_size = gfx::Size(last_button_bounds.right(),
+                               ShelfConfig::Get()->hotseat_size());
+  } else {
+    preferred_size = gfx::Size(ShelfConfig::Get()->hotseat_size(),
+                               last_button_bounds.bottom());
   }
   gfx::Point origin(GetMirroredXWithWidthInView(0, preferred_size.width()), 0);
-
-  // In overflow mode, we should use OverflowBubbleView as a source for
-  // converting |origin| to screen coordinates. When a scroll operation is
-  // occurred in OverflowBubble, the bounds of ShelfView in OverflowBubble can
-  // be changed.
-  if (is_overflow_mode())
-    ConvertPointToScreen(owner_overflow_bubble_->bubble_view(), &origin);
-  else
-    ConvertPointToScreen(this, &origin);
+  ConvertPointToScreen(this, &origin);
 
   return gfx::Rect(origin, preferred_size);
 }
@@ -2252,7 +1823,7 @@
 }
 
 void ShelfView::OnGestureEvent(ui::GestureEvent* event) {
-  if (!overflow_mode_ && !ShouldHandleGestures(*event))
+  if (!ShouldHandleGestures(*event))
     return;
 
   if (HandleGestureEvent(event))
@@ -2320,15 +1891,6 @@
     CancelDrag(-1);
   }
 
-  // When the overflow bubble is visible, the overflow range needs to be set
-  // before CalculateIdealBounds() gets called. Otherwise CalculateIdealBounds()
-  // could trigger a ShelfItemChanged() by hiding the overflow bubble and
-  // since the overflow bubble is not yet synced with the ShelfModel this
-  // could cause a crash.
-  if (overflow_bubble_ && overflow_bubble_->IsShowing()) {
-    UpdateOverflowRange(overflow_bubble_->bubble_view()->shelf_view());
-  }
-
   if (view.get() == shelf_->tooltip()->GetCurrentAnchorView())
     shelf_->tooltip()->Close();
 
@@ -2391,10 +1953,7 @@
     view_model_->set_ideal_bounds(model_index, old_ideal_bounds);
 
     new_view->SetBoundsRect(old_view->bounds());
-    if (overflow_button_ && overflow_button_->GetVisible())
-      AnimateToIdealBounds();
-    else
-      bounds_animator_->AnimateViewTo(new_view, old_ideal_bounds);
+    bounds_animator_->AnimateViewTo(new_view, old_ideal_bounds);
 
     // If an item is being pinned or unpinned, show the new status of the
     // shelf immediately so that the separator gets drawn as needed.
@@ -2466,8 +2025,6 @@
     if (i >= first_visible_index_ && i <= last_visible_index_)
       view_model_->view_at(i)->Layout();
   }
-  if (overflow_bubble_)
-    overflow_bubble_->Hide();
 
   AnnounceShelfAlignment();
 }
@@ -2686,9 +2243,6 @@
 }
 
 base::string16 ShelfView::GetTitleForChildView(const views::View* view) const {
-  if (view == overflow_button_)
-    return overflow_button_->GetAccessibleName();
-
   const ShelfItem* item = ShelfItemForView(view);
   return item ? item->title : base::string16();
 }
diff --git a/ash/shelf/shelf_view.h b/ash/shelf/shelf_view.h
index e6150b36..91c3cb4 100644
--- a/ash/shelf/shelf_view.h
+++ b/ash/shelf/shelf_view.h
@@ -17,8 +17,6 @@
 #include "ash/public/cpp/shelf_item_delegate.h"
 #include "ash/public/cpp/shelf_model_observer.h"
 #include "ash/public/cpp/tablet_mode_observer.h"
-#include "ash/shelf/overflow_bubble.h"
-#include "ash/shelf/overflow_bubble_view.h"
 #include "ash/shelf/shelf.h"
 #include "ash/shelf/shelf_button_delegate.h"
 #include "ash/shelf/shelf_button_pressed_metric_tracker.h"
@@ -50,8 +48,6 @@
 
 namespace ash {
 class DragImageView;
-class OverflowBubble;
-class OverflowButton;
 class ScopedRootWindowForNewWindows;
 class ShelfAppButton;
 class ShelfButton;
@@ -127,7 +123,7 @@
   // Returns the size occupied by |count| app icons. If |with_overflow| is
   // true, returns the size of |count| app icons followed by an overflow
   // button.
-  static int GetSizeOfAppIcons(int count, bool with_overflow);
+  static int GetSizeOfAppIcons(int count);
 
   // Initializes shelf view elements.
   void Init();
@@ -145,17 +141,6 @@
   // ShelfAppButton or the ShelfView.
   bool IsShowingMenuForView(const views::View* view) const;
 
-  // Returns true if overflow bubble is shown.
-  bool IsShowingOverflowBubble() const;
-
-  // Sets owner overflow bubble instance from which this shelf view pops
-  // out as overflow.
-  void set_owner_overflow_bubble(OverflowBubble* owner) {
-    owner_overflow_bubble_ = owner;
-  }
-
-  OverflowButton* GetOverflowButton() const;
-
   // Updates the union of all the shelf item bounds shown by this shelf view.
   // This is used to determine the common area where the mouse can hover
   // for showing tooltips without stuttering over gaps.
@@ -169,9 +154,6 @@
   base::string16 GetTitleForView(const views::View* view) const override;
   views::View* GetViewForEvent(const ui::Event& event) override;
 
-  // Toggles the overflow menu.
-  void ToggleOverflowBubble();
-
   // Returns rectangle bounding all visible launcher items. Used screen
   // coordinate system.
   gfx::Rect GetVisibleItemsBoundsInScreen();
@@ -268,14 +250,8 @@
   // True if the current |drag_view_| is the given |drag_view|.
   bool IsDraggedView(const views::View* drag_view) const;
 
-  // The three methods below return the first or last focusable child of the
-  // set including both the main shelf and the overflow shelf it it's showing.
-  // - The first focusable child is either the home button, or the back
-  //   button in tablet mode.
-  // - The last focusable child can be either 1) the last app icon on the main
-  //   shelf if there aren't enough apps to overflow, 2) the overflow button
-  //   if it's visible but the overflow bubble isn't showing, or 3) the last
-  //   app icon in the overflow bubble if it's showing.
+  // These three methods return the first or last focuable child of the whole
+  // shelf view.
   views::View* FindFirstOrLastFocusableChild(bool last);
   views::View* FindFirstFocusableChild();
   views::View* FindLastFocusableChild();
@@ -305,25 +281,6 @@
     return view_model_.get();
   }
 
-  // Returns the main shelf. This can be called on either the main shelf
-  // or the overflow shelf.
-  ShelfView* main_shelf() { return main_shelf_ ? main_shelf_ : this; }
-
-  // Returns the overflow shelf. This can be called on either the main shelf
-  // or the overflow shelf. Returns nullptr if the overflow shelf isn't visible.
-  ShelfView* overflow_shelf() {
-    return const_cast<ShelfView*>(
-        const_cast<const ShelfView*>(this)->overflow_shelf());
-  }
-
-  const ShelfView* overflow_shelf() const {
-    if (is_overflow_mode())
-      return this;
-    return IsShowingOverflowBubble()
-               ? overflow_bubble_->bubble_view()->shelf_view()
-               : nullptr;
-  }
-
   void set_default_last_focusable_child(bool default_last_focusable_child) {
     default_last_focusable_child_ = default_last_focusable_child;
   }
@@ -334,27 +291,15 @@
 
   ShelfAppButton* drag_view() { return drag_view_; }
 
-  // Returns true when this ShelfView is used for Overflow Bubble.
-  // In this mode, it does not show app list and overflow button.
-  // Note:
-  //   * When Shelf can contain only one item (the overflow button) due to very
-  //     small resolution screen, the overflow bubble can show the app list
-  //     button.
-  bool is_overflow_mode() const { return overflow_mode_; }
-
   int first_visible_index() const { return first_visible_index_; }
   int last_visible_index() const { return last_visible_index_; }
   int number_of_visible_apps() const {
-    if (is_overflow_mode())
-      return std::max(0, last_visible_index_ - first_visible_index_ + 1);
-    else
-      return std::max(0, last_visible_index_ + 1);
+    return std::max(0, last_visible_index_ + 1);
   }
   views::View* first_visible_button_for_testing() {
     return view_model_->view_at(first_visible_index());
   }
   ShelfWidget* shelf_widget() const { return shelf_->shelf_widget(); }
-  OverflowBubble* overflow_bubble() { return overflow_bubble_.get(); }
   views::ViewModel* view_model() { return view_model_.get(); }
   bool dragged_off_shelf() const { return dragged_off_shelf_; }
   ShelfID drag_and_drop_shelf_id() const { return drag_and_drop_shelf_id_; }
@@ -394,9 +339,6 @@
   // Returns unowned pointer (view is owned by the view hierarchy).
   views::View* CreateViewForItem(const ShelfItem& item);
 
-  // Updates the visible range of overflow items in |overflow_view|.
-  void UpdateOverflowRange(ShelfView* overflow_view) const;
-
   // Returns the size that's actually available for app icons. Size occupied
   // by the home button and back button plus all appropriate margins is
   // not available for app icons.
@@ -411,14 +353,10 @@
   // appropriately.
   AppCenteringStrategy CalculateAppCenteringStrategy();
 
-  // Update all buttons' visibility in overflow.
-  void UpdateAllButtonsVisibilityInOverflowMode();
-
   // Sets the bounds of each view to its ideal bounds.
   void LayoutToIdealBounds();
 
   void LayoutBackAndHomeButtons();
-  void LayoutOverflowButton() const;
 
   // Returns the index of the last view whose max primary axis coordinate is
   // less than |max_value|. Returns -1 if nothing fits, or there are no views.
@@ -446,11 +384,6 @@
   // Reorder |drag_view_| according to the latest dragging coordinate.
   void MoveDragViewTo(int primary_axis_coordinate);
 
-  // Ends the drag on the other shelf. (ie if we are on main shelf, ends drag on
-  // the overflow shelf). Invoked when a shelf item is being dragged from one
-  // shelf to the other.
-  void EndDragOnOtherShelf(bool cancel);
-
   // Creates a drag proxy icon which can escape the given view.
   // The proxy should get created using the |icon| with a magnification of
   // |scale_factor| at a center location of |location_in_screen_coordinates.
@@ -491,10 +424,6 @@
   int CancelDrag(int modified_index);
 
   // Returns rectangle bounds used for drag insertion.
-  // Note:
-  //  * When overflow button is visible, returns bounds from first item
-  //    to overflow button.
-  //  * In the overflow mode, returns only bubble's bounds.
   gfx::Rect GetBoundsForDragInsertInScreen();
 
   // Invoked after the fading in animation for item addition is ended.
@@ -610,19 +539,12 @@
   //   subset of items.
   int first_visible_index_ = -1;
 
-  // Last index of an app launcher button that is visible (does not go into
-  // overflow), or -1 if there are no apps (or if only the overflow button is
-  // visible).
+  // Last index of an app launcher button that is visible, or -1 if there
+  // are no apps.
   int last_visible_index_ = -1;
 
   std::unique_ptr<views::BoundsAnimator> bounds_animator_;
 
-  OverflowButton* overflow_button_ = nullptr;
-
-  std::unique_ptr<OverflowBubble> overflow_bubble_;
-
-  OverflowBubble* owner_overflow_bubble_ = nullptr;
-
   // Pointer device that initiated the current drag operation. If there is no
   // current dragging operation, this is NONE.
   Pointer drag_pointer_ = NONE;
@@ -695,21 +617,9 @@
   // True when the icon was dragged off the shelf.
   bool dragged_off_shelf_ = false;
 
-  // True when an item is dragged from one shelf to another (eg. overflow).
-  bool dragged_to_another_shelf_ = false;
-
   // The rip off view when a snap back operation is underway.
   ShelfAppButton* snap_back_from_rip_off_view_ = nullptr;
 
-  // True when this ShelfView is used for Overflow Bubble.
-  bool overflow_mode_ = false;
-
-  // Holds a pointer to main ShelfView when a ShelfView is in overflow mode.
-  ShelfView* main_shelf_ = nullptr;
-
-  // True when ripped item from overflow bubble is entered into Shelf.
-  bool dragged_off_from_overflow_to_shelf_ = false;
-
   // True if the event is a repost event from a event which has just closed the
   // menu of the same shelf item.
   bool is_repost_event_on_same_item_ = false;
diff --git a/ash/shelf/shelf_view_test_api.cc b/ash/shelf/shelf_view_test_api.cc
index 103347a..cc9dd706 100644
--- a/ash/shelf/shelf_view_test_api.cc
+++ b/ash/shelf/shelf_view_test_api.cc
@@ -5,7 +5,6 @@
 #include "ash/shelf/shelf_view_test_api.h"
 
 #include "ash/public/cpp/shelf_model.h"
-#include "ash/shelf/overflow_button.h"
 #include "ash/shelf/shelf_app_button.h"
 #include "ash/shelf/shelf_menu_model_adapter.h"
 #include "ash/shelf/shelf_navigation_widget.h"
@@ -63,16 +62,6 @@
   return shelf_view_->view_model_->view_at(index);
 }
 
-void ShelfViewTestAPI::ShowOverflowBubble() {
-  DCHECK(!shelf_view_->IsShowingOverflowBubble());
-  shelf_view_->ToggleOverflowBubble();
-}
-
-void ShelfViewTestAPI::HideOverflowBubble() {
-  DCHECK(shelf_view_->IsShowingOverflowBubble());
-  shelf_view_->ToggleOverflowBubble();
-}
-
 const gfx::Rect& ShelfViewTestAPI::GetBoundsByIndex(int index) {
   return shelf_view_->view_model_->view_at(index)->bounds();
 }
@@ -125,10 +114,6 @@
   return true;
 }
 
-OverflowBubble* ShelfViewTestAPI::overflow_bubble() {
-  return shelf_view_->overflow_bubble_.get();
-}
-
 ShelfTooltipManager* ShelfViewTestAPI::tooltip_manager() {
   return shelf_view_->shelf()->tooltip();
 }
@@ -150,10 +135,6 @@
   return shelf_view_->dragged_off_shelf_;
 }
 
-bool ShelfViewTestAPI::DraggedItemToAnotherShelf() {
-  return shelf_view_->dragged_to_another_shelf_;
-}
-
 ShelfButtonPressedMetricTracker*
 ShelfViewTestAPI::shelf_button_pressed_metric_tracker() {
   return &(shelf_view_->shelf_button_pressed_metric_tracker_);
diff --git a/ash/shelf/shelf_view_unittest.cc b/ash/shelf/shelf_view_unittest.cc
index 5f9b124cb..b27e55c 100644
--- a/ash/shelf/shelf_view_unittest.cc
+++ b/ash/shelf/shelf_view_unittest.cc
@@ -29,7 +29,6 @@
 #include "ash/session/session_controller_impl.h"
 #include "ash/shelf/back_button.h"
 #include "ash/shelf/home_button.h"
-#include "ash/shelf/overflow_button.h"
 #include "ash/shelf/shelf.h"
 #include "ash/shelf/shelf_app_button.h"
 #include "ash/shelf/shelf_focus_cycler.h"
@@ -575,15 +574,6 @@
     ASSERT_NO_FATAL_FAILURE(CheckModelIDs(*id_map));
   }
 
-  void AddAppShortcutsUntilOverflow() {
-    int items_added = 0;
-    while (!shelf_view_->GetOverflowButton()->GetVisible()) {
-      AddAppShortcut();
-      ++items_added;
-      ASSERT_LT(items_added, 10000);
-    }
-  }
-
   // Returns the item's ShelfID at |index|.
   ShelfID GetItemId(int index) {
     DCHECK_GE(index, 0);
@@ -650,28 +640,6 @@
   DISALLOW_COPY_AND_ASSIGN(ShelfViewTextDirectionTest);
 };
 
-// Check the ideal bounds of several items in LTR and RTL UI.
-TEST_P(ShelfViewTextDirectionTest, GetIdealBoundsOfItemIcon) {
-  ShelfID id_1 = AddAppShortcut();
-  const gfx::Rect bounds_1 = shelf_view_->GetIdealBoundsOfItemIcon(id_1);
-  EXPECT_TRUE(GetButtonByID(id_1)->GetMirroredBounds().Contains(bounds_1));
-
-  if (chromeos::switches::ShouldShowScrollableShelf())
-    return;
-
-  AddAppShortcutsUntilOverflow();
-  ShelfID id_2 = AddAppShortcut();
-  ShelfID id_3 = AddAppShortcut();
-
-  const gfx::Rect bounds_2 = shelf_view_->GetIdealBoundsOfItemIcon(id_2);
-  const gfx::Rect bounds_3 = shelf_view_->GetIdealBoundsOfItemIcon(id_3);
-
-  // Just items in the overflow area return the overflow button's ideal bounds.
-  EXPECT_NE(bounds_1, shelf_view_->GetOverflowButton()->GetMirroredBounds());
-  EXPECT_EQ(bounds_2, shelf_view_->GetOverflowButton()->GetMirroredBounds());
-  EXPECT_EQ(bounds_3, shelf_view_->GetOverflowButton()->GetMirroredBounds());
-}
-
 // Checks that shelf view contents are considered in the correct drag group.
 TEST_F(ShelfViewTest, EnforceDragType) {
   EXPECT_TRUE(test_api_->SameDragType(TYPE_APP, TYPE_APP));
@@ -685,189 +653,6 @@
       test_api_->SameDragType(TYPE_BROWSER_SHORTCUT, TYPE_BROWSER_SHORTCUT));
 }
 
-// Adds platform app button until overflow and verifies that the last added
-// platform app button is hidden.
-TEST_F(ShelfViewNotScrollableTest, AddBrowserUntilOverflow) {
-  // All buttons should be visible.
-  ASSERT_EQ(test_api_->GetButtonCount(), shelf_view_->last_visible_index() + 1);
-
-  // Add platform app button until overflow.
-  int items_added = 0;
-  ShelfID last_added = AddApp();
-  while (!shelf_view_->GetOverflowButton()->GetVisible()) {
-    // Added button is visible after animation while in this loop.
-    EXPECT_TRUE(GetButtonByID(last_added)->GetVisible());
-
-    last_added = AddApp();
-    ++items_added;
-    ASSERT_LT(items_added, 10000);
-  }
-
-  // The last added button should be invisible.
-  EXPECT_FALSE(GetButtonByID(last_added)->GetVisible());
-}
-
-// Adds one platform app button then adds app shortcut until overflow. Verifies
-// that the browser button gets hidden on overflow and last added app shortcut
-// is still visible.
-TEST_F(ShelfViewNotScrollableTest,
-       AddAppShortcutWithBrowserButtonUntilOverflow) {
-  // All buttons should be visible.
-  ASSERT_EQ(test_api_->GetButtonCount(), shelf_view_->last_visible_index() + 1);
-
-  ShelfID browser_button_id = AddApp();
-
-  // Add app shortcut until overflow.
-  int items_added = 0;
-  ShelfID last_added = AddAppShortcut();
-  while (!shelf_view_->GetOverflowButton()->GetVisible()) {
-    // Added button is visible after animation while in this loop.
-    EXPECT_TRUE(GetButtonByID(last_added)->GetVisible());
-
-    last_added = AddAppShortcut();
-    ++items_added;
-    ASSERT_LT(items_added, 10000);
-  }
-
-  // And the platform app button is invisible.
-  EXPECT_FALSE(GetButtonByID(browser_button_id)->GetVisible());
-}
-
-// Making sure that no buttons on the shelf will ever overlap after adding many
-// of them.
-TEST_F(ShelfViewNotScrollableTest, AssertNoButtonsOverlap) {
-  std::vector<ShelfID> button_ids;
-  // Add app icons until the overflow button is visible.
-  while (!shelf_view_->GetOverflowButton()->GetVisible()) {
-    ShelfID id = AddApp();
-    button_ids.push_back(id);
-  }
-  ASSERT_LT(button_ids.size(), 10000U);
-  ASSERT_GT(button_ids.size(), 2U);
-
-  // Remove 2 icons to make more room, the overflow button should go away.
-  for (int i = 0; i < 2; ++i) {
-    ShelfID id = button_ids.back();
-    RemoveByID(id);
-    button_ids.pop_back();
-  }
-  EXPECT_FALSE(shelf_view_->GetOverflowButton()->GetVisible());
-  EXPECT_TRUE(GetButtonByID(button_ids.back())->GetVisible());
-
-  // Add 20 app icons, and expect to have overflow.
-  for (int i = 0; i < 20; ++i) {
-    ShelfID id = AddAppShortcut();
-    button_ids.push_back(id);
-  }
-  ASSERT_LT(button_ids.size(), 10000U);
-  EXPECT_TRUE(shelf_view_->GetOverflowButton()->GetVisible());
-
-  // Test that any two successive visible icons never overlap in all shelf
-  // alignment types.
-  const ShelfAlignment kAlignments[] = {
-      ShelfAlignment::kLeft,
-      ShelfAlignment::kRight,
-      ShelfAlignment::kBottom,
-      ShelfAlignment::kBottomLocked,
-  };
-
-  for (ShelfAlignment alignment : kAlignments) {
-    shelf_view_->shelf()->SetAlignment(alignment);
-    // For every 2 successive visible icons, expect that their bounds don't
-    // intersect.
-    for (int i = 2; i < test_api_->GetButtonCount() - 1; ++i) {
-      if (!(test_api_->GetButton(i)->GetVisible() &&
-            test_api_->GetButton(i + 1)->GetVisible())) {
-        continue;
-      }
-
-      const gfx::Rect& bounds1 = test_api_->GetBoundsByIndex(i);
-      const gfx::Rect& bounds2 = test_api_->GetBoundsByIndex(i + 1);
-      EXPECT_FALSE(bounds1.Intersects(bounds2));
-    }
-  }
-}
-
-// Adds button until overflow then removes first added one. Verifies that
-// the last added one changes from invisible to visible and overflow
-// chevron is gone.
-TEST_F(ShelfViewNotScrollableTest, RemoveButtonRevealsOverflowed) {
-  // All buttons should be visible.
-  ASSERT_EQ(test_api_->GetButtonCount(), shelf_view_->last_visible_index() + 1);
-
-  // Add platform app buttons until overflow.
-  int items_added = 0;
-  ShelfID first_added = AddApp();
-  ShelfID last_added = first_added;
-  while (!shelf_view_->GetOverflowButton()->GetVisible()) {
-    last_added = AddApp();
-    ++items_added;
-    ASSERT_LT(items_added, 10000);
-  }
-
-  // Expect add more than 1 button. First added is visible and last is not.
-  EXPECT_NE(first_added, last_added);
-  EXPECT_TRUE(GetButtonByID(first_added)->GetVisible());
-  EXPECT_FALSE(GetButtonByID(last_added)->GetVisible());
-
-  // Remove first added.
-  RemoveByID(first_added);
-
-  // Last added button becomes visible and overflow chevron is gone.
-  EXPECT_TRUE(GetButtonByID(last_added)->GetVisible());
-  EXPECT_EQ(1.0f, GetButtonByID(last_added)->layer()->opacity());
-  EXPECT_FALSE(shelf_view_->GetOverflowButton()->GetVisible());
-}
-
-// Verifies that remove last overflowed button should hide overflow chevron.
-TEST_F(ShelfViewNotScrollableTest, RemoveLastOverflowed) {
-  // All buttons should be visible.
-  ASSERT_EQ(test_api_->GetButtonCount(), shelf_view_->last_visible_index() + 1);
-
-  // Add platform app button until overflow.
-  int items_added = 0;
-  ShelfID last_added = AddApp();
-  while (!shelf_view_->GetOverflowButton()->GetVisible()) {
-    last_added = AddApp();
-    ++items_added;
-    ASSERT_LT(items_added, 10000);
-  }
-
-  RemoveByID(last_added);
-  EXPECT_FALSE(shelf_view_->GetOverflowButton()->GetVisible());
-}
-
-// Adds platform app button without waiting for animation to finish and verifies
-// that all added buttons are visible.
-TEST_F(ShelfViewNotScrollableTest, AddButtonQuickly) {
-  // All buttons should be visible.
-  ASSERT_EQ(test_api_->GetButtonCount(), shelf_view_->last_visible_index() + 1);
-
-  // Add a few platform buttons quickly without wait for animation.
-  int added_count = 0;
-  while (!shelf_view_->GetOverflowButton()->GetVisible()) {
-    AddAppNoWait();
-    ++added_count;
-    ASSERT_LT(added_count, 10000);
-  }
-
-  // ShelfView should be big enough to hold at least 3 new buttons.
-  ASSERT_GE(added_count, 3);
-
-  // Wait for the last animation to finish.
-  test_api_->RunMessageLoopUntilAnimationsDone();
-
-  // Verifies non-overflow buttons are visible. The back button at index 0 is
-  // not visible.
-  for (int i = 1; i <= shelf_view_->last_visible_index(); ++i) {
-    ShelfAppButton* button = test_api_->GetButton(i);
-    if (button) {
-      EXPECT_TRUE(button->GetVisible()) << "button index=" << i;
-      EXPECT_EQ(1.0f, button->layer()->opacity()) << "button index=" << i;
-    }
-  }
-}
-
 // Check that model changes are handled correctly while a shelf icon is being
 // dragged.
 TEST_F(ShelfViewTest, ModelChangesWhileDragging) {
@@ -1051,8 +836,7 @@
   // The rip off threshold. Taken from |kRipOffDistance| in shelf_view.cc.
   const int kRipOffDistance = 48;
 
-  // Add two apps (which is on the main shelf) and then add buttons until
-  // overflow. Add one more app (which is on the overflow shelf).
+  // Add two apps on the main shelf.
   ShelfID first_app_id = AddAppShortcut();
   ShelfID second_app_id = AddAppShortcut();
 
@@ -1179,8 +963,6 @@
 }
 
 TEST_F(ShelfViewNotScrollableTest, ButtonTitlesTest) {
-  AddAppShortcutsUntilOverflow();
-
   Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true);
   test_api_->RunMessageLoopUntilAnimationsDone();
 
@@ -1455,110 +1237,6 @@
   EXPECT_FALSE(tooltip_manager->IsVisible());
 }
 
-// Resizing shelf view while an add animation without fade-in is running,
-// which happens when overflow happens. Home button should end up in its
-// new ideal bounds.
-TEST_F(ShelfViewNotScrollableTest, ResizeDuringOverflowAddAnimation) {
-  // All buttons should be visible.
-  ASSERT_EQ(test_api_->GetButtonCount(), shelf_view_->last_visible_index() + 1);
-
-  // Add buttons until overflow. Let the non-overflow add animations finish but
-  // leave the last running.
-  int items_added = 0;
-  AddAppNoWait();
-  while (!shelf_view_->GetOverflowButton()->GetVisible()) {
-    test_api_->RunMessageLoopUntilAnimationsDone();
-    AddAppNoWait();
-    ++items_added;
-    ASSERT_LT(items_added, 10000);
-  }
-
-  // Resize shelf view with that animation running and stay overflown.
-  gfx::Rect bounds = shelf_view_->bounds();
-  bounds.set_width(bounds.width() - ShelfConfig::Get()->shelf_size());
-  shelf_view_->SetBoundsRect(bounds);
-  ASSERT_TRUE(shelf_view_->GetOverflowButton()->GetVisible());
-
-  // Finish the animation.
-  test_api_->RunMessageLoopUntilAnimationsDone();
-
-  // Home button should ends up in its new ideal bounds.
-  const int home_button_index = test_api_->GetButtonCount() - 1;
-  const gfx::Rect& app_list_ideal_bounds =
-      test_api_->GetIdealBoundsByIndex(home_button_index);
-  const gfx::Rect& app_list_bounds =
-      test_api_->GetBoundsByIndex(home_button_index);
-  EXPECT_EQ(app_list_ideal_bounds, app_list_bounds);
-}
-
-// Check the drag insertion bounds of shelf view in multi monitor environment.
-TEST_F(ShelfViewNotScrollableTest, CheckDragInsertBoundsWithMultiMonitor) {
-  UpdateDisplay("800x600,800x600");
-  Shelf* secondary_shelf = Shelf::ForWindow(Shell::GetAllRootWindows()[1]);
-  ShelfView* shelf_view_for_secondary =
-      secondary_shelf->GetShelfViewForTesting();
-
-  // The bounds should be big enough for 4 buttons + overflow chevron.
-  shelf_view_for_secondary->SetBounds(0, 0, 500,
-                                      ShelfConfig::Get()->shelf_size());
-
-  ShelfViewTestAPI test_api_for_secondary(shelf_view_for_secondary);
-  // Speeds up animation for test.
-  test_api_for_secondary.SetAnimationDuration(
-      base::TimeDelta::FromMilliseconds(1));
-
-  AddAppShortcutsUntilOverflow();
-
-  // Test #1: Test drag insertion bounds of primary shelf.
-  // Show overflow bubble.
-  test_api_->ShowOverflowBubble();
-  ASSERT_TRUE(shelf_view_->IsShowingOverflowBubble());
-
-  ShelfViewTestAPI test_api_for_overflow_view(
-      test_api_->overflow_bubble()->bubble_view()->shelf_view());
-  const ShelfView* overflow_shelf_view = shelf_view_->overflow_shelf();
-
-  ShelfAppButton* button = test_api_for_overflow_view.GetButton(
-      overflow_shelf_view->last_visible_index());
-
-  // Checks that a point in shelf is contained in drag insert bounds.
-  gfx::Point point_in_shelf_view = button->GetBoundsInScreen().CenterPoint();
-  gfx::Rect drag_reinsert_bounds =
-      test_api_for_overflow_view.GetBoundsForDragInsertInScreen();
-  EXPECT_TRUE(drag_reinsert_bounds.Contains(point_in_shelf_view));
-  // Checks that a point out of shelf is not contained in drag insert bounds.
-  EXPECT_FALSE(
-      drag_reinsert_bounds.Contains(gfx::Point(point_in_shelf_view.x(), 0)));
-
-  // Test #2: Test drag insertion bounds of secondary shelf.
-  // Show overflow bubble.
-  test_api_for_secondary.ShowOverflowBubble();
-  ASSERT_TRUE(shelf_view_for_secondary->IsShowingOverflowBubble());
-
-  ShelfViewTestAPI test_api_for_overflow_view_of_secondary(
-      test_api_for_secondary.overflow_bubble()->bubble_view()->shelf_view());
-  const ShelfView* overflow_shelf_view_of_secondary =
-      shelf_view_for_secondary->overflow_shelf();
-
-  ShelfAppButton* button_in_secondary =
-      test_api_for_overflow_view_of_secondary.GetButton(
-          overflow_shelf_view_of_secondary->last_visible_index());
-
-  // Checks that a point in shelf is contained in drag insert bounds.
-  gfx::Point point_in_secondary_shelf_view =
-      button_in_secondary->GetBoundsInScreen().CenterPoint();
-  gfx::Rect drag_reinsert_bounds_in_secondary =
-      test_api_for_overflow_view_of_secondary.GetBoundsForDragInsertInScreen();
-  EXPECT_TRUE(drag_reinsert_bounds_in_secondary.Contains(
-      point_in_secondary_shelf_view));
-  // Checks that a point out of shelf is not contained in drag insert bounds.
-  EXPECT_FALSE(drag_reinsert_bounds_in_secondary.Contains(
-      gfx::Point(point_in_secondary_shelf_view.x(), 0)));
-  // Checks that a point of overflow bubble in primary shelf should not be
-  // contained by insert bounds of secondary shelf.
-  EXPECT_FALSE(drag_reinsert_bounds_in_secondary.Contains(point_in_shelf_view));
-}
-
 // Checks the rip an item off from left aligned shelf in secondary monitor.
 TEST_F(ShelfViewTest, CheckRipOffFromLeftShelfAlignmentWithMultiMonitor) {
   UpdateDisplay("800x600,800x600");
@@ -2224,7 +1902,6 @@
     AddAppShortcut();
   }
   test_api_->RunMessageLoopUntilAnimationsDone();
-  EXPECT_FALSE(shelf_view_->GetOverflowButton()->GetVisible());
   CheckAllItemsAreInBounds();
 }
 
@@ -2796,8 +2473,6 @@
 // Tests that the number of buttons is as expected and the shelf's widget
 // intially has focus.
 TEST_F(ShelfViewFocusTest, Basic) {
-  EXPECT_FALSE(shelf_view_->IsShowingOverflowBubble());
-
   // There are five buttons, including 3 app buttons. The back button and
   // launcher are always there, the browser shortcut is added in
   // ShelfViewTest and the two test apps added in ShelfViewFocusTest.
diff --git a/ash/shelf/shelf_widget.cc b/ash/shelf/shelf_widget.cc
index 8eb4b294e..e806571 100644
--- a/ash/shelf/shelf_widget.cc
+++ b/ash/shelf/shelf_widget.cc
@@ -26,8 +26,6 @@
 #include "ash/shelf/hotseat_widget.h"
 #include "ash/shelf/login_shelf_gesture_controller.h"
 #include "ash/shelf/login_shelf_view.h"
-#include "ash/shelf/overflow_bubble.h"
-#include "ash/shelf/overflow_bubble_view.h"
 #include "ash/shelf/scrollable_shelf_view.h"
 #include "ash/shelf/shelf_background_animator_observer.h"
 #include "ash/shelf/shelf_layout_manager.h"
diff --git a/ash/shelf/shelf_widget_unittest.cc b/ash/shelf/shelf_widget_unittest.cc
index 37a0e9a1..36454647 100644
--- a/ash/shelf/shelf_widget_unittest.cc
+++ b/ash/shelf/shelf_widget_unittest.cc
@@ -170,7 +170,7 @@
   views::Widget* widget = new views::Widget;
   views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
   params.bounds = gfx::Rect(0, 0, 200, 200);
-  params.context = CurrentContext();
+  params.context = GetContext();
   // Widget is now owned by the parent window.
   widget->Init(std::move(params));
   widget->SetFullscreen(true);
@@ -248,7 +248,7 @@
   views::Widget* widget = new views::Widget;
   views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
   params.bounds = gfx::Rect(0, 0, 200, 200);
-  params.context = CurrentContext();
+  params.context = GetContext();
   // Widget is now owned by the parent window.
   widget->Init(std::move(params));
   widget->Show();
@@ -310,7 +310,7 @@
   params.bounds = gfx::Rect(shelf_bounds.height() - kOverlapSize,
                             shelf_bounds.y() - kWindowHeight + kOverlapSize,
                             kWindowWidth, kWindowHeight);
-  params.context = CurrentContext();
+  params.context = GetContext();
   // Widget is now owned by the parent window.
   widget->Init(std::move(params));
   // Explicitly set the bounds which will allow the widget to overlap the shelf.
diff --git a/ash/shelf/test/shelf_layout_manager_test_base.cc b/ash/shelf/test/shelf_layout_manager_test_base.cc
index f05abe6..b12aef8a 100644
--- a/ash/shelf/test/shelf_layout_manager_test_base.cc
+++ b/ash/shelf/test/shelf_layout_manager_test_base.cc
@@ -10,6 +10,7 @@
 #include "ash/session/session_controller_impl.h"
 #include "ash/shelf/shelf_layout_manager.h"
 #include "ash/shelf/shelf_view.h"
+#include "ash/shell.h"
 #include "ash/window_factory.h"
 #include "ash/wm/tablet_mode/tablet_mode_controller_test_api.h"
 #include "ash/wm/window_state.h"
@@ -197,7 +198,7 @@
 views::Widget* ShelfLayoutManagerTestBase::CreateTestWidget() {
   views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
   params.bounds = gfx::Rect(0, 0, 200, 200);
-  params.context = CurrentContext();
+  params.context = GetContext();
   views::Widget* widget = new views::Widget;
   widget->Init(std::move(params));
   widget->Show();
diff --git a/ash/shell_unittest.cc b/ash/shell_unittest.cc
index b7d649fca..51396ec 100644
--- a/ash/shell_unittest.cc
+++ b/ash/shell_unittest.cc
@@ -183,7 +183,7 @@
   // TODO(jamescook): Convert to AshTestBase::CreateTestWidget().
   views::Widget* CreateTestWindow(views::Widget::InitParams params) {
     views::Widget* widget = new views::Widget;
-    params.context = CurrentContext();
+    params.context = GetContext();
     widget->Init(std::move(params));
     return widget;
   }
@@ -270,7 +270,7 @@
   // Don't specify bounds, parent or context.
   params.delegate = new WindowWithPreferredSize;
   views::Widget widget;
-  params.context = CurrentContext();
+  params.context = GetContext();
   widget.Init(std::move(params));
 
   // Widget is centered on secondary display.
@@ -400,7 +400,7 @@
 
   // Modal dialog without parent, caused crash see crbug.com/226141
   views::Widget* modal_dialog = views::DialogDelegate::CreateDialogWidget(
-      new TestModalDialogDelegate(), CurrentContext(), nullptr);
+      new TestModalDialogDelegate(), GetContext(), nullptr);
 
   modal_dialog->Show();
   EXPECT_FALSE(modal_dialog->GetNativeView()->HasFocus());
diff --git a/ash/system/message_center/arc/arc_notification_view_unittest.cc b/ash/system/message_center/arc/arc_notification_view_unittest.cc
index c18d113..69fb45c 100644
--- a/ash/system/message_center/arc/arc_notification_view_unittest.cc
+++ b/ash/system/message_center/arc/arc_notification_view_unittest.cc
@@ -89,7 +89,7 @@
 
     views::Widget::InitParams init_params(
         views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
-    init_params.context = CurrentContext();
+    init_params.context = GetContext();
     init_params.parent = Shell::GetPrimaryRootWindow()->GetChildById(
         desks_util::GetActiveDeskContainerId());
     init_params.ownership =
diff --git a/ash/system/palette/tools/create_note_action.cc b/ash/system/palette/tools/create_note_action.cc
index 73710ef..21e374d 100644
--- a/ash/system/palette/tools/create_note_action.cc
+++ b/ash/system/palette/tools/create_note_action.cc
@@ -10,6 +10,7 @@
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/system/palette/palette_ids.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/events/event.h"
 
 namespace ash {
 namespace {
@@ -22,9 +23,13 @@
 }  // namespace
 
 CreateNoteAction::CreateNoteAction(Delegate* delegate)
-    : CommonPaletteTool(delegate) {}
+    : CommonPaletteTool(delegate) {
+  Shell::Get()->AddPreTargetHandler(this);
+}
 
-CreateNoteAction::~CreateNoteAction() = default;
+CreateNoteAction::~CreateNoteAction() {
+  Shell::Get()->RemovePreTargetHandler(this);
+}
 
 PaletteGroup CreateNoteAction::GetGroup() const {
   return PaletteGroup::ACTION;
@@ -57,4 +62,21 @@
   return kPaletteActionCreateNoteIcon;
 }
 
+void CreateNoteAction::OnKeyEvent(ui::KeyEvent* event) {
+  // Listen for events generated by a bluetooth button on the tail of a stylus.
+  // This is different from a regular stylus button on a barrel. Regular barrel
+  // buttons require proximity to the screen and add a flag to the touch event,
+  // rather than generating a key event.
+  //
+  // The only events with the EF_IS_STYLUS_BUTTON flags will be generated by
+  // special bluetooth buttons.
+  if (!(event->flags() & ui::EF_IS_STYLUS_BUTTON))
+    return;
+  if (event->type() == ui::ET_KEY_PRESSED)
+    OnEnable();
+
+  // This event shouldn't be handled as a regular key event, so consume it.
+  event->StopPropagation();
+}
+
 }  // namespace ash
diff --git a/ash/system/palette/tools/create_note_action.h b/ash/system/palette/tools/create_note_action.h
index 2b4e564..7449fac 100644
--- a/ash/system/palette/tools/create_note_action.h
+++ b/ash/system/palette/tools/create_note_action.h
@@ -8,12 +8,14 @@
 #include "ash/ash_export.h"
 #include "ash/system/palette/common_palette_tool.h"
 #include "base/macros.h"
+#include "ui/events/event_handler.h"
 
 namespace ash {
 
 // A button in the ash palette that launches the selected note-taking app when
 // clicked. This action dynamically hides itself if it is not available.
-class ASH_EXPORT CreateNoteAction : public CommonPaletteTool {
+class ASH_EXPORT CreateNoteAction : public CommonPaletteTool,
+                                    public ui::EventHandler {
  public:
   explicit CreateNoteAction(Delegate* delegate);
   ~CreateNoteAction() override;
@@ -28,6 +30,9 @@
   // CommonPaletteTool overrides.
   const gfx::VectorIcon& GetPaletteIcon() const override;
 
+  // ui::EventHandler overrides.
+  void OnKeyEvent(ui::KeyEvent* event) override;
+
   DISALLOW_COPY_AND_ASSIGN(CreateNoteAction);
 };
 
diff --git a/ash/system/palette/tools/create_note_unittest.cc b/ash/system/palette/tools/create_note_unittest.cc
index e2982b62..cd2e318 100644
--- a/ash/system/palette/tools/create_note_unittest.cc
+++ b/ash/system/palette/tools/create_note_unittest.cc
@@ -53,6 +53,13 @@
     tool_ = std::make_unique<CreateNoteAction>(palette_tool_delegate_.get());
   }
 
+  void TearDown() override {
+    // This needs to be called first to remove the event handler before the
+    // shell instance gets torn down.
+    tool_.reset();
+    AshTestBase::TearDown();
+  }
+
  protected:
   std::unique_ptr<MockPaletteToolDelegate> palette_tool_delegate_;
   std::unique_ptr<PaletteTool> tool_;
@@ -123,4 +130,16 @@
   tool_->OnEnable();
 }
 
+TEST_F(CreateNoteTest, ToolIsEnabledWhenStylusButtonIsPressed) {
+  auto note_taking_client = std::make_unique<TestNoteTakingControllerClient>();
+  std::unique_ptr<views::View> view = base::WrapUnique(tool_->CreateView());
+
+  // Send a stylus button event.
+  ui::test::EventGenerator* generator = GetEventGenerator();
+  generator->PressKey(ui::VKEY_F19, ui::EF_IS_STYLUS_BUTTON);
+  generator->ReleaseKey(ui::VKEY_F19, ui::EF_IS_STYLUS_BUTTON);
+
+  EXPECT_EQ(1, note_taking_client->GetCreateNoteCount());
+}
+
 }  // namespace ash
diff --git a/ash/test/ash_test_base.cc b/ash/test/ash_test_base.cc
index c88354d..1527293 100644
--- a/ash/test/ash_test_base.cc
+++ b/ash/test/ash_test_base.cc
@@ -230,8 +230,8 @@
       .UpdateNaturalOrientation();
 }
 
-aura::Window* AshTestBase::CurrentContext() {
-  return ash_test_helper_.CurrentContext();
+aura::Window* AshTestBase::GetContext() {
+  return ash_test_helper_.GetContext();
 }
 
 // static
diff --git a/ash/test/ash_test_base.h b/ash/test/ash_test_base.h
index 4faae64d..39b07b2 100644
--- a/ash/test/ash_test_base.h
+++ b/ash/test/ash_test_base.h
@@ -113,7 +113,7 @@
   // Returns a root Window. Usually this is the active root Window, but that
   // method can return NULL sometimes, and in those cases, we fall back on the
   // primary root Window.
-  aura::Window* CurrentContext();
+  aura::Window* GetContext();
 
   // Creates and shows a widget. See ash/public/cpp/shell_window_ids.h for
   // values for |container_id|.
diff --git a/ash/test/ash_test_helper.cc b/ash/test/ash_test_helper.cc
index 09dc1d9..54c8492 100644
--- a/ash/test/ash_test_helper.cc
+++ b/ash/test/ash_test_helper.cc
@@ -286,7 +286,7 @@
   return Shell::Get()->local_state_;
 }
 
-aura::Window* AshTestHelper::CurrentContext() {
+aura::Window* AshTestHelper::GetContext() {
   aura::Window* root_window = Shell::GetRootWindowForNewWindows();
   if (!root_window)
     root_window = Shell::GetPrimaryRootWindow();
diff --git a/ash/test/ash_test_helper.h b/ash/test/ash_test_helper.h
index d5cd38a..3cb5128 100644
--- a/ash/test/ash_test_helper.h
+++ b/ash/test/ash_test_helper.h
@@ -76,6 +76,7 @@
 
   struct InitParams {
     // True if the user should log in.
+    InitParams() {}  // Work around https://bugs.llvm.org/show_bug.cgi?id=15886.
     bool start_session = true;
     PrefService* local_state = nullptr;
     ConfigType config_type = kUnitTest;
@@ -84,7 +85,7 @@
   // Creates the ash::Shell and performs associated initialization according
   // to |init_params|. |shell_init_params| is used to initialize ash::Shell,
   // or it uses test settings if omitted.
-  void SetUp(const InitParams& init_params,
+  void SetUp(const InitParams& init_params = InitParams(),
              base::Optional<ShellInitParams> shell_init_params = base::nullopt);
 
   // Destroys the ash::Shell and performs associated cleanup.
@@ -93,7 +94,7 @@
   // Returns a root Window. Usually this is the active root Window, but that
   // method can return NULL sometimes, and in those cases, we fall back on the
   // primary root Window.
-  aura::Window* CurrentContext();
+  aura::Window* GetContext();
 
   PrefService* GetLocalStatePrefService();
 
diff --git a/ash/test/ash_test_helper_unittest.cc b/ash/test/ash_test_helper_unittest.cc
index 8e265e42..4b4d6d4 100644
--- a/ash/test/ash_test_helper_unittest.cc
+++ b/ash/test/ash_test_helper_unittest.cc
@@ -21,8 +21,7 @@
   void SetUp() override {
     testing::Test::SetUp();
     ash_test_helper_ = std::make_unique<AshTestHelper>();
-    AshTestHelper::InitParams init_params;
-    ash_test_helper_->SetUp(std::move(init_params));
+    ash_test_helper_->SetUp();
   }
 
   void TearDown() override {
@@ -45,14 +44,14 @@
 TEST_F(AshTestHelperTest, AshTestHelper) {
   // Check initial state.
   EXPECT_TRUE(ash_test_helper()->test_shell_delegate());
-  EXPECT_TRUE(ash_test_helper()->CurrentContext());
+  EXPECT_TRUE(ash_test_helper()->GetContext());
 
   // Enough state is initialized to create a window.
   using views::Widget;
   std::unique_ptr<Widget> w1(new Widget);
   Widget::InitParams params;
   params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
-  params.context = ash_test_helper()->CurrentContext();
+  params.context = ash_test_helper()->GetContext();
   w1->Init(std::move(params));
   w1->Show();
   EXPECT_TRUE(w1->IsActive());
diff --git a/ash/wm/ash_focus_rules_unittest.cc b/ash/wm/ash_focus_rules_unittest.cc
index ae58a06..df6b738 100644
--- a/ash/wm/ash_focus_rules_unittest.cc
+++ b/ash/wm/ash_focus_rules_unittest.cc
@@ -213,7 +213,7 @@
   BlockUserSession(BLOCKED_BY_LOCK_SCREEN);
   EXPECT_TRUE(Shell::Get()->session_controller()->IsScreenLocked());
 
-  views::test::TestInitialFocusWidgetDelegate delegate(CurrentContext());
+  views::test::TestInitialFocusWidgetDelegate delegate(GetContext());
   EXPECT_FALSE(delegate.view()->HasFocus());
   delegate.GetWidget()->Show();
   EXPECT_FALSE(delegate.GetWidget()->IsActive());
diff --git a/ash/wm/immersive_fullscreen_controller_unittest.cc b/ash/wm/immersive_fullscreen_controller_unittest.cc
index 25d98e9..84cb8aca 100644
--- a/ash/wm/immersive_fullscreen_controller_unittest.cc
+++ b/ash/wm/immersive_fullscreen_controller_unittest.cc
@@ -179,7 +179,7 @@
     widget_ = new views::Widget();
     views::Widget::InitParams params;
     params.delegate = new TestWidgetDelegate();
-    params.context = CurrentContext();
+    params.context = GetContext();
     widget_->Init(std::move(params));
     widget_->Show();
 
@@ -485,7 +485,7 @@
 TEST_F(ImmersiveFullscreenControllerTest, Inactive) {
   // Set up initial state.
   views::Widget* popup_widget = views::Widget::CreateWindowWithContext(
-      nullptr, CurrentContext(), gfx::Rect(0, 0, 200, 200));
+      nullptr, GetContext(), gfx::Rect(0, 0, 200, 200));
   popup_widget->Show();
   ASSERT_FALSE(top_container()->GetWidget()->IsActive());
 
@@ -609,7 +609,7 @@
   // Test that it is possible to reveal the top-of-window views by overshooting
   // the top edge slightly when the top container's widget is not active.
   views::Widget* popup_widget = views::Widget::CreateWindowWithContext(
-      nullptr, CurrentContext(), gfx::Rect(0, 200, 100, 100));
+      nullptr, GetContext(), gfx::Rect(0, 200, 100, 100));
   popup_widget->Show();
   ASSERT_FALSE(top_container()->GetWidget()->IsActive());
   ASSERT_FALSE(top_container()->GetBoundsInScreen().Intersects(
@@ -953,7 +953,7 @@
       views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
   non_transient_params.bounds = gfx::Rect(0, 100, 100, 100);
   std::unique_ptr<views::Widget> non_transient_widget(new views::Widget());
-  non_transient_params.context = CurrentContext();
+  non_transient_params.context = GetContext();
   non_transient_widget->Init(std::move(non_transient_params));
 
   EXPECT_FALSE(controller()->IsRevealed());
diff --git a/ash/wm/lock_layout_manager_unittest.cc b/ash/wm/lock_layout_manager_unittest.cc
index fd15d51..65cde649 100644
--- a/ash/wm/lock_layout_manager_unittest.cc
+++ b/ash/wm/lock_layout_manager_unittest.cc
@@ -70,7 +70,7 @@
     views::Widget* widget = new views::Widget;
     if (use_delegate)
       params.delegate = new LoginTestWidgetDelegate(widget);
-    params.context = CurrentContext();
+    params.context = GetContext();
     widget->Init(std::move(params));
     widget->Show();
     aura::Window* window = widget->GetNativeView();
diff --git a/ash/wm/overview/cleanup_animation_observer_unittest.cc b/ash/wm/overview/cleanup_animation_observer_unittest.cc
index bd548036..9d78c40e4 100644
--- a/ash/wm/overview/cleanup_animation_observer_unittest.cc
+++ b/ash/wm/overview/cleanup_animation_observer_unittest.cc
@@ -73,7 +73,7 @@
     params.bounds = bounds;
     params.type = views::Widget::InitParams::TYPE_WINDOW;
     params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
-    params.context = CurrentContext();
+    params.context = GetContext();
     widget->Init(std::move(params));
     widget->Show();
     widget->AddObserver(this);
diff --git a/ash/wm/overview/drop_target_view.cc b/ash/wm/overview/drop_target_view.cc
index a3b9af049..09f1105 100644
--- a/ash/wm/overview/drop_target_view.cc
+++ b/ash/wm/overview/drop_target_view.cc
@@ -8,6 +8,7 @@
 
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/wm/overview/overview_constants.h"
+#include "ash/wm/overview/rounded_rect_view.h"
 #include "ui/gfx/paint_vector_icon.h"
 #include "ui/views/border.h"
 #include "ui/views/controls/image_view.h"
@@ -17,10 +18,9 @@
 namespace {
 
 constexpr SkColor kDropTargetBackgroundColor =
-    SkColorSetARGB(0xFF, 0xFF, 0XFF, 0XFF);
+    SkColorSetARGB(0x24, 0xFF, 0XFF, 0XFF);
 constexpr SkColor kDropTargetBorderColor =
     SkColorSetARGB(0x4C, 0xE8, 0XEA, 0XED);
-constexpr float kDropTargetBackgroundOpacity = 0.14f;
 constexpr int kDropTargetBorderThickness = 2;
 constexpr int kDropTargetMiddleSize = 96;
 
@@ -40,22 +40,16 @@
     SetVerticalAlignment(views::ImageView::Alignment::kCenter);
     SetHorizontalAlignment(views::ImageView::Alignment::kCenter);
   }
+  PlusIconView(const PlusIconView&) = delete;
+  PlusIconView& operator=(const PlusIconView&) = delete;
   ~PlusIconView() override = default;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(PlusIconView);
 };
 
 DropTargetView::DropTargetView(bool has_plus_icon) {
-  background_view_ = AddChildView(std::make_unique<views::View>());
-  background_view_->SetPaintToLayer(ui::LAYER_SOLID_COLOR);
-  background_view_->layer()->SetColor(kDropTargetBackgroundColor);
-  background_view_->layer()->SetOpacity(kDropTargetBackgroundOpacity);
   const int corner_radius =
       views::LayoutProvider::Get()->GetCornerRadiusMetric(views::EMPHASIS_LOW);
-  background_view_->layer()->SetRoundedCornerRadius(
-      gfx::RoundedCornersF(corner_radius));
-  background_view_->layer()->SetIsFastRoundedCorner(true);
+  background_view_ = AddChildView(std::make_unique<RoundedRectView>(
+      corner_radius, kDropTargetBackgroundColor));
 
   if (has_plus_icon)
     plus_icon_ = AddChildView(std::make_unique<PlusIconView>());
diff --git a/ash/wm/overview/drop_target_view.h b/ash/wm/overview/drop_target_view.h
index 7babc8f..7a9b5b1 100644
--- a/ash/wm/overview/drop_target_view.h
+++ b/ash/wm/overview/drop_target_view.h
@@ -5,10 +5,10 @@
 #ifndef ASH_WM_OVERVIEW_DROP_TARGET_VIEW_H_
 #define ASH_WM_OVERVIEW_DROP_TARGET_VIEW_H_
 
-#include "base/macros.h"
 #include "ui/views/view.h"
 
 namespace ash {
+class RoundedRectView;
 
 // DropTargetView represents a transparent view with border in overview. It
 // includes a background view and plus icon. Dragged window in tablet mode can
@@ -16,6 +16,8 @@
 class DropTargetView : public views::View {
  public:
   explicit DropTargetView(bool has_plus_icon);
+  DropTargetView(const DropTargetView&) = delete;
+  DropTargetView& operator=(const DropTargetView&) = delete;
   ~DropTargetView() override = default;
 
   // Updates the visibility of |background_view_| since it is only shown when
@@ -28,10 +30,8 @@
  private:
   class PlusIconView;
 
-  views::View* background_view_ = nullptr;
+  RoundedRectView* background_view_ = nullptr;
   PlusIconView* plus_icon_ = nullptr;
-
-  DISALLOW_COPY_AND_ASSIGN(DropTargetView);
 };
 
 }  // namespace ash
diff --git a/ash/wm/overview/overview_session.cc b/ash/wm/overview/overview_session.cc
index 27f93db9..c8eff6a3 100644
--- a/ash/wm/overview/overview_session.cc
+++ b/ash/wm/overview/overview_session.cc
@@ -51,7 +51,6 @@
 #include "ui/events/event.h"
 #include "ui/views/widget/widget.h"
 #include "ui/wm/core/coordinate_conversion.h"
-#include "ui/wm/core/window_util.h"
 
 namespace ash {
 
@@ -894,42 +893,6 @@
   RefreshNoWindowsWidgetBounds(/*animate=*/false);
 }
 
-void OverviewSession::OnWindowHierarchyChanged(
-    const HierarchyChangeParams& params) {
-  if (ignore_window_hierarchy_changes_)
-    return;
-
-  // Only care about newly added children of |observed_windows_|.
-  if (!observed_windows_.count(params.receiver) ||
-      !observed_windows_.count(params.new_parent)) {
-    return;
-  }
-
-  // Removing a desk while in overview mode results in reparenting the windows
-  // of that desk to the associated container of another desk. This is a window
-  // hierarchy change that shouldn't result in exiting overview mode.
-  if (DesksController::Get()->AreDesksBeingModified())
-    return;
-
-  aura::Window* new_window = params.target;
-  WindowState* state = WindowState::Get(new_window);
-  if (!state->IsUserPositionable() || state->IsPip())
-    return;
-
-  // If the new window is added when splitscreen is active, do nothing.
-  // SplitViewController will do the right thing to snap the window or end
-  // overview mode.
-  if (SplitViewController::Get(new_window)->InSplitViewMode())
-    return;
-
-  if (IsSwitchableContainer(new_window->parent()) &&
-      !::wm::GetTransientParent(new_window)) {
-    // The new window is in one of the switchable containers, abort overview.
-    EndOverview();
-    return;
-  }
-}
-
 void OverviewSession::OnWindowDestroying(aura::Window* window) {
   Shell::Get()
       ->accessibility_controller()
diff --git a/ash/wm/overview/overview_session.h b/ash/wm/overview/overview_session.h
index 6d2f088..81e4f87e 100644
--- a/ash/wm/overview/overview_session.h
+++ b/ash/wm/overview/overview_session.h
@@ -326,7 +326,6 @@
                                uint32_t metrics) override;
 
   // aura::WindowObserver:
-  void OnWindowHierarchyChanged(const HierarchyChangeParams& params) override;
   void OnWindowDestroying(aura::Window* window) override;
 
   // ShelObserver:
@@ -344,11 +343,6 @@
 
   OverviewDelegate* delegate() { return delegate_; }
 
-  void set_ignore_window_hierarchy_changes(
-      bool ignore_window_hierarchy_changes) {
-    ignore_window_hierarchy_changes_ = ignore_window_hierarchy_changes;
-  }
-
   bool is_shutting_down() const { return is_shutting_down_; }
   void set_is_shutting_down(bool is_shutting_down) {
     is_shutting_down_ = is_shutting_down;
@@ -431,10 +425,6 @@
   // initially true until this is initialized.
   bool ignore_activations_ = true;
 
-  // True when performing operations that may cause window hierarchy changes.
-  // Used to prevent handling the resulting expected window hierarchy change.
-  bool ignore_window_hierarchy_changes_ = false;
-
   // True when overview mode is exiting.
   bool is_shutting_down_ = false;
 
diff --git a/ash/wm/overview/overview_window_drag_controller.cc b/ash/wm/overview/overview_window_drag_controller.cc
index 44c46e7..f8a38f23 100644
--- a/ash/wm/overview/overview_window_drag_controller.cc
+++ b/ash/wm/overview/overview_window_drag_controller.cc
@@ -29,6 +29,7 @@
 #include "ash/wm/window_util.h"
 #include "base/numerics/ranges.h"
 #include "ui/aura/window.h"
+#include "ui/aura/window_observer.h"
 #include "ui/display/display.h"
 #include "ui/wm/core/coordinate_conversion.h"
 
@@ -125,6 +126,65 @@
   DISALLOW_COPY_AND_ASSIGN(AtScopeExitRunner);
 };
 
+// Helps with handling the workflow where you drag an overview item from one
+// grid and drop into another grid. The challenge is that if the item represents
+// an ARC window, that window will be moved to the target root asynchronously.
+// |OverviewItemMoveHelper| observes the window until it moves to the target
+// root. Then |OverviewItemMoveHelper| self destructs and adds a new item to
+// represent the window on the target root.
+class OverviewItemMoveHelper : public aura::WindowObserver {
+ public:
+  // |target_item_bounds| is the bounds of the dragged overview item when the
+  // drag ends. |target_item_bounds| is used to put the new item where the old
+  // item ended, so it looks like it is the same item. Then the item is animated
+  // from there to its proper position in the grid.
+  OverviewItemMoveHelper(aura::Window* window,
+                         const gfx::RectF& target_item_bounds)
+      : window_(window), target_item_bounds_(target_item_bounds) {
+    window->AddObserver(this);
+  }
+  OverviewItemMoveHelper(const OverviewItemMoveHelper&) = delete;
+  OverviewItemMoveHelper& operator=(const OverviewItemMoveHelper&) = delete;
+  ~OverviewItemMoveHelper() override {
+    OverviewController* overview_controller =
+        Shell::Get()->overview_controller();
+    if (overview_controller->InOverviewSession()) {
+      overview_controller->overview_session()->PositionWindows(
+          /*animate=*/true);
+    }
+  }
+
+  // aura::WindowObserver:
+  void OnWindowDestroyed(aura::Window* window) override {
+    DCHECK_EQ(window_, window);
+    delete this;
+  }
+  void OnWindowAddedToRootWindow(aura::Window* window) override {
+    DCHECK_EQ(window_, window);
+    window->RemoveObserver(this);
+    OverviewController* overview_controller =
+        Shell::Get()->overview_controller();
+    if (overview_controller->InOverviewSession()) {
+      OverviewGrid* target_grid =
+          overview_controller->overview_session()->GetGridWithRootWindow(
+              window->GetRootWindow());
+      // Add |window| to |target_grid| with reposition=false and restack=false,
+      // because soon we will handle both repositioning and restacking anyway.
+      target_grid->AddItemInMruOrder(window, /*reposition=*/false,
+                                     /*animate=*/false, /*restack=*/false);
+      OverviewItem* item = target_grid->GetOverviewItemContaining(window);
+      item->SetBounds(target_item_bounds_, OVERVIEW_ANIMATION_NONE);
+      item->set_should_restack_on_animation_end(true);
+      // The destructor will call |OverviewSession::PositionWindows|.
+    }
+    delete this;
+  }
+
+ private:
+  aura::Window* const window_;
+  const gfx::RectF target_item_bounds_;
+};
+
 }  // namespace
 
 OverviewWindowDragController::OverviewWindowDragController(
@@ -581,36 +641,25 @@
       target_root != item_->root_window()) {
     // Get the window and bounds from |item_| before removing it from its grid.
     aura::Window* window = item_->GetWindow();
-    const gfx::RectF bounds = item_->target_bounds();
-    // Remove |item_| from its grid, with reposition=false because soon we will
-    // call |OverviewSession::PositionWindows| anyway.
+    const gfx::RectF target_item_bounds = item_->target_bounds();
+    // Remove |item_| from its grid. Leave the repositioning to the
+    // |OverviewItemMoveHelper|.
     item_->overview_grid()->RemoveItem(item_, /*item_destroying=*/false,
                                        /*reposition=*/false);
     item_ = nullptr;
-    // Use |OverviewSession::set_ignore_window_hierarchy_changes| to prevent
-    // |OverviewSession::OnWindowHierarchyChanged| from ending overview as we
-    // move |window| to |target_root|.
-    overview_session_->set_ignore_window_hierarchy_changes(true);
+    // The |OverviewItemMoveHelper| will self destruct when we move |window| to
+    // |target_root|.
+    new OverviewItemMoveHelper(window, target_item_bounds);
+    // Move |window| to |target_root|. The |OverviewItemMoveHelper| will take
+    // care of the rest.
     window_util::MoveWindowToDisplay(window,
                                      display::Screen::GetScreen()
                                          ->GetDisplayNearestWindow(target_root)
                                          .id());
-    overview_session_->set_ignore_window_hierarchy_changes(false);
-
-    OverviewGrid* target_grid =
-        overview_session_->GetGridWithRootWindow(target_root);
-    // Add |window| to |target_grid| with reposition=false and restack=false,
-    // because soon we will handle both repositioning and restacking anyway.
-    target_grid->AddItemInMruOrder(window, /*reposition=*/false,
-                                   /*animate=*/false, /*restack=*/false);
-    item_ = target_grid->GetOverviewItemContaining(window);
-    // Put the new item where the old item ended, so it looks like it is the
-    // same item. The following call to |OverviewSession::PositionWindows| will
-    // animate it from there.
-    item_->SetBounds(bounds, OVERVIEW_ANIMATION_NONE);
+  } else {
+    item_->set_should_restack_on_animation_end(true);
+    overview_session_->PositionWindows(/*animate=*/true);
   }
-  item_->set_should_restack_on_animation_end(true);
-  overview_session_->PositionWindows(/*animate=*/true);
   return DragResult::kDropIntoOverview;
 }
 
diff --git a/ash/wm/overview/rounded_rect_view.cc b/ash/wm/overview/rounded_rect_view.cc
index 60950b9..f40dd07b 100644
--- a/ash/wm/overview/rounded_rect_view.cc
+++ b/ash/wm/overview/rounded_rect_view.cc
@@ -5,7 +5,6 @@
 #include "ash/wm/overview/rounded_rect_view.h"
 
 #include "ui/gfx/canvas.h"
-#include "ui/gfx/skia_util.h"
 
 namespace ash {
 
@@ -14,28 +13,6 @@
 
 RoundedRectView::~RoundedRectView() = default;
 
-void RoundedRectView::OnPaint(gfx::Canvas* canvas) {
-  views::View::OnPaint(canvas);
-
-  SkScalar radius = SkIntToScalar(corner_radius_);
-  const SkScalar kRadius[8] = {radius, radius, radius, radius,
-                               radius, radius, radius, radius};
-  SkPath path;
-  gfx::Rect bounds(size());
-  path.addRoundRect(gfx::RectToSkRect(bounds), kRadius);
-
-  canvas->ClipPath(path, true);
-  canvas->DrawColor(background_color_);
-}
-
-void RoundedRectView::SetBackgroundColor(SkColor background_color) {
-  if (background_color_ == background_color)
-    return;
-
-  background_color_ = background_color;
-  SchedulePaint();
-}
-
 void RoundedRectView::SetCornerRadius(int radius) {
   if (corner_radius_ == radius)
     return;
@@ -44,4 +21,16 @@
   SchedulePaint();
 }
 
+void RoundedRectView::OnPaint(gfx::Canvas* canvas) {
+  views::View::OnPaint(canvas);
+
+  cc::PaintFlags flags;
+  flags.setStyle(cc::PaintFlags::kFill_Style);
+  flags.setColor(background_color_);
+  flags.setAntiAlias(true);
+
+  gfx::RectF bounds(GetLocalBounds());
+  canvas->DrawRoundRect(bounds, corner_radius_, flags);
+}
+
 }  // namespace ash
diff --git a/ash/wm/overview/rounded_rect_view.h b/ash/wm/overview/rounded_rect_view.h
index e455e03..e9397fdf 100644
--- a/ash/wm/overview/rounded_rect_view.h
+++ b/ash/wm/overview/rounded_rect_view.h
@@ -15,14 +15,13 @@
 
 // A View having rounded corners and a specified background color which is
 // only painted within the bounds defined by the rounded corners.
-// TODO(varkha): This duplicates code from RoundedImageView. Refactor these
-// classes and move into ui/views.
 class RoundedRectView : public views::View {
  public:
   RoundedRectView(int corner_radius, SkColor background_color);
+  RoundedRectView(const RoundedRectView&) = delete;
+  RoundedRectView& operator=(const RoundedRectView&) = delete;
   ~RoundedRectView() override;
 
-  void SetBackgroundColor(SkColor background_color);
   void SetCornerRadius(int radius);
 
   // views::View:
@@ -30,9 +29,7 @@
 
  private:
   int corner_radius_;
-  SkColor background_color_;
-
-  DISALLOW_COPY_AND_ASSIGN(RoundedRectView);
+  const SkColor background_color_;
 };
 
 }  // namespace ash
diff --git a/ash/wm/resize_shadow_and_cursor_unittest.cc b/ash/wm/resize_shadow_and_cursor_unittest.cc
index 90eb79c..f4776b45 100644
--- a/ash/wm/resize_shadow_and_cursor_unittest.cc
+++ b/ash/wm/resize_shadow_and_cursor_unittest.cc
@@ -56,7 +56,7 @@
     AshTestBase::SetUp();
 
     views::Widget* widget = views::Widget::CreateWindowWithContext(
-        new TestWidgetDelegate(), CurrentContext(), gfx::Rect(0, 0, 200, 100));
+        new TestWidgetDelegate(), GetContext(), gfx::Rect(0, 0, 200, 100));
     widget->Show();
     window_ = widget->GetNativeView();
 
diff --git a/ash/wm/splitview/split_view_controller.cc b/ash/wm/splitview/split_view_controller.cc
index 735850f..fc460b89 100644
--- a/ash/wm/splitview/split_view_controller.cc
+++ b/ash/wm/splitview/split_view_controller.cc
@@ -384,17 +384,10 @@
   // will run into problems because |window| will be on the wrong overview grid.
   RemoveSnappingWindowFromOverviewIfApplicable(overview_session, window);
   if (root_window_ != window->GetRootWindow()) {
-    // Use |OverviewSession::set_ignore_window_hierarchy_changes| to prevent
-    // |OverviewSession::OnWindowHierarchyChanged| from ending overview as we
-    // move |window| to |root_window_|.
-    if (overview_session)
-      overview_session->set_ignore_window_hierarchy_changes(true);
     window_util::MoveWindowToDisplay(window,
                                      display::Screen::GetScreen()
                                          ->GetDisplayNearestWindow(root_window_)
                                          .id());
-    if (overview_session)
-      overview_session->set_ignore_window_hierarchy_changes(false);
   }
 
   bool do_divider_spawn_animation = false;
diff --git a/ash/wm/splitview/split_view_controller_unittest.cc b/ash/wm/splitview/split_view_controller_unittest.cc
index 1c271e00..273737f 100644
--- a/ash/wm/splitview/split_view_controller_unittest.cc
+++ b/ash/wm/splitview/split_view_controller_unittest.cc
@@ -4538,7 +4538,7 @@
         std::make_unique<TestWindowDelegateWithWidget>(can_resize);
     widget_delegate->set_widget(widget);
     params.delegate = widget_delegate.release();
-    params.context = CurrentContext();
+    params.context = GetContext();
     widget->Init(std::move(params));
     widget->Show();
     return base::WrapUnique<aura::Window>(widget->GetNativeView());
diff --git a/ash/wm/system_gesture_event_filter_unittest.cc b/ash/wm/system_gesture_event_filter_unittest.cc
index 9d054dc6..43a1b295 100644
--- a/ash/wm/system_gesture_event_filter_unittest.cc
+++ b/ash/wm/system_gesture_event_filter_unittest.cc
@@ -290,7 +290,7 @@
        TwoFingerAttemptResizeLeftAndRightEdgesSimultaneously) {
   gfx::Rect initial_bounds(0, 0, 400, 400);
   views::Widget* toplevel = views::Widget::CreateWindowWithContext(
-      new ResizableWidgetDelegate, CurrentContext(), initial_bounds);
+      new ResizableWidgetDelegate, GetContext(), initial_bounds);
   toplevel->Show();
 
   const int kSteps = 15;
diff --git a/ash/wm/system_modal_container_layout_manager_unittest.cc b/ash/wm/system_modal_container_layout_manager_unittest.cc
index 0e04ca6..fb21b5f 100644
--- a/ash/wm/system_modal_container_layout_manager_unittest.cc
+++ b/ash/wm/system_modal_container_layout_manager_unittest.cc
@@ -155,7 +155,7 @@
 
   aura::Window* ShowToplevelTestWindow(bool modal) {
     views::Widget* widget = views::Widget::CreateWindowWithContext(
-        new TestWindow(modal), CurrentContext());
+        new TestWindow(modal), GetContext());
     widget->Show();
     return widget->GetNativeView();
   }
@@ -318,7 +318,7 @@
   // Create a normal window and attempt to receive a click event.
   EventTestWindow* main_delegate = new EventTestWindow(false);
   std::unique_ptr<aura::Window> main(
-      main_delegate->ShowTestWindowWithContext(CurrentContext()));
+      main_delegate->ShowTestWindowWithContext(GetContext()));
   EXPECT_TRUE(wm::IsActiveWindow(main.get()));
   ui::test::EventGenerator e1(Shell::GetPrimaryRootWindow(), main.get());
   e1.ClickLeftButton();
@@ -412,7 +412,7 @@
   // Create a normal window and attempt to receive a click event.
   EventTestWindow* main_delegate = new EventTestWindow(false);
   std::unique_ptr<aura::Window> main(
-      main_delegate->ShowTestWindowWithContext(CurrentContext()));
+      main_delegate->ShowTestWindowWithContext(GetContext()));
   ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), main.get());
 
   // A window for status area to test if it could receive an event
@@ -452,7 +452,7 @@
   // Create a normal window and attempt to receive a click event.
   EventTestWindow* main_delegate = new EventTestWindow(false);
   std::unique_ptr<aura::Window> main(
-      main_delegate->ShowTestWindowWithContext(CurrentContext()));
+      main_delegate->ShowTestWindowWithContext(GetContext()));
   EXPECT_TRUE(wm::IsActiveWindow(main.get()));
   ui::test::EventGenerator e1(Shell::GetPrimaryRootWindow(), main.get());
   e1.ClickLeftButton();
@@ -826,8 +826,7 @@
 TEST_F(SystemModalContainerLayoutManagerTest, VisibilityChange) {
   std::unique_ptr<aura::Window> window(ShowToplevelTestWindow(false));
   std::unique_ptr<aura::Window> modal_window(
-      views::Widget::CreateWindowWithContext(new TestWindow(true),
-                                             CurrentContext())
+      views::Widget::CreateWindowWithContext(new TestWindow(true), GetContext())
           ->GetNativeWindow());
   SystemModalContainerLayoutManager* layout_manager =
       Shell::GetPrimaryRootWindowController()->GetSystemModalLayoutManager(
diff --git a/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc b/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc
index 95bf9e4..d44f375 100644
--- a/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc
+++ b/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc
@@ -122,8 +122,8 @@
 
   // Creates a window which also has a widget.
   aura::Window* CreateWindowWithWidget(const gfx::Rect& bounds) {
-    views::Widget* widget = views::Widget::CreateWindowWithContext(
-        nullptr, CurrentContext(), bounds);
+    views::Widget* widget =
+        views::Widget::CreateWindowWithContext(nullptr, GetContext(), bounds);
     widget->Show();
     // Note: The widget will get deleted with the window.
     return widget->GetNativeWindow();
diff --git a/ash/wm/window_dimmer_unittest.cc b/ash/wm/window_dimmer_unittest.cc
index e943dd8..72750b5 100644
--- a/ash/wm/window_dimmer_unittest.cc
+++ b/ash/wm/window_dimmer_unittest.cc
@@ -16,7 +16,7 @@
 
 // Verify that a window underneath the window dimmer is not occluded.
 TEST_F(WindowDimmerTest, Occlusion) {
-  aura::Window* root_window = CurrentContext();
+  aura::Window* root_window = GetContext();
   aura::Window* bottom_window = aura::test::CreateTestWindow(
       SK_ColorWHITE, 1, root_window->bounds(), root_window);
   bottom_window->TrackOcclusionState();
diff --git a/ash/wm/window_modality_controller_unittest.cc b/ash/wm/window_modality_controller_unittest.cc
index a3f9b57..f827a610 100644
--- a/ash/wm/window_modality_controller_unittest.cc
+++ b/ash/wm/window_modality_controller_unittest.cc
@@ -543,7 +543,7 @@
 //   the |modal_child| window.
 // - Focus should follow the active window.
 TEST_F(WindowModalityControllerTest, ChildModal) {
-  TestChildModalParent* delegate = TestChildModalParent::Show(CurrentContext());
+  TestChildModalParent* delegate = TestChildModalParent::Show(GetContext());
   aura::Window* top_level = delegate->GetWidget()->GetNativeView();
   EXPECT_TRUE(wm::IsActiveWindow(top_level));
 
@@ -596,7 +596,7 @@
 // Same as |ChildModal| test, but using |EventGenerator| rather than bypassing
 // it by calling |ActivateWindow|.
 TEST_F(WindowModalityControllerTest, ChildModalEventGenerator) {
-  TestChildModalParent* delegate = TestChildModalParent::Show(CurrentContext());
+  TestChildModalParent* delegate = TestChildModalParent::Show(GetContext());
   aura::Window* top_level = delegate->GetWidget()->GetNativeView();
   EXPECT_TRUE(wm::IsActiveWindow(top_level));
 
diff --git a/ash/wm/workspace/multi_window_resize_controller_unittest.cc b/ash/wm/workspace/multi_window_resize_controller_unittest.cc
index 03616380..cce94e2 100644
--- a/ash/wm/workspace/multi_window_resize_controller_unittest.cc
+++ b/ash/wm/workspace/multi_window_resize_controller_unittest.cc
@@ -141,7 +141,7 @@
   params1.delegate = new TestWidgetDelegate;
   params1.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
   params1.bounds = gfx::Rect(100, 200);
-  params1.context = CurrentContext();
+  params1.context = GetContext();
   w1->Init(std::move(params1));
   w1->Show();
 
@@ -150,7 +150,7 @@
   params2.delegate = new TestWidgetDelegate;
   params2.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
   params2.bounds = gfx::Rect(100, 0, 100, 100);
-  params2.context = CurrentContext();
+  params2.context = GetContext();
   w2->Init(std::move(params2));
   w2->Show();
 
@@ -159,7 +159,7 @@
   params3.delegate = new TestWidgetDelegate;
   params3.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
   params3.bounds = gfx::Rect(100, 100, 100, 100);
-  params3.context = CurrentContext();
+  params3.context = GetContext();
   w3->Init(std::move(params3));
   w3->Show();
 
diff --git a/ash/wm/workspace/workspace_layout_manager_unittest.cc b/ash/wm/workspace/workspace_layout_manager_unittest.cc
index db27ff9..e8bf42b 100644
--- a/ash/wm/workspace/workspace_layout_manager_unittest.cc
+++ b/ash/wm/workspace/workspace_layout_manager_unittest.cc
@@ -292,7 +292,7 @@
   views::Widget::InitParams params;
   params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
   params.delegate = new MaximizeDelegateView(gfx::Rect(400, 0, 130, 40));
-  params.context = CurrentContext();
+  params.context = GetContext();
   w1->Init(std::move(params));
   EXPECT_EQ(root_windows[0], w1->GetNativeWindow()->GetRootWindow());
   w1->Show();
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 65f0b56..e0833b5 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -94,7 +94,7 @@
 }
 
 if (is_fuchsia) {
-  import("//build/config/fuchsia/fidl_library.gni")
+  import("//third_party/fuchsia-sdk/sdk/build/fidl_library.gni")
 }
 
 config("base_flags") {
diff --git a/base/android/android_image_reader_compat.cc b/base/android/android_image_reader_compat.cc
index a64a38d..032aa122 100644
--- a/base/android/android_image_reader_compat.cc
+++ b/base/android/android_image_reader_compat.cc
@@ -22,6 +22,8 @@
 namespace base {
 namespace android {
 
+bool AndroidImageReader::disable_support_ = false;
+
 AndroidImageReader& AndroidImageReader::GetInstance() {
   // C++11 static local variable initialization is
   // thread-safe.
@@ -29,8 +31,12 @@
   return *instance;
 }
 
+void AndroidImageReader::DisableSupport() {
+  disable_support_ = true;
+}
+
 bool AndroidImageReader::IsSupported() {
-  return is_supported_;
+  return !disable_support_ && is_supported_;
 }
 
 AndroidImageReader::AndroidImageReader() {
diff --git a/base/android/android_image_reader_compat.h b/base/android/android_image_reader_compat.h
index 77d5458..b882188 100644
--- a/base/android/android_image_reader_compat.h
+++ b/base/android/android_image_reader_compat.h
@@ -22,6 +22,9 @@
   // Thread safe GetInstance.
   static AndroidImageReader& GetInstance();
 
+  // Disable image reader support.
+  static void DisableSupport();
+
   // Check if the image reader usage is supported. This function returns TRUE
   // if android version is >=OREO, image reader support is not disabled and all
   // the required functions are loaded.
@@ -64,6 +67,7 @@
   AndroidImageReader();
   bool LoadFunctions();
 
+  static bool disable_support_;
   bool is_supported_;
   pAImage_delete AImage_delete_;
   pAImage_deleteAsync AImage_deleteAsync_;
diff --git a/base/profiler/chrome_unwinder_android.cc b/base/profiler/chrome_unwinder_android.cc
index 995ca59..d8f27ff 100644
--- a/base/profiler/chrome_unwinder_android.cc
+++ b/base/profiler/chrome_unwinder_android.cc
@@ -4,102 +4,25 @@
 
 #include "base/profiler/chrome_unwinder_android.h"
 
-#include "base/android/library_loader/anchor_functions.h"
-#include "base/debug/elf_reader.h"
-#include "base/debug/proc_maps_linux.h"
-#include "base/no_destructor.h"
 #include "base/numerics/checked_math.h"
 #include "base/profiler/module_cache.h"
 #include "base/profiler/native_unwinder.h"
-#include "base/profiler/profile_builder.h"
 #include "build/build_config.h"
 
-extern "C" {
-// The address of |__executable_start| gives the start address of the
-// executable or shared library. This value is used to find the offset address
-// of the instruction in binary from PC.
-extern char __executable_start;
-}
-
 namespace base {
 
-namespace {
-
-const std::string& GetChromeModuleId() {
-  static const base::NoDestructor<std::string> build_id([] {
-#if defined(OFFICIAL_BUILD)
-    base::debug::ElfBuildIdBuffer build_id;
-    size_t build_id_length =
-        base::debug::ReadElfBuildId(&__executable_start, true, build_id);
-    DCHECK_GT(build_id_length, 0u);
-    // Append 0 for the age value.
-    return std::string(build_id, build_id_length) + "0";
-#else
-    // Local chromium builds don't have an ELF build-id note. A synthetic
-    // build id is provided. https://crbug.com/870919
-    return std::string("CCCCCCCCDB511330464892F0B600B4D60");
-#endif
-  }());
-  return *build_id;
-}
-
-StringPiece GetChromeLibraryName() {
-  static const StringPiece library_name([] {
-    Optional<StringPiece> library_name =
-        base::debug::ReadElfLibraryName(&__executable_start);
-    DCHECK(library_name);
-    return *library_name;
-  }());
-  return library_name;
-}
-
-class ChromeModule : public ModuleCache::Module {
- public:
-  ChromeModule() : build_id_(GetChromeModuleId()) {}
-  ~ChromeModule() override = default;
-
-  uintptr_t GetBaseAddress() const override {
-    return reinterpret_cast<uintptr_t>(&__executable_start);
-  }
-
-  std::string GetId() const override { return build_id_; }
-
-  FilePath GetDebugBasename() const override {
-    return FilePath(GetChromeLibraryName());
-  }
-
-  // Gets the size of the module.
-  size_t GetSize() const override {
-    return base::android::kEndOfText - GetBaseAddress();
-  }
-
-  // True if this is a native module.
-  bool IsNative() const override { return true; }
-
-  std::string build_id_;
-};
-
-}  // namespace
-
-ChromeUnwinderAndroid::ChromeUnwinderAndroid(const ArmCFITable* cfi_table)
-    : cfi_table_(cfi_table) {
+ChromeUnwinderAndroid::ChromeUnwinderAndroid(
+    const ArmCFITable* cfi_table,
+    const ModuleCache::Module* chrome_module)
+    : cfi_table_(cfi_table), chrome_module_(chrome_module) {
   DCHECK(cfi_table_);
+  DCHECK(chrome_module_);
 }
 
 ChromeUnwinderAndroid::~ChromeUnwinderAndroid() = default;
 
-void ChromeUnwinderAndroid::AddInitialModules(ModuleCache* module_cache) {
-  std::vector<std::unique_ptr<const ModuleCache::Module>> modules;
-  modules.push_back(std::make_unique<ChromeModule>());
-  chrome_module_id_ = modules.back()->GetId();
-  module_cache->UpdateNonNativeModules({}, std::move(modules));
-}
-
 bool ChromeUnwinderAndroid::CanUnwindFrom(const Frame* current_frame) const {
-  // AddNonNativeModules() should be called first.
-  DCHECK(!chrome_module_id_.empty());
-  return current_frame->module &&
-         current_frame->module->GetId() == chrome_module_id_;
+  return current_frame->module == chrome_module_;
 }
 
 UnwindResult ChromeUnwinderAndroid::TryUnwind(RegisterContext* thread_context,
@@ -109,7 +32,6 @@
   DCHECK(CanUnwindFrom(&stack->back()));
   do {
     const ModuleCache::Module* module = stack->back().module;
-
     uintptr_t pc = RegisterContextInstructionPointer(thread_context);
     DCHECK_GE(pc, module->GetBaseAddress());
     uintptr_t func_addr = pc - module->GetBaseAddress();
@@ -126,11 +48,6 @@
   return UnwindResult::UNRECOGNIZED_FRAME;
 }
 
-void ChromeUnwinderAndroid::SetExpectedChromeModuleIdForTesting(
-    const std::string& chrome_module_id) {
-  chrome_module_id_ = chrome_module_id;
-}
-
 // static
 bool ChromeUnwinderAndroid::Step(RegisterContext* thread_context,
                                  uintptr_t stack_top,
diff --git a/base/profiler/chrome_unwinder_android.h b/base/profiler/chrome_unwinder_android.h
index 80288a49..a854b2a 100644
--- a/base/profiler/chrome_unwinder_android.h
+++ b/base/profiler/chrome_unwinder_android.h
@@ -18,15 +18,13 @@
 // Chrome unwinder implementation for Android, using ArmCfiTable.
 class BASE_EXPORT ChromeUnwinderAndroid : public Unwinder {
  public:
-  ChromeUnwinderAndroid(const ArmCFITable* cfi_table);
+  ChromeUnwinderAndroid(const ArmCFITable* cfi_table,
+                        const ModuleCache::Module* chrome_module);
   ~ChromeUnwinderAndroid() override;
   ChromeUnwinderAndroid(const ChromeUnwinderAndroid&) = delete;
   ChromeUnwinderAndroid& operator=(const ChromeUnwinderAndroid&) = delete;
 
-  void SetExpectedChromeModuleIdForTesting(const std::string& chrome_module_id);
-
   // Unwinder:
-  void AddInitialModules(ModuleCache* module_cache) override;
   bool CanUnwindFrom(const Frame* current_frame) const override;
   UnwindResult TryUnwind(RegisterContext* thread_context,
                          uintptr_t stack_top,
@@ -45,7 +43,7 @@
                    const ArmCFITable::FrameEntry& entry);
 
   const ArmCFITable* cfi_table_;
-  std::string chrome_module_id_;
+  const ModuleCache::Module* const chrome_module_;
 };
 
 }  // namespace base
diff --git a/base/profiler/chrome_unwinder_android_unittest.cc b/base/profiler/chrome_unwinder_android_unittest.cc
index 6325f47..5b33fca 100644
--- a/base/profiler/chrome_unwinder_android_unittest.cc
+++ b/base/profiler/chrome_unwinder_android_unittest.cc
@@ -213,8 +213,7 @@
   auto non_chrome_module =
       std::make_unique<TestModule>(0x2000, 0x500, "OtherModule");
 
-  ChromeUnwinderAndroid unwinder(cfi_table.get());
-  unwinder.SetExpectedChromeModuleIdForTesting("ChromeModule");
+  ChromeUnwinderAndroid unwinder(cfi_table.get(), chrome_module.get());
 
   Frame chrome_frame{0x1100, chrome_module.get()};
   EXPECT_TRUE(unwinder.CanUnwindFrom(&chrome_frame));
@@ -231,8 +230,7 @@
   const ModuleCache::Module* chrome_module = AddNativeModule(
       &module_cache, std::make_unique<TestModule>(0x1000, 0x500));
 
-  ChromeUnwinderAndroid unwinder(cfi_table.get());
-  unwinder.SetExpectedChromeModuleIdForTesting(chrome_module->GetId());
+  ChromeUnwinderAndroid unwinder(cfi_table.get(), chrome_module);
 
   std::vector<uintptr_t> stack_buffer = {
       0xFFFF,
@@ -269,8 +267,7 @@
   const ModuleCache::Module* chrome_module = AddNativeModule(
       &module_cache, std::make_unique<TestModule>(0x1000, 0x500));
 
-  ChromeUnwinderAndroid unwinder(cfi_table.get());
-  unwinder.SetExpectedChromeModuleIdForTesting(chrome_module->GetId());
+  ChromeUnwinderAndroid unwinder(cfi_table.get(), chrome_module);
 
   std::vector<uintptr_t> stack_buffer = {
       0xFFFF,
@@ -301,8 +298,7 @@
   const ModuleCache::Module* chrome_module = AddNativeModule(
       &module_cache, std::make_unique<TestModule>(0x1000, 0x500));
 
-  ChromeUnwinderAndroid unwinder(cfi_table.get());
-  unwinder.SetExpectedChromeModuleIdForTesting(chrome_module->GetId());
+  ChromeUnwinderAndroid unwinder(cfi_table.get(), chrome_module);
 
   std::vector<uintptr_t> stack_buffer = {0xFFFF};
 
@@ -324,16 +320,4 @@
   EXPECT_EQ(std::vector<Frame>({{0x1200, chrome_module}}), stack);
 }
 
-TEST(ChromeUnwinderAndroidTest, AddInitialModules) {
-  auto cfi_table = ArmCFITable::Parse(
-      {reinterpret_cast<const uint8_t*>(cfi_data), sizeof(cfi_data)});
-  ChromeUnwinderAndroid unwinder(cfi_table.get());
-  ModuleCache module_cache;
-  unwinder.AddInitialModules(&module_cache);
-
-  EXPECT_NE(module_cache.GetModuleForAddress(reinterpret_cast<uintptr_t>(
-                &ChromeUnwinderAndroid::StepForTesting)),
-            nullptr);
-}
-
 }  // namespace base
diff --git a/base/profiler/stack_copier.h b/base/profiler/stack_copier.h
index a504886..b1eedcb 100644
--- a/base/profiler/stack_copier.h
+++ b/base/profiler/stack_copier.h
@@ -14,7 +14,6 @@
 namespace base {
 
 class StackBuffer;
-class ProfileBuilder;
 
 // StackCopier causes a thread to be suspended, copies its stack, and resumes
 // the thread's execution. It's intended to provide an abstraction over stack
@@ -23,17 +22,35 @@
 // is performed by the OS through signals (Android).
 class BASE_EXPORT StackCopier {
  public:
+  // Interface that may be implemented by the caller of CopyStack() to receive a
+  // callback when the stack is copied, while the target thread is suspended.
+  class BASE_EXPORT Delegate {
+   public:
+    virtual ~Delegate() {}
+
+    // Invoked at the time the stack is copied.
+    // IMPORTANT NOTE: to avoid deadlock implementations of this interface must
+    // not invoke any non-reentrant code that is also invoked by the target
+    // thread. In particular, it may not perform any heap allocation or
+    // deallocation, including indirectly via use of DCHECK/CHECK or other
+    // logging statements.
+    virtual void OnStackCopy() = 0;
+
+    // Invoked after the stack has been copied and the target thread resumed.
+    virtual void OnThreadResume() = 0;
+  };
+
   virtual ~StackCopier();
 
   // Copies the thread's register context into |thread_context|, the stack into
   // |stack_buffer|, and the top of stack address into |stack_top|. Records
-  // metadata while the thread is suspended via |profile_builder|. Records
-  // |timestamp| at the time the stack was copied. Returns true if successful.
+  // |timestamp| at the time the stack was copied. delegate->OnStackCopy() will
+  // be invoked while the thread is suspended. Returns true if successful.
   virtual bool CopyStack(StackBuffer* stack_buffer,
                          uintptr_t* stack_top,
-                         ProfileBuilder* profile_builder,
                          TimeTicks* timestamp,
-                         RegisterContext* thread_context) = 0;
+                         RegisterContext* thread_context,
+                         Delegate* delegate) = 0;
 
  protected:
   // If the value at |pointer| points to the original stack, rewrite it to point
diff --git a/base/profiler/stack_copier_signal.cc b/base/profiler/stack_copier_signal.cc
index 372038e..1b601703 100644
--- a/base/profiler/stack_copier_signal.cc
+++ b/base/profiler/stack_copier_signal.cc
@@ -11,9 +11,7 @@
 
 #include <atomic>
 
-#include "base/profiler/metadata_recorder.h"
 #include "base/profiler/register_context.h"
-#include "base/profiler/sample_metadata.h"
 #include "base/profiler/stack_buffer.h"
 #include "base/profiler/suspendable_thread_delegate.h"
 #include "base/trace_event/trace_event.h"
@@ -95,6 +93,9 @@
 
   // The timestamp when the stack was copied.
   TimeTicks* timestamp;
+
+  // The delegate provided to the StackCopier.
+  StackCopier::Delegate* stack_copier_delegate;
 };
 
 // Pointer to the parameters to be "passed" to the CopyStackSignalHandler() from
@@ -127,13 +128,13 @@
     return;
   }
 
+  params->stack_copier_delegate->OnStackCopy();
+
   *params->stack_copy_bottom =
       StackCopierSignal::CopyStackContentsAndRewritePointers(
           reinterpret_cast<uint8_t*>(bottom), reinterpret_cast<uintptr_t*>(top),
           StackBuffer::kPlatformStackAlignment, params->stack_buffer->buffer());
 
-  // TODO(https://crbug.com/988579): Record metadata while the thread is
-  // suspended.
   *params->success = true;
 }
 
@@ -186,16 +187,16 @@
 
 bool StackCopierSignal::CopyStack(StackBuffer* stack_buffer,
                                   uintptr_t* stack_top,
-                                  ProfileBuilder* profile_builder,
                                   TimeTicks* timestamp,
-                                  RegisterContext* thread_context) {
+                                  RegisterContext* thread_context,
+                                  Delegate* delegate) {
   AsyncSafeWaitableEvent wait_event;
   bool copied = false;
   const uint8_t* stack_copy_bottom = nullptr;
   const uintptr_t stack_base_address = thread_delegate_->GetStackBaseAddress();
   HandlerParams params = {stack_base_address, &wait_event,  &copied,
                           thread_context,     stack_buffer, &stack_copy_bottom,
-                          timestamp};
+                          timestamp,          delegate};
   {
     ScopedSetSignalHandlerParams scoped_handler_params(&params);
 
@@ -228,6 +229,8 @@
     }
   }
 
+  delegate->OnThreadResume();
+
   const uintptr_t bottom = RegisterContextStackPointer(params.context);
   for (uintptr_t* reg :
        thread_delegate_->GetRegistersToRewrite(thread_context)) {
diff --git a/base/profiler/stack_copier_signal.h b/base/profiler/stack_copier_signal.h
index 609eb49..c764b5b 100644
--- a/base/profiler/stack_copier_signal.h
+++ b/base/profiler/stack_copier_signal.h
@@ -24,9 +24,9 @@
   // StackCopier:
   bool CopyStack(StackBuffer* stack_buffer,
                  uintptr_t* stack_top,
-                 ProfileBuilder* profile_builder,
                  TimeTicks* timestamp,
-                 RegisterContext* thread_context) override;
+                 RegisterContext* thread_context,
+                 Delegate* delegate) override;
 
   using StackCopier::CopyStackContentsAndRewritePointers;
 
diff --git a/base/profiler/stack_copier_signal_unittest.cc b/base/profiler/stack_copier_signal_unittest.cc
index b8cb6dc..6e2953c 100644
--- a/base/profiler/stack_copier_signal_unittest.cc
+++ b/base/profiler/stack_copier_signal_unittest.cc
@@ -6,7 +6,6 @@
 #include <algorithm>
 #include <utility>
 
-#include "base/profiler/profile_builder.h"
 #include "base/profiler/sampling_profiler_thread_token.h"
 #include "base/profiler/stack_buffer.h"
 #include "base/profiler/stack_copier_signal.h"
@@ -22,27 +21,6 @@
 
 namespace {
 
-class TestProfileBuilder : public ProfileBuilder {
- public:
-  TestProfileBuilder() = default;
-
-  TestProfileBuilder(const TestProfileBuilder&) = delete;
-  TestProfileBuilder& operator=(const TestProfileBuilder&) = delete;
-
-  // ProfileBuilder
-  ModuleCache* GetModuleCache() override { return nullptr; }
-
-  void RecordMetadata(
-      base::ProfileBuilder::MetadataProvider* metadata_provider) override {}
-
-  void OnSampleCompleted(std::vector<Frame> frames,
-                         TimeTicks sample_timestamp) override {}
-  void OnProfileCompleted(TimeDelta profile_duration,
-                          TimeDelta sampling_period) override {}
-
- private:
-};
-
 // Values to write to the stack and look for in the copy.
 static const uint32_t kStackSentinels[] = {0xf312ecd9, 0x1fcd7f19, 0xe69e617d,
                                            0x8245f94f};
@@ -82,6 +60,30 @@
   SamplingProfilerThreadToken thread_token_;
 };
 
+class TestStackCopierDelegate : public StackCopier::Delegate {
+ public:
+  void OnStackCopy() override {
+    // We can't EXPECT_FALSE(on_thread_resume_was_invoked_) here because that
+    // invocation is not reentrant.
+    on_stack_copy_was_invoked_ = true;
+  }
+
+  void OnThreadResume() override {
+    EXPECT_TRUE(on_stack_copy_was_invoked_);
+    on_thread_resume_was_invoked_ = true;
+  }
+
+  bool on_stack_copy_was_invoked() const { return on_stack_copy_was_invoked_; }
+
+  bool on_thread_resume_was_invoked() const {
+    return on_thread_resume_was_invoked_;
+  }
+
+ private:
+  bool on_stack_copy_was_invoked_ = false;
+  bool on_thread_resume_was_invoked_ = false;
+};
+
 }  // namespace
 
 // ASAN moves local variables outside of the stack extents, which breaks the
@@ -101,9 +103,9 @@
   StackBuffer stack_buffer(/* buffer_size = */ 1 << 20);
   memset(stack_buffer.buffer(), 0, stack_buffer.size());
   uintptr_t stack_top = 0;
-  TestProfileBuilder profiler_builder;
   TimeTicks timestamp;
   RegisterContext context;
+  TestStackCopierDelegate stack_copier_delegate;
 
   StackCopierSignal copier(std::make_unique<ThreadDelegatePosix>(
       GetSamplingProfilerCurrentThreadToken()));
@@ -114,8 +116,8 @@
   for (size_t i = 0; i < size(kStackSentinels); ++i)
     sentinels[i] = kStackSentinels[i];
 
-  bool result = copier.CopyStack(&stack_buffer, &stack_top, &profiler_builder,
-                                 &timestamp, &context);
+  bool result = copier.CopyStack(&stack_buffer, &stack_top, &timestamp,
+                                 &context, &stack_copier_delegate);
   ASSERT_TRUE(result);
 
   uint32_t* const end = reinterpret_cast<uint32_t*>(stack_top);
@@ -138,16 +140,16 @@
   StackBuffer stack_buffer(/* buffer_size = */ 1 << 20);
   memset(stack_buffer.buffer(), 0, stack_buffer.size());
   uintptr_t stack_top = 0;
-  TestProfileBuilder profiler_builder;
   TimeTicks timestamp;
   RegisterContext context;
+  TestStackCopierDelegate stack_copier_delegate;
 
   StackCopierSignal copier(std::make_unique<ThreadDelegatePosix>(
       GetSamplingProfilerCurrentThreadToken()));
 
   TimeTicks before = TimeTicks::Now();
-  bool result = copier.CopyStack(&stack_buffer, &stack_top, &profiler_builder,
-                                 &timestamp, &context);
+  bool result = copier.CopyStack(&stack_buffer, &stack_top, &timestamp,
+                                 &context, &stack_copier_delegate);
   TimeTicks after = TimeTicks::Now();
   ASSERT_TRUE(result);
 
@@ -155,6 +157,31 @@
   EXPECT_LE(timestamp, after);
 }
 
+// TSAN hangs on the AsyncSafeWaitableEvent FUTEX_WAIT call.
+#if defined(THREAD_SANITIZER)
+#define MAYBE_CopyStackDelegateInvoked DISABLED_CopyStackDelegateInvoked
+#else
+#define MAYBE_CopyStackDelegateInvoked CopyStackDelegateInvoked
+#endif
+TEST(StackCopierSignalTest, MAYBE_CopyStackDelegateInvoked) {
+  StackBuffer stack_buffer(/* buffer_size = */ 1 << 20);
+  memset(stack_buffer.buffer(), 0, stack_buffer.size());
+  uintptr_t stack_top = 0;
+  TimeTicks timestamp;
+  RegisterContext context;
+  TestStackCopierDelegate stack_copier_delegate;
+
+  StackCopierSignal copier(std::make_unique<ThreadDelegatePosix>(
+      GetSamplingProfilerCurrentThreadToken()));
+
+  bool result = copier.CopyStack(&stack_buffer, &stack_top, &timestamp,
+                                 &context, &stack_copier_delegate);
+  ASSERT_TRUE(result);
+
+  EXPECT_TRUE(stack_copier_delegate.on_stack_copy_was_invoked());
+  EXPECT_TRUE(stack_copier_delegate.on_thread_resume_was_invoked());
+}
+
 // Limit to 32-bit Android, which is the platform we care about for this
 // functionality. The test is broken on too many other varied platforms to try
 // to selectively disable.
@@ -167,9 +194,9 @@
   StackBuffer stack_buffer(/* buffer_size = */ 1 << 20);
   memset(stack_buffer.buffer(), 0, stack_buffer.size());
   uintptr_t stack_top = 0;
-  TestProfileBuilder profiler_builder;
   TimeTicks timestamp;
   RegisterContext context{};
+  TestStackCopierDelegate stack_copier_delegate;
 
   TargetThread target_thread;
   target_thread.Start();
@@ -178,8 +205,8 @@
 
   StackCopierSignal copier(std::make_unique<ThreadDelegatePosix>(thread_token));
 
-  bool result = copier.CopyStack(&stack_buffer, &stack_top, &profiler_builder,
-                                 &timestamp, &context);
+  bool result = copier.CopyStack(&stack_buffer, &stack_top, &timestamp,
+                                 &context, &stack_copier_delegate);
   ASSERT_TRUE(result);
 
   target_thread.NotifyCopyFinished();
diff --git a/base/profiler/stack_copier_suspend.cc b/base/profiler/stack_copier_suspend.cc
index ecf4e95..d570c77 100644
--- a/base/profiler/stack_copier_suspend.cc
+++ b/base/profiler/stack_copier_suspend.cc
@@ -4,8 +4,6 @@
 
 #include "base/profiler/stack_copier_suspend.h"
 
-#include "base/profiler/metadata_recorder.h"
-#include "base/profiler/sample_metadata.h"
 #include "base/profiler/stack_buffer.h"
 #include "base/profiler/suspendable_thread_delegate.h"
 
@@ -19,25 +17,19 @@
 
 // Suspends the thread, copies the stack state, and resumes the thread. The
 // copied stack state includes the stack itself, the top address of the stack
-// copy, the register context, and the current metadata state. Returns true on
-// success, and returns the copied state via the params.
+// copy, and the register context. Returns true on success, and returns the
+// copied state via the params.
 //
 // NO HEAP ALLOCATIONS within the ScopedSuspendThread scope.
 bool StackCopierSuspend::CopyStack(StackBuffer* stack_buffer,
                                    uintptr_t* stack_top,
-                                   ProfileBuilder* profile_builder,
                                    TimeTicks* timestamp,
-                                   RegisterContext* thread_context) {
+                                   RegisterContext* thread_context,
+                                   Delegate* delegate) {
   const uintptr_t top = thread_delegate_->GetStackBaseAddress();
   uintptr_t bottom = 0;
   const uint8_t* stack_copy_bottom = nullptr;
   {
-    // The MetadataProvider must be created before the ScopedSuspendThread
-    // because it acquires a lock in its constructor that might otherwise be
-    // held by the target thread, resulting in deadlock.
-    std::unique_ptr<ProfileBuilder::MetadataProvider> get_metadata_items =
-        GetSampleMetadataRecorder()->CreateMetadataProvider();
-
     // Allocation of the ScopedSuspendThread object itself is OK since it
     // necessarily occurs before the thread is suspended by the object.
     std::unique_ptr<SuspendableThreadDelegate::ScopedSuspendThread>
@@ -65,13 +57,15 @@
     if (!thread_delegate_->CanCopyStack(bottom))
       return false;
 
-    profile_builder->RecordMetadata(get_metadata_items.get());
+    delegate->OnStackCopy();
 
     stack_copy_bottom = CopyStackContentsAndRewritePointers(
         reinterpret_cast<uint8_t*>(bottom), reinterpret_cast<uintptr_t*>(top),
         StackBuffer::kPlatformStackAlignment, stack_buffer->buffer());
   }
 
+  delegate->OnThreadResume();
+
   *stack_top = reinterpret_cast<uintptr_t>(stack_copy_bottom) + (top - bottom);
 
   for (uintptr_t* reg :
diff --git a/base/profiler/stack_copier_suspend.h b/base/profiler/stack_copier_suspend.h
index 78c7e80..3e08e8f1 100644
--- a/base/profiler/stack_copier_suspend.h
+++ b/base/profiler/stack_copier_suspend.h
@@ -26,9 +26,9 @@
   // StackCopier:
   bool CopyStack(StackBuffer* stack_buffer,
                  uintptr_t* stack_top,
-                 ProfileBuilder* profile_builder,
                  TimeTicks* timestamp,
-                 RegisterContext* thread_context) override;
+                 RegisterContext* thread_context,
+                 Delegate* delegate) override;
 
  private:
   std::unique_ptr<SuspendableThreadDelegate> thread_delegate_;
diff --git a/base/profiler/stack_copier_suspend_unittest.cc b/base/profiler/stack_copier_suspend_unittest.cc
index a887adaf..a81eca5 100644
--- a/base/profiler/stack_copier_suspend_unittest.cc
+++ b/base/profiler/stack_copier_suspend_unittest.cc
@@ -8,7 +8,6 @@
 #include <numeric>
 #include <utility>
 
-#include "base/profiler/profile_builder.h"
 #include "base/profiler/stack_buffer.h"
 #include "base/profiler/stack_copier_suspend.h"
 #include "base/profiler/suspendable_thread_delegate.h"
@@ -83,28 +82,28 @@
   RegisterContext* thread_context_;
 };
 
-class TestProfileBuilder : public ProfileBuilder {
+class TestStackCopierDelegate : public StackCopier::Delegate {
  public:
-  TestProfileBuilder() = default;
-
-  TestProfileBuilder(const TestProfileBuilder&) = delete;
-  TestProfileBuilder& operator=(const TestProfileBuilder&) = delete;
-
-  // ProfileBuilder
-  ModuleCache* GetModuleCache() override { return nullptr; }
-
-  void RecordMetadata(
-      ProfileBuilder::MetadataProvider* metadata_provider) override {
-    recorded_metadata_ = true;
+  void OnStackCopy() override {
+    // We can't EXPECT_FALSE(on_thread_resume_was_invoked_) here because that
+    // invocation is not reentrant.
+    on_stack_copy_was_invoked_ = true;
   }
 
-  void OnSampleCompleted(std::vector<Frame> frames,
-                         TimeTicks sample_timestamp) override {}
-  void OnProfileCompleted(TimeDelta profile_duration,
-                          TimeDelta sampling_period) override {}
+  void OnThreadResume() override {
+    EXPECT_TRUE(on_stack_copy_was_invoked_);
+    on_thread_resume_was_invoked_ = true;
+  }
+
+  bool on_stack_copy_was_invoked() const { return on_stack_copy_was_invoked_; }
+
+  bool on_thread_resume_was_invoked() const {
+    return on_thread_resume_was_invoked_;
+  }
 
  private:
-  bool recorded_metadata_ = false;
+  bool on_stack_copy_was_invoked_ = false;
+  bool on_thread_resume_was_invoked_ = false;
 };
 
 }  // namespace
@@ -117,12 +116,11 @@
   std::unique_ptr<StackBuffer> stack_buffer =
       std::make_unique<StackBuffer>(stack.size() * sizeof(uintptr_t));
   uintptr_t stack_top = 0;
-  TestProfileBuilder profile_builder;
   TimeTicks timestamp;
   RegisterContext register_context{};
-  stack_copier_suspend.CopyStack(stack_buffer.get(), &stack_top,
-                                 &profile_builder, &timestamp,
-                                 &register_context);
+  TestStackCopierDelegate stack_copier_delegate;
+  stack_copier_suspend.CopyStack(stack_buffer.get(), &stack_top, &timestamp,
+                                 &register_context, &stack_copier_delegate);
 
   uintptr_t* stack_copy_bottom =
       reinterpret_cast<uintptr_t*>(stack_buffer.get()->buffer());
@@ -141,12 +139,11 @@
   // Make the buffer different than the input stack.
   stack_buffer->buffer()[0] = 100;
   uintptr_t stack_top = 0;
-  TestProfileBuilder profile_builder;
   TimeTicks timestamp;
   RegisterContext register_context{};
-  stack_copier_suspend.CopyStack(stack_buffer.get(), &stack_top,
-                                 &profile_builder, &timestamp,
-                                 &register_context);
+  TestStackCopierDelegate stack_copier_delegate;
+  stack_copier_suspend.CopyStack(stack_buffer.get(), &stack_top, &timestamp,
+                                 &register_context, &stack_copier_delegate);
 
   uintptr_t* stack_copy_bottom =
       reinterpret_cast<uintptr_t*>(stack_buffer.get()->buffer());
@@ -168,12 +165,11 @@
   std::unique_ptr<StackBuffer> stack_buffer =
       std::make_unique<StackBuffer>(stack.size() * sizeof(uintptr_t));
   uintptr_t stack_top = 0;
-  TestProfileBuilder profile_builder;
   TimeTicks timestamp;
   RegisterContext register_context{};
-  stack_copier_suspend.CopyStack(stack_buffer.get(), &stack_top,
-                                 &profile_builder, &timestamp,
-                                 &register_context);
+  TestStackCopierDelegate stack_copier_delegate;
+  stack_copier_suspend.CopyStack(stack_buffer.get(), &stack_top, &timestamp,
+                                 &register_context, &stack_copier_delegate);
 
   uintptr_t* stack_copy_bottom =
       reinterpret_cast<uintptr_t*>(stack_buffer.get()->buffer());
@@ -193,23 +189,42 @@
   std::unique_ptr<StackBuffer> stack_buffer =
       std::make_unique<StackBuffer>(stack.size() * sizeof(uintptr_t));
   uintptr_t stack_top = 0;
-  TestProfileBuilder profile_builder;
   TimeTicks timestamp;
   RegisterContext register_context{};
+  TestStackCopierDelegate stack_copier_delegate;
 
   TimeTicks before = TimeTicks::Now();
-  stack_copier_suspend.CopyStack(stack_buffer.get(), &stack_top,
-                                 &profile_builder, &timestamp,
-                                 &register_context);
+  stack_copier_suspend.CopyStack(stack_buffer.get(), &stack_top, &timestamp,
+                                 &register_context, &stack_copier_delegate);
   TimeTicks after = TimeTicks::Now();
 
   EXPECT_GE(timestamp, before);
   EXPECT_LE(timestamp, after);
 }
 
+TEST(StackCopierSuspendTest, CopyStackDelegateInvoked) {
+  const std::vector<uintptr_t> stack = {0};
+  StackCopierSuspend stack_copier_suspend(
+      std::make_unique<TestSuspendableThreadDelegate>(stack));
+
+  std::unique_ptr<StackBuffer> stack_buffer =
+      std::make_unique<StackBuffer>(stack.size() * sizeof(uintptr_t));
+  uintptr_t stack_top = 0;
+  TimeTicks timestamp;
+  RegisterContext register_context{};
+  TestStackCopierDelegate stack_copier_delegate;
+
+  stack_copier_suspend.CopyStack(stack_buffer.get(), &stack_top, &timestamp,
+                                 &register_context, &stack_copier_delegate);
+
+  EXPECT_TRUE(stack_copier_delegate.on_stack_copy_was_invoked());
+  EXPECT_TRUE(stack_copier_delegate.on_thread_resume_was_invoked());
+}
+
 TEST(StackCopierSuspendTest, RewriteRegisters) {
   std::vector<uintptr_t> stack = {0, 1, 2};
   RegisterContext register_context{};
+  TestStackCopierDelegate stack_copier_delegate;
   RegisterContextFramePointer(&register_context) =
       reinterpret_cast<uintptr_t>(&stack[1]);
   StackCopierSuspend stack_copier_suspend(
@@ -220,10 +235,8 @@
       std::make_unique<StackBuffer>(stack.size() * sizeof(uintptr_t));
   uintptr_t stack_top = 0;
   TimeTicks timestamp;
-  TestProfileBuilder profile_builder;
-  stack_copier_suspend.CopyStack(stack_buffer.get(), &stack_top,
-                                 &profile_builder, &timestamp,
-                                 &register_context);
+  stack_copier_suspend.CopyStack(stack_buffer.get(), &stack_top, &timestamp,
+                                 &register_context, &stack_copier_delegate);
 
   uintptr_t stack_copy_bottom =
       reinterpret_cast<uintptr_t>(stack_buffer.get()->buffer());
diff --git a/base/profiler/stack_sampler_impl.cc b/base/profiler/stack_sampler_impl.cc
index 09c8925..90c6c5b 100644
--- a/base/profiler/stack_sampler_impl.cc
+++ b/base/profiler/stack_sampler_impl.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "base/compiler_specific.h"
 #include "base/logging.h"
 #include "base/profiler/profile_builder.h"
 #include "base/profiler/sample_metadata.h"
@@ -13,6 +14,7 @@
 #include "base/profiler/stack_copier.h"
 #include "base/profiler/suspendable_thread_delegate.h"
 #include "base/profiler/unwinder.h"
+#include "build/build_config.h"
 
 // IMPORTANT NOTE: Some functions within this implementation are invoked while
 // the target thread is suspended so it must not do any allocation from the
@@ -23,6 +25,58 @@
 
 namespace base {
 
+namespace {
+
+// Notifies the unwinders about the stack capture, and records metadata, while
+// the thread is suspended.
+class StackCopierDelegate : public StackCopier::Delegate {
+ public:
+  StackCopierDelegate(Unwinder* native_unwinder,
+                      Unwinder* aux_unwinder,
+                      ProfileBuilder* profile_builder)
+      : native_unwinder_(native_unwinder),
+        aux_unwinder_(aux_unwinder),
+        profile_builder_(profile_builder),
+        metadata_provider_(
+            GetSampleMetadataRecorder()->CreateMetadataProvider()) {}
+
+  StackCopierDelegate(const StackCopierDelegate&) = delete;
+  StackCopierDelegate& operator=(const StackCopierDelegate&) = delete;
+
+  // StackCopier::Delegate:
+  // IMPORTANT NOTE: to avoid deadlock this function must not invoke any
+  // non-reentrant code that is also invoked by the target thread. In
+  // particular, it may not perform any heap allocation or deallocation,
+  // including indirectly via use of DCHECK/CHECK or other logging statements.
+  void OnStackCopy() override {
+    native_unwinder_->OnStackCapture();
+    if (aux_unwinder_)
+      aux_unwinder_->OnStackCapture();
+
+#if !defined(OS_POSIX) || defined(OS_MACOSX)
+    profile_builder_->RecordMetadata(metadata_provider_.get());
+#else
+    // TODO(https://crbug.com/1056283): Support metadata recording on POSIX
+    // platforms.
+    ALLOW_UNUSED_LOCAL(profile_builder_);
+#endif
+  }
+
+  void OnThreadResume() override {
+    // Reset this as soon as possible because it may hold a lock on the
+    // metadata.
+    metadata_provider_.reset();
+  }
+
+ private:
+  Unwinder* const native_unwinder_;
+  Unwinder* const aux_unwinder_;
+  ProfileBuilder* const profile_builder_;
+  std::unique_ptr<ProfileBuilder::MetadataProvider> metadata_provider_;
+};
+
+}  // namespace
+
 StackSamplerImpl::StackSamplerImpl(std::unique_ptr<StackCopier> stack_copier,
                                    std::unique_ptr<Unwinder> native_unwinder,
                                    ModuleCache* module_cache,
@@ -46,8 +100,10 @@
   RegisterContext thread_context;
   uintptr_t stack_top;
   TimeTicks timestamp;
-  bool success = stack_copier_->CopyStack(
-      stack_buffer, &stack_top, profile_builder, &timestamp, &thread_context);
+  StackCopierDelegate delegate(native_unwinder_.get(), aux_unwinder_.get(),
+                               profile_builder);
+  bool success = stack_copier_->CopyStack(stack_buffer, &stack_top, &timestamp,
+                                          &thread_context, &delegate);
   if (!success)
     return;
 
@@ -59,8 +115,8 @@
                 native_unwinder_.get(), aux_unwinder_.get()),
       timestamp);
 }
-// static
 
+// static
 std::vector<Frame> StackSamplerImpl::WalkStackForTesting(
     ModuleCache* module_cache,
     RegisterContext* thread_context,
diff --git a/base/profiler/stack_sampler_impl.h b/base/profiler/stack_sampler_impl.h
index 226ccdb..725905e 100644
--- a/base/profiler/stack_sampler_impl.h
+++ b/base/profiler/stack_sampler_impl.h
@@ -10,11 +10,11 @@
 #include "base/base_export.h"
 #include "base/profiler/frame.h"
 #include "base/profiler/register_context.h"
+#include "base/profiler/stack_copier.h"
 #include "base/profiler/stack_sampler.h"
 
 namespace base {
 
-class StackCopier;
 class Unwinder;
 
 // Cross-platform stack sampler implementation. Delegates to StackCopier for the
diff --git a/base/profiler/stack_sampler_impl_unittest.cc b/base/profiler/stack_sampler_impl_unittest.cc
index b171f2d..c3f58ee 100644
--- a/base/profiler/stack_sampler_impl_unittest.cc
+++ b/base/profiler/stack_sampler_impl_unittest.cc
@@ -64,9 +64,9 @@
 
   bool CopyStack(StackBuffer* stack_buffer,
                  uintptr_t* stack_top,
-                 ProfileBuilder* profile_builder,
                  TimeTicks* timestamp,
-                 RegisterContext* thread_context) override {
+                 RegisterContext* thread_context,
+                 Delegate* delegate) override {
     std::memcpy(stack_buffer->buffer(), &fake_stack_[0], fake_stack_.size());
     *stack_top =
         reinterpret_cast<uintptr_t>(&fake_stack_[0] + fake_stack_.size());
diff --git a/base/profiler/unwinder.h b/base/profiler/unwinder.h
index f88a5ed..9a0e767 100644
--- a/base/profiler/unwinder.h
+++ b/base/profiler/unwinder.h
@@ -31,8 +31,7 @@
 // use with the StackSamplingProfiler. The profiler is expected to call
 // CanUnwind() to determine if the Unwinder thinks it can unwind from the frame
 // represented by the context values, then TryUnwind() to attempt the
-// unwind. Note that the stack samples for multiple collection scenarios are
-// interleaved on a single Unwinder instance.
+// unwind.
 class Unwinder {
  public:
   virtual ~Unwinder() = default;
@@ -41,6 +40,13 @@
   // ModuleCache.
   virtual void AddInitialModules(ModuleCache* module_cache) {}
 
+  // Invoked at the time the stack is captured. IMPORTANT NOTE: this function is
+  // invoked while the target thread is suspended. To avoid deadlock it must not
+  // invoke any non-reentrant code that is also invoked by the target thread. In
+  // particular, it may not perform any heap allocation or deallocation,
+  // including indirectly via use of DCHECK/CHECK or other logging statements.
+  virtual void OnStackCapture() {}
+
   // Returns true if the unwinder recognizes the code referenced by
   // |current_frame| as code from which it should be able to unwind. When
   // multiple unwinders are in use, each should return true for a disjoint set
diff --git a/base/synchronization/atomic_flag.cc b/base/synchronization/atomic_flag.cc
index a7ff0e7..381dbc4 100644
--- a/base/synchronization/atomic_flag.cc
+++ b/base/synchronization/atomic_flag.cc
@@ -24,6 +24,7 @@
 }
 
 void AtomicFlag::UnsafeResetForTesting() {
+  DETACH_FROM_SEQUENCE(set_sequence_checker_);
   flag_.store(0, std::memory_order_release);
 }
 
diff --git a/base/test/test_timeouts.cc b/base/test/test_timeouts.cc
index 3cca9e6..ef612bb 100644
--- a/base/test/test_timeouts.cc
+++ b/base/test/test_timeouts.cc
@@ -61,9 +61,10 @@
   // On coverage build, tests run 3x slower.
   constexpr int kTimeoutMultiplier = 3;
 #elif !defined(NDEBUG) && defined(OS_CHROMEOS)
+  // TODO(crbug.com/1058022): reduce the multiplier back to 2x.
   // A number of tests on ChromeOS run very close to the base limit, so ChromeOS
-  // gets 2x.
-  constexpr int kTimeoutMultiplier = 2;
+  // gets 3x.
+  constexpr int kTimeoutMultiplier = 3;
 #else
   constexpr int kTimeoutMultiplier = 1;
 #endif
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index 5e2863d1..1069a42 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -4004,9 +4004,7 @@
       _proto_runtime = "//third_party/android_protobuf:protobuf_nano_javalib"
     } else {
       # Use the regular proto library to generate lite protos.
-      _protoc_dep = "//third_party/protobuf:protoc($host_toolchain)"
-      _protoc_out_dir = get_label_info(_protoc_dep, "root_out_dir")
-      _protoc_bin = "$_protoc_out_dir/protoc"
+      _protoc_bin = "//third_party/android_protoc/protoc"
       _proto_runtime =
           "//third_party/android_deps:com_google_protobuf_protobuf_lite_java"
       _protoc_javalite_plugin_dir = "//third_party/protoc_javalite/"
@@ -4018,7 +4016,10 @@
       _srcjar_path = "$target_gen_dir/$target_name.srcjar"
       script = "//build/protoc_java.py"
 
-      deps = [ _protoc_dep ]
+      deps = []
+      if (defined(_protoc_dep)) {
+        deps += [ _protoc_dep ]
+      }
       if (defined(invoker.deps)) {
         deps += invoker.deps
       }
diff --git a/build/config/fuchsia/fidl_library.gni b/build/config/fuchsia/fidl_library.gni
deleted file mode 100644
index 481436a..0000000
--- a/build/config/fuchsia/fidl_library.gni
+++ /dev/null
@@ -1,7 +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.
-
-assert(is_fuchsia)
-
-import("//third_party/fuchsia-sdk/sdk/build/fidl_library.gni")
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index ad65d9ba..87f41b0 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-0.20200305.1.1
\ No newline at end of file
+0.20200305.2.1
\ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index ad65d9ba..87f41b0 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-0.20200305.1.1
\ No newline at end of file
+0.20200305.2.1
\ No newline at end of file
diff --git a/build/fuchsia/update_sdk.py b/build/fuchsia/update_sdk.py
index dfa8141..212e56c 100755
--- a/build/fuchsia/update_sdk.py
+++ b/build/fuchsia/update_sdk.py
@@ -25,6 +25,9 @@
 SDK_SIGNATURE_FILE = '.hash'
 
 EXTRA_SDK_HASH_PREFIX = ''
+SDK_TARBALL_PATH_TEMPLATE = (
+    'gs://fuchsia/development/{sdk_hash}/sdk/{platform}-amd64/gn.tar.gz')
+
 
 def GetSdkGeneration(hash):
   if not hash:
@@ -75,7 +78,7 @@
 
 
 def GetSdkTarballForPlatformAndHash(sdk_hash):
-  return 'gs://fuchsia/development/{sdk_hash}/sdk/{platform}-amd64/gn.tar.gz'.format(
+  return SDK_TARBALL_PATH_TEMPLATE.format(
       sdk_hash=sdk_hash, platform=GetHostOsFromPlatform())
 
 
diff --git a/cc/input/scrollbar_controller.cc b/cc/input/scrollbar_controller.cc
index e199bb2..1561497 100644
--- a/cc/input/scrollbar_controller.cc
+++ b/cc/input/scrollbar_controller.cc
@@ -329,22 +329,26 @@
   if (drag_processed_for_current_frame_)
     return scroll_result;
 
-  const ScrollNode* currently_scrolling_node =
-      layer_tree_host_impl_->CurrentlyScrollingNode();
+  // When initiating a thumb drag, a pointerdown and a pointermove can both
+  // arrive a the ScrollbarController in succession before a GSB would have
+  // been dispatched. So, querying LayerTreeHostImpl::CurrentlyScrollingNode()
+  // can potentially be null. Hence, a better way to look the target_node to be
+  // scrolled is by using ScrollbarLayerImplBase::scroll_element_id().
+  const ScrollNode* target_node =
+      layer_tree_host_impl_->active_tree()
+          ->property_trees()
+          ->scroll_tree.FindNodeFromElementId(scrollbar->scroll_element_id());
 
-  // Thumb drag needs a scroll_node. Clear the thumb drag state and exit if it
-  // is unset.
-  if (currently_scrolling_node == nullptr) {
-    drag_state_ = base::nullopt;
-    return scroll_result;
-  }
+  // If a scrollbar exists, it should always have an ElementId pointing to a
+  // valid ScrollNode.
+  DCHECK(target_node);
 
   // If scroll_offset can't be consumed, there's no point in continuing on.
   const gfx::ScrollOffset scroll_offset(
       GetScrollOffsetForDragPosition(scrollbar, position_in_widget));
   const gfx::Vector2dF clamped_scroll_offset(
       layer_tree_host_impl_->ComputeScrollDelta(
-          *currently_scrolling_node, ScrollOffsetToVector2dF(scroll_offset)));
+          *target_node, ScrollOffsetToVector2dF(scroll_offset)));
 
   if (clamped_scroll_offset.IsZero())
     return scroll_result;
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index 325d04d..925c96a8 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -12458,6 +12458,81 @@
   host_impl_ = nullptr;
 }
 
+// Tests that a pointerdown followed by pointermove(s) produces
+// InputHandlerPointerResult with scroll_offset > 0 even though the GSB might
+// have been dispatched *after* the first pointermove was handled by the
+// ScrollbarController.
+TEST_F(LayerTreeHostImplTest, PointerMoveOutOfSequence) {
+  LayerTreeSettings settings = DefaultSettings();
+  settings.compositor_threaded_scrollbar_scrolling = true;
+  CreateHostImpl(settings, CreateLayerTreeFrameSink());
+
+  // Setup the viewport.
+  const gfx::Size viewport_size = gfx::Size(360, 600);
+  const gfx::Size content_size = gfx::Size(345, 3800);
+  SetupViewportLayersOuterScrolls(viewport_size, content_size);
+  LayerImpl* scroll_layer = OuterViewportScrollLayer();
+
+  // Set up the scrollbar and its dimensions.
+  LayerTreeImpl* layer_tree_impl = host_impl_->active_tree();
+  auto* scrollbar = AddLayer<PaintedScrollbarLayerImpl>(layer_tree_impl,
+                                                        VERTICAL, false, true);
+  SetupScrollbarLayerCommon(scroll_layer, scrollbar);
+  scrollbar->SetHitTestable(true);
+
+  const gfx::Size scrollbar_size = gfx::Size(15, 600);
+  scrollbar->SetBounds(scrollbar_size);
+
+  // Set up the thumb dimensions.
+  scrollbar->SetThumbThickness(15);
+  scrollbar->SetThumbLength(50);
+  scrollbar->SetTrackRect(gfx::Rect(0, 15, 15, 575));
+  scrollbar->SetOffsetToTransformParent(gfx::Vector2dF(345, 0));
+
+  TestInputHandlerClient input_handler_client;
+  host_impl_->BindToClient(&input_handler_client);
+
+  // PointerDown sets up the state needed to initiate a drag. Although, the
+  // resulting GSB won't be dispatched until the next VSync. Hence, the
+  // CurrentlyScrollingNode is expected to be null.
+  host_impl_->MouseDown(gfx::PointF(350, 18), /*shift_modifier*/ false);
+  EXPECT_TRUE(!host_impl_->CurrentlyScrollingNode());
+
+  // PointerMove arrives before the next VSync. This still needs to be handled
+  // by the ScrollbarController even though the GSB has not yet been dispatched.
+  // Note that this doesn't result in a scroll yet. It only prepares a GSU based
+  // on the result that is returned by ScrollbarController::HandlePointerMove.
+  InputHandlerPointerResult result =
+      host_impl_->MouseMoveAt(gfx::Point(350, 19));
+  EXPECT_GT(result.scroll_offset.y(), 0u);
+
+  // GSB gets dispatched at VSync.
+  viz::BeginFrameArgs begin_frame_args =
+      viz::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1);
+  begin_frame_args.frame_time = base::TimeTicks::Now();
+  begin_frame_args.frame_id.sequence_number++;
+  host_impl_->WillBeginImplFrame(begin_frame_args);
+  host_impl_->ScrollBegin(
+      BeginState(gfx::Point(350, 18), gfx::Vector2dF(), InputHandler::SCROLLBAR)
+          .get(),
+      InputHandler::SCROLLBAR);
+  EXPECT_TRUE(host_impl_->CurrentlyScrollingNode());
+
+  // The PointerMove(s) that follow should be handled and are expected to have a
+  // scroll_offset > 0.
+  result = host_impl_->MouseMoveAt(gfx::Point(350, 20));
+  EXPECT_GT(result.scroll_offset.y(), 0u);
+
+  // End the scroll.
+  host_impl_->MouseUp(gfx::PointF(350, 20));
+  host_impl_->ScrollEnd();
+  EXPECT_TRUE(!host_impl_->CurrentlyScrollingNode());
+
+  // Tear down the LayerTreeHostImpl before the InputHandlerClient.
+  host_impl_->ReleaseLayerTreeFrameSink();
+  host_impl_ = nullptr;
+}
+
 // This tests that faded-out Mac scrollbars can't be interacted with.
 TEST_F(LayerTreeHostImplTest, FadedOutPaintedScrollbarHitTest) {
   LayerTreeSettings settings = DefaultSettings();
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index f1a0a82..03402273 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -183,6 +183,15 @@
   }
 }
 
+# TODO (crbug/1058764) Unfork credential leak dialog password change when prototype is done.
+if (enable_password_change_in_leaked_dialog) {
+  android_resources("password_change_resources") {
+    resource_dirs = [ "//chrome/android/java/res_password_change" ]
+    deps = [ ":chrome_app_java_resources" ]
+    custom_package = "org.chromium.chrome.password_change"
+  }
+}
+
 # TODO(chouinard): Remove this wrapper target after downstream dependencies on it are replaced.
 android_resources("chrome_download_java_resources") {
   resource_dirs = []
@@ -471,6 +480,9 @@
     deps += [ ":chrome_vr_java_resources" ]
   }
 
+  if (enable_password_change_in_leaked_dialog) {
+    deps += [ ":password_change_resources" ]
+  }
   srcjar_deps += [ ":chrome_vr_android_java_enums_srcjar" ]
   if (enable_feed_in_chrome) {
     deps += [ "//chrome/android/feed:chrome_feed_java_resources" ]
@@ -2877,6 +2889,10 @@
   if (enable_vr) {
     sources += [ "java/src/org/chromium/chrome/browser/component_updater/VrAssetsComponentInstaller.java" ]
   }
+
+  if (enable_password_change_in_leaked_dialog) {
+    sources += [ "java/src/org/chromium/chrome/browser/password_manager/CredentialLeakDialogPasswordChangeBridge.java" ]
+  }
 }
 
 android_library("native_java_unittests_java") {
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayIntegrationTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayIntegrationTest.java
index 2ef4330d..5a0b600 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayIntegrationTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayIntegrationTest.java
@@ -11,8 +11,10 @@
 import static org.hamcrest.Matchers.is;
 
 import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.checkElementExists;
+import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.checkElementOnScreen;
 import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.startAutofillAssistant;
 import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.tapElement;
+import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.waitUntil;
 import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.waitUntilViewMatchesCondition;
 
 import android.support.test.InstrumentationRegistry;
@@ -24,7 +26,6 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.base.test.util.DisabledTest;
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.ChipProto;
@@ -72,7 +73,6 @@
      */
     @Test
     @MediumTest
-    @DisabledTest(message = "Test is flaky. crbug.com/1058599")
     public void testShowCastOnDocumentElement() throws Exception {
         ElementReferenceProto element = (ElementReferenceProto) ElementReferenceProto.newBuilder()
                                                 .addSelectors("#touch_area_one")
@@ -102,12 +102,13 @@
                 list);
         runScript(script);
 
+        waitUntil(() -> checkElementOnScreen(mTestRule, "touch_area_one"));
         waitUntilViewMatchesCondition(withText("Prompt"), isCompletelyDisplayed());
 
         // Tapping on the element should remove it from the DOM.
         assertThat(checkElementExists(mTestRule.getWebContents(), "touch_area_one"), is(true));
         tapElement(mTestRule, "touch_area_one");
-        assertThat(checkElementExists(mTestRule.getWebContents(), "touch_area_one"), is(false));
+        waitUntil(() -> !checkElementExists(mTestRule.getWebContents(), "touch_area_one"));
         // Tapping on the element should be blocked by the overlay.
         tapElement(mTestRule, "touch_area_four");
         assertThat(checkElementExists(mTestRule.getWebContents(), "touch_area_four"), is(true));
@@ -118,7 +119,6 @@
      */
     @Test
     @MediumTest
-    @DisabledTest(message = "Test is flaky. crbug.com/1058599")
     public void testShowCastOnDocumentElementInScrolledBrowserWindow() throws Exception {
         ElementReferenceProto element = (ElementReferenceProto) ElementReferenceProto.newBuilder()
                                                 .addSelectors("#touch_area_five")
@@ -148,13 +148,14 @@
                 list);
         runScript(script);
 
+        waitUntil(() -> checkElementOnScreen(mTestRule, "touch_area_five"));
         waitUntilViewMatchesCondition(withText("Prompt"), isCompletelyDisplayed());
 
         // Tapping on the element should remove it from the DOM. The element should be after a
         // big element forcing the page to scroll.
         assertThat(checkElementExists(mTestRule.getWebContents(), "touch_area_five"), is(true));
         tapElement(mTestRule, "touch_area_five");
-        assertThat(checkElementExists(mTestRule.getWebContents(), "touch_area_five"), is(false));
+        waitUntil(() -> !checkElementExists(mTestRule.getWebContents(), "touch_area_five"));
         // Tapping on the element should be blocked by the overlay.
         tapElement(mTestRule, "touch_area_six");
         assertThat(checkElementExists(mTestRule.getWebContents(), "touch_area_six"), is(true));
@@ -165,7 +166,6 @@
      */
     @Test
     @MediumTest
-    @DisabledTest(message = "flaky on Android L; crbug.com/1058599")
     public void testShowCastOnIFrameElement() throws Exception {
         ElementReferenceProto element = (ElementReferenceProto) ElementReferenceProto.newBuilder()
                                                 .addSelectors("#iframe")
@@ -196,14 +196,14 @@
                 list);
         runScript(script);
 
+        waitUntil(() -> checkElementOnScreen(mTestRule, "iframe", "touch_area_1"));
         waitUntilViewMatchesCondition(withText("Prompt"), isCompletelyDisplayed());
 
         // Tapping on the element should remove it from the DOM.
         assertThat(
                 checkElementExists(mTestRule.getWebContents(), "iframe", "touch_area_1"), is(true));
         tapElement(mTestRule, "iframe", "touch_area_1");
-        assertThat(checkElementExists(mTestRule.getWebContents(), "iframe", "touch_area_1"),
-                is(false));
+        waitUntil(() -> !checkElementExists(mTestRule.getWebContents(), "iframe", "touch_area_1"));
         // Tapping on the element should be blocked by the overlay.
         tapElement(mTestRule, "iframe", "touch_area_2");
         assertThat(
@@ -215,7 +215,6 @@
      */
     @Test
     @MediumTest
-    @DisabledTest(message = "flaky on Android L; crbug.com/1058599")
     public void testShowCastOnIFrameElementInScrollIFrame() throws Exception {
         ElementReferenceProto element = (ElementReferenceProto) ElementReferenceProto.newBuilder()
                                                 .addSelectors("#iframe")
@@ -246,6 +245,7 @@
                 list);
         runScript(script);
 
+        waitUntil(() -> checkElementOnScreen(mTestRule, "iframe", "touch_area_3"));
         waitUntilViewMatchesCondition(withText("Prompt"), isCompletelyDisplayed());
 
         // Tapping on the element should remove it from the DOM. The element should be after a
@@ -253,8 +253,7 @@
         assertThat(
                 checkElementExists(mTestRule.getWebContents(), "iframe", "touch_area_3"), is(true));
         tapElement(mTestRule, "iframe", "touch_area_3");
-        assertThat(checkElementExists(mTestRule.getWebContents(), "iframe", "touch_area_3"),
-                is(false));
+        waitUntil(() -> !checkElementExists(mTestRule.getWebContents(), "iframe", "touch_area_3"));
         // Tapping on the element should be blocked by the overlay.
         tapElement(mTestRule, "iframe", "touch_area_4");
         assertThat(
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiTestUtil.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiTestUtil.java
index a4a51d6..86f55f3 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiTestUtil.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiTestUtil.java
@@ -67,6 +67,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.concurrent.Callable;
 
 import jp.tomorrowkey.android.gifplayer.BaseGifImage;
 
@@ -372,6 +373,21 @@
         });
     }
 
+    public static void waitUntil(Callable<Boolean> condition) {
+        CriteriaHelper.pollInstrumentationThread(
+                new Criteria("Timeout while waiting for condition") {
+                    @Override
+                    public boolean isSatisfied() {
+                        try {
+                            return condition.call();
+                        } catch (Exception e) {
+                            return false;
+                        }
+                    }
+                },
+                DEFAULT_MAX_TIME_TO_POLL, DEFAULT_POLLING_INTERVAL);
+    }
+
     /**
      * Creates a {@link BottomSheetController} for the activity, suitable for testing.
      *
@@ -508,6 +524,15 @@
         return rect;
     }
 
+    public static boolean checkElementOnScreen(
+            CustomTabActivityTestRule testRule, String... elementIds) throws Exception {
+        Rect coords = getAbsoluteBoundingRect(testRule, elementIds);
+        DisplayMetrics displayMetrics = testRule.getActivity().getResources().getDisplayMetrics();
+
+        return (coords.left < displayMetrics.widthPixels && 0 <= coords.right)
+                && (coords.top < displayMetrics.heightPixels && 0 <= coords.bottom);
+    }
+
     /** Checks whether the specified element exists in the DOM tree. */
     public static boolean checkElementExists(WebContents webContents, String... elementIds)
             throws Exception {
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMenuItemBinder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMenuItemBinder.java
index d45b1e70..228ea261 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMenuItemBinder.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMenuItemBinder.java
@@ -7,7 +7,6 @@
 import android.view.View;
 import android.widget.TextView;
 
-import org.chromium.chrome.tab_ui.R;
 import org.chromium.ui.modelutil.PropertyKey;
 import org.chromium.ui.modelutil.PropertyModel;
 
@@ -17,8 +16,7 @@
 public class TabGridDialogMenuItemBinder {
     public static void binder(PropertyModel model, View view, PropertyKey propertyKey) {
         if (propertyKey == TabGridDialogMenuItemProperties.TITLE) {
-            TextView textView = view.findViewById(R.id.menu_item_text);
-            textView.setText(model.get(TabGridDialogMenuItemProperties.TITLE));
+            ((TextView) view).setText(model.get(TabGridDialogMenuItemProperties.TITLE));
         }
     }
 }
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java
index 39593b8..1ee2069 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java
@@ -519,7 +519,7 @@
 
     private void verifyTabGridDialogToolbarMenuItem(ListView listView, int index, String text) {
         View menuItemView = listView.getChildAt(index);
-        TextView menuItemText = menuItemView.findViewById(R.id.menu_item_text);
+        TextView menuItemText = menuItemView.findViewById(R.id.menu_item);
         assertEquals(text, menuItemText.getText());
     }
 
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/sharedstream/ui/MaterialSpinnerView.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/sharedstream/ui/MaterialSpinnerView.java
index 129deab..1961c73 100644
--- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/sharedstream/ui/MaterialSpinnerView.java
+++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/sharedstream/ui/MaterialSpinnerView.java
@@ -6,13 +6,13 @@
 
 import android.content.Context;
 import android.content.res.Resources.Theme;
-import android.support.v4.widget.CircularProgressDrawable;
 import android.support.v7.widget.AppCompatImageView;
 import android.util.AttributeSet;
 import android.util.TypedValue;
 import android.view.View;
 
 import androidx.annotation.Nullable;
+import androidx.swiperefreshlayout.widget.CircularProgressDrawable;
 
 import org.chromium.chrome.feed.R;
 
diff --git a/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/library/sharedstream/ui/MaterialSpinnerViewTest.java b/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/library/sharedstream/ui/MaterialSpinnerViewTest.java
index 718519d..e870f7e 100644
--- a/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/library/sharedstream/ui/MaterialSpinnerViewTest.java
+++ b/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/library/sharedstream/ui/MaterialSpinnerViewTest.java
@@ -7,9 +7,10 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import android.app.Activity;
-import android.support.v4.widget.CircularProgressDrawable;
 import android.view.View;
 
+import androidx.swiperefreshlayout.widget.CircularProgressDrawable;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/chrome/android/feed/feed_java_sources.gni b/chrome/android/feed/feed_java_sources.gni
index 89b12547..41c0b56f 100644
--- a/chrome/android/feed/feed_java_sources.gni
+++ b/chrome/android/feed/feed_java_sources.gni
@@ -10,11 +10,11 @@
     "//components/feed/core/proto:proto_java",
     "//third_party/android_deps:android_support_v7_appcompat_java",
     "//third_party/android_deps:androidx_collection_collection_java",
+    "//third_party/android_deps:androidx_swiperefreshlayout_swiperefreshlayout_java",
     "//third_party/android_deps:com_android_support_cardview_v7_java",
     "//third_party/android_deps:com_android_support_interpolator_java",
     "//third_party/android_deps:com_android_support_recyclerview_v7_java",
     "//third_party/android_deps:com_android_support_support_annotations_java",
-    "//third_party/android_deps:com_android_support_swiperefreshlayout_java",
     "//third_party/android_deps:com_google_protobuf_protobuf_lite_java",
     "//third_party/android_deps:javax_inject_javax_inject_java",
     "//third_party/jsr-305:jsr_305_javalib",
diff --git a/chrome/android/java/res/layout/status_indicator_container.xml b/chrome/android/java/res/layout/status_indicator_container.xml
index d004aa3..1b004a1 100644
--- a/chrome/android/java/res/layout/status_indicator_container.xml
+++ b/chrome/android/java/res/layout/status_indicator_container.xml
@@ -8,14 +8,15 @@
     android:id="@+id/status_indicator"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:background="@android:color/black">
+    android:background="@color/modern_primary_color">
 
     <org.chromium.components.browser_ui.widget.text.TextViewWithCompoundDrawables
         android:id="@+id/status_text"
-        android:layout_width="wrap_content"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_gravity="center"
         android:minHeight="20dp"
         android:textAlignment="center"
-        android:drawablePadding="8dp" />
+        android:drawablePadding="8dp"
+        android:textAppearance="@style/TextAppearance.TextSmall.Primary"/>
 </org.chromium.components.browser_ui.widget.ViewResourceFrameLayout>
diff --git a/chrome/android/java/res/values/colors.xml b/chrome/android/java/res/values/colors.xml
index 5d2125a4..84f6c64 100644
--- a/chrome/android/java/res/values/colors.xml
+++ b/chrome/android/java/res/values/colors.xml
@@ -133,6 +133,10 @@
     <!-- Prefetch article colors -->
     <color name="prefetch_offline_icon_tint_color">@color/modern_grey_500</color>
 
+    <!-- Offline indicator v2 colors -->
+    <color name="offline_indicator_offline_color">@android:color/black</color>
+    <color name="offline_indicator_back_online_color">@color/default_bg_color_blue</color>
+
     <!-- Other colors -->
     <color name="media_viewer_bg">#000000</color>
     <color name="image_viewer_bg">#0E0E0E</color>
diff --git a/chrome/android/java/res_password_change/layout/password_manager_dialog_with_help_button_password_change.xml b/chrome/android/java/res_password_change/layout/password_manager_dialog_with_help_button_password_change.xml
new file mode 100644
index 0000000..2116918
--- /dev/null
+++ b/chrome/android/java/res_password_change/layout/password_manager_dialog_with_help_button_password_change.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2019 The Chromium Authors. All rights reserved.
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file. -->
+
+<org.chromium.chrome.browser.password_manager.PasswordManagerDialogPasswordChangeView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/password_manager_dialog"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:gravity="center">
+
+    <!-- PasswordManagerDialogPasswordChangeView extends ScrollView, which can only have one child.
+         Thus an additional layout to wrap everything is needed. -->
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingBottom="22dp"
+        android:orientation="vertical">
+
+        <org.chromium.ui.widget.ChromeImageButton
+            android:id="@+id/password_dialog_help_button"
+            android:layout_height="48dp"
+            android:layout_width="48dp"
+            android:layout_marginTop="4dp"
+            android:layout_marginEnd="4dp"
+            android:layout_gravity="end"
+            android:background="?attr/selectableItemBackground"
+            app:srcCompat="@drawable/ic_help_and_feedback"
+            android:contentDescription="@string/help"
+            android:visibility="gone"/>
+
+        <ImageView
+            android:id="@+id/password_manager_dialog_illustration"
+            android:layout_width="match_parent"
+            android:layout_height="140dp"
+            android:layout_marginStart="@dimen/password_manager_dialog_illustration_margin"
+            android:layout_marginEnd="@dimen/password_manager_dialog_illustration_margin"
+            android:adjustViewBounds="true"
+            android:scaleType="fitCenter"
+            tools:ignore="ContentDescription" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <TextView
+                android:id="@+id/password_manager_dialog_title"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:layout_marginStart="@dimen/password_manager_dialog_text_margin"
+                android:layout_marginEnd="@dimen/password_manager_dialog_text_margin"
+                android:paddingTop="@dimen/password_manager_dialog_title_padding_top"
+                android:textAppearance="@style/TextAppearance.Headline.Primary" />
+
+            <org.chromium.ui.widget.ChromeImageButton
+                android:id="@+id/password_dialog_inline_help_button"
+                android:layout_height="48dp"
+                android:layout_width="48dp"
+                android:layout_weight="0"
+                android:layout_marginTop="4dp"
+                android:layout_marginEnd="4dp"
+                android:background="?attr/selectableItemBackground"
+                app:srcCompat ="@drawable/ic_help_and_feedback"
+                android:visibility="gone"/>
+        </LinearLayout>
+
+        <org.chromium.ui.widget.TextViewWithLeading
+            android:id="@+id/password_manager_dialog_details"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="@dimen/password_manager_dialog_text_margin"
+            android:layout_marginEnd="@dimen/password_manager_dialog_text_margin"
+            android:layout_marginTop="@dimen/password_manager_dialog_details_padding_top"
+            android:textAppearance="@style/TextAppearance.TextMedium.Secondary"
+            app:leading="@dimen/text_size_medium_leading" />
+    </LinearLayout>
+</org.chromium.chrome.browser.password_manager.PasswordManagerDialogPasswordChangeView>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderSelectActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderSelectActivity.java
index 835fb818..36d0c84 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderSelectActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderSelectActivity.java
@@ -8,7 +8,6 @@
 import android.content.Intent;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
-import android.support.graphics.drawable.VectorDrawableCompat;
 import android.support.v4.view.ViewCompat;
 import android.support.v7.content.res.AppCompatResources;
 import android.support.v7.widget.Toolbar;
@@ -22,6 +21,8 @@
 import android.widget.ListView;
 import android.widget.TextView;
 
+import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
+
 import org.chromium.base.IntentUtils;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.SynchronousInitializationActivity;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataTabsFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataTabsFragment.java
index 6ca4d2d..f8484f8eb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataTabsFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataTabsFragment.java
@@ -9,7 +9,6 @@
 // TODO(bjoyce): Need to convert tablayout to androidx after viewpager
 // and fragmentpageradatper are converted.
 import android.support.design.widget.TabLayout;
-import android.support.graphics.drawable.VectorDrawableCompat;
 import android.support.v4.app.Fragment;
 import android.support.v4.app.FragmentManager;
 import android.support.v4.app.FragmentPagerAdapter;
@@ -23,6 +22,8 @@
 import android.view.View;
 import android.view.ViewGroup;
 
+import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
+
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.help.HelpAndFeedback;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/datareduction/settings/DataReductionPreferenceFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/datareduction/settings/DataReductionPreferenceFragment.java
index 70e9275..eabde1a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/datareduction/settings/DataReductionPreferenceFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/datareduction/settings/DataReductionPreferenceFragment.java
@@ -7,12 +7,13 @@
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.os.Bundle;
-import android.support.graphics.drawable.VectorDrawableCompat;
 import android.support.v7.preference.PreferenceFragmentCompat;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
 
+import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
+
 import org.chromium.base.CommandLine;
 import org.chromium.base.IntentUtils;
 import org.chromium.chrome.R;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/datareduction/settings/DataReductionStatsPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/datareduction/settings/DataReductionStatsPreference.java
index 757c6fc..f4ac454ac 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/datareduction/settings/DataReductionStatsPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/datareduction/settings/DataReductionStatsPreference.java
@@ -14,7 +14,6 @@
 import android.annotation.SuppressLint;
 import android.content.Context;
 import android.content.DialogInterface;
-import android.support.graphics.drawable.VectorDrawableCompat;
 import android.support.v7.app.AlertDialog;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceViewHolder;
@@ -29,6 +28,7 @@
 import android.widget.TextView;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
 
 import org.chromium.base.Callback;
 import org.chromium.base.Log;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/device_dialog/BluetoothChooserDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/device_dialog/BluetoothChooserDialog.java
index 8070c0f..66e389d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/device_dialog/BluetoothChooserDialog.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/device_dialog/BluetoothChooserDialog.java
@@ -14,7 +14,6 @@
 import android.content.res.Resources;
 import android.graphics.drawable.Drawable;
 import android.location.LocationManager;
-import android.support.graphics.drawable.VectorDrawableCompat;
 import android.support.v4.graphics.drawable.DrawableCompat;
 import android.support.v7.content.res.AppCompatResources;
 import android.text.SpannableString;
@@ -23,6 +22,7 @@
 
 import androidx.annotation.IntDef;
 import androidx.annotation.VisibleForTesting;
+import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
 
 import org.chromium.base.Log;
 import org.chromium.base.annotations.CalledByNative;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/view/AutoAnimatorDrawable.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/view/AutoAnimatorDrawable.java
index 17f8ee8..e1a32b96 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/view/AutoAnimatorDrawable.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/view/AutoAnimatorDrawable.java
@@ -13,10 +13,10 @@
 import android.graphics.drawable.RotateDrawable;
 import android.graphics.drawable.ScaleDrawable;
 import android.os.Build;
-import android.support.graphics.drawable.Animatable2Compat;
 import android.support.v7.graphics.drawable.DrawableWrapper;
 
 import androidx.annotation.Nullable;
+import androidx.vectordrawable.graphics.drawable.Animatable2Compat;
 
 import org.chromium.base.task.PostTask;
 import org.chromium.content_public.browser.UiThreadTaskTraits;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/view/SelectionView.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/view/SelectionView.java
index a81c27b..b901a84 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/view/SelectionView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/view/SelectionView.java
@@ -5,12 +5,13 @@
 package org.chromium.chrome.browser.download.home.view;
 
 import android.content.Context;
-import android.support.graphics.drawable.AnimatedVectorDrawableCompat;
 import android.util.AttributeSet;
 import android.view.LayoutInflater;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
 
+import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat;
+
 import org.chromium.chrome.R;
 
 /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryItemView.java b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryItemView.java
index f69c3b46..d67f934 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryItemView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryItemView.java
@@ -7,7 +7,6 @@
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.drawable.Drawable;
-import android.support.graphics.drawable.VectorDrawableCompat;
 import android.support.v4.view.ViewCompat;
 import android.support.v7.content.res.AppCompatResources;
 import android.util.AttributeSet;
@@ -16,6 +15,7 @@
 import android.widget.ImageView.ScaleType;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
 
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.R;
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 59809bce..2d8862d9 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
@@ -5,14 +5,14 @@
 package org.chromium.chrome.browser.infobar;
 
 import android.graphics.drawable.Drawable;
-import android.support.graphics.drawable.Animatable2Compat;
-import android.support.graphics.drawable.AnimatedVectorDrawableCompat;
-import android.support.graphics.drawable.VectorDrawableCompat;
 import android.support.v4.view.ViewCompat;
 import android.view.View;
 import android.widget.TextView;
 
 import androidx.annotation.Nullable;
+import androidx.vectordrawable.graphics.drawable.Animatable2Compat;
+import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat;
+import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
 
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.NativeMethods;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
index 370488d..690fd49 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
@@ -19,6 +19,7 @@
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
+import android.view.WindowManager;
 import android.view.inputmethod.InputMethodManager;
 import android.widget.FrameLayout;
 import android.widget.ImageButton;
@@ -82,6 +83,8 @@
 public class LocationBarLayout extends FrameLayout
         implements OnClickListener, LocationBar, AutocompleteDelegate, FakeboxDelegate,
                    VoiceRecognitionHandler.Delegate, AssistantVoiceSearchService.Observer {
+    private static final int KEYBOARD_HIDE_DELAY_MS = 150;
+    private static final int KEYBOARD_MODE_CHANGE_DELAY_MS = 300;
 
     protected ImageButton mDeleteButton;
     protected ImageButton mMicButton;
@@ -121,6 +124,7 @@
     protected CompositeTouchDelegate mCompositeTouchDelegate;
 
     private AssistantVoiceSearchService mAssistantVoiceSearchService;
+    private Runnable mKeyboardResizeModeTask;
 
     /**
      * Class to handle input from a hardware keyboard when the focus is on the URL bar. In
@@ -174,28 +178,27 @@
         mUrlCoordinator = new UrlBarCoordinator((UrlBar) mUrlBar);
         mUrlCoordinator.setDelegate(this);
 
-        OmniboxSuggestionListEmbedder embedder =
-                new OmniboxSuggestionListEmbedder() {
-                    @Override
-                    public boolean isTablet() {
-                        return mIsTablet;
-                    }
+        OmniboxSuggestionListEmbedder embedder = new OmniboxSuggestionListEmbedder() {
+            @Override
+            public boolean isTablet() {
+                return mIsTablet;
+            }
 
-                    @Override
-                    public WindowDelegate getWindowDelegate() {
-                        return mWindowDelegate;
-                    }
+            @Override
+            public WindowDelegate getWindowDelegate() {
+                return mWindowDelegate;
+            }
 
-                    @Override
-                    public View getAnchorView() {
-                        return getRootView().findViewById(R.id.toolbar);
-                    }
+            @Override
+            public View getAnchorView() {
+                return getRootView().findViewById(R.id.toolbar);
+            }
 
-                    @Override
-                    public View getAlignmentView() {
-                        return mIsTablet ? LocationBarLayout.this : null;
-                    }
-                };
+            @Override
+            public View getAlignmentView() {
+                return mIsTablet ? LocationBarLayout.this : null;
+            }
+        };
         mAutocompleteCoordinator = AutocompleteCoordinatorFactory.createAutocompleteCoordinator(
                 this, this, embedder, mUrlCoordinator);
         addUrlFocusChangeListener(mAutocompleteCoordinator);
@@ -293,14 +296,6 @@
         mUrlCoordinator.setAllowFocus(focusable);
     }
 
-    /**
-     * @return The WindowDelegate for the LocationBar. This should be used for all Window related
-     * state queries.
-     */
-    protected WindowDelegate getWindowDelegate() {
-        return mWindowDelegate;
-    }
-
     @Override
     public AutocompleteCoordinator getAutocompleteCoordinator() {
         return mAutocompleteCoordinator;
@@ -522,6 +517,7 @@
      * @param hasFocus Whether focus was gained.
      */
     protected void handleUrlFocusAnimation(boolean hasFocus) {
+        removeCallbacks(mKeyboardResizeModeTask);
         if (hasFocus) mUrlFocusedWithoutAnimations = false;
         for (UrlFocusChangeListener listener : mUrlFocusChangeListeners) {
             listener.onUrlFocusChange(hasFocus);
@@ -1182,4 +1178,53 @@
                 mAssistantVoiceSearchService.getMicButtonColorStateList(primaryColor, getContext());
         ApiCompatibilityUtils.setImageTintList(mMicButton, colorStateList);
     }
+
+    /**
+     * Handles any actions to be performed after all other actions triggered by the URL focus
+     * change.  This will be called after any animations are performed to transition from one
+     * focus state to the other.
+     * @param hasFocus Whether the URL field has gained focus.
+     */
+    protected void finishUrlFocusChange(boolean hasFocus) {
+        if (!hasFocus) {
+            // The animation rendering may not yet be 100% complete and hiding the keyboard makes
+            // the animation quite choppy.
+            postDelayed(() -> getWindowAndroid().getKeyboardDelegate().hideKeyboard(mUrlBar),
+                    KEYBOARD_HIDE_DELAY_MS);
+            // Convert the keyboard back to resize mode (delay the change for an arbitrary amount
+            // of time in hopes the keyboard will be completely hidden before making this change).
+            setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE, true);
+        } else {
+            setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN, false);
+            getWindowAndroid().getKeyboardDelegate().showKeyboard(mUrlBar);
+        }
+        mStatusViewCoordinator.onUrlAnimationFinished(hasFocus);
+        setUrlFocusChangeInProgress(false);
+        updateShouldAnimateIconChanges();
+    }
+
+    /**
+     * @param softInputMode The software input resize mode.
+     * @param delay Delay the change in input mode.
+     */
+    private void setSoftInputMode(final int softInputMode, boolean delay) {
+        if (mKeyboardResizeModeTask != null) {
+            removeCallbacks(mKeyboardResizeModeTask);
+            mKeyboardResizeModeTask = null;
+        }
+
+        if (mWindowDelegate == null || mWindowDelegate.getWindowSoftInputMode() == softInputMode) {
+            return;
+        }
+
+        if (delay) {
+            mKeyboardResizeModeTask = () -> {
+                mWindowDelegate.setWindowSoftInputMode(softInputMode);
+                mKeyboardResizeModeTask = null;
+            };
+            postDelayed(mKeyboardResizeModeTask, KEYBOARD_MODE_CHANGE_DELAY_MS);
+        } else {
+            mWindowDelegate.setWindowSoftInputMode(softInputMode);
+        }
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarPhone.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarPhone.java
index 0b93ad4..f22f548c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarPhone.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarPhone.java
@@ -12,10 +12,8 @@
 import android.util.AttributeSet;
 import android.view.TouchDelegate;
 import android.view.View;
-import android.view.WindowManager;
 
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.WindowDelegate;
 import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
 import org.chromium.chrome.browser.ntp.NewTabPage;
 import org.chromium.chrome.browser.omnibox.status.StatusView;
@@ -27,17 +25,12 @@
  * A location bar implementation specific for smaller/phone screens.
  */
 public class LocationBarPhone extends LocationBarLayout {
-    private static final int KEYBOARD_MODE_CHANGE_DELAY_MS = 300;
-    private static final int KEYBOARD_HIDE_DELAY_MS = 150;
-
     private static final int ACTION_BUTTON_TOUCH_OVERFLOW_LEFT = 15;
 
     private View mFirstVisibleFocusedView;
     private View mUrlBar;
     private StatusView mStatusView;
 
-    private Runnable mKeyboardResizeModeTask;
-
     /**
      * Constructor used to inflate from XML.
      */
@@ -305,34 +298,13 @@
         return retVal;
     }
 
-    /**
-     * Handles any actions to be performed after all other actions triggered by the URL focus
-     * change.  This will be called after any animations are performed to transition from one
-     * focus state to the other.
-     * @param hasFocus Whether the URL field has gained focus.
-     */
+    @Override
     public void finishUrlFocusChange(boolean hasFocus) {
+        super.finishUrlFocusChange(hasFocus);
         if (!hasFocus) {
-            // The animation rendering may not yet be 100% complete and hiding the keyboard makes
-            // the animation quite choppy.
-            postDelayed(new Runnable() {
-                @Override
-                public void run() {
-                    getWindowAndroid().getKeyboardDelegate().hideKeyboard(mUrlBar);
-                }
-            }, KEYBOARD_HIDE_DELAY_MS);
-            // Convert the keyboard back to resize mode (delay the change for an arbitrary amount
-            // of time in hopes the keyboard will be completely hidden before making this change).
-            setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE, true);
             mUrlActionContainer.setVisibility(GONE);
-        } else {
-            setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN, false);
-            getWindowAndroid().getKeyboardDelegate().showKeyboard(mUrlBar);
         }
         updateUrlBarPaddingForSearchEngineIcon();
-        mStatusViewCoordinator.onUrlAnimationFinished(hasFocus);
-        setUrlFocusChangeInProgress(false);
-        updateShouldAnimateIconChanges();
     }
 
     @Override
@@ -352,34 +324,6 @@
         mStatusViewCoordinator.setShowIconsWhenUrlFocused(showIcon);
     }
 
-    /**
-     * @param softInputMode The software input resize mode.
-     * @param delay Delay the change in input mode.
-     */
-    private void setSoftInputMode(final int softInputMode, boolean delay) {
-        final WindowDelegate delegate = getWindowDelegate();
-
-        if (mKeyboardResizeModeTask != null) {
-            removeCallbacks(mKeyboardResizeModeTask);
-            mKeyboardResizeModeTask = null;
-        }
-
-        if (delegate == null || delegate.getWindowSoftInputMode() == softInputMode) return;
-
-        if (delay) {
-            mKeyboardResizeModeTask = new Runnable() {
-                @Override
-                public void run() {
-                    delegate.setWindowSoftInputMode(softInputMode);
-                    mKeyboardResizeModeTask = null;
-                }
-            };
-            postDelayed(mKeyboardResizeModeTask, KEYBOARD_MODE_CHANGE_DELAY_MS);
-        } else {
-            delegate.setWindowSoftInputMode(softInputMode);
-        }
-    }
-
     private int getAdditionalOffsetForNTP() {
         return getResources().getDimensionPixelSize(R.dimen.sei_search_box_lateral_padding)
                 - getResources().getDimensionPixelSize(R.dimen.sei_location_bar_lateral_padding);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarTablet.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarTablet.java
index 585ba25..3e74e85 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarTablet.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarTablet.java
@@ -13,7 +13,6 @@
 import android.util.Property;
 import android.view.MotionEvent;
 import android.view.View;
-import android.view.WindowManager;
 
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.download.DownloadUtils;
@@ -31,7 +30,6 @@
  * Location bar for tablet form factors.
  */
 public class LocationBarTablet extends LocationBarLayout {
-    private static final int KEYBOARD_MODE_CHANGE_DELAY_MS = 300;
     private static final long MAX_NTP_KEYBOARD_FOCUS_DURATION_MS = 200;
 
     private static final int ICON_FADE_ANIMATION_DURATION_MS = 150;
@@ -65,14 +63,6 @@
                 }
             };
 
-    private final Runnable mKeyboardResizeModeTask = new Runnable() {
-        @Override
-        public void run() {
-            getWindowDelegate().setWindowSoftInputMode(
-                    WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
-        }
-    };
-
     private View mLocationBarIcon;
     private View mBookmarkButton;
     private View mSaveOfflineButton;
@@ -160,8 +150,6 @@
     public void handleUrlFocusAnimation(final boolean hasFocus) {
         super.handleUrlFocusAnimation(hasFocus);
 
-        removeCallbacks(mKeyboardResizeModeTask);
-
         if (mUrlFocusChangeAnimator != null && mUrlFocusChangeAnimator.isRunning()) {
             mUrlFocusChangeAnimator.cancel();
             mUrlFocusChangeAnimator = null;
@@ -195,29 +183,6 @@
         mUrlFocusChangeAnimator.start();
     }
 
-    private void finishUrlFocusChange(boolean hasFocus) {
-        // Report focus change early to trigger animations.
-        mStatusViewCoordinator.onUrlFocusChange(hasFocus);
-        if (hasFocus) {
-            if (getWindowDelegate().getWindowSoftInputMode()
-                    != WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN) {
-                getWindowDelegate().setWindowSoftInputMode(
-                        WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
-            }
-            getWindowAndroid().getKeyboardDelegate().showKeyboard(mUrlBar);
-        } else {
-            getWindowAndroid().getKeyboardDelegate().hideKeyboard(mUrlBar);
-            // Convert the keyboard back to resize mode (delay the change for an arbitrary
-            // amount of time in hopes the keyboard will be completely hidden before making
-            // this change).
-            if (getWindowDelegate().getWindowSoftInputMode()
-                    != WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE) {
-                postDelayed(mKeyboardResizeModeTask, KEYBOARD_MODE_CHANGE_DELAY_MS);
-            }
-        }
-        setUrlFocusChangeInProgress(false);
-    }
-
     /**
      * @param shouldShowButtons Whether buttons should be displayed in the URL bar when it's not
      *                          focused.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilder.java b/chrome/android/java/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilder.java
index ed3f40cb..34cffd48 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilder.java
@@ -212,7 +212,8 @@
     private Runnable createPermissionClickCallback(
             Intent intentOverride, String[] androidPermissions) {
         return () -> {
-            if (intentOverride == null && mPermissionDelegate != null) {
+            if (intentOverride == null && androidPermissions != null
+                    && mPermissionDelegate != null) {
                 // Try and immediately request missing Android permissions where possible.
                 for (int i = 0; i < androidPermissions.length; i++) {
                     if (!mPermissionDelegate.canRequestPermission(androidPermissions[i])) continue;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/CredentialLeakDialogPasswordChangeBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/CredentialLeakDialogPasswordChangeBridge.java
new file mode 100644
index 0000000..715c821
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/CredentialLeakDialogPasswordChangeBridge.java
@@ -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.
+package org.chromium.chrome.browser.password_manager;
+
+import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.chrome.browser.help.HelpAndFeedback;
+import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.tab.TabImpl;
+import org.chromium.ui.base.WindowAndroid;
+import org.chromium.ui.modaldialog.DialogDismissalCause;
+
+import java.lang.ref.WeakReference;
+
+// TODO (crbug/1058764) Unfork credential leak dialog password change when prototype is done.
+/**
+ * JNI call glue between the native password manager CredentialLeak class and
+ * Java objects.
+ */
+public class CredentialLeakDialogPasswordChangeBridge {
+    private long mNativeCredentialLeakDialogPasswordChangeViewAndroid;
+    private final PasswordManagerDialogPasswordChangeCoordinator mCredentialLeakDialog;
+    private final WeakReference<ChromeActivity> mActivity;
+
+    private CredentialLeakDialogPasswordChangeBridge(
+            WindowAndroid windowAndroid, long nativeCredentialLeakDialogPasswordChangeViewAndroid) {
+        mNativeCredentialLeakDialogPasswordChangeViewAndroid =
+                nativeCredentialLeakDialogPasswordChangeViewAndroid;
+        ChromeActivity activity = (ChromeActivity) windowAndroid.getActivity().get();
+        mActivity = new WeakReference<>(activity);
+        mCredentialLeakDialog = new PasswordManagerDialogPasswordChangeCoordinator(
+                activity.getModalDialogManager(), activity.findViewById(android.R.id.content),
+                activity.getFullscreenManager(), activity.getControlContainerHeightResource());
+    }
+
+    @CalledByNative
+    public static CredentialLeakDialogPasswordChangeBridge create(
+            WindowAndroid windowAndroid, long nativeDialog) {
+        return new CredentialLeakDialogPasswordChangeBridge(windowAndroid, nativeDialog);
+    }
+
+    @CalledByNative
+    public void showDialog(String credentialLeakTitle, String credentialLeakDetails,
+            String positiveButton, String negativeButton) {
+        if (mActivity.get() == null) return;
+
+        PasswordManagerDialogPasswordChangeContents contents =
+                new PasswordManagerDialogPasswordChangeContents(credentialLeakTitle,
+                        credentialLeakDetails, R.drawable.password_check_warning, positiveButton,
+                        negativeButton, this::onClick);
+        contents.setPrimaryButtonFilled(negativeButton != null);
+        contents.setHelpButtonCallback(this::showHelpArticle);
+
+        mCredentialLeakDialog.initialize(mActivity.get(), contents);
+        mCredentialLeakDialog.showDialog();
+    }
+
+    @CalledByNative
+    private void destroy() {
+        mNativeCredentialLeakDialogPasswordChangeViewAndroid = 0;
+        mCredentialLeakDialog.dismissDialog(DialogDismissalCause.DISMISSED_BY_NATIVE);
+    }
+
+    private void onClick(@DialogDismissalCause int dismissalCause) {
+        if (mNativeCredentialLeakDialogPasswordChangeViewAndroid == 0) return;
+        switch (dismissalCause) {
+            case DialogDismissalCause.POSITIVE_BUTTON_CLICKED:
+                CredentialLeakDialogPasswordChangeBridgeJni.get().accepted(
+                        mNativeCredentialLeakDialogPasswordChangeViewAndroid,
+                        CredentialLeakDialogPasswordChangeBridge.this);
+                return;
+            case DialogDismissalCause.NEGATIVE_BUTTON_CLICKED:
+                CredentialLeakDialogPasswordChangeBridgeJni.get().cancelled(
+                        mNativeCredentialLeakDialogPasswordChangeViewAndroid,
+                        CredentialLeakDialogPasswordChangeBridge.this);
+                return;
+            default:
+                CredentialLeakDialogPasswordChangeBridgeJni.get().closed(
+                        mNativeCredentialLeakDialogPasswordChangeViewAndroid,
+                        CredentialLeakDialogPasswordChangeBridge.this);
+        }
+    }
+
+    private void showHelpArticle() {
+        if (mActivity.get() == null) return;
+
+        Profile profile = ((TabImpl) mActivity.get().getActivityTabProvider().get()).getProfile();
+        HelpAndFeedback.getInstance().show(mActivity.get(),
+                mActivity.get().getString(R.string.help_context_password_leak_detection), profile,
+                null);
+    }
+
+    @NativeMethods
+    interface Natives {
+        void accepted(long nativeCredentialLeakDialogPasswordChangeViewAndroid,
+                CredentialLeakDialogPasswordChangeBridge caller);
+
+        void cancelled(long nativeCredentialLeakDialogPasswordChangeViewAndroid,
+                CredentialLeakDialogPasswordChangeBridge caller);
+
+        void closed(long nativeCredentialLeakDialogPasswordChangeViewAndroid,
+                CredentialLeakDialogPasswordChangeBridge caller);
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogPasswordChangeContents.java b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogPasswordChangeContents.java
new file mode 100644
index 0000000..41f3141
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogPasswordChangeContents.java
@@ -0,0 +1,189 @@
+// 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.password_manager;
+
+import android.support.annotation.IdRes;
+import android.support.annotation.Nullable;
+
+import org.chromium.base.Callback;
+import org.chromium.ui.modaldialog.ModalDialogManager;
+
+// TODO (crbug/1058764) Unfork credential leak dialog password change when prototype is done.
+
+/**
+ * Class containing all data that customizes the contents displayed in the
+ * dialog.
+ */
+public class PasswordManagerDialogPasswordChangeContents {
+    /**
+     * Helper class for range. TODO(crbug.com/1041591): Replace it with
+     * android.util.Range once the minimum API level is 21.
+     */
+    public static class BoldRange {
+        public final int start;
+        public final int end;
+
+        BoldRange(int start, int end) {
+            assert (start <= end);
+            this.start = start;
+            this.end = end;
+        }
+    }
+
+    private final String mTitle;
+    private final String mDetails;
+    private final String mPrimaryButtonText;
+    private final @Nullable String mSecondaryButtonText;
+    private final @IdRes int mIllustrationId;
+    private final Callback<Integer> mButtonClickCallback;
+
+    private boolean mPrimaryButtonFilled;
+    private @Nullable Runnable mHelpButtonCallback;
+    private @ModalDialogManager.ModalDialogType int mDialogType;
+    private BoldRange[] mBoldRanges;
+
+    /**
+     * Constructor for the dialog contents.
+     *
+     * @param title               The title of the dialog, to be displayed below the
+     *                            image.
+     * @param details             The details text to be displayed under the title.
+     * @param illustrationId      The resource id of the image displayed above the
+     *                            title.
+     * @param primaryButtonText   The text of the primary button.
+     * @param secondaryButtonText The text of the secondary button or null if there
+     *                            shouldn't be a secondary button.
+     * @param buttonClickCallback The callback handling the click on the buttons. It
+     *                            takes the type of the button as a parameter.
+     */
+    public PasswordManagerDialogPasswordChangeContents(String title, String details,
+            int illustrationId, String primaryButtonText, @Nullable String secondaryButtonText,
+            Callback<Integer> buttonClickCallback) {
+        mTitle = title;
+        mDetails = details;
+        mPrimaryButtonText = primaryButtonText;
+        mSecondaryButtonText = secondaryButtonText;
+        mIllustrationId = illustrationId;
+        mButtonClickCallback = buttonClickCallback;
+        mPrimaryButtonFilled = false;
+        mHelpButtonCallback = null;
+        mDialogType = ModalDialogManager.ModalDialogType.APP;
+        mBoldRanges = new BoldRange[] {};
+    }
+
+    /**
+     * Sets whether or not the primary button should be displayed as filled.
+     */
+    public void setPrimaryButtonFilled(boolean primaryButtonFilled) {
+        mPrimaryButtonFilled = primaryButtonFilled;
+    }
+
+    /**
+     * Sets a callback to be invoked when the help button is clicked. If left null,
+     * no help button will be displayed.
+     */
+    public void setHelpButtonCallback(Runnable helpButtonCallback) {
+        mHelpButtonCallback = helpButtonCallback;
+    }
+
+    /**
+     * Sets type of the modal dialog to be displayed: app or tab modal.
+     */
+    public void setDialogType(@ModalDialogManager.ModalDialogType int type) {
+        mDialogType = type;
+    }
+
+    /**
+     * Sets the bold ranges in the dialog details.
+     *
+     * @param boldStartRanges The start positions of bold spans in dialog details,
+     *                        inclusive.
+     * @param boldEndRanges   The end positions of bold spans in dialog details,
+     *                        exclusive.
+     */
+    public void setBoldRanges(int[] boldStartRanges, int[] boldEndRanges) {
+        assert (boldStartRanges.length == boldEndRanges.length);
+        mBoldRanges = new BoldRange[boldStartRanges.length];
+        for (int i = 0; i < boldStartRanges.length; i++) {
+            mBoldRanges[i] = new BoldRange(boldStartRanges[i], boldEndRanges[i]);
+        }
+    }
+
+    /**
+     * Returns the title of the dialog. It is also used as content description.
+     */
+    public String getTitle() {
+        return mTitle;
+    }
+
+    /**
+     * Returns the details to be displayed in the dialog under the title.
+     */
+    public String getDetails() {
+        return mDetails;
+    }
+
+    /**
+     * Returns the text displayed in the primary button.
+     */
+    public String getPrimaryButtonText() {
+        return mPrimaryButtonText;
+    }
+
+    /**
+     * Returns the text displayed in the secondary button or null if the dialog has
+     * only one button.
+     */
+    @Nullable
+    public String getSecondaryButtonText() {
+        return mSecondaryButtonText;
+    }
+
+    /**
+     * The resource id of the image displayed above the title.
+     */
+    public @IdRes int getIllustrationId() {
+        return mIllustrationId;
+    }
+
+    /**
+     * The callback invoked when either of the two dialog buttons is clicked.
+     *
+     * @return A {@link Callback} taking an {@link Integer} as a parameter which
+     *         represents which button was clicked.
+     */
+    public Callback getButtonClickCallback() {
+        return mButtonClickCallback;
+    }
+
+    /**
+     * Whether the primary button should be displayed as filled or not.
+     */
+    public boolean isPrimaryButtonFilled() {
+        return mPrimaryButtonFilled;
+    }
+
+    /**
+     * Returns the callback handling the click on the help icon or null if no help
+     * icon should be displayed.
+     */
+    @Nullable
+    public Runnable getHelpButtonCallback() {
+        return mHelpButtonCallback;
+    }
+
+    /**
+     * The type of the dialog: app modal or tab modal.
+     */
+    public @ModalDialogManager.ModalDialogType int getDialogType() {
+        return mDialogType;
+    }
+
+    /**
+     * Returns the bold ranges in the details text.
+     */
+    public BoldRange[] getBoldRanges() {
+        return mBoldRanges;
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogPasswordChangeCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogPasswordChangeCoordinator.java
new file mode 100644
index 0000000..6b73bb1
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogPasswordChangeCoordinator.java
@@ -0,0 +1,91 @@
+// 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.password_manager;
+
+import static org.chromium.chrome.browser.password_manager.PasswordManagerDialogPasswordChangeProperties.DETAILS;
+import static org.chromium.chrome.browser.password_manager.PasswordManagerDialogPasswordChangeProperties.HELP_BUTTON_CALLBACK;
+import static org.chromium.chrome.browser.password_manager.PasswordManagerDialogPasswordChangeProperties.ILLUSTRATION;
+import static org.chromium.chrome.browser.password_manager.PasswordManagerDialogPasswordChangeProperties.TITLE;
+
+import android.content.Context;
+import android.graphics.Typeface;
+import android.text.SpannableString;
+import android.text.Spanned;
+import android.text.style.StyleSpan;
+import android.view.LayoutInflater;
+import android.view.View;
+
+import androidx.annotation.VisibleForTesting;
+
+import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
+import org.chromium.chrome.browser.password_manager.PasswordManagerDialogPasswordChangeContents.BoldRange;
+import org.chromium.chrome.password_change.R;
+import org.chromium.ui.modaldialog.DialogDismissalCause;
+import org.chromium.ui.modaldialog.ModalDialogManager;
+import org.chromium.ui.modaldialog.ModalDialogProperties;
+import org.chromium.ui.modelutil.PropertyModel;
+import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
+
+/**
+ * The coordinator for the password manager illustration modal dialog. Manages
+ * the sub-component objects.
+ */
+
+// TODO (crbug/1058764) Unfork credential leak dialog password change when prototype is done.
+
+public class PasswordManagerDialogPasswordChangeCoordinator {
+    private final PasswordManagerDialogPasswordChangeMediator mMediator;
+    private PropertyModel mModel;
+
+    public PasswordManagerDialogPasswordChangeCoordinator(ModalDialogManager modalDialogManager,
+            View androidContentView, ChromeFullscreenManager fullscreenManager,
+            int containerHeightResource) {
+        mMediator = new PasswordManagerDialogPasswordChangeMediator(
+                new PropertyModel.Builder(ModalDialogProperties.ALL_KEYS), modalDialogManager,
+                androidContentView, fullscreenManager, containerHeightResource);
+    }
+
+    public void initialize(Context context, PasswordManagerDialogPasswordChangeContents contents) {
+        View customView = LayoutInflater.from(context).inflate(
+                R.layout.password_manager_dialog_with_help_button_password_change, null);
+        mModel = buildModel(contents);
+        mMediator.initialize(mModel, customView, contents);
+        PropertyModelChangeProcessor.create(
+                mModel, customView, PasswordManagerDialogPasswordChangeViewBinder::bind);
+    }
+
+    public void showDialog() {
+        mMediator.showDialog();
+    }
+
+    public void dismissDialog(@DialogDismissalCause int dismissalCause) {
+        mMediator.dismissDialog(dismissalCause);
+    }
+
+    private PropertyModel buildModel(PasswordManagerDialogPasswordChangeContents contents) {
+        return PasswordManagerDialogPasswordChangeProperties.defaultModelBuilder()
+                .with(TITLE, contents.getTitle())
+                .with(DETAILS,
+                        addBoldSpanToDetails(contents.getDetails(), contents.getBoldRanges()))
+                .with(ILLUSTRATION, contents.getIllustrationId())
+                .with(HELP_BUTTON_CALLBACK, contents.getHelpButtonCallback())
+                .build();
+    }
+
+    private SpannableString addBoldSpanToDetails(String details, BoldRange[] boldRanges) {
+        SpannableString spannableDetails = new SpannableString(details);
+        for (BoldRange boldRange : boldRanges) {
+            StyleSpan boldSpan = new StyleSpan(Typeface.BOLD);
+            spannableDetails.setSpan(
+                    boldSpan, boldRange.start, boldRange.end, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
+        }
+        return spannableDetails;
+    }
+
+    @VisibleForTesting
+    public PasswordManagerDialogPasswordChangeMediator getMediatorForTesting() {
+        return mMediator;
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogPasswordChangeMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogPasswordChangeMediator.java
new file mode 100644
index 0000000..dc83b2ef
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogPasswordChangeMediator.java
@@ -0,0 +1,139 @@
+// 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.password_manager;
+
+import static org.chromium.chrome.browser.password_manager.PasswordManagerDialogPasswordChangeProperties.ILLUSTRATION_VISIBLE;
+
+import android.content.res.Resources;
+import android.view.View;
+
+import androidx.annotation.VisibleForTesting;
+
+import org.chromium.base.Callback;
+import org.chromium.base.task.PostTask;
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
+import org.chromium.chrome.browser.modaldialog.ChromeTabModalPresenter;
+import org.chromium.content_public.browser.UiThreadTaskTraits;
+import org.chromium.ui.modaldialog.DialogDismissalCause;
+import org.chromium.ui.modaldialog.ModalDialogManager;
+import org.chromium.ui.modaldialog.ModalDialogProperties;
+import org.chromium.ui.modelutil.PropertyModel;
+
+// TODO (crbug/1058764) Unfork credential leak dialog password change when prototype is done.
+
+/**
+ * Mediator class responsible for the logic of showing the password manager
+ * dialog (e.g. onboarding dialog).
+ */
+class PasswordManagerDialogPasswordChangeMediator implements View.OnLayoutChangeListener {
+    private final ModalDialogManager mDialogManager;
+    private final View mAndroidContentView;
+    private final ChromeFullscreenManager mFullscreenManager;
+    private final int mContainerHeightResource;
+
+    private PropertyModel.Builder mHostDialogModelBuilder;
+    private PropertyModel mHostDialogModel;
+    private PropertyModel mModel;
+    private Resources mResources;
+    private @ModalDialogManager.ModalDialogType int mDialogType;
+
+    private static class DialogClickHandler implements ModalDialogProperties.Controller {
+        private Callback<Integer> mCallback;
+
+        DialogClickHandler(Callback<Integer> onClick) {
+            mCallback = onClick;
+        }
+
+        @Override
+        public void onClick(PropertyModel model, int buttonType) {
+            switch (buttonType) {
+                case ModalDialogProperties.ButtonType.POSITIVE:
+                    mCallback.onResult(DialogDismissalCause.POSITIVE_BUTTON_CLICKED);
+                    break;
+                case ModalDialogProperties.ButtonType.NEGATIVE:
+                    mCallback.onResult(DialogDismissalCause.NEGATIVE_BUTTON_CLICKED);
+                    break;
+                default:
+                    assert false : "Unexpected button pressed in dialog: " + buttonType;
+            }
+        }
+
+        @Override
+        public void onDismiss(PropertyModel model, @DialogDismissalCause int dismissalCause) {
+            mCallback.onResult(dismissalCause);
+        }
+    }
+
+    PasswordManagerDialogPasswordChangeMediator(PropertyModel.Builder hostDialogModelBuilder,
+            ModalDialogManager manager, View androidContentView,
+            ChromeFullscreenManager fullscreenManager, int containerHeightResource) {
+        mDialogManager = manager;
+        mHostDialogModelBuilder = hostDialogModelBuilder;
+        mAndroidContentView = androidContentView;
+        mFullscreenManager = fullscreenManager;
+        mContainerHeightResource = containerHeightResource;
+        mAndroidContentView.addOnLayoutChangeListener(this);
+    }
+
+    void initialize(
+            PropertyModel model, View view, PasswordManagerDialogPasswordChangeContents contents) {
+        mResources = view.getResources();
+        mModel = model;
+        mHostDialogModel =
+                mHostDialogModelBuilder.with(ModalDialogProperties.CUSTOM_VIEW, view)
+                        .with(ModalDialogProperties.CONTROLLER,
+                                new DialogClickHandler(contents.getButtonClickCallback()))
+                        .with(ModalDialogProperties.CONTENT_DESCRIPTION, contents.getTitle())
+                        .with(ModalDialogProperties.POSITIVE_BUTTON_TEXT,
+                                contents.getPrimaryButtonText())
+                        .with(ModalDialogProperties.NEGATIVE_BUTTON_TEXT,
+                                contents.getSecondaryButtonText())
+                        .with(ModalDialogProperties.PRIMARY_BUTTON_FILLED,
+                                contents.isPrimaryButtonFilled())
+                        .build();
+        mDialogType = contents.getDialogType();
+    }
+
+    private boolean hasSufficientSpaceForIllustration(int heightPx) {
+        // If |mResources| is null, it means that the dialog was not initialized yet.
+        if (mResources == null) return false;
+        heightPx -=
+                ChromeTabModalPresenter.getContainerTopMargin(mResources, mContainerHeightResource);
+        heightPx -= ChromeTabModalPresenter.getContainerBottomMargin(mFullscreenManager);
+        return heightPx >= mResources.getDimensionPixelSize(
+                       R.dimen.password_manager_dialog_min_vertical_space_to_show_illustration);
+    }
+
+    @Override
+    public void onLayoutChange(View view, int left, int top, int right, int bottom, int oldLeft,
+            int oldTop, int oldRight, int oldBottom) {
+        // Return if the dialog wasn't initialized
+        if (mModel == null) return;
+        int oldHeight = oldBottom - oldTop;
+        int newHeight = bottom - top;
+        if (newHeight == oldHeight) return;
+        PostTask.postTask(UiThreadTaskTraits.DEFAULT, () -> {
+            mModel.set(ILLUSTRATION_VISIBLE, hasSufficientSpaceForIllustration(newHeight));
+        });
+    }
+
+    void showDialog() {
+        mModel.set(ILLUSTRATION_VISIBLE,
+                hasSufficientSpaceForIllustration(mAndroidContentView.getHeight()));
+        mHostDialogModel = mHostDialogModelBuilder.build();
+        mDialogManager.showDialog(mHostDialogModel, mDialogType);
+    }
+
+    void dismissDialog(int dismissalCause) {
+        mDialogManager.dismissDialog(mHostDialogModel, dismissalCause);
+        mAndroidContentView.removeOnLayoutChangeListener(this);
+    }
+
+    @VisibleForTesting
+    public PropertyModel getModelForTesting() {
+        return mModel;
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogPasswordChangeProperties.java b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogPasswordChangeProperties.java
new file mode 100644
index 0000000..8f5b209
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogPasswordChangeProperties.java
@@ -0,0 +1,43 @@
+// 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.password_manager;
+
+import org.chromium.ui.modelutil.PropertyModel;
+import org.chromium.ui.modelutil.PropertyModel.ReadableIntPropertyKey;
+import org.chromium.ui.modelutil.PropertyModel.ReadableObjectPropertyKey;
+import org.chromium.ui.modelutil.PropertyModel.WritableBooleanPropertyKey;
+
+// TODO (crbug/1058764) Unfork credential leak dialog password change when prototype is done.
+
+/**
+ * Data properties for the password manager illustration modal dialog.
+ */
+class PasswordManagerDialogPasswordChangeProperties {
+    // Callback handling clicks on the help button. If present, the button will be
+    // shown.
+    static final ReadableObjectPropertyKey<Runnable> HELP_BUTTON_CALLBACK =
+            new ReadableObjectPropertyKey<>();
+
+    // Illustration drawable resource id for the password manager.
+    static final ReadableIntPropertyKey ILLUSTRATION = new ReadableIntPropertyKey();
+
+    // Boolean indicating whether there is enough space for the illustration to be
+    // shown.
+    static final WritableBooleanPropertyKey ILLUSTRATION_VISIBLE = new WritableBooleanPropertyKey();
+
+    // Title that appears below the illustration.
+    static final ReadableObjectPropertyKey<String> TITLE = new ReadableObjectPropertyKey<>();
+
+    // Multiline explanation text displayed under the illustration.
+    static final ReadableObjectPropertyKey<CharSequence> DETAILS =
+            new ReadableObjectPropertyKey<>();
+
+    private PasswordManagerDialogPasswordChangeProperties() {}
+
+    static PropertyModel.Builder defaultModelBuilder() {
+        return new PropertyModel.Builder(
+                HELP_BUTTON_CALLBACK, ILLUSTRATION, ILLUSTRATION_VISIBLE, TITLE, DETAILS);
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogPasswordChangeView.java b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogPasswordChangeView.java
new file mode 100644
index 0000000..87eeb4fc
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogPasswordChangeView.java
@@ -0,0 +1,89 @@
+// 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.password_manager;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.ScrollView;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+
+import org.chromium.chrome.R;
+import org.chromium.ui.widget.ChromeImageButton;
+
+// TODO (crbug/1058764) Unfork credential leak dialog password change when prototype is done.
+/**
+ * The dialog content view for illustration dialogs used by the password manager
+ * (e.g. onboarding, leak warning).
+ */
+public class PasswordManagerDialogPasswordChangeView extends ScrollView {
+    private @Nullable ChromeImageButton mHelpButtonView;
+    private @Nullable ChromeImageButton mInlineHelpButtonView;
+    private ImageView mIllustrationView;
+    private TextView mTitleView;
+    private TextView mDetailsView;
+
+    public PasswordManagerDialogPasswordChangeView(Context context, @Nullable AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    @Override
+    protected void onFinishInflate() {
+        super.onFinishInflate();
+        mHelpButtonView = findViewById(R.id.password_dialog_help_button);
+        mInlineHelpButtonView = findViewById(R.id.password_dialog_inline_help_button);
+        mIllustrationView = findViewById(R.id.password_manager_dialog_illustration);
+        mTitleView = findViewById(R.id.password_manager_dialog_title);
+        mDetailsView = findViewById(R.id.password_manager_dialog_details);
+    }
+
+    void addHelpButton(Runnable callback) {
+        if (mHelpButtonView == null) return;
+        mHelpButtonView.setOnClickListener(view -> callback.run());
+        mInlineHelpButtonView.setOnClickListener(view -> callback.run());
+        mHelpButtonView.setVisibility(VISIBLE);
+    }
+
+    void setIllustration(int illustration) {
+        mIllustrationView.setImageResource(illustration);
+    }
+
+    public void updateIllustrationVisibility(boolean illustrationVisible) {
+        if (illustrationVisible) {
+            mIllustrationView.setVisibility(VISIBLE);
+        } else {
+            mIllustrationView.setVisibility(GONE);
+        }
+    }
+
+    public void updateHelpIcon(boolean usesInlineIcon) {
+        // There is no help button to update.
+        if (mHelpButtonView == null) return;
+
+        // The inline help icon is displayed on the same line as the title and requires
+        // a different
+        // margin.
+        LinearLayout.LayoutParams layoutParams =
+                (LinearLayout.LayoutParams) mTitleView.getLayoutParams();
+        layoutParams.setMarginEnd(getResources().getDimensionPixelSize(usesInlineIcon
+                        ? R.dimen.password_manager_dialog_title_compact_margin
+                        : R.dimen.password_manager_dialog_text_margin));
+        mTitleView.setLayoutParams(layoutParams);
+
+        mHelpButtonView.setVisibility(usesInlineIcon ? GONE : VISIBLE);
+        mInlineHelpButtonView.setVisibility(usesInlineIcon ? VISIBLE : GONE);
+    }
+
+    void setTitle(String title) {
+        mTitleView.setText(title);
+    }
+
+    void setDetails(CharSequence details) {
+        mDetailsView.setText(details);
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogPasswordChangeViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogPasswordChangeViewBinder.java
new file mode 100644
index 0000000..d2b7e2e
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogPasswordChangeViewBinder.java
@@ -0,0 +1,39 @@
+// 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.password_manager;
+
+import static org.chromium.chrome.browser.password_manager.PasswordManagerDialogPasswordChangeProperties.DETAILS;
+import static org.chromium.chrome.browser.password_manager.PasswordManagerDialogPasswordChangeProperties.HELP_BUTTON_CALLBACK;
+import static org.chromium.chrome.browser.password_manager.PasswordManagerDialogPasswordChangeProperties.ILLUSTRATION;
+import static org.chromium.chrome.browser.password_manager.PasswordManagerDialogPasswordChangeProperties.ILLUSTRATION_VISIBLE;
+import static org.chromium.chrome.browser.password_manager.PasswordManagerDialogPasswordChangeProperties.TITLE;
+
+import android.view.View;
+
+import org.chromium.ui.modelutil.PropertyKey;
+import org.chromium.ui.modelutil.PropertyModel;
+
+// TODO (crbug/1058764) Unfork credential leak dialog password change when prototype is done.
+/**
+ * Class responsible for binding the model and the view.
+ */
+class PasswordManagerDialogPasswordChangeViewBinder {
+    static void bind(PropertyModel model, View view, PropertyKey propertyKey) {
+        PasswordManagerDialogPasswordChangeView dialogView =
+                (PasswordManagerDialogPasswordChangeView) view;
+        if (HELP_BUTTON_CALLBACK == propertyKey) {
+            dialogView.addHelpButton(model.get(HELP_BUTTON_CALLBACK));
+        } else if (ILLUSTRATION == propertyKey) {
+            dialogView.setIllustration(model.get(ILLUSTRATION));
+        } else if (ILLUSTRATION_VISIBLE == propertyKey) {
+            dialogView.updateIllustrationVisibility(model.get(ILLUSTRATION_VISIBLE));
+            dialogView.updateHelpIcon(!model.get(ILLUSTRATION_VISIBLE));
+        } else if (TITLE == propertyKey) {
+            dialogView.setTitle(model.get(TITLE));
+        } else if (DETAILS == propertyKey) {
+            dialogView.setDetails(model.get(DETAILS));
+        }
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/handler/PaymentHandlerCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/handler/PaymentHandlerCoordinator.java
index c1d8ec2..0b95622 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/handler/PaymentHandlerCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/handler/PaymentHandlerCoordinator.java
@@ -12,10 +12,14 @@
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.payments.PaymentsExperimentalFeatures;
 import org.chromium.chrome.browser.payments.handler.toolbar.PaymentHandlerToolbarCoordinator;
+import org.chromium.chrome.browser.thinwebview.ThinWebView;
+import org.chromium.chrome.browser.thinwebview.ThinWebViewConstraints;
+import org.chromium.chrome.browser.thinwebview.ThinWebViewFactory;
 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController;
 import org.chromium.components.embedder_support.view.ContentView;
 import org.chromium.content_public.browser.LoadUrlParams;
 import org.chromium.content_public.browser.WebContents;
+import org.chromium.ui.base.ActivityWindowAndroid;
 import org.chromium.ui.base.ViewAndroidDelegate;
 import org.chromium.ui.modelutil.PropertyModel;
 import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
@@ -93,8 +97,12 @@
         // Observer is designed to set here rather than in the constructor because
         // PaymentHandlerMediator and PaymentHandlerToolbarCoordinator have mutual dependencies.
         mToolbarCoordinator.setObserver(mediator);
+        ThinWebView thinWebView = ThinWebViewFactory.create(
+                activity, new ActivityWindowAndroid(activity), new ThinWebViewConstraints());
+        assert webContentView.getParent() == null;
+        thinWebView.attachWebContents(mWebContents, webContentView);
         PaymentHandlerView view = new PaymentHandlerView(
-                activity, mWebContents, webContentView, mToolbarCoordinator.getView());
+                activity, mWebContents, mToolbarCoordinator.getView(), thinWebView.getView());
         assert mToolbarCoordinator.getToolbarHeightPx() == view.getToolbarHeightPx();
         PropertyModelChangeProcessor changeProcessor =
                 PropertyModelChangeProcessor.create(model, view, PaymentHandlerViewBinder::bind);
@@ -107,6 +115,7 @@
             assert activity.getWindow() != null;
             assert activity.getWindow().getDecorView() != null;
             activity.getWindow().getDecorView().removeOnLayoutChangeListener(mediator);
+            thinWebView.destroy();
             mediator.destroy();
         };
         return bottomSheetController.requestShowContent(view, /*animate=*/true);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/handler/PaymentHandlerView.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/handler/PaymentHandlerView.java
index 4f2ce72..545f798 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/handler/PaymentHandlerView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/handler/PaymentHandlerView.java
@@ -4,6 +4,7 @@
 
 package org.chromium.chrome.browser.payments.handler;
 
+import android.content.Context;
 import android.support.annotation.Nullable;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -11,70 +12,43 @@
 import android.widget.FrameLayout;
 
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.thinwebview.ThinWebView;
-import org.chromium.chrome.browser.thinwebview.ThinWebViewConstraints;
-import org.chromium.chrome.browser.thinwebview.ThinWebViewFactory;
 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetContent;
-import org.chromium.components.embedder_support.view.ContentView;
 import org.chromium.content_public.browser.RenderCoordinates;
 import org.chromium.content_public.browser.WebContents;
-import org.chromium.ui.base.ActivityWindowAndroid;
 
 /**
  * The view of the PaymentHandler UI. This view can be divided into the toolbar area and the
  * content area. The content area does not include the toolbar area; it includes the BottomSheet
  * area below the toolbar, which includes the part that extends beneath the screen. The ThinWebView
- * is designed to fit into the visible part of the content area, called content visible area.
+ * has a fixed height, which is the height of visible content area when the sheet is in full state.
  */
 /* package */ class PaymentHandlerView implements BottomSheetContent {
     private final View mToolbarView;
     private final FrameLayout mContentView;
-    private final ThinWebView mThinWebView;
+    private final View mThinWebView;
     private final WebContents mWebContents;
-    private final int mTabHeight;
     private final int mToolbarHeightPx;
-    private final ChromeActivity mActivity;
 
     /**
      * Construct the PaymentHandlerView.
      *
-     * @param activity The activity where the bottome-sheet should be shown.
+     * @param context The {@link Context} of the Application.
      * @param webContents The web-content of the payment-handler web-app.
-     * @param webContentView The {@link ContentView} that has been constructed with the web-content.
      * @param toolbarView The view of the Payment Handler toolbar.
+     * @param thinWebView The view that shows the WebContents of the payment app.
      */
-    /* package */ PaymentHandlerView(ChromeActivity activity, WebContents webContents,
-            ContentView webContentView, View toolbarView) {
-        mActivity = activity;
+    /* package */ PaymentHandlerView(
+            Context context, WebContents webContents, View toolbarView, View thinWebView) {
         mWebContents = webContents;
-        mTabHeight = mActivity.getActivityTab().getView().getHeight();
         mToolbarView = toolbarView;
+        mThinWebView = thinWebView;
         mToolbarHeightPx =
-                activity.getResources().getDimensionPixelSize(R.dimen.sheet_tab_toolbar_height);
-        mContentView = (FrameLayout) LayoutInflater.from(activity).inflate(
+                context.getResources().getDimensionPixelSize(R.dimen.sheet_tab_toolbar_height);
+        mContentView = (FrameLayout) LayoutInflater.from(context).inflate(
                 R.layout.payment_handler_content, null);
-
-        mThinWebView = ThinWebViewFactory.create(
-                activity, new ActivityWindowAndroid(activity), new ThinWebViewConstraints());
-        initContentView(activity, mThinWebView, webContents, webContentView);
-    }
-
-    /**
-     * Initialize the content view.
-     *
-     * @param activity The activity where the bottome-sheet should be shown.
-     * @param thinWebView The {@link ThinWebView} that was created with the activity.
-     * @param webContents The web-content of the payment-handler web-app.
-     * @param webContentView The {@link ContentView} that has been constructed with the web-content.
-     */
-    private void initContentView(ChromeActivity activity, ThinWebView thinWebView,
-            WebContents webContents, ContentView webContentView) {
-        assert webContentView.getParent() == null;
-        thinWebView.attachWebContents(webContents, webContentView);
         mContentView.setPadding(
                 /*left=*/0, /*top=*/mToolbarHeightPx, /*right=*/0, /*bottom=*/0);
-        mContentView.addView(thinWebView.getView(), /*index=*/0);
+        mContentView.addView(thinWebView, /*index=*/0);
     }
 
     /**
@@ -83,12 +57,9 @@
      *         in pixels.
      */
     /* package */ void onContentVisibleHeightChanged(int heightPx) {
-        // Scale mThinWebView to make the web-content fit into the visible content area of the
-        // PaymentHandler UI.
-        if (mThinWebView.getView() == null || mWebContents.isDestroyed()) return;
-        LayoutParams params = (LayoutParams) mThinWebView.getView().getLayoutParams();
+        LayoutParams params = (LayoutParams) mThinWebView.getLayoutParams();
         params.height = Math.max(0, heightPx);
-        mThinWebView.getView().setLayoutParams(params);
+        mThinWebView.setLayoutParams(params);
     }
 
     /* package */ int getToolbarHeightPx() {
@@ -125,9 +96,7 @@
     }
 
     @Override
-    public void destroy() {
-        mThinWebView.destroy();
-    }
+    public void destroy() {}
 
     @Override
     @ContentPriority
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/PickerBitmapView.java b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/PickerBitmapView.java
index 03e5c9c4..f6607a7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/PickerBitmapView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/PickerBitmapView.java
@@ -14,7 +14,6 @@
 import android.graphics.drawable.AnimationDrawable;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
-import android.support.graphics.drawable.VectorDrawableCompat;
 import android.support.v4.widget.ImageViewCompat;
 import android.support.v7.content.res.AppCompatResources;
 import android.util.AttributeSet;
@@ -29,6 +28,7 @@
 
 import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
+import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
 
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.R;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java
index 501f800..529d5b2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java
@@ -12,7 +12,6 @@
 import android.graphics.BitmapFactory;
 import android.os.Build;
 import android.os.Bundle;
-import android.support.graphics.drawable.VectorDrawableCompat;
 import android.support.v4.app.Fragment;
 import android.support.v4.app.ListFragment;
 import android.support.v7.preference.Preference;
@@ -23,6 +22,7 @@
 import android.view.ViewGroup;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
 
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.R;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/PrivacySettings.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/PrivacySettings.java
index 9d847b4a..4ab04d8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/PrivacySettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/PrivacySettings.java
@@ -5,7 +5,6 @@
 package org.chromium.chrome.browser.settings.privacy;
 
 import android.os.Bundle;
-import android.support.graphics.drawable.VectorDrawableCompat;
 import android.support.v7.preference.CheckBoxPreference;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceFragmentCompat;
@@ -13,6 +12,8 @@
 import android.view.MenuInflater;
 import android.view.MenuItem;
 
+import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
+
 import org.chromium.base.BuildInfo;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.help.HelpAndFeedback;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ChosenObjectSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ChosenObjectSettings.java
index b23087a..65027884 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ChosenObjectSettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ChosenObjectSettings.java
@@ -7,7 +7,6 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.os.Bundle;
-import android.support.graphics.drawable.VectorDrawableCompat;
 import android.support.v4.view.MenuItemCompat;
 import android.support.v7.app.AlertDialog;
 import android.support.v7.preference.Preference;
@@ -20,6 +19,8 @@
 import android.view.View;
 import android.view.inputmethod.EditorInfo;
 
+import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
+
 import org.chromium.base.annotations.RemovableInRelease;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.help.HelpAndFeedback;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SingleCategorySettings.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SingleCategorySettings.java
index 952cafa..fc82646 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SingleCategorySettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SingleCategorySettings.java
@@ -11,7 +11,6 @@
 import android.content.DialogInterface;
 import android.os.Build;
 import android.os.Bundle;
-import android.support.graphics.drawable.VectorDrawableCompat;
 import android.support.v7.app.AlertDialog;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceFragmentCompat;
@@ -34,6 +33,7 @@
 import android.widget.TextView;
 
 import androidx.annotation.Nullable;
+import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
 
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.metrics.RecordUserAction;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorCoordinator.java
index 20fab1c3..fbfece7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorCoordinator.java
@@ -9,6 +9,10 @@
 import android.view.View;
 import android.view.ViewStub;
 
+import androidx.annotation.ColorInt;
+import androidx.annotation.NonNull;
+
+import org.chromium.base.supplier.Supplier;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
 import org.chromium.components.browser_ui.widget.ViewResourceFrameLayout;
@@ -16,8 +20,6 @@
 import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
 import org.chromium.ui.resources.ResourceManager;
 
-import java.util.HashSet;
-
 /**
  * The coordinator for a status indicator that is positioned below the status bar and is persistent.
  * Typically used to relay status, e.g. indicate user is offline.
@@ -29,95 +31,119 @@
          * Called when the height of the status indicator changes.
          * @param newHeight The new height in pixels.
          */
-        void onStatusIndicatorHeightChanged(int newHeight);
+        default void onStatusIndicatorHeightChanged(int newHeight) {}
+
+        /**
+         * Called when the background color of the status indicator changes.
+         * @param newColor The new color as {@link ColorInt}.
+         */
+        default void onStatusIndicatorColorChanged(@ColorInt int newColor) {}
     }
 
     private StatusIndicatorMediator mMediator;
-    private PropertyModel mModel;
-    private View mView;
     private StatusIndicatorSceneLayer mSceneLayer;
-    private HashSet<StatusIndicatorObserver> mObservers = new HashSet<>();
+    private boolean mIsShowing;
+    private Runnable mRemoveOnLayoutChangeListener;
 
+    /**
+     * Constructs the status indicator.
+     * @param activity The {@link Activity} to find and inflate the status indicator view.
+     * @param resourceManager The {@link ResourceManager} for the status indicator's cc layer.
+     * @param fullscreenManager The {@link ChromeFullscreenManager} to listen to for the changes in
+     *                          controls offsets.
+     * @param statusBarColorWithoutStatusIndicatorSupplier A supplier that will get the status bar
+     *                                                     color without taking the status indicator
+     *                                                     into account.
+     */
     public StatusIndicatorCoordinator(Activity activity, ResourceManager resourceManager,
-            ChromeFullscreenManager fullscreenManager) {
+            ChromeFullscreenManager fullscreenManager,
+            Supplier<Integer> statusBarColorWithoutStatusIndicatorSupplier) {
         // TODO(crbug.com/1005843): Create this view lazily if/when we need it. This is a task for
-        // when we have the public API figured out.
+        // when we have the public API figured out. First, we should avoid inflating the view here
+        // in case it's never used.
         final ViewStub stub = activity.findViewById(R.id.status_indicator_stub);
         ViewResourceFrameLayout root = (ViewResourceFrameLayout) stub.inflate();
-        mView = root;
         mSceneLayer = new StatusIndicatorSceneLayer(root, () -> fullscreenManager);
-        mModel = new PropertyModel.Builder(StatusIndicatorProperties.ALL_KEYS)
-                         .with(StatusIndicatorProperties.ANDROID_VIEW_VISIBILITY, View.GONE)
-                         .with(StatusIndicatorProperties.COMPOSITED_VIEW_VISIBLE, false)
-                         .build();
-        PropertyModelChangeProcessor.create(mModel,
+        PropertyModel model =
+                new PropertyModel.Builder(StatusIndicatorProperties.ALL_KEYS)
+                        .with(StatusIndicatorProperties.ANDROID_VIEW_VISIBILITY, View.GONE)
+                        .with(StatusIndicatorProperties.COMPOSITED_VIEW_VISIBLE, false)
+                        .build();
+        PropertyModelChangeProcessor.create(model,
                 new StatusIndicatorViewBinder.ViewHolder(root, mSceneLayer),
                 StatusIndicatorViewBinder::bind);
-        mMediator = new StatusIndicatorMediator(mModel, fullscreenManager);
-        mObservers.add(mMediator);
+        mMediator = new StatusIndicatorMediator(
+                model, fullscreenManager, statusBarColorWithoutStatusIndicatorSupplier);
         resourceManager.getDynamicResourceLoader().registerResource(
                 root.getId(), root.getResourceAdapter());
+        root.addOnLayoutChangeListener(mMediator);
+        mRemoveOnLayoutChangeListener = () -> root.removeOnLayoutChangeListener(mMediator);
     }
 
-    /**
-     * Set the {@link String} the status indicator should display.
-     * @param statusText The string.
-     */
-    public void setStatusText(String statusText) {
-        mModel.set(StatusIndicatorProperties.STATUS_TEXT, statusText);
+    public void destroy() {
+        mRemoveOnLayoutChangeListener.run();
     }
 
-    /**
-     * Set the {@link Drawable} the status indicator should display next to the status text.
-     * @param statusIcon The icon drawable.
-     */
-    public void setStatusIcon(Drawable statusIcon) {
-        mModel.set(StatusIndicatorProperties.STATUS_ICON, statusIcon);
-    }
-
-    // TODO(sinansahin): With animation.
     // TODO(sinansahin): Destroy the view when not needed.
-    /** Show the status indicator. */
-    public void show() {
-        mModel.set(StatusIndicatorProperties.ANDROID_VIEW_VISIBILITY, View.INVISIBLE);
-        // TODO(crbug.com/1005843): We will need a measure pass before we can get the real height of
-        // this view. We should keep this in mind when inflating the view lazily.
-        mView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
-            @Override
-            public void onLayoutChange(View v, int left, int top, int right, int bottom,
-                    int oldLeft, int oldTop, int oldRight, int oldBottom) {
-                final int height = v.getHeight();
-                for (StatusIndicatorObserver observer : mObservers) {
-                    observer.onStatusIndicatorHeightChanged(height);
-                }
-                mView.removeOnLayoutChangeListener(this);
-            }
-        });
+
+    /**
+     * Show the status indicator with the initial properties with animations.
+     *
+     * @param statusText The status string that will be visible on the status indicator.
+     * @param statusIcon The icon {@link Drawable} that will appear next to the status text.
+     * @param backgroundColor The background color for the status indicator and the status bar.
+     * @param textColor Status text color.
+     * @param iconTint Status icon tint.
+     */
+    public void show(@NonNull String statusText, Drawable statusIcon, @ColorInt int backgroundColor,
+            @ColorInt int textColor, @ColorInt int iconTint) {
+        // TODO(sinansahin): Once we've moved the connectivity detection code to a separate class,
+        // we should make sure #show(), #updateContent(), and #hide() are called correctly there,
+        // e.g. show shouldn't be called if we're already showing. Then, we can turn these if checks
+        // into asserts.
+        if (mIsShowing) return;
+        mIsShowing = true;
+
+        mMediator.animateShow(statusText, statusIcon, backgroundColor, textColor, iconTint);
     }
 
-    // TODO(sinansahin): With animation as well.
-    /** Hide the status indicator. */
+    /**
+     * Update the status indicator text, icon and colors with animations. All of the properties will
+     * be animated even if only one property changes. Support to animate a single property may be
+     * added in the future if needed.
+     *
+     * @param statusText The string that will replace the current text.
+     * @param statusIcon The icon that will replace the current icon.
+     * @param backgroundColor The color that will replace the status indicator background color.
+     * @param textColor The new text color to fit the new background.
+     * @param iconTint The new icon tint to fit the background.
+     * @param animationCompleteCallback The callback that will be run once the animations end.
+     */
+    public void updateContent(@NonNull String statusText, Drawable statusIcon,
+            @ColorInt int backgroundColor, @ColorInt int textColor, @ColorInt int iconTint,
+            Runnable animationCompleteCallback) {
+        if (!mIsShowing) return;
+
+        mMediator.animateUpdate(statusText, statusIcon, backgroundColor, textColor, iconTint,
+                animationCompleteCallback);
+    }
+
+    /**
+     * Hide the status indicator with animations.
+     */
     public void hide() {
-        mModel.set(StatusIndicatorProperties.ANDROID_VIEW_VISIBILITY, View.GONE);
-        for (StatusIndicatorObserver observer : mObservers) {
-            observer.onStatusIndicatorHeightChanged(0);
-        }
+        if (!mIsShowing) return;
+        mIsShowing = false;
+
+        mMediator.animateHide();
     }
 
     public void addObserver(StatusIndicatorObserver observer) {
-        mObservers.add(observer);
+        mMediator.addObserver(observer);
     }
 
     public void removeObserver(StatusIndicatorObserver observer) {
-        mObservers.remove(observer);
-    }
-
-    /**
-     * Is the status indicator currently visible.
-     * @return True if visible.
-     */
-    public boolean isVisible() {
-        return mModel.get(StatusIndicatorProperties.COMPOSITED_VIEW_VISIBLE);
+        mMediator.removeObserver(observer);
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorMediator.java
index 0897f9f2..68eca90 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorMediator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorMediator.java
@@ -4,22 +4,55 @@
 
 package org.chromium.chrome.browser.status_indicator;
 
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.AnimatorSet;
+import android.animation.ArgbEvaluator;
+import android.animation.ValueAnimator;
+import android.graphics.Color;
+import android.graphics.drawable.Drawable;
 import android.view.View;
 
+import androidx.annotation.ColorInt;
+import androidx.annotation.NonNull;
+
+import org.chromium.base.supplier.Supplier;
 import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
+import org.chromium.components.browser_ui.widget.animation.Interpolators;
 import org.chromium.ui.modelutil.PropertyModel;
 
-class StatusIndicatorMediator implements ChromeFullscreenManager.FullscreenListener,
-                                         StatusIndicatorCoordinator.StatusIndicatorObserver {
+import java.util.HashSet;
+
+class StatusIndicatorMediator
+        implements ChromeFullscreenManager.FullscreenListener, View.OnLayoutChangeListener {
+    private static final int STATUS_BAR_COLOR_TRANSITION_DURATION_MS = 200;
+    private static final int FADE_TEXT_DURATION_MS = 150;
+    private static final int UPDATE_COLOR_TRANSITION_DURATION_MS = 400;
+
     private PropertyModel mModel;
     private ChromeFullscreenManager mFullscreenManager;
-    private int mIndicatorHeight;
+    private HashSet<StatusIndicatorCoordinator.StatusIndicatorObserver> mObservers =
+            new HashSet<>();
+    private Supplier<Integer> mStatusBarWithoutIndicatorColorSupplier;
+    private Runnable mOnCompositorShowAnimationEnd;
 
+    private int mIndicatorHeight;
     private boolean mIsHiding;
 
-    StatusIndicatorMediator(PropertyModel model, ChromeFullscreenManager fullscreenManager) {
+    /**
+     * Constructs the status indicator mediator.
+     * @param model The {@link PropertyModel} for the status indicator.
+     * @param fullscreenManager The {@link ChromeFullscreenManager} to listen to for the changes in
+     *                          controls offsets.
+     * @param statusBarWithoutIndicatorColorSupplier A supplier that will get the status bar color
+     *                                               without taking the status indicator into
+     *                                               account.
+     */
+    StatusIndicatorMediator(PropertyModel model, ChromeFullscreenManager fullscreenManager,
+            Supplier<Integer> statusBarWithoutIndicatorColorSupplier) {
         mModel = model;
         mFullscreenManager = fullscreenManager;
+        mStatusBarWithoutIndicatorColorSupplier = statusBarWithoutIndicatorColorSupplier;
     }
 
     @Override
@@ -30,11 +63,15 @@
         // min-height.
         mModel.set(StatusIndicatorProperties.COMPOSITED_VIEW_VISIBLE, compositedVisible);
 
+        final boolean isCompletelyShown = topControlsMinHeightOffset == mIndicatorHeight;
         // Android view should only be visible when the indicator is fully shown.
         mModel.set(StatusIndicatorProperties.ANDROID_VIEW_VISIBILITY,
-                mIsHiding ? View.GONE
-                          : (topControlsMinHeightOffset == mIndicatorHeight ? View.VISIBLE
-                                                                            : View.INVISIBLE));
+                mIsHiding ? View.GONE : (isCompletelyShown ? View.VISIBLE : View.INVISIBLE));
+
+        if (mOnCompositorShowAnimationEnd != null && isCompletelyShown) {
+            mOnCompositorShowAnimationEnd.run();
+            mOnCompositorShowAnimationEnd = null;
+        }
 
         final boolean doneHiding = !compositedVisible && mIsHiding;
         if (doneHiding) {
@@ -44,7 +81,249 @@
     }
 
     @Override
-    public void onStatusIndicatorHeightChanged(int newHeight) {
+    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft,
+            int oldTop, int oldRight, int oldBottom) {
+        if (mIndicatorHeight == v.getHeight()) return;
+
+        heightChanged(v.getHeight());
+    }
+
+    void addObserver(StatusIndicatorCoordinator.StatusIndicatorObserver observer) {
+        mObservers.add(observer);
+    }
+
+    void removeObserver(StatusIndicatorCoordinator.StatusIndicatorObserver observer) {
+        mObservers.remove(observer);
+    }
+
+    // Animations
+
+    // TODO(sinansahin): We might want to end the running animations if we need to hide before we're
+    // done showing/updating and vice versa.
+
+    /**
+     * Transitions the status bar color to the expected status indicator color background. Also,
+     * initializes other properties, e.g. status text, status icon, and colors.
+     *
+     * These animations are transitioning the status bar color to the provided background color
+     * (skipped if the background is the same as the current status bar color), then sliding in the
+     * status indicator, and then fading in the status text with the icon.
+     *
+     * The animation timeline looks like this:
+     *
+     * Status bar transitions |*--------*
+     * Indicator slides in    |         *--------*
+     * Text fades in          |                  *------*
+     *
+     * @param statusText Status text to show.
+     * @param statusIcon Compound drawable to show next to text.
+     * @param backgroundColor Background color for the indicator.
+     * @param textColor Status text color.
+     * @param iconTint Compound drawable tint.
+     */
+    void animateShow(@NonNull String statusText, Drawable statusIcon, @ColorInt int backgroundColor,
+            @ColorInt int textColor, @ColorInt int iconTint) {
+        Runnable initializeProperties = () -> {
+            mModel.set(StatusIndicatorProperties.STATUS_TEXT, statusText);
+            mModel.set(StatusIndicatorProperties.STATUS_ICON, statusIcon);
+            mModel.set(StatusIndicatorProperties.TEXT_ALPHA, 0.f);
+            mModel.set(StatusIndicatorProperties.BACKGROUND_COLOR, backgroundColor);
+            mModel.set(StatusIndicatorProperties.TEXT_COLOR, textColor);
+            mModel.set(StatusIndicatorProperties.ICON_TINT, iconTint);
+            mModel.set(StatusIndicatorProperties.ANDROID_VIEW_VISIBILITY, View.INVISIBLE);
+            mOnCompositorShowAnimationEnd = () -> animateTextFadeIn();
+        };
+
+        final int statusBarColor = mStatusBarWithoutIndicatorColorSupplier.get();
+        // If we aren't changing the status bar color, skip the status bar color animation and
+        // continue with the rest of the animations.
+        if (statusBarColor == backgroundColor) {
+            initializeProperties.run();
+            return;
+        }
+
+        ValueAnimator animation = ValueAnimator.ofInt(statusBarColor, backgroundColor);
+        animation.setEvaluator(new ArgbEvaluator());
+        animation.setInterpolator(Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR);
+        animation.setDuration(STATUS_BAR_COLOR_TRANSITION_DURATION_MS);
+        animation.addUpdateListener(anim -> {
+            for (StatusIndicatorCoordinator.StatusIndicatorObserver observer : mObservers) {
+                observer.onStatusIndicatorColorChanged((int) anim.getAnimatedValue());
+            }
+        });
+        animation.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                initializeProperties.run();
+            }
+        });
+        animation.start();
+    }
+
+    private void animateTextFadeIn() {
+        ValueAnimator animation = ValueAnimator.ofFloat(0.f, 1.f);
+        animation.setInterpolator(Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR);
+        animation.setDuration(FADE_TEXT_DURATION_MS);
+        animation.addUpdateListener((anim -> {
+            final float currentAlpha = (float) anim.getAnimatedValue();
+            mModel.set(StatusIndicatorProperties.TEXT_ALPHA, currentAlpha);
+        }));
+        animation.start();
+    }
+
+    // TODO(sinansahin): See if/how we can skip some of the animations if the properties didn't
+    // change. This might require UX guidance.
+
+    /**
+     * Updates the contents and background of the status indicator with animations.
+     *
+     * These animations are transitioning the status bar and the background color to the provided
+     * background color while fading out the status text with the icon, and then fading in the new
+     * status text with the icon (with the provided color and tint).
+     *
+     * The animation timeline looks like this:
+     *
+     * Old text fades out               |*------*
+     * Background/status bar transition |*------------------*
+     * New text fades in                |                   *------*
+     *
+     * @param statusText New status text to show.
+     * @param statusIcon New compound drawable to show next to text.
+     * @param backgroundColor New background color for the indicator.
+     * @param textColor New status text color.
+     * @param iconTint New compound drawable tint.
+     * @param animationCompleteCallback Callback to run after the animation is done.
+     */
+    void animateUpdate(@NonNull String statusText, Drawable statusIcon,
+            @ColorInt int backgroundColor, @ColorInt int textColor, @ColorInt int iconTint,
+            Runnable animationCompleteCallback) {
+        final boolean changed =
+                !statusText.equals(mModel.get(StatusIndicatorProperties.STATUS_TEXT))
+                || statusIcon != mModel.get(StatusIndicatorProperties.STATUS_ICON)
+                || backgroundColor != mModel.get(StatusIndicatorProperties.BACKGROUND_COLOR)
+                || textColor != mModel.get(StatusIndicatorProperties.TEXT_COLOR)
+                || iconTint != mModel.get(StatusIndicatorProperties.ICON_TINT);
+        assert changed
+            : "#animateUpdate() shouldn't be called without any change to the status indicator.";
+
+        // 1. Fade out old text.
+        ValueAnimator fadeOldOut = ValueAnimator.ofFloat(1.f, 0.f);
+        fadeOldOut.setInterpolator(Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR);
+        fadeOldOut.setDuration(FADE_TEXT_DURATION_MS);
+        fadeOldOut.addUpdateListener(anim -> {
+            final float currentAlpha = (float) anim.getAnimatedValue();
+            mModel.set(StatusIndicatorProperties.TEXT_ALPHA, currentAlpha);
+        });
+        fadeOldOut.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                mModel.set(StatusIndicatorProperties.STATUS_TEXT, statusText);
+                mModel.set(StatusIndicatorProperties.STATUS_ICON, statusIcon);
+                mModel.set(StatusIndicatorProperties.TEXT_COLOR, textColor);
+                mModel.set(StatusIndicatorProperties.ICON_TINT, iconTint);
+            }
+        });
+
+        // 2. Simultaneously transition the background.
+        ValueAnimator colorAnimation = ValueAnimator.ofInt(
+                mModel.get(StatusIndicatorProperties.BACKGROUND_COLOR), backgroundColor);
+        colorAnimation.setEvaluator(new ArgbEvaluator());
+        colorAnimation.setInterpolator(Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR);
+        colorAnimation.setDuration(UPDATE_COLOR_TRANSITION_DURATION_MS);
+        colorAnimation.addUpdateListener(anim -> {
+            final int currentColor = (int) anim.getAnimatedValue();
+            mModel.set(StatusIndicatorProperties.BACKGROUND_COLOR, currentColor);
+            notifyColorChange(currentColor);
+        });
+
+        // 3. Fade in new text, after #1 and #2 are done.
+        ValueAnimator fadeNewIn = ValueAnimator.ofFloat(0.f, 1.f);
+        fadeNewIn.setInterpolator(Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR);
+        fadeNewIn.setDuration(FADE_TEXT_DURATION_MS);
+        fadeNewIn.addUpdateListener(anim -> {
+            final float currentAlpha = (float) anim.getAnimatedValue();
+            mModel.set(StatusIndicatorProperties.TEXT_ALPHA, currentAlpha);
+        });
+
+        AnimatorSet animatorSet = new AnimatorSet();
+        animatorSet.play(fadeOldOut).with(colorAnimation);
+        animatorSet.play(fadeNewIn).after(colorAnimation);
+        animatorSet.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                animationCompleteCallback.run();
+            }
+        });
+        animatorSet.start();
+    }
+
+    /**
+     * Hide the status indicator with animations.
+     *
+     * These animations are transitioning the status bar and background color to the system color
+     * while fading the text out, and then sliding the indicator out.
+     *
+     * The animation timeline looks like this:
+     *
+     * Status bar and background transition |*--------*
+     * Text fades out                       |*------*
+     * Indicator slides out                 |         *--------*
+     */
+    void animateHide() {
+        // 1. Transition the background.
+        ValueAnimator colorAnimation =
+                ValueAnimator.ofInt(mModel.get(StatusIndicatorProperties.BACKGROUND_COLOR),
+                        mStatusBarWithoutIndicatorColorSupplier.get());
+        colorAnimation.setEvaluator(new ArgbEvaluator());
+        colorAnimation.setInterpolator(Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR);
+        colorAnimation.setDuration(STATUS_BAR_COLOR_TRANSITION_DURATION_MS);
+        colorAnimation.addUpdateListener(anim -> {
+            final int currentColor = (int) anim.getAnimatedValue();
+            mModel.set(StatusIndicatorProperties.BACKGROUND_COLOR, currentColor);
+            notifyColorChange(currentColor);
+        });
+        colorAnimation.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                notifyColorChange(Color.TRANSPARENT);
+            }
+        });
+
+        // 2. Fade out the text simultaneously with #1.
+        ValueAnimator fadeOut = ValueAnimator.ofFloat(1.f, 0.f);
+        fadeOut.setInterpolator(Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR);
+        fadeOut.setDuration(FADE_TEXT_DURATION_MS);
+        fadeOut.addUpdateListener(anim -> mModel.set(
+                StatusIndicatorProperties.TEXT_ALPHA, (float) anim.getAnimatedValue()));
+
+        AnimatorSet animatorSet = new AnimatorSet();
+        animatorSet.play(colorAnimation).with(fadeOut);
+        animatorSet.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                heightChanged(0);
+            }
+        });
+        animatorSet.start();
+    }
+
+    // Observer notifiers
+
+    private void notifyHeightChange(int height) {
+        for (StatusIndicatorCoordinator.StatusIndicatorObserver observer : mObservers) {
+            observer.onStatusIndicatorHeightChanged(height);
+        }
+    }
+
+    private void notifyColorChange(@ColorInt int color) {
+        for (StatusIndicatorCoordinator.StatusIndicatorObserver observer : mObservers) {
+            observer.onStatusIndicatorColorChanged(color);
+        }
+    }
+
+    // Other internal methods
+
+    private void heightChanged(int newHeight) {
         mIndicatorHeight = newHeight;
 
         if (mIndicatorHeight > 0) {
@@ -53,5 +332,7 @@
         } else {
             mIsHiding = true;
         }
+
+        notifyHeightChange(newHeight);
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorProperties.java b/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorProperties.java
index db3571b..b9cc0bce 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorProperties.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorProperties.java
@@ -26,6 +26,19 @@
     static final PropertyModel.WritableBooleanPropertyKey COMPOSITED_VIEW_VISIBLE =
             new PropertyModel.WritableBooleanPropertyKey();
 
-    static final PropertyKey[] ALL_KEYS = new PropertyKey[] {
-            STATUS_TEXT, STATUS_ICON, ANDROID_VIEW_VISIBILITY, COMPOSITED_VIEW_VISIBLE};
+    static final PropertyModel.WritableIntPropertyKey BACKGROUND_COLOR =
+            new PropertyModel.WritableIntPropertyKey();
+
+    static final PropertyModel.WritableFloatPropertyKey TEXT_ALPHA =
+            new PropertyModel.WritableFloatPropertyKey();
+
+    static final PropertyModel.WritableIntPropertyKey TEXT_COLOR =
+            new PropertyModel.WritableIntPropertyKey();
+
+    static final PropertyModel.WritableIntPropertyKey ICON_TINT =
+            new PropertyModel.WritableIntPropertyKey();
+
+    static final PropertyKey[] ALL_KEYS =
+            new PropertyKey[] {STATUS_TEXT, STATUS_ICON, ANDROID_VIEW_VISIBILITY,
+                    COMPOSITED_VIEW_VISIBLE, BACKGROUND_COLOR, TEXT_ALPHA, TEXT_COLOR, ICON_TINT};
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorViewBinder.java
index 9b03762..ab923c3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorViewBinder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorViewBinder.java
@@ -4,10 +4,13 @@
 
 package org.chromium.chrome.browser.status_indicator;
 
+import android.content.res.ColorStateList;
+import android.view.View;
 import android.widget.TextView;
 
 import org.chromium.chrome.R;
 import org.chromium.components.browser_ui.widget.ViewResourceFrameLayout;
+import org.chromium.components.browser_ui.widget.text.TextViewWithCompoundDrawables;
 import org.chromium.ui.modelutil.PropertyKey;
 import org.chromium.ui.modelutil.PropertyModel;
 
@@ -47,6 +50,21 @@
         } else if (StatusIndicatorProperties.ANDROID_VIEW_VISIBILITY == propertyKey) {
             view.javaViewRoot.setVisibility(
                     model.get(StatusIndicatorProperties.ANDROID_VIEW_VISIBILITY));
+        } else if (StatusIndicatorProperties.BACKGROUND_COLOR == propertyKey) {
+            view.javaViewRoot.setBackgroundColor(
+                    model.get(StatusIndicatorProperties.BACKGROUND_COLOR));
+        } else if (StatusIndicatorProperties.TEXT_ALPHA == propertyKey) {
+            final View text = view.javaViewRoot.findViewById(R.id.status_text);
+            text.setAlpha(model.get(StatusIndicatorProperties.TEXT_ALPHA));
+        } else if (StatusIndicatorProperties.TEXT_COLOR == propertyKey) {
+            final TextView text = view.javaViewRoot.findViewById(R.id.status_text);
+            text.setTextColor(model.get(StatusIndicatorProperties.TEXT_COLOR));
+        } else if (StatusIndicatorProperties.ICON_TINT == propertyKey) {
+            final TextViewWithCompoundDrawables text =
+                    view.javaViewRoot.findViewById(R.id.status_text);
+            final ColorStateList tint =
+                    ColorStateList.valueOf(model.get(StatusIndicatorProperties.ICON_TINT));
+            text.setDrawableTintColor(tint);
         } else {
             assert false : "Unhandled property detected in StatusIndicatorViewBinder!";
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileRenderer.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileRenderer.java
index e1a778c..fa64288 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileRenderer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileRenderer.java
@@ -10,13 +10,13 @@
 import android.graphics.BitmapFactory;
 import android.graphics.Color;
 import android.graphics.drawable.BitmapDrawable;
-import android.support.graphics.drawable.VectorDrawableCompat;
 import android.support.v4.graphics.drawable.RoundedBitmapDrawable;
 import android.view.LayoutInflater;
 import android.view.ViewGroup;
 
 import androidx.annotation.LayoutRes;
 import androidx.annotation.VisibleForTesting;
+import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
 
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.Log;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
index 8bd4e6a..b7dd44c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
@@ -4,13 +4,17 @@
 
 package org.chromium.chrome.browser.tabbed_mode;
 
+import android.os.Handler;
+
 import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
+import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.Callback;
 import org.chromium.base.TraceEvent;
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.base.task.PostTask;
+import org.chromium.chrome.R;
 import org.chromium.chrome.browser.AppHooks;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.compositor.layouts.LayoutManager;
@@ -48,6 +52,8 @@
 public class TabbedRootUiCoordinator extends RootUiCoordinator implements NativeInitObserver {
     private static boolean sEnableStatusIndicatorForTests;
 
+    private static final int STATUS_INDICATOR_WAIT_BEFORE_HIDE_DURATION_MS = 2000;
+
     private @Nullable ImmersiveModeManager mImmersiveModeManager;
     private TabbedSystemUiCoordinator mSystemUiCoordinator;
     private @Nullable EmptyBackgroundViewWrapper mEmptyBackgroundViewWrapper;
@@ -82,6 +88,8 @@
 
         if (mStatusIndicatorCoordinator != null) {
             mStatusIndicatorCoordinator.removeObserver(mStatusIndicatorObserver);
+            mStatusIndicatorCoordinator.removeObserver(mActivity.getStatusBarColorController());
+            mStatusIndicatorCoordinator.destroy();
         }
 
         if (mToolbarButtonInProductHelpController != null) {
@@ -174,17 +182,23 @@
 
         final ChromeFullscreenManager fullscreenManager = mActivity.getFullscreenManager();
         mStatusIndicatorCoordinator = new StatusIndicatorCoordinator(mActivity,
-                mActivity.getCompositorViewHolder().getResourceManager(), fullscreenManager);
+                mActivity.getCompositorViewHolder().getResourceManager(), fullscreenManager,
+                mActivity.getStatusBarColorController()::getStatusBarColorWithoutStatusIndicator);
         layoutManager.setStatusIndicatorSceneOverlay(mStatusIndicatorCoordinator.getSceneLayer());
-        mStatusIndicatorObserver = (indicatorHeight -> {
-            final int resourceId = mActivity.getControlContainerHeightResource();
-            final int topControlsNewHeight =
-                    mActivity.getResources().getDimensionPixelSize(resourceId) + indicatorHeight;
-            fullscreenManager.setAnimateBrowserControlsHeightChanges(true);
-            fullscreenManager.setTopControlsHeight(topControlsNewHeight, indicatorHeight);
-            fullscreenManager.setAnimateBrowserControlsHeightChanges(false);
-        });
+        mStatusIndicatorObserver = new StatusIndicatorCoordinator.StatusIndicatorObserver() {
+            @Override
+            public void onStatusIndicatorHeightChanged(int indicatorHeight) {
+                final int resourceId = mActivity.getControlContainerHeightResource();
+                final int topControlsNewHeight =
+                        mActivity.getResources().getDimensionPixelSize(resourceId)
+                        + indicatorHeight;
+                fullscreenManager.setAnimateBrowserControlsHeightChanges(true);
+                fullscreenManager.setTopControlsHeight(topControlsNewHeight, indicatorHeight);
+                fullscreenManager.setAnimateBrowserControlsHeightChanges(false);
+            }
+        };
         mStatusIndicatorCoordinator.addObserver(mStatusIndicatorObserver);
+        mStatusIndicatorCoordinator.addObserver(mActivity.getStatusBarColorController());
 
         // Don't listen to the ConnectivityDetector if the feature is disabled.
         if (!ChromeFeatureList.isEnabled(ChromeFeatureList.OFFLINE_INDICATOR_V2)) {
@@ -194,9 +208,30 @@
         mConnectivityDetector = new ConnectivityDetector((state) -> {
             final boolean offline = state != ConnectivityDetector.ConnectionState.VALIDATED;
             if (offline) {
-                mStatusIndicatorCoordinator.show();
+                final int backgroundColor = ApiCompatibilityUtils.getColor(
+                        mActivity.getResources(), R.color.offline_indicator_offline_color);
+                final int textColor = ApiCompatibilityUtils.getColor(
+                        mActivity.getResources(), R.color.default_text_color_light);
+                final int iconTint = ApiCompatibilityUtils.getColor(
+                        mActivity.getResources(), R.color.default_icon_color_light);
+                mStatusIndicatorCoordinator.show(
+                        mActivity.getString(R.string.offline_indicator_v2_offline_text), null,
+                        backgroundColor, textColor, iconTint);
             } else {
-                mStatusIndicatorCoordinator.hide();
+                final int backgroundColor = ApiCompatibilityUtils.getColor(
+                        mActivity.getResources(), R.color.offline_indicator_back_online_color);
+                final int textColor = ApiCompatibilityUtils.getColor(
+                        mActivity.getResources(), R.color.default_text_color_inverse);
+                final int iconTint = ApiCompatibilityUtils.getColor(
+                        mActivity.getResources(), R.color.default_icon_color_inverse);
+                Runnable hide = () -> {
+                    final Handler handler = new Handler();
+                    handler.postDelayed(() -> mStatusIndicatorCoordinator.hide(),
+                            STATUS_INDICATOR_WAIT_BEFORE_HIDE_DURATION_MS);
+                };
+                mStatusIndicatorCoordinator.updateContent(
+                        mActivity.getString(R.string.offline_indicator_v2_back_online_text), null,
+                        backgroundColor, textColor, iconTint, hide);
             }
         });
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/NewTabButton.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/NewTabButton.java
index b396ca0..259e5a3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/NewTabButton.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/NewTabButton.java
@@ -6,12 +6,12 @@
 
 import android.content.Context;
 import android.content.res.ColorStateList;
-import android.support.graphics.drawable.VectorDrawableCompat;
 import android.support.v7.content.res.AppCompatResources;
 import android.util.AttributeSet;
 import android.view.View;
 
 import androidx.annotation.StringRes;
+import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
 
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.R;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator.java
index 5af8bfe4..fa3c88d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator.java
@@ -32,7 +32,7 @@
         mTabObserver = new ActivityTabProvider.ActivityTabTabObserver(activityTabProvider) {
             @Override
             public void onDidStartNavigation(Tab tab, NavigationHandle navigation) {
-                if (!navigation.isInMainFrame()) {
+                if (navigation.isSameDocument() || !navigation.isInMainFrame()) {
                     return;
                 }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/system/StatusBarColorController.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/system/StatusBarColorController.java
index 33488d49..02dabae 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ui/system/StatusBarColorController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/system/StatusBarColorController.java
@@ -21,6 +21,7 @@
 import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
 import org.chromium.chrome.browser.lifecycle.Destroyable;
 import org.chromium.chrome.browser.ntp.NewTabPage;
+import org.chromium.chrome.browser.status_indicator.StatusIndicatorCoordinator;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabSelectionType;
 import org.chromium.chrome.browser.tab.TabThemeColorHelper;
@@ -39,9 +40,10 @@
  * Maintains the status bar color for a {@link ChromeActivity}.
  */
 public class StatusBarColorController
-        implements Destroyable, TopToolbarCoordinator.UrlExpansionObserver {
-    public static @ColorInt int UNDEFINED_STATUS_BAR_COLOR = Color.TRANSPARENT;
-    public static @ColorInt int DEFAULT_STATUS_BAR_COLOR = Color.argb(0x01, 0, 0, 0);
+        implements Destroyable, TopToolbarCoordinator.UrlExpansionObserver,
+                   StatusIndicatorCoordinator.StatusIndicatorObserver {
+    public static final @ColorInt int UNDEFINED_STATUS_BAR_COLOR = Color.TRANSPARENT;
+    public static final @ColorInt int DEFAULT_STATUS_BAR_COLOR = Color.argb(0x01, 0, 0, 0);
 
     /**
      * Provides the base status bar color.
@@ -86,6 +88,8 @@
 
     private float mToolbarUrlExpansionPercentage;
     private boolean mShouldUpdateStatusBarColorForNTP;
+    private @ColorInt int mStatusIndicatorColor;
+    private @ColorInt int mStatusBarColorWithoutStatusIndicator;
 
     /**
      * @param chromeActivity The {@link ChromeActivity} that this class is attached to.
@@ -106,6 +110,8 @@
         mStandardDefaultThemeColor = ChromeColors.getDefaultThemeColor(resources, false);
         mIncognitoDefaultThemeColor = ChromeColors.getDefaultThemeColor(resources, true);
 
+        mStatusIndicatorColor = UNDEFINED_STATUS_BAR_COLOR;
+
         mStatusBarColorTabObserver = new ActivityTabProvider.ActivityTabTabObserver(
                 chromeActivity.getActivityTabProvider()) {
             @Override
@@ -203,6 +209,14 @@
         if (mShouldUpdateStatusBarColorForNTP) updateStatusBarColor();
     }
 
+    // StatusIndicatorCoordinator.StatusIndicatorObserver implementation.
+
+    @Override
+    public void onStatusIndicatorColorChanged(@ColorInt int newColor) {
+        mStatusIndicatorColor = newColor;
+        updateStatusBarColor();
+    }
+
     /**
      * @param tabModelSelector The {@link TabModelSelector} to check whether incognito model is
      *                         selected.
@@ -229,7 +243,49 @@
             statusBarColor =
                     mIsIncognito ? mIncognitoDefaultThemeColor : mStandardDefaultThemeColor;
         }
-        setStatusBarColor(statusBarColor, isDefaultThemeColor);
+
+        mStatusBarColorWithoutStatusIndicator = statusBarColor;
+
+        final boolean statusIndicatorColorSet = mStatusIndicatorColor != UNDEFINED_STATUS_BAR_COLOR;
+        if (statusIndicatorColorSet) {
+            statusBarColor = mStatusIndicatorColor;
+        }
+
+        // If the API level is not at least M, the status bar icons will be always light. So, we
+        // should darken the status bar color.
+        boolean shouldDarkenStatusBar = Build.VERSION.SDK_INT < Build.VERSION_CODES.M;
+
+        // Calculate the color without the status indicator.
+        if (shouldDarkenStatusBar && isDefaultThemeColor) {
+            mStatusBarColorWithoutStatusIndicator = Color.BLACK;
+        } else if (shouldDarkenStatusBar) {
+            mStatusBarColorWithoutStatusIndicator =
+                    ColorUtils.getDarkenedColorForStatusBar(mStatusBarColorWithoutStatusIndicator);
+        }
+
+        // If we need to darken the color and the theme color is default, the status bar color
+        // should be black. However, we should use the status indicator color if it's set.
+        if (shouldDarkenStatusBar && isDefaultThemeColor && !statusIndicatorColorSet) {
+            statusBarColor = Color.BLACK;
+        } else if (shouldDarkenStatusBar) {
+            statusBarColor = ColorUtils.getDarkenedColorForStatusBar(statusBarColor);
+        } else {
+            // If we aren't darkening the color, we should apply scrim if it's showing.
+            statusBarColor = applyCurrentScrimToColor(statusBarColor);
+        }
+
+        setStatusBarColor(statusBarColor);
+    }
+
+    // TODO(sinansahin): Confirm pre-M expectations with UX and update as needed.
+    /**
+     * @return The status bar color without the status indicator's color taken into consideration.
+     *         Color returned from this method includes darkening if the OS version doesn't support
+     *         light status bar icons (pre-M). However, scrimming isn't included since it's managed
+     *         completely by this class.
+     */
+    public @ColorInt int getStatusBarColorWithoutStatusIndicator() {
+        return mStatusBarColorWithoutStatusIndicator;
     }
 
     private @ColorInt int calculateBaseStatusBarColor() {
@@ -273,36 +329,35 @@
     }
 
     /**
-     * Set device status bar to a given color.
+     * Set device status bar to a given color. Also, set the status bar icons to a dark color if
+     * needed.
      * @param color The color that the status bar should be set to.
-     * @param isDefaultThemeColor Whether {@code color} is the default theme color.
      */
-    private void setStatusBarColor(int color, boolean isDefaultThemeColor) {
+    private void setStatusBarColor(@ColorInt int color) {
         if (UiUtils.isSystemUiThemingDisabled()) return;
 
-        int statusBarColor = color;
-        boolean supportsDarkStatusIcons = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
-        View root = mWindow.getDecorView().getRootView();
-        Resources resources = root.getResources();
-        if (supportsDarkStatusIcons) {
-            if (mScrimColor == 0) {
-                mScrimColor = ApiCompatibilityUtils.getColor(resources, R.color.black_alpha_65);
-            }
-            // Apply a color overlay if the scrim is showing.
-            float scrimColorAlpha = (mScrimColor >>> 24) / 255f;
-            int scrimColorOpaque = mScrimColor & 0xFF000000;
-            statusBarColor = ColorUtils.getColorWithOverlay(
-                    statusBarColor, scrimColorOpaque, mStatusBarScrimFraction * scrimColorAlpha);
+        final View root = mWindow.getDecorView().getRootView();
+        boolean needsDarkStatusBarIcons = !ColorUtils.shouldUseLightForegroundOnBackground(color);
+        ApiCompatibilityUtils.setStatusBarIconColor(root, needsDarkStatusBarIcons);
+        ApiCompatibilityUtils.setStatusBarColor(mWindow, color);
+    }
 
-            boolean needsDarkStatusBarIcons =
-                    !ColorUtils.shouldUseLightForegroundOnBackground(statusBarColor);
-            ApiCompatibilityUtils.setStatusBarIconColor(root, needsDarkStatusBarIcons);
-        } else {
-            statusBarColor = isDefaultThemeColor ? Color.BLACK
-                                                 : ColorUtils.getDarkenedColorForStatusBar(color);
+    /**
+     * Get the scrim applied color if the scrim is showing. Otherwise, return the original color.
+     * @param color Color to maybe apply scrim to.
+     * @return The resulting color.
+     */
+    private @ColorInt int applyCurrentScrimToColor(@ColorInt int color) {
+        if (mScrimColor == 0) {
+            final View root = mWindow.getDecorView().getRootView();
+            final Resources resources = root.getResources();
+            mScrimColor = ApiCompatibilityUtils.getColor(resources, R.color.black_alpha_65);
         }
-
-        ApiCompatibilityUtils.setStatusBarColor(mWindow, statusBarColor);
+        // Apply a color overlay if the scrim is showing.
+        float scrimColorAlpha = (mScrimColor >>> 24) / 255f;
+        int scrimColorOpaque = mScrimColor & 0xFF000000;
+        return ColorUtils.getColorWithOverlay(
+                color, scrimColorOpaque, mStatusBarScrimFraction * scrimColorAlpha);
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkIntentDataProviderFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkIntentDataProviderFactory.java
index 0c77faa..4382a63 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkIntentDataProviderFactory.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkIntentDataProviderFactory.java
@@ -291,8 +291,10 @@
             }
         }
 
+        // Check the OS version because the same WebAPK is vended by the WebAPK server for all OS
+        // versions.
         boolean isPrimaryIconMaskable =
-                primaryMaskableIconId != 0 && ShortcutHelper.doesAndroidSupportMaskableIcons();
+                primaryMaskableIconId != 0 && (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O);
 
         int badgeIconId = IntentUtils.safeGetInt(bundle, WebApkMetaDataKeys.BADGE_ICON_ID, 0);
         int splashIconId = IntentUtils.safeGetInt(bundle, WebApkMetaDataKeys.SPLASH_ID, 0);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java
index 58b65d3..7e165b6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java
@@ -378,8 +378,9 @@
             return WebApkUpdateReason.DISPLAY_MODE_DIFFERS;
         } else if (!oldInfo.shareTarget().equals(fetchedInfo.shareTarget())) {
             return WebApkUpdateReason.WEB_SHARE_TARGET_DIFFERS;
-        } else if (ShortcutHelper.doesAndroidSupportMaskableIcons()
-                && oldInfo.isIconAdaptive() != fetchedInfo.isIconAdaptive()) {
+        } else if (oldInfo.isIconAdaptive() != fetchedInfo.isIconAdaptive()
+                && (!fetchedInfo.isIconAdaptive()
+                        || ShortcutHelper.doesAndroidSupportMaskableIcons())) {
             return WebApkUpdateReason.PRIMARY_ICON_MASKABLE_DIFFERS;
         } else if (shortcutsDiffer(oldInfo.shortcutItems(), fetchedInfo.shortcutItems())) {
             return WebApkUpdateReason.SHORTCUTS_DIFFER;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappIcon.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappIcon.java
index f1574204..abe8263 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappIcon.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappIcon.java
@@ -9,6 +9,8 @@
 import android.graphics.Bitmap;
 import android.graphics.drawable.BitmapDrawable;
 
+import androidx.annotation.VisibleForTesting;
+
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.ContextUtils;
 import org.chromium.chrome.browser.ShortcutHelper;
@@ -49,6 +51,11 @@
         return mBitmap;
     }
 
+    @VisibleForTesting
+    public int resourceIdForTesting() {
+        return mResourceId;
+    }
+
     private Bitmap generateBitmap() {
         if (mEncoded != null) {
             return ShortcutHelper.decodeBitmapFromString(mEncoded);
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni
index 70ed63f..b2f2406 100644
--- a/chrome/android/java_sources.gni
+++ b/chrome/android/java_sources.gni
@@ -14,6 +14,7 @@
 import("//chrome/android/features/tab_ui/tab_management_java_sources.gni")
 import("//chrome/android/feed/feed_java_sources.gni")
 import("//chrome/browser/share/android/test_java_sources.gni")
+import("//chrome/common/features.gni")
 import("//components/feed/features.gni")
 import("//components/offline_pages/buildflags/features.gni")
 import("//device/vr/buildflags/buildflags.gni")
@@ -50,3 +51,15 @@
     "java/src/org/chromium/chrome/browser/vr/ArImmersiveOverlay.java",
   ]
 }
+
+if (enable_password_change_in_leaked_dialog) {
+  chrome_java_sources += [
+    "java/src/org/chromium/chrome/browser/password_manager/CredentialLeakDialogPasswordChangeBridge.java",
+    "java/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogPasswordChangeContents.java",
+    "java/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogPasswordChangeCoordinator.java",
+    "java/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogPasswordChangeMediator.java",
+    "java/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogPasswordChangeProperties.java",
+    "java/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogPasswordChangeView.java",
+    "java/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogPasswordChangeViewBinder.java",
+  ]
+}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/ItemChooserDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/ItemChooserDialogTest.java
index cf2ffb7..870a534 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/ItemChooserDialogTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/ItemChooserDialogTest.java
@@ -6,7 +6,6 @@
 
 import android.app.Dialog;
 import android.graphics.drawable.Drawable;
-import android.support.graphics.drawable.VectorDrawableCompat;
 import android.support.test.filters.LargeTest;
 import android.support.v4.util.ObjectsCompat;
 import android.text.SpannableString;
@@ -16,6 +15,8 @@
 import android.widget.ListView;
 import android.widget.TextView;
 
+import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
+
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Rule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/micro/MicrotransactionRenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/micro/MicrotransactionRenderTest.java
index cd6815a..e43489b2 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/micro/MicrotransactionRenderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/micro/MicrotransactionRenderTest.java
@@ -5,13 +5,14 @@
 package org.chromium.chrome.browser.payments.micro;
 
 import android.support.annotation.Nullable;
-import android.support.graphics.drawable.VectorDrawableCompat;
 import android.support.test.filters.SmallTest;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.ProgressBar;
 import android.widget.RelativeLayout;
 
+import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
+
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorTest.java
index 853a3d8..40e8ec3 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorTest.java
@@ -4,9 +4,8 @@
 
 package org.chromium.chrome.browser.status_indicator;
 
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.hamcrest.MatcherAssert.assertThat;
-
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.MediumTest;
 import android.view.View;
@@ -15,6 +14,7 @@
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
+import org.junit.ClassRule;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -32,6 +32,7 @@
 import org.chromium.content_public.browser.test.util.Criteria;
 import org.chromium.content_public.browser.test.util.CriteriaHelper;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
+import org.chromium.ui.test.util.DisableAnimationsTestRule;
 import org.chromium.ui.test.util.UiRestriction;
 
 /**
@@ -46,6 +47,11 @@
 @Restriction({UiRestriction.RESTRICTION_TYPE_PHONE})
 public class StatusIndicatorTest {
     // clang-format on
+
+    @ClassRule
+    public static DisableAnimationsTestRule mDisableAnimationsTestRule =
+            new DisableAnimationsTestRule();
+
     @Rule
     public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
 
@@ -82,15 +88,15 @@
                 mActivityTestRule.getActivity().getFullscreenManager();
         InstrumentationRegistry.getInstrumentation().waitForIdleSync();
 
-        assertThat("Wrong initial Android view visibility.",
-                mStatusIndicatorContainer.getVisibility(), equalTo(View.GONE));
+        Assert.assertEquals("Wrong initial Android view visibility.", View.GONE,
+                mStatusIndicatorContainer.getVisibility());
         Assert.assertFalse("Wrong initial composited view visibility.",
                 mStatusIndicatorSceneLayer.isSceneOverlayTreeShowing());
-        assertThat("Wrong initial control container top margin.",
-                mControlContainerLayoutParams.topMargin, equalTo(0));
+        Assert.assertEquals("Wrong initial control container top margin.", 0,
+                mControlContainerLayoutParams.topMargin);
 
-        TestThreadUtils.runOnUiThreadBlocking(mStatusIndicatorCoordinator::show);
-
+        TestThreadUtils.runOnUiThreadBlocking(() -> mStatusIndicatorCoordinator.show(
+        "Status", null, Color.BLACK, Color.WHITE, Color.WHITE));
         InstrumentationRegistry.getInstrumentation().waitForIdleSync();
 
         // TODO(sinansahin): Investigate setting the duration for the browser controls animations to
@@ -101,19 +107,32 @@
                 fullscreenManager::getTopControlsMinHeightOffset));
 
         // Now, the Android view should be visible.
-        assertThat("Wrong Android view visibility.", mStatusIndicatorContainer.getVisibility(),
-                equalTo(View.VISIBLE));
+        Assert.assertEquals("Wrong Android view visibility.", View.VISIBLE,
+                mStatusIndicatorContainer.getVisibility());
+        Assert.assertEquals("Wrong background color.", Color.BLACK,
+                ((ColorDrawable) mStatusIndicatorContainer.getBackground()).getColor());
+
+        TestThreadUtils.runOnUiThreadBlocking(() -> mStatusIndicatorCoordinator.updateContent(
+                "Exit status", null, Color.WHITE, Color.BLACK, Color.BLACK, () -> {}));
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+        // The Android view should be visible.
+        Assert.assertEquals("Wrong Android view visibility.", View.VISIBLE,
+                mStatusIndicatorContainer.getVisibility());
+        Assert.assertEquals("Wrong background color.", Color.WHITE,
+                ((ColorDrawable) mStatusIndicatorContainer.getBackground()).getColor());
 
         TestThreadUtils.runOnUiThreadBlocking(mStatusIndicatorCoordinator::hide);
-
-        // The Android view visibility should be {@link View.GONE} after #hide().
-        assertThat("Wrong Android view visibility.", mStatusIndicatorContainer.getVisibility(),
-                equalTo(View.GONE));
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
 
         // Wait until the status indicator finishes animating, or becomes fully hidden.
         CriteriaHelper.pollUiThread(
                 Criteria.equals(0, fullscreenManager::getTopControlsMinHeightOffset));
 
+        // The Android view visibility should be {@link View.GONE} after #hide().
+        Assert.assertEquals("Wrong Android view visibility.", View.GONE,
+                mStatusIndicatorContainer.getVisibility());
+
         Assert.assertFalse("Composited view shouldn't be visible.",
                 mStatusIndicatorSceneLayer.isSceneOverlayTreeShowing());
     }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorViewBinderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorViewBinderTest.java
index 6e44153c..f88bfaf 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorViewBinderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorViewBinderTest.java
@@ -4,18 +4,25 @@
 
 package org.chromium.chrome.browser.status_indicator;
 
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.hamcrest.MatcherAssert.assertThat;
+import static android.graphics.PorterDuff.Mode.SRC_IN;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import android.graphics.Color;
+import android.graphics.PorterDuffColorFilter;
+import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
+import android.os.Build;
 import android.support.test.annotation.UiThreadTest;
 import android.support.test.filters.SmallTest;
 import android.support.v4.content.res.ResourcesCompat;
 import android.text.TextUtils;
 import android.view.View;
-import android.widget.TextView;
 
-import org.junit.Assert;
+import org.chromium.base.MathUtils;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -23,6 +30,7 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.components.browser_ui.widget.ViewResourceFrameLayout;
+import org.chromium.components.browser_ui.widget.text.TextViewWithCompoundDrawables;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.ui.modelutil.PropertyModel;
 import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
@@ -37,7 +45,7 @@
     private static final String STATUS_TEXT = "Offline";
 
     private ViewResourceFrameLayout mContainer;
-    private TextView mStatusTextView;
+    private TextViewWithCompoundDrawables mStatusTextView;
     private MockStatusIndicatorSceneLayer mSceneLayer;
 
     private PropertyModel mModel;
@@ -78,11 +86,9 @@
     @SmallTest
     @UiThreadTest
     public void testTextView() {
-        Assert.assertTrue(
-                "Wrong initial status text.", TextUtils.isEmpty(mStatusTextView.getText()));
-        Assert.assertNull(
-                "Wrong initial status icon.", mStatusTextView.getCompoundDrawablesRelative()[0]);
-        Assert.assertTrue(
+        assertTrue("Wrong initial status text.", TextUtils.isEmpty(mStatusTextView.getText()));
+        assertNull("Wrong initial status icon.", mStatusTextView.getCompoundDrawablesRelative()[0]);
+        assertTrue(
                 "Rest of the compound drawables are not null.", areRestOfCompoundDrawablesNull());
 
         Drawable drawable = ResourcesCompat.getDrawable(getActivity().getResources(),
@@ -93,10 +99,10 @@
             mModel.set(StatusIndicatorProperties.STATUS_ICON, drawable);
         });
 
-        assertThat("Wrong status text.", mStatusTextView.getText(), equalTo(STATUS_TEXT));
-        assertThat("Wrong status icon.", mStatusTextView.getCompoundDrawablesRelative()[0],
-                equalTo(drawable));
-        Assert.assertTrue(
+        assertEquals("Wrong status text.", STATUS_TEXT, mStatusTextView.getText());
+        assertEquals(
+                "Wrong status icon.", drawable, mStatusTextView.getCompoundDrawablesRelative()[0]);
+        assertTrue(
                 "Rest of the compound drawables are not null.", areRestOfCompoundDrawablesNull());
     }
 
@@ -104,9 +110,9 @@
     @SmallTest
     @UiThreadTest
     public void testVisibility() {
-        assertThat("Wrong initial Android view visibility.", mContainer.getVisibility(),
-                equalTo(View.GONE));
-        Assert.assertFalse("Wrong initial composited view visibility.",
+        assertEquals(
+                "Wrong initial Android view visibility.", View.GONE, mContainer.getVisibility());
+        assertFalse("Wrong initial composited view visibility.",
                 mSceneLayer.isSceneOverlayTreeShowing());
 
         TestThreadUtils.runOnUiThreadBlocking(() -> {
@@ -114,18 +120,73 @@
             mModel.set(StatusIndicatorProperties.COMPOSITED_VIEW_VISIBLE, true);
         });
 
-        assertThat(
-                "Android view is not visible.", mContainer.getVisibility(), equalTo(View.VISIBLE));
-        Assert.assertTrue(
-                "Composited view is not visible.", mSceneLayer.isSceneOverlayTreeShowing());
+        assertEquals("Android view is not visible.", View.VISIBLE, mContainer.getVisibility());
+        assertTrue("Composited view is not visible.", mSceneLayer.isSceneOverlayTreeShowing());
 
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             mModel.set(StatusIndicatorProperties.ANDROID_VIEW_VISIBILITY, View.GONE);
             mModel.set(StatusIndicatorProperties.COMPOSITED_VIEW_VISIBLE, false);
         });
 
-        assertThat("Android view is not gone.", mContainer.getVisibility(), equalTo(View.GONE));
-        Assert.assertFalse("Composited view is visible.", mSceneLayer.isSceneOverlayTreeShowing());
+        assertEquals("Android view is not gone.", View.GONE, mContainer.getVisibility());
+        assertFalse("Composited view is visible.", mSceneLayer.isSceneOverlayTreeShowing());
+    }
+
+    @Test
+    @SmallTest
+    @UiThreadTest
+    public void testColorAndTint() {
+        int bgColor = getActivity().getResources().getColor(R.color.modern_primary_color);
+        int textColor = getActivity().getResources().getColor(R.color.default_text_color);
+        assertEquals("Wrong initial background color.", bgColor,
+                ((ColorDrawable) mContainer.getBackground()).getColor());
+        assertEquals("Wrong initial text color", textColor, mStatusTextView.getCurrentTextColor());
+
+        Drawable drawable = ResourcesCompat.getDrawable(getActivity().getResources(),
+                R.drawable.ic_error_white_24dp_filled, getActivity().getTheme());
+
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            mModel.set(StatusIndicatorProperties.STATUS_ICON, drawable);
+            mModel.set(StatusIndicatorProperties.BACKGROUND_COLOR, Color.BLUE);
+            mModel.set(StatusIndicatorProperties.TEXT_COLOR, Color.RED);
+            mModel.set(StatusIndicatorProperties.ICON_TINT, Color.GREEN);
+        });
+
+        assertEquals("Wrong background color.", Color.BLUE,
+                ((ColorDrawable) mContainer.getBackground()).getColor());
+        assertEquals("Wrong text color.", Color.RED, mStatusTextView.getCurrentTextColor());
+
+        // There is no way to get the color filter below L. We could technically modify
+        // TextViewWithCompoundDrawables to cache it, but it's not worth the effort. Once the min
+        // apk is L, we won't be using color filters anyway.
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            assertEquals("Wrong compound drawables tint",
+                    new PorterDuffColorFilter(Color.GREEN, SRC_IN),
+                    mStatusTextView.getCompoundDrawablesRelative()[0].getColorFilter());
+        }
+    }
+
+    @Test
+    @SmallTest
+    @UiThreadTest
+    public void testTextAlpha() {
+        assertEquals(
+                "Wrong initial text alpha.", 1.f, mStatusTextView.getAlpha(), MathUtils.EPSILON);
+
+        TestThreadUtils.runOnUiThreadBlocking(
+                () -> mModel.set(StatusIndicatorProperties.TEXT_ALPHA, .5f));
+
+        assertEquals("Wrong text alpha.", .5f, mStatusTextView.getAlpha(), MathUtils.EPSILON);
+
+        TestThreadUtils.runOnUiThreadBlocking(
+                () -> mModel.set(StatusIndicatorProperties.TEXT_ALPHA, .0f));
+
+        assertEquals("Wrong text alpha.", 0.f, mStatusTextView.getAlpha(), MathUtils.EPSILON);
+
+        TestThreadUtils.runOnUiThreadBlocking(
+                () -> mModel.set(StatusIndicatorProperties.TEXT_ALPHA, 1.f));
+
+        assertEquals("Wrong text alpha.", 1.f, mStatusTextView.getAlpha(), MathUtils.EPSILON);
     }
 
     private boolean areRestOfCompoundDrawablesNull() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ui/system/StatusBarColorControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ui/system/StatusBarColorControllerTest.java
index 7ab161d0..11ecb818 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ui/system/StatusBarColorControllerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ui/system/StatusBarColorControllerTest.java
@@ -9,16 +9,22 @@
 import android.os.Build;
 import android.support.test.filters.LargeTest;
 
+import androidx.annotation.ColorInt;
+
 import org.junit.After;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import org.chromium.base.ApiCompatibilityUtils;
+import org.chromium.base.supplier.Supplier;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.base.test.util.Restriction;
+import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.flags.CachedFeatureFlags;
@@ -31,6 +37,7 @@
 import org.chromium.components.browser_ui.styles.ChromeColors;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.ui.test.util.UiRestriction;
+import org.chromium.ui.util.ColorUtils;
 
 /**
  * {@link StatusBarColorController} tests.
@@ -42,10 +49,14 @@
     @Rule
     public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
 
+    private @ColorInt int mScrimColor;
+
     @Before
     public void setUp() {
         CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, true);
         mActivityTestRule.startMainActivityOnBlankPage();
+        mScrimColor = ApiCompatibilityUtils.getColor(mActivityTestRule.getActivity().getResources(),
+                org.chromium.chrome.R.color.black_alpha_65);
     }
 
     @After
@@ -109,7 +120,81 @@
         ThemeTestUtils.assertStatusBarColor(activity, expectedDefaultStandardColor);
     }
 
+    /**
+     * Test that the status indicator color is included in the color calculation correctly.
+     */
+    @Test
+    @LargeTest
+    @Feature({"StatusBar"})
+    @MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP)
+    @Restriction({UiRestriction.RESTRICTION_TYPE_PHONE}) // Status bar is always black on tablets
+    public void testColorWithStatusIndicator() {
+        final ChromeActivity activity = mActivityTestRule.getActivity();
+        final StatusBarColorController statusBarColorController =
+                mActivityTestRule.getActivity().getStatusBarColorController();
+        final Supplier<Integer> statusBarColor = () -> activity.getWindow().getStatusBarColor();
+        final int initialColor = statusBarColor.get();
+
+        // Initially, StatusBarColorController#getStatusBarColorWithoutStatusIndicator should return
+        // the same color as the current status bar color.
+        Assert.assertEquals(
+                "Wrong initial value returned by #getStatusBarColorWithoutStatusIndicator().",
+                initialColor, statusBarColorController.getStatusBarColorWithoutStatusIndicator());
+
+        // Set a status indicator color.
+        TestThreadUtils.runOnUiThreadBlocking(
+                () -> statusBarColorController.onStatusIndicatorColorChanged(Color.BLUE));
+
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
+            Assert.assertEquals("Wrong status bar color for Android L.",
+                    ColorUtils.getDarkenedColorForStatusBar(Color.BLUE),
+                    statusBarColor.get().intValue());
+        } else {
+            Assert.assertEquals("Wrong status bar color for Android M+.", Color.BLUE,
+                    statusBarColor.get().intValue());
+        }
+
+        // StatusBarColorController#getStatusBarColorWithoutStatusIndicator should still return the
+        // initial color.
+        Assert.assertEquals("Wrong value returned by #getStatusBarColorWithoutStatusIndicator().",
+                initialColor, statusBarColorController.getStatusBarColorWithoutStatusIndicator());
+
+        // Set scrim.
+        TestThreadUtils.runOnUiThreadBlocking(
+                () -> statusBarColorController.getStatusBarScrimDelegate()
+                        .setStatusBarScrimFraction(.5f));
+
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
+            // If we're already darkening the color for Android L, scrim shouldn't be applied.
+            Assert.assertEquals("Wrong status bar color w/ scrim for Android L.",
+                    ColorUtils.getDarkenedColorForStatusBar(Color.BLUE),
+                    statusBarColor.get().intValue());
+        } else {
+            // Otherwise, the resulting color should be a scrimmed version of the status bar color.
+            Assert.assertEquals("Wrong status bar color w/ scrim for Android M+.",
+                    getScrimmedColor(Color.BLUE, .5f), statusBarColor.get().intValue());
+        }
+
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            // Remove scrim.
+            statusBarColorController.getStatusBarScrimDelegate().setStatusBarScrimFraction(.0f);
+            // Set the status indicator color to the default, i.e. transparent.
+            statusBarColorController.onStatusIndicatorColorChanged(Color.TRANSPARENT);
+        });
+
+        // Now, the status bar color should be back to the initial color.
+        Assert.assertEquals(
+                "Wrong status bar color after the status indicator color is set to default.",
+                initialColor, statusBarColor.get().intValue());
+    }
+
     private int defaultColorFallbackToBlack(int color) {
         return (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) ? Color.BLACK : color;
     }
+
+    private int getScrimmedColor(@ColorInt int color, float fraction) {
+        final float scrimColorAlpha = (mScrimColor >>> 24) / 255f;
+        final int scrimColorOpaque = mScrimColor & 0xFF000000;
+        return ColorUtils.getColorWithOverlay(color, scrimColorOpaque, fraction * scrimColorAlpha);
+    }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java
index 808c2df..4daa478 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java
@@ -30,6 +30,7 @@
 import org.chromium.chrome.test.util.browser.webapps.WebappTestPage;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.content_public.common.ScreenOrientationValues;
+import org.chromium.net.test.EmbeddedTestServer;
 import org.chromium.net.test.EmbeddedTestServerRule;
 import org.chromium.webapk.lib.client.WebApkVersion;
 
@@ -77,6 +78,7 @@
 
     private ChromeActivity mActivity;
     private Tab mTab;
+    private EmbeddedTestServer mTestServer;
 
     /**
      * Subclass of {@link WebApkUpdateManager} which notifies the {@link CallbackHelper} passed to
@@ -128,15 +130,15 @@
 
     public CreationData defaultCreationData() {
         CreationData creationData = new CreationData();
-        creationData.manifestUrl = mTestServerRule.getServer().getURL(WEBAPK_MANIFEST_URL);
-        creationData.startUrl = mTestServerRule.getServer().getURL(WEBAPK_START_URL);
-        creationData.scope = mTestServerRule.getServer().getURL(WEBAPK_SCOPE_URL);
+        creationData.manifestUrl = mTestServer.getURL(WEBAPK_MANIFEST_URL);
+        creationData.startUrl = mTestServer.getURL(WEBAPK_START_URL);
+        creationData.scope = mTestServer.getURL(WEBAPK_SCOPE_URL);
         creationData.name = WEBAPK_NAME;
         creationData.shortName = WEBAPK_SHORT_NAME;
 
         creationData.iconUrlToMurmur2HashMap = new HashMap<String, String>();
         creationData.iconUrlToMurmur2HashMap.put(
-                mTestServerRule.getServer().getURL(WEBAPK_ICON_URL), WEBAPK_ICON_MURMUR2_HASH);
+                mTestServer.getURL(WEBAPK_ICON_URL), WEBAPK_ICON_MURMUR2_HASH);
 
         creationData.displayMode = WEBAPK_DISPLAY_MODE;
         creationData.orientation = WEBAPK_ORIENTATION;
@@ -153,6 +155,7 @@
         RecordHistogram.setDisabledForTests(true);
         mActivity = mActivityTestRule.getActivity();
         mTab = mActivity.getActivityTab();
+        mTestServer = mTestServerRule.getServer();
 
         TestFetchStorageCallback callback = new TestFetchStorageCallback();
         WebappRegistry.getInstance().register(WEBAPK_ID, callback);
@@ -202,11 +205,11 @@
     public void testCanonicalUrlsIdenticalShouldNotUpgrade() throws Exception {
         // URL canonicalization should replace "%74" with 't'.
         CreationData creationData = defaultCreationData();
-        creationData.startUrl = mTestServerRule.getServer().getURL(
-                "/chrome/test/data/banners/manifest_%74est_page.html");
+        creationData.startUrl =
+                mTestServer.getURL("/chrome/test/data/banners/manifest_%74est_page.html");
 
         WebappTestPage.navigateToServiceWorkerPageWithManifest(
-                mTestServerRule.getServer(), mTab, WEBAPK_MANIFEST_URL);
+                mTestServer, mTab, WEBAPK_MANIFEST_URL);
         Assert.assertFalse(checkUpdateNeeded(creationData));
     }
 
@@ -219,11 +222,11 @@
     public void testCanonicalUrlsDifferentShouldUpgrade() throws Exception {
         // URL canonicalization should replace "%62" with 'b'.
         CreationData creationData = defaultCreationData();
-        creationData.startUrl = mTestServerRule.getServer().getURL(
-                "/chrome/test/data/banners/manifest_%62est_page.html");
+        creationData.startUrl =
+                mTestServer.getURL("/chrome/test/data/banners/manifest_%62est_page.html");
 
         WebappTestPage.navigateToServiceWorkerPageWithManifest(
-                mTestServerRule.getServer(), mTab, WEBAPK_MANIFEST_URL);
+                mTestServer, mTab, WEBAPK_MANIFEST_URL);
         Assert.assertTrue(checkUpdateNeeded(creationData));
     }
 
@@ -232,11 +235,11 @@
     @Feature({"WebApk"})
     public void testNoUpdateForPagesWithoutWST() throws Exception {
         CreationData creationData = defaultCreationData();
-        creationData.startUrl = mTestServerRule.getServer().getURL(
-                "/chrome/test/data/banners/manifest_test_page.html");
+        creationData.startUrl =
+                mTestServer.getURL("/chrome/test/data/banners/manifest_test_page.html");
 
         WebappTestPage.navigateToServiceWorkerPageWithManifest(
-                mTestServerRule.getServer(), mTab, WEBAPK_MANIFEST_URL);
+                mTestServer, mTab, WEBAPK_MANIFEST_URL);
         Assert.assertFalse(checkUpdateNeeded(creationData));
     }
 
@@ -257,13 +260,32 @@
     }
 
     private void testNewMaskableIconShouldUpdate() throws Exception {
-        CreationData creationData = defaultCreationData();
-        creationData.startUrl = mTestServerRule.getServer().getURL(
-                "/chrome/test/data/banners/manifest_test_page.html");
-        creationData.isPrimaryIconMaskable = true;
+        final String maskableManifestUrl = "/chrome/test/data/banners/manifest_maskable.json";
+
+        CreationData creationData = new CreationData();
+        creationData.manifestUrl = mTestServer.getURL(maskableManifestUrl);
+        creationData.startUrl =
+                mTestServer.getURL("/chrome/test/data/banners/manifest_test_page.html");
+        creationData.scope = mTestServer.getURL("/chrome/test/data/banners/");
+        creationData.name = "Manifest test app";
+        creationData.shortName = creationData.name;
+
+        creationData.iconUrlToMurmur2HashMap = new HashMap<String, String>();
+        creationData.iconUrlToMurmur2HashMap.put(
+                mTestServer.getURL("/chrome/test/data/banners/launcher-icon-4x.png"),
+                "8692598279279335241");
+        creationData.iconUrlToMurmur2HashMap.put(
+                mTestServer.getURL("/chrome/test/data/banners/launcher-icon-3x.png"),
+                "16812314236514539104");
+        creationData.displayMode = WebDisplayMode.STANDALONE;
+        creationData.orientation = ScreenOrientationValues.LANDSCAPE;
+        creationData.themeColor = 2147483648L;
+        creationData.backgroundColor = 2147483648L;
+        creationData.isPrimaryIconMaskable = false;
+        creationData.shortcuts = new ArrayList<>();
 
         WebappTestPage.navigateToServiceWorkerPageWithManifest(
-                mTestServerRule.getServer(), mTab, WEBAPK_MANIFEST_URL);
+                mTestServer, mTab, maskableManifestUrl);
 
         Assert.assertEquals(
                 ShortcutHelper.doesAndroidSupportMaskableIcons(), checkUpdateNeeded(creationData));
@@ -274,20 +296,18 @@
     @Feature({"WebApk"})
     public void testManifestWithExtraShortcutsDoesNotCauseUpdate() throws Exception {
         CreationData creationData = defaultCreationData();
-        creationData.startUrl = mTestServerRule.getServer().getURL(
-                "/chrome/test/data/banners/manifest_test_page.html");
+        creationData.startUrl =
+                mTestServer.getURL("/chrome/test/data/banners/manifest_test_page.html");
 
-        creationData.manifestUrl =
-                mTestServerRule.getServer().getURL(WEBAPK_MANIFEST_TOO_MANY_SHORTCUTS_URL);
+        creationData.manifestUrl = mTestServer.getURL(WEBAPK_MANIFEST_TOO_MANY_SHORTCUTS_URL);
         for (int i = 0; i < 4; i++) {
             creationData.shortcuts.add(new WebApkExtras.ShortcutItem("name" + String.valueOf(i),
-                    "short_name",
-                    mTestServerRule.getServer().getURL(WEBAPK_SCOPE_URL + "launch_url"), "", ""));
+                    "short_name", mTestServer.getURL(WEBAPK_SCOPE_URL + "launch_url"), "", ""));
         }
 
         // The fifth shortcut should be ignored.
         WebappTestPage.navigateToServiceWorkerPageWithManifest(
-                mTestServerRule.getServer(), mTab, WEBAPK_MANIFEST_TOO_MANY_SHORTCUTS_URL);
+                mTestServer, mTab, WEBAPK_MANIFEST_TOO_MANY_SHORTCUTS_URL);
         Assert.assertFalse(checkUpdateNeeded(creationData));
     }
 }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorMediatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorMediatorTest.java
index bc916c7..d9c2e90 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorMediatorTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorMediatorTest.java
@@ -4,13 +4,14 @@
 
 package org.chromium.chrome.browser.status_indicator;
 
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
+import android.graphics.Color;
 import android.view.View;
 
 import org.junit.Before;
@@ -37,6 +38,12 @@
     @Mock
     ChromeFullscreenManager mFullscreenManager;
 
+    @Mock
+    View mStatusIndicatorView;
+
+    @Mock
+    StatusIndicatorCoordinator.StatusIndicatorObserver mObserver;
+
     private PropertyModel mModel;
     private StatusIndicatorMediator mMediator;
 
@@ -47,24 +54,38 @@
                          .with(StatusIndicatorProperties.ANDROID_VIEW_VISIBILITY, View.GONE)
                          .with(StatusIndicatorProperties.COMPOSITED_VIEW_VISIBLE, false)
                          .build();
-        mMediator = new StatusIndicatorMediator(mModel, mFullscreenManager);
+        mMediator = new StatusIndicatorMediator(mModel, mFullscreenManager, () -> Color.WHITE);
     }
 
     @Test
     public void testHeightChangeAddsListener() {
-        //
-        mMediator.onStatusIndicatorHeightChanged(70);
+        // After layout
+        setViewHeight(70);
+        mMediator.onLayoutChange(mStatusIndicatorView, 0, 0, 0, 0, 0, 0, 0, 0);
         verify(mFullscreenManager).addListener(mMediator);
     }
 
     @Test
+    public void testHeightChangeNotifiesObservers() {
+        // Add an observer.
+        mMediator.addObserver(mObserver);
+        // After layout
+        setViewHeight(70);
+        mMediator.onLayoutChange(mStatusIndicatorView, 0, 0, 0, 0, 0, 0, 0, 0);
+        verify(mObserver).onStatusIndicatorHeightChanged(70);
+        mMediator.removeObserver(mObserver);
+    }
+
+    @Test
     public void testHeightChangeDoesNotRemoveListenerImmediately() {
         // Show the status indicator.
-        mMediator.onStatusIndicatorHeightChanged(70);
+        setViewHeight(70);
+        mMediator.onLayoutChange(mStatusIndicatorView, 0, 0, 0, 0, 0, 0, 0, 0);
         mMediator.onControlsOffsetChanged(0, 70, 0, 0, false);
 
         // Now, hide it. Listener shouldn't be removed.
-        mMediator.onStatusIndicatorHeightChanged(0);
+        setViewHeight(0);
+        mMediator.onLayoutChange(mStatusIndicatorView, 0, 0, 0, 0, 0, 0, 0, 0);
         verify(mFullscreenManager, never()).removeListener(mMediator);
 
         // Once the hiding animation is done...
@@ -76,52 +97,51 @@
     @Test
     public void testHeightChangeToZeroMakesAndroidViewGone() {
         // Show the status indicator.
-        mMediator.onStatusIndicatorHeightChanged(70);
+        setViewHeight(70);
+        mMediator.onLayoutChange(mStatusIndicatorView, 0, 0, 0, 0, 0, 0, 0, 0);
         mMediator.onControlsOffsetChanged(0, 70, 0, 0, false);
         // The Android view should be visible at this point.
-        assertThat(mModel.get(StatusIndicatorProperties.ANDROID_VIEW_VISIBILITY),
-                equalTo(View.VISIBLE));
+        assertEquals(View.VISIBLE, mModel.get(StatusIndicatorProperties.ANDROID_VIEW_VISIBILITY));
         // Now hide it.
-        mMediator.onStatusIndicatorHeightChanged(0);
+        setViewHeight(0);
+        mMediator.onLayoutChange(mStatusIndicatorView, 0, 0, 0, 0, 0, 0, 0, 0);
         // The hiding animation...
         mMediator.onControlsOffsetChanged(0, 30, 0, 0, false);
         // Android view will be gone once the animation starts.
-        assertThat(
-                mModel.get(StatusIndicatorProperties.ANDROID_VIEW_VISIBILITY), equalTo(View.GONE));
+        assertEquals(View.GONE, mModel.get(StatusIndicatorProperties.ANDROID_VIEW_VISIBILITY));
         mMediator.onControlsOffsetChanged(0, 0, 0, 0, false);
         // Shouldn't make the Android view invisible. It should stay gone.
-        assertThat(
-                mModel.get(StatusIndicatorProperties.ANDROID_VIEW_VISIBILITY), equalTo(View.GONE));
+        assertEquals(View.GONE, mModel.get(StatusIndicatorProperties.ANDROID_VIEW_VISIBILITY));
     }
 
     @Test
     public void testOffsetChangeUpdatesVisibility() {
         // Initially, the Android view should be GONE.
-        mMediator.onStatusIndicatorHeightChanged(20);
-        assertThat(
-                mModel.get(StatusIndicatorProperties.ANDROID_VIEW_VISIBILITY), equalTo(View.GONE));
+        setViewHeight(20);
+        mMediator.onLayoutChange(mStatusIndicatorView, 0, 0, 0, 0, 0, 0, 0, 0);
+        assertEquals(View.GONE, mModel.get(StatusIndicatorProperties.ANDROID_VIEW_VISIBILITY));
         // Assume the status indicator is completely hidden.
         mMediator.onControlsOffsetChanged(0, 0, 0, 0, false);
-        assertThat(mModel.get(StatusIndicatorProperties.ANDROID_VIEW_VISIBILITY),
-                equalTo(View.INVISIBLE));
+        assertEquals(View.INVISIBLE, mModel.get(StatusIndicatorProperties.ANDROID_VIEW_VISIBILITY));
         assertFalse(mModel.get(StatusIndicatorProperties.COMPOSITED_VIEW_VISIBLE));
 
         // Status indicator is partially showing.
         mMediator.onControlsOffsetChanged(0, 10, 0, 0, false);
-        assertThat(mModel.get(StatusIndicatorProperties.ANDROID_VIEW_VISIBILITY),
-                equalTo(View.INVISIBLE));
+        assertEquals(View.INVISIBLE, mModel.get(StatusIndicatorProperties.ANDROID_VIEW_VISIBILITY));
         assertTrue(mModel.get(StatusIndicatorProperties.COMPOSITED_VIEW_VISIBLE));
 
         // Status indicator is fully showing, 20px.
         mMediator.onControlsOffsetChanged(0, 20, 0, 0, false);
-        assertThat(mModel.get(StatusIndicatorProperties.ANDROID_VIEW_VISIBILITY),
-                equalTo(View.VISIBLE));
+        assertEquals(View.VISIBLE, mModel.get(StatusIndicatorProperties.ANDROID_VIEW_VISIBILITY));
         assertTrue(mModel.get(StatusIndicatorProperties.COMPOSITED_VIEW_VISIBLE));
 
         // Hide again.
         mMediator.onControlsOffsetChanged(0, 0, 0, 0, false);
-        assertThat(mModel.get(StatusIndicatorProperties.ANDROID_VIEW_VISIBILITY),
-                equalTo(View.INVISIBLE));
+        assertEquals(View.INVISIBLE, mModel.get(StatusIndicatorProperties.ANDROID_VIEW_VISIBILITY));
         assertFalse(mModel.get(StatusIndicatorProperties.COMPOSITED_VIEW_VISIBLE));
     }
+
+    private void setViewHeight(int height) {
+        when(mStatusIndicatorView.getHeight()).thenReturn(height);
+    }
 }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediatorTest.java
index d40c917..f193504d 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediatorTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediatorTest.java
@@ -185,4 +185,23 @@
         assertEquals(mModel.get(LoadProgressProperties.COMPLETION_STATE),
                 CompletionState.FINISHED_DO_ANIMATE);
     }
+
+    @Test
+    public void testSameDocumentLoad_afterFinishedLoading() {
+        assertEquals(mModel.get(LoadProgressProperties.COMPLETION_STATE),
+                CompletionState.FINISHED_DONT_ANIMATE);
+
+        NavigationHandle navigation = new NavigationHandle(0, URL_1, true, false, false);
+        mTabObserver.onDidStartNavigation(mTab, navigation);
+        mTabObserver.onLoadProgressChanged(mTab, 1.0f);
+        assertEquals(mModel.get(LoadProgressProperties.PROGRESS), 1.0f, MathUtils.EPSILON);
+        assertEquals(mModel.get(LoadProgressProperties.COMPLETION_STATE),
+                CompletionState.FINISHED_DO_ANIMATE);
+        NavigationHandle sameDocNav = new NavigationHandle(0, URL_1, true, true, false);
+        mTabObserver.onDidStartNavigation(mTab, sameDocNav);
+
+        assertEquals(mModel.get(LoadProgressProperties.PROGRESS), 1.0f, MathUtils.EPSILON);
+        assertEquals(mModel.get(LoadProgressProperties.COMPLETION_STATE),
+                CompletionState.FINISHED_DO_ANIMATE);
+    }
 }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkInfoTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkInfoTest.java
index c1682764..583a07d 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkInfoTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkInfoTest.java
@@ -23,6 +23,7 @@
 import org.robolectric.android.XmlResourceParserImpl;
 import org.robolectric.annotation.Config;
 import org.robolectric.res.ResourceTable;
+import org.robolectric.util.ReflectionHelpers;
 import org.w3c.dom.Document;
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
@@ -64,6 +65,8 @@
     private static final String MANIFEST_URL = "https://www.google.com/alphabet.json";
     private static final String ICON_URL = "https://www.google.com/scope/worm.png";
     private static final String ICON_MURMUR2_HASH = "5";
+    private static final int PRIMARY_ICON_ID = 12;
+    private static final int PRIMARY_MASKABLE_ICON_ID = 14;
     private static final int SOURCE = ShortcutSource.NOTIFICATION;
 
     /** Fakes the Resources object, allowing lookup of String value. */
@@ -175,6 +178,10 @@
 
     @Test
     public void testSanity() {
+        // Test guidelines:
+        // - Stubbing out native calls in this test likely means that there is a bug.
+        // - For every WebApkInfo boolean there should be a test which tests both values.
+
         Bundle bundle = new Bundle();
         bundle.putString(WebApkMetaDataKeys.SCOPE, SCOPE);
         bundle.putString(WebApkMetaDataKeys.NAME, NAME);
@@ -188,6 +195,8 @@
         bundle.putString(WebApkMetaDataKeys.START_URL, START_URL);
         bundle.putString(WebApkMetaDataKeys.ICON_URLS_AND_ICON_MURMUR2_HASHES,
                 ICON_URL + " " + ICON_MURMUR2_HASH);
+        bundle.putInt(WebApkMetaDataKeys.ICON_ID, PRIMARY_ICON_ID);
+        bundle.putInt(WebApkMetaDataKeys.MASKABLE_ICON_ID, PRIMARY_MASKABLE_ICON_ID);
 
         Bundle shareActivityBundle = new Bundle();
         shareActivityBundle.putString(WebApkMetaDataKeys.SHARE_ACTION, "action0");
@@ -238,7 +247,8 @@
         Assert.assertEquals(
                 (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M), info.isSplashProvidedByWebApk());
 
-        Assert.assertEquals(null, info.icon().bitmap());
+        Assert.assertEquals(PRIMARY_MASKABLE_ICON_ID, info.icon().resourceIdForTesting());
+        Assert.assertEquals(true, info.isIconAdaptive());
         Assert.assertEquals(null, info.badgeIcon().bitmap());
         Assert.assertEquals(null, info.splashIcon().bitmap());
 
@@ -255,6 +265,45 @@
     }
 
     /**
+     * Test that {@link WebApkInfo#create()} ignores the maskable icon on pre-Android-O
+     * Android OSes.
+     */
+    @Test
+    public void testOsVersionDoesNotSupportAdaptive() {
+        ReflectionHelpers.setStaticField(Build.VERSION.class, "SDK_INT", Build.VERSION_CODES.N);
+
+        Bundle bundle = new Bundle();
+        bundle.putInt(WebApkMetaDataKeys.ICON_ID, PRIMARY_ICON_ID);
+        bundle.putInt(WebApkMetaDataKeys.MASKABLE_ICON_ID, PRIMARY_MASKABLE_ICON_ID);
+        bundle.putString(WebApkMetaDataKeys.START_URL, START_URL);
+        WebApkTestHelper.registerWebApkWithMetaData(
+                WEBAPK_PACKAGE_NAME, bundle, null /* shareTargetMetaData */);
+
+        Intent intent = createMinimalWebApkIntent(WEBAPK_PACKAGE_NAME, START_URL);
+        WebApkInfo info = WebApkInfo.create(intent);
+        Assert.assertEquals(PRIMARY_ICON_ID, info.icon().resourceIdForTesting());
+        Assert.assertEquals(false, info.isIconAdaptive());
+    }
+
+    /**
+     * Test that {@link WebApkInfo#create()} selects {@link WebApkMetaDataKeys.ICON_ID} if no
+     * maskable icon is provided and that the icon is tagged as non-maskable.
+     */
+    @Test
+    public void testNoMaskableIcon() {
+        Bundle bundle = new Bundle();
+        bundle.putInt(WebApkMetaDataKeys.ICON_ID, PRIMARY_ICON_ID);
+        bundle.putString(WebApkMetaDataKeys.START_URL, START_URL);
+        WebApkTestHelper.registerWebApkWithMetaData(
+                WEBAPK_PACKAGE_NAME, bundle, null /* shareTargetMetaData */);
+
+        Intent intent = createMinimalWebApkIntent(WEBAPK_PACKAGE_NAME, START_URL);
+        WebApkInfo info = WebApkInfo.create(intent);
+        Assert.assertEquals(PRIMARY_ICON_ID, info.icon().resourceIdForTesting());
+        Assert.assertEquals(false, info.isIconAdaptive());
+    }
+
+    /**
      * Test that {@link WebApkInfo#create()} populates {@link WebApkInfo#url()} with the start URL
      * from the intent not the start URL in the WebAPK's meta data. When a WebAPK is launched via a
      * deep link from a URL within the WebAPK's scope, the WebAPK should open at the URL it was deep
diff --git a/chrome/android/native_java_unittests/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderTest.java b/chrome/android/native_java_unittests/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderTest.java
index cc58a64a..c1862348 100644
--- a/chrome/android/native_java_unittests/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderTest.java
+++ b/chrome/android/native_java_unittests/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderTest.java
@@ -18,6 +18,7 @@
 import org.chromium.base.Callback;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.CalledByNativeJavaTest;
+import org.chromium.base.annotations.DisabledCalledByNativeJavaTest;
 import org.chromium.base.test.util.JniMocker;
 import org.chromium.chrome.browser.UnitTestUtils;
 import org.chromium.chrome.browser.instantapps.InstantAppsHandler;
@@ -864,7 +865,7 @@
     }
 
     /** Tests the pseudo-random artificial delay to counter a timing attack. */
-    @CalledByNativeJavaTest
+    @DisabledCalledByNativeJavaTest  // crbug.com/1058857
     public void testArtificialDelay() throws Exception {
         byte[] salt = {0x64, 0x09, -0x68, -0x25, 0x70, 0x11, 0x25, 0x24, 0x68, -0x1a, 0x08, 0x79,
                 -0x12, -0x50, 0x3b, -0x57, -0x17, -0x4d, 0x46, 0x02};
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index f22f6c1..26283b6 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -3602,6 +3602,9 @@
           Profile Importer
         </message>
       </if>
+      <message name="IDS_UTILITY_PROCESS_QRCODE_GENERATOR_SERVICE_NAME" desc="The name of the utility process used for encoding QR codes.">
+        QR Code Generator
+      </message>
       <if expr="is_win">
         <message name="IDS_UTILITY_PROCESS_WIFI_CREDENTIALS_GETTER_NAME" desc="The name of the utility process used for getting the WiFi credentials">
           WiFi Credentials Getter
@@ -10470,9 +10473,27 @@
     <message name="IDS_DEEP_SCANNING_DIALOG_DRAG_FILES_FAILURE_MESSAGE" desc="Message shown in tab modal dialog after performing a deep scan of dragged files when they doesn't comply with enterprise security policies">
       These files violate your organization's security policies and can't be dropped.
     </message>
+    <message name="IDS_DEEP_SCANNING_DIALOG_UPLOAD_WARNING_MESSAGE" desc="Message shown in tab modal dialog after performing a deep scan of uploaded data when it doesn't comply with enterprise security policies to warn the user and allow them to proceed or not">
+      This upload violates your organization's security policies. Do you want to proceed anyway?
+    </message>
+    <message name="IDS_DEEP_SCANNING_DIALOG_PASTE_WARNING_MESSAGE" desc="Message shown in tab modal dialog after performing a deep scan of pasted data when it doesn't comply with enterprise security policies to warn the user and allow them to proceed or not">
+      This pasted data violates your organization's security policies. Do you want to proceed anyway?
+    </message>
+    <message name="IDS_DEEP_SCANNING_DIALOG_DRAG_DATA_WARNING_MESSAGE" desc="Message shown in tab modal dialog after performing a deep scan of dragged data when it doesn't comply with enterprise security policies to warn the user and allow them to proceed or not">
+      This dropped data violates your organization's security policies. Do you want to proceed anyway?
+    </message>
+    <message name="IDS_DEEP_SCANNING_DIALOG_DRAG_FILES_WARNING_MESSAGE" desc="Message shown in tab modal dialog after performing a deep scan of dragged files when they doesn't comply with enterprise security policies to warn the user and allow them to proceed or not">
+      These dropped files violate your organization's security policies. Do you want to proceed anyway?
+    </message>
     <message name="IDS_DEEP_SCANNING_DIALOG_TIMEOUT_MESSAGE" desc="Message shown in tab modal dialog after a deep scan times out.">
       Something went wrong. Scanning could not be completed. Please try again.
     </message>
+    <message name="IDS_DEEP_SCANNING_DIALOG_PROCEED_BUTTON" desc="Text shown in the proceed button of a tab modal dialog after performing a deep scan of data to ignore the obtained warning and proceed with the upload.">
+      Proceed anyway
+    </message>
+    <message name="IDS_DEEP_SCANNING_DIALOG_CANCEL_WARNING_BUTTON" desc="Text shown in the cancel button of a tab modal dialog after performing a deep scan of data to acknowledge the obtained warning and close the dialog.">
+      Cancel
+    </message>
     <message name="IDS_DEEP_SCANNING_DIALOG_CANCEL_UPLOAD_BUTTON" desc="Text shown in the cancel button of a tab modal dialog while performing a deep scan of data to see if it complies with enterprise policies">
       Cancel upload
     </message>
diff --git a/chrome/app/os_settings_strings.grdp b/chrome/app/os_settings_strings.grdp
index c83bf2a..2afd7ce 100644
--- a/chrome/app/os_settings_strings.grdp
+++ b/chrome/app/os_settings_strings.grdp
@@ -2413,5 +2413,73 @@
   <message name="IDS_SETTINGS_APPS_LINK_TEXT" desc="The label for the button which links to the App Management page.">
     Manage your apps
   </message>
+
+  <!-- Storage -->
+  <message name="IDS_SETTINGS_STORAGE_TITLE" desc="In Device Settings, the title for storage management.">
+    Storage management
+  </message>
+  <message name="IDS_SETTINGS_STORAGE_ITEM_IN_USE" desc="In Device Settings > Storage, label for the used storage size of Chrome OS internal storage.">
+    In use
+  </message>
+  <message name="IDS_SETTINGS_STORAGE_ITEM_AVAILABLE" desc="In Device Settings > Storage, label for the available storage size of Chrome OS internal storage.">
+    Available
+  </message>
+  <message name="IDS_SETTINGS_STORAGE_ITEM_MY_FILES" desc="In Device Settings > Storage, label for the size of My files root.">
+    My files
+  </message>
+  <message name="IDS_SETTINGS_STORAGE_ITEM_BROWSING_DATA" desc="In Device Settings > Storage, label for the size of browsing data.">
+    Browsing data
+  </message>
+  <message name="IDS_SETTINGS_STORAGE_ITEM_APPS" desc="In Device Settings > Storage, label for the total size of Android apps and web store apps and extensions.">
+    Apps and extensions
+  </message>
+  <message name="IDS_SETTINGS_STORAGE_ITEM_CROSTINI" desc="In Device Settings > Storage, label for the total size of Crostini VMs, apps and cache.">
+    Linux (Beta) storage
+  </message>
+  <message name="IDS_SETTINGS_STORAGE_ITEM_OTHER_USERS" desc="In Device Settings > Storage, label for the total size of other users' data directories.">
+    Other users
+  </message>
+  <message name="IDS_SETTINGS_STORAGE_SIZE_CALCULATING" desc="In Device Settings > Storage, label for storage item's size indicating the size is being calculated.">
+    Calculating...
+  </message>
+  <message name="IDS_SETTINGS_STORAGE_SIZE_UNKNOWN" desc="In Device Settings > Storage, label for storage item's size indicating the size is unknown">
+    Unknown
+  </message>
+  <message name="IDS_SETTINGS_STORAGE_SPACE_LOW_MESSAGE_TITLE" desc="Title of a warning message indicating device's available disk space is low.">
+    Device is low on space
+  </message>
+  <message name="IDS_SETTINGS_STORAGE_SPACE_LOW_MESSAGE_LINE_1" desc="The first paragraph of a warning message indicating device's available disk space is low.">
+    To free up space, delete files from device storage.
+  </message>
+  <message name="IDS_SETTINGS_STORAGE_SPACE_LOW_MESSAGE_LINE_2" desc="The second paragraph of a warning message indicating device's available disk space is low.">
+    If space isn’t made available, users and data may be automatically removed.
+  </message>
+  <message name="IDS_SETTINGS_STORAGE_SPACE_CRITICALLY_LOW_MESSAGE_TITLE" desc="Title of a warning message indicating device's available disk space is critically low.">
+    Device space critically low
+  </message>
+  <message name="IDS_SETTINGS_STORAGE_SPACE_CRITICALLY_LOW_MESSAGE_LINE_1" desc="The first paragraph of a warning message indicating device's available disk space is critically low.">
+    Free up at least 512 MB of space or your device will become unresponsive. To free up space, delete files from device storage.
+  </message>
+  <message name="IDS_SETTINGS_STORAGE_SPACE_CRITICALLY_LOW_MESSAGE_LINE_2" desc="The second paragraph of a warning message indicating device's available disk space is critically low.">
+    If you don’t free up space, users and data may be automatically removed.
+  </message>
+  <message name="IDS_SETTINGS_STORAGE_EXTERNAL" desc="In Device Settings > Storage, label for the subpage for setting preferences for external storage.">
+    External storage preferences
+  </message>
+  <message name="IDS_SETTINGS_STORAGE_ANDROID_APPS_ACCESS_EXTERNAL_DRIVES_NOTE" desc="Label for the additional note for the subpage for setting preferences for external storage.">
+    Apps from Google Play may require full file system access to read and write files on external storage devices. Files and folders created on the device are visible to anyone who uses the external drive. <ph name="LINK_BEGIN">&lt;a target="_blank" href="$1<ex>https://google.com/</ex>"&gt;</ph>Learn more<ph name="LINK_END">&lt;/a&gt;</ph>
+  </message>
+  <message name="IDS_SETTINGS_STORAGE_EXTERNAL_STORAGE_EMPTY_LIST_HEADER" desc="Header of the list of external storage devices for the subpage for setting preferences for external storage. This is shown when the list is empty.">
+    Available devices will appear here.
+  </message>
+  <message name="IDS_SETTINGS_STORAGE_EXTERNAL_STORAGE_LIST_HEADER" desc="Header of the list of external storage devices for the subpage for setting preferences for external storage. This is shown when the list is not empty.">
+    Available devices
+  </message>
+  <message name="IDS_SETTINGS_STORAGE_OVERVIEW_ARIA_LABEL" desc="The label to be read aloud by ChromeVox to describe the storage usage progress bar on the Storage page">
+    Storage Usage Overview
+  </message>
+  <message name="IDS_SETTINGS_STORAGE_ITEM_SYSTEM" desc="In Device Settings > Storage, label for the total system size, difference between the size of the filesystem and the size of all items listed on the storage page.">
+    System
+  </message>
 </if>
 </grit-part>
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index c7f3e597..ea23c54f 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -2898,77 +2898,6 @@
     Requires extension from the Chrome Web Store
   </message>
 
-  <!-- Device Page -->
-  <if expr="chromeos">
-    <!-- Storage -->
-    <message name="IDS_SETTINGS_STORAGE_TITLE" desc="In Device Settings, the title for storage management.">
-      Storage management
-    </message>
-    <message name="IDS_SETTINGS_STORAGE_ITEM_IN_USE" desc="In Device Settings > Storage, label for the used storage size of Chrome OS internal storage.">
-      In use
-    </message>
-    <message name="IDS_SETTINGS_STORAGE_ITEM_AVAILABLE" desc="In Device Settings > Storage, label for the available storage size of Chrome OS internal storage.">
-      Available
-    </message>
-    <message name="IDS_SETTINGS_STORAGE_ITEM_SYSTEM" desc="In Device Settings > Storage, label for the total system size, difference between the size of the filesystem and the size of all items listed on the storage page.">
-      System
-    </message>
-    <message name="IDS_SETTINGS_STORAGE_ITEM_MY_FILES" desc="In Device Settings > Storage, label for the size of My files root.">
-      My files
-    </message>
-    <message name="IDS_SETTINGS_STORAGE_ITEM_BROWSING_DATA" desc="In Device Settings > Storage, label for the size of browsing data.">
-      Browsing data
-    </message>
-    <message name="IDS_SETTINGS_STORAGE_ITEM_APPS" desc="In Device Settings > Storage, label for the total size of Android apps and web store apps and extensions.">
-      Apps and extensions
-    </message>
-    <message name="IDS_SETTINGS_STORAGE_ITEM_CROSTINI" desc="In Device Settings > Storage, label for the total size of Crostini VMs, apps and cache.">
-      Linux (Beta) storage
-    </message>
-    <message name="IDS_SETTINGS_STORAGE_ITEM_OTHER_USERS" desc="In Device Settings > Storage, label for the total size of other users' data directories.">
-      Other users
-    </message>
-    <message name="IDS_SETTINGS_STORAGE_SIZE_CALCULATING" desc="In Device Settings > Storage, label for storage item's size indicating the size is being calculated.">
-      Calculating...
-    </message>
-    <message name="IDS_SETTINGS_STORAGE_SIZE_UNKNOWN" desc="In Device Settings > Storage, label for storage item's size indicating the size is unknown">
-      Unknown
-    </message>
-    <message name="IDS_SETTINGS_STORAGE_SPACE_LOW_MESSAGE_TITLE" desc="Title of a warning message indicating device's available disk space is low.">
-      Device is low on space
-    </message>
-    <message name="IDS_SETTINGS_STORAGE_SPACE_LOW_MESSAGE_LINE_1" desc="The first paragraph of a warning message indicating device's available disk space is low.">
-      To free up space, delete files from device storage.
-    </message>
-    <message name="IDS_SETTINGS_STORAGE_SPACE_LOW_MESSAGE_LINE_2" desc="The second paragraph of a warning message indicating device's available disk space is low.">
-      If space isn’t made available, users and data may be automatically removed.
-    </message>
-    <message name="IDS_SETTINGS_STORAGE_SPACE_CRITICALLY_LOW_MESSAGE_TITLE" desc="Title of a warning message indicating device's available disk space is critically low.">
-      Device space critically low
-    </message>
-    <message name="IDS_SETTINGS_STORAGE_SPACE_CRITICALLY_LOW_MESSAGE_LINE_1" desc="The first paragraph of a warning message indicating device's available disk space is critically low.">
-      Free up at least 512 MB of space or your device will become unresponsive. To free up space, delete files from device storage.
-    </message>
-    <message name="IDS_SETTINGS_STORAGE_SPACE_CRITICALLY_LOW_MESSAGE_LINE_2" desc="The second paragraph of a warning message indicating device's available disk space is critically low.">
-      If you don’t free up space, users and data may be automatically removed.
-    </message>
-    <message name="IDS_SETTINGS_STORAGE_EXTERNAL" desc="In Device Settings > Storage, label for the subpage for setting preferences for external storage.">
-      External storage preferences
-    </message>
-    <message name="IDS_SETTINGS_STORAGE_ANDROID_APPS_ACCESS_EXTERNAL_DRIVES_NOTE" desc="Label for the additional note for the subpage for setting preferences for external storage.">
-      Apps from Google Play may require full file system access to read and write files on external storage devices. Files and folders created on the device are visible to anyone who uses the external drive. <ph name="LINK_BEGIN">&lt;a target="_blank" href="$1<ex>https://google.com/</ex>"&gt;</ph>Learn more<ph name="LINK_END">&lt;/a&gt;</ph>
-    </message>
-    <message name="IDS_SETTINGS_STORAGE_EXTERNAL_STORAGE_EMPTY_LIST_HEADER" desc="Header of the list of external storage devices for the subpage for setting preferences for external storage. This is shown when the list is empty.">
-      Available devices will appear here.
-    </message>
-    <message name="IDS_SETTINGS_STORAGE_EXTERNAL_STORAGE_LIST_HEADER" desc="Header of the list of external storage devices for the subpage for setting preferences for external storage. This is shown when the list is not empty.">
-      Available devices
-    </message>
-    <message name="IDS_SETTINGS_STORAGE_OVERVIEW_ARIA_LABEL" desc="The label to be read aloud by ChromeVox to describe the storage usage progress bar on the Storage page">
-      Storage Usage Overview
-    </message>
-  </if>
-
   <!-- System Page -->
   <if expr="not chromeos">
     <message name="IDS_SETTINGS_SYSTEM" desc="Title of the system settings.">
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 8336def7..9014ed5 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -3037,6 +3037,15 @@
       ]
       deps += [ "//chrome/android/modules/dev_ui/provider:native" ]
     }
+
+    if (enable_password_change_in_leaked_dialog) {
+      sources += [
+        "password_manager/credential_leak_password_change_controller_android.cc",
+        "password_manager/credential_leak_password_change_controller_android.h",
+      ]
+
+      defines += [ "ENABLE_PASSWORD_CHANGE" ]
+    }
   } else {  # !is_android
     sources += [
       "accessibility/caption_bubble.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index b059bfb..cbd199e4 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -179,7 +179,6 @@
 #include "chrome/browser/flags/android/chrome_feature_list.h"
 #else  // OS_ANDROID
 #include "chrome/browser/media/router/media_router_feature.h"
-#include "components/mirroring/service/features.h"
 #endif  // OS_ANDROID
 
 #if defined(OS_CHROMEOS)
@@ -2342,9 +2341,6 @@
      flag_descriptions::kCastMediaRouteProviderName,
      flag_descriptions::kCastMediaRouteProviderDescription, kOsDesktop,
      FEATURE_VALUE_TYPE(media_router::kCastMediaRouteProvider)},
-    {"mirroring-service", flag_descriptions::kMirroringServiceName,
-     flag_descriptions::kMirroringServiceDescription, kOsDesktop,
-     FEATURE_VALUE_TYPE(mirroring::features::kMirroringService)},
 #endif  // !OS_ANDROID
 #if defined(OS_ANDROID)
     {"autofill-keyboard-accessory-view",
diff --git a/chrome/browser/accessibility/image_annotation_browsertest.cc b/chrome/browser/accessibility/image_annotation_browsertest.cc
index fc03b62..b4dd6e1d 100644
--- a/chrome/browser/accessibility/image_annotation_browsertest.cc
+++ b/chrome/browser/accessibility/image_annotation_browsertest.cc
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/bind_helpers.h"
 #include "base/feature_list.h"
 #include "base/logging.h"
 #include "base/strings/string_split.h"
diff --git a/chrome/browser/android/explore_sites/explore_sites_bridge_experimental.cc b/chrome/browser/android/explore_sites/explore_sites_bridge_experimental.cc
index 2c9a09a..1a91b65 100644
--- a/chrome/browser/android/explore_sites/explore_sites_bridge_experimental.cc
+++ b/chrome/browser/android/explore_sites/explore_sites_bridge_experimental.cc
@@ -10,6 +10,7 @@
 #include "base/android/jni_string.h"
 #include "base/android/scoped_java_ref.h"
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/android/chrome_jni_headers/ExploreSitesBridgeExperimental_jni.h"
 #include "chrome/android/chrome_jni_headers/ExploreSitesCategoryTile_jni.h"
diff --git a/chrome/browser/android/explore_sites/explore_sites_service_impl.cc b/chrome/browser/android/explore_sites/explore_sites_service_impl.cc
index 9e68e04..70c14e48 100644
--- a/chrome/browser/android/explore_sites/explore_sites_service_impl.cc
+++ b/chrome/browser/android/explore_sites/explore_sites_service_impl.cc
@@ -6,6 +6,7 @@
 
 #include "base/bind.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/task/post_task.h"
diff --git a/chrome/browser/android/oom_intervention/oom_intervention_decider.cc b/chrome/browser/android/oom_intervention/oom_intervention_decider.cc
index 52b7273..5c4b3bd9 100644
--- a/chrome/browser/android/oom_intervention/oom_intervention_decider.cc
+++ b/chrome/browser/android/oom_intervention/oom_intervention_decider.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/android/oom_intervention/oom_intervention_decider.h"
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/metrics/metrics_service.h"
diff --git a/chrome/browser/android/signin/signin_manager_android.cc b/chrome/browser/android/signin/signin_manager_android.cc
index 5e050f79..d0409e5 100644
--- a/chrome/browser/android/signin/signin_manager_android.cc
+++ b/chrome/browser/android/signin/signin_manager_android.cc
@@ -9,6 +9,7 @@
 
 #include "base/android/jni_string.h"
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/feature_list.h"
 #include "chrome/android/chrome_jni_headers/SigninManager_jni.h"
 #include "chrome/common/pref_names.h"
diff --git a/chrome/browser/android/tab_android.cc b/chrome/browser/android/tab_android.cc
index e96593da..a0c6204 100644
--- a/chrome/browser/android/tab_android.cc
+++ b/chrome/browser/android/tab_android.cc
@@ -13,6 +13,7 @@
 #include "base/android/jni_android.h"
 #include "base/android/jni_string.h"
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
 #include "base/trace_event/trace_event.h"
diff --git a/chrome/browser/android/usage_stats/notification_suspender.cc b/chrome/browser/android/usage_stats/notification_suspender.cc
index cd32d15..380ff0e 100644
--- a/chrome/browser/android/usage_stats/notification_suspender.cc
+++ b/chrome/browser/android/usage_stats/notification_suspender.cc
@@ -6,6 +6,7 @@
 
 #include "base/android/jni_array.h"
 #include "base/android/jni_string.h"
+#include "base/bind_helpers.h"
 #include "base/logging.h"
 #include "chrome/android/chrome_jni_headers/NotificationSuspender_jni.h"
 #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/apps/app_service/extension_apps.cc b/chrome/browser/apps/app_service/extension_apps.cc
index e816fef..25a69feb 100644
--- a/chrome/browser/apps/app_service/extension_apps.cc
+++ b/chrome/browser/apps/app_service/extension_apps.cc
@@ -13,6 +13,7 @@
 #include "ash/public/cpp/multi_user_window_manager.h"
 #include "ash/public/cpp/shelf_types.h"
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/optional.h"
diff --git a/chrome/browser/apps/app_service/web_apps.cc b/chrome/browser/apps/app_service/web_apps.cc
index 448a554..ac086d5 100644
--- a/chrome/browser/apps/app_service/web_apps.cc
+++ b/chrome/browser/apps/app_service/web_apps.cc
@@ -11,6 +11,7 @@
 #include "ash/public/cpp/app_list/app_list_metrics.h"
 #include "ash/public/cpp/app_menu_constants.h"
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/optional.h"
diff --git a/chrome/browser/autofill/address_accessory_controller_impl.cc b/chrome/browser/autofill/address_accessory_controller_impl.cc
index 05bd064..89e31ffa 100644
--- a/chrome/browser/autofill/address_accessory_controller_impl.cc
+++ b/chrome/browser/autofill/address_accessory_controller_impl.cc
@@ -7,6 +7,7 @@
 #include <algorithm>
 #include <utility>
 
+#include "base/memory/ptr_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/android/preferences/autofill/autofill_profile_bridge.h"
 #include "chrome/browser/autofill/manual_filling_controller.h"
diff --git a/chrome/browser/autofill/credit_card_accessory_controller_impl.cc b/chrome/browser/autofill/credit_card_accessory_controller_impl.cc
index 7a30dcbd..8c6cd3c 100644
--- a/chrome/browser/autofill/credit_card_accessory_controller_impl.cc
+++ b/chrome/browser/autofill/credit_card_accessory_controller_impl.cc
@@ -9,6 +9,7 @@
 #include <utility>
 #include <vector>
 
+#include "base/memory/ptr_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/android/preferences/autofill/autofill_profile_bridge.h"
 #include "chrome/browser/autofill/manual_filling_controller.h"
diff --git a/chrome/browser/autofill/manual_filling_controller_impl.cc b/chrome/browser/autofill/manual_filling_controller_impl.cc
index 17076a7..be3f0aae 100644
--- a/chrome/browser/autofill/manual_filling_controller_impl.cc
+++ b/chrome/browser/autofill/manual_filling_controller_impl.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/callback.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "chrome/browser/autofill/address_accessory_controller.h"
 #include "chrome/browser/autofill/credit_card_accessory_controller.h"
diff --git a/chrome/browser/availability/availability_prober.cc b/chrome/browser/availability/availability_prober.cc
index 4eb7d58f7..bb4e8aed 100644
--- a/chrome/browser/availability/availability_prober.cc
+++ b/chrome/browser/availability/availability_prober.cc
@@ -10,6 +10,7 @@
 
 #include "base/base64.h"
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/guid.h"
 #include "base/metrics/histogram.h"
 #include "base/metrics/histogram_functions.h"
diff --git a/chrome/browser/background_fetch/background_fetch_delegate_impl.cc b/chrome/browser/background_fetch/background_fetch_delegate_impl.cc
index 91548ec5..321f0fa 100644
--- a/chrome/browser/background_fetch/background_fetch_delegate_impl.cc
+++ b/chrome/browser/background_fetch/background_fetch_delegate_impl.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/feature_list.h"
 #include "base/guid.h"
 #include "base/logging.h"
diff --git a/chrome/browser/background_sync/background_sync_permission_context_unittest.cc b/chrome/browser/background_sync/background_sync_permission_context_unittest.cc
index 6769836..bfc7c70f 100644
--- a/chrome/browser/background_sync/background_sync_permission_context_unittest.cc
+++ b/chrome/browser/background_sync/background_sync_permission_context_unittest.cc
@@ -7,6 +7,7 @@
 #include <string>
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/macros.h"
 #include "base/run_loop.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
diff --git a/chrome/browser/battery/battery_metrics_browsertest.cc b/chrome/browser/battery/battery_metrics_browsertest.cc
index be2f6a0..bededc2 100644
--- a/chrome/browser/battery/battery_metrics_browsertest.cc
+++ b/chrome/browser/battery/battery_metrics_browsertest.cc
@@ -5,6 +5,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/macros.h"
 #include "base/run_loop.h"
 #include "base/test/metrics/histogram_tester.h"
diff --git a/chrome/browser/browser_switcher/alternative_browser_driver.h b/chrome/browser/browser_switcher/alternative_browser_driver.h
index 20e1c13..3ae1948 100644
--- a/chrome/browser/browser_switcher/alternative_browser_driver.h
+++ b/chrome/browser/browser_switcher/alternative_browser_driver.h
@@ -7,6 +7,7 @@
 
 #include <string>
 
+#include "base/callback.h"
 #include "base/command_line.h"
 #include "base/files/file_path.h"
 #include "base/macros.h"
@@ -39,11 +40,13 @@
 // - Launching an external process
 class AlternativeBrowserDriver {
  public:
+  using LaunchCallback = base::OnceCallback<void(bool success)>;
+
   virtual ~AlternativeBrowserDriver();
 
   // Tries to launch |browser| at the specified URL, using whatever
   // method is most appropriate.
-  virtual bool TryLaunch(const GURL& url) = 0;
+  virtual void TryLaunch(const GURL& url, LaunchCallback cb) = 0;
 
   // Returns the localized string for the name of the alternative browser, if it
   // was auto-detected. If the name couldn't be auto-detected, returns an empty
@@ -62,8 +65,12 @@
   explicit AlternativeBrowserDriverImpl(const BrowserSwitcherPrefs* prefs);
   ~AlternativeBrowserDriverImpl() override;
 
+  AlternativeBrowserDriverImpl(const AlternativeBrowserDriverImpl&) = delete;
+  AlternativeBrowserDriverImpl& operator=(const AlternativeBrowserDriverImpl&) =
+      delete;
+
   // AlternativeBrowserDriver
-  bool TryLaunch(const GURL& url) override;
+  void TryLaunch(const GURL& url, LaunchCallback cb) override;
   std::string GetBrowserName() const override;
   BrowserType GetBrowserType() const override;
 
@@ -74,14 +81,7 @@
  private:
   using StringType = base::FilePath::StringType;
 
-#if defined(OS_WIN)
-  bool TryLaunchWithDde(const GURL& url);
-  bool TryLaunchWithExec(const GURL& url);
-#endif
-
   const BrowserSwitcherPrefs* const prefs_;
-
-  DISALLOW_COPY_AND_ASSIGN(AlternativeBrowserDriverImpl);
 };
 
 }  // namespace browser_switcher
diff --git a/chrome/browser/browser_switcher/alternative_browser_driver_posix.cc b/chrome/browser/browser_switcher/alternative_browser_driver_posix.cc
index bb9d900..ad6c6bb 100644
--- a/chrome/browser/browser_switcher/alternative_browser_driver_posix.cc
+++ b/chrome/browser/browser_switcher/alternative_browser_driver_posix.cc
@@ -11,9 +11,14 @@
 #include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/task/post_task.h"
+#include "base/task/thread_pool.h"
+#include "base/threading/scoped_blocking_call.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_switcher/browser_switcher_prefs.h"
 #include "chrome/grit/generated_resources.h"
+#include "content/public/browser/browser_task_traits.h"
+#include "content/public/browser/browser_thread.h"
 #include "url/gurl.h"
 
 #include "third_party/re2/src/re2/re2.h"
@@ -22,6 +27,8 @@
 
 namespace {
 
+using LaunchCallback = AlternativeBrowserDriver::LaunchCallback;
+
 const char kUrlVarName[] = "${url}";
 
 #if defined(OS_MACOSX)
@@ -147,64 +154,14 @@
     *str = mapping->executable_name;
 }
 
-}  // namespace
-
-AlternativeBrowserDriver::~AlternativeBrowserDriver() {}
-
-AlternativeBrowserDriverImpl::AlternativeBrowserDriverImpl(
-    const BrowserSwitcherPrefs* prefs)
-    : prefs_(prefs) {}
-
-AlternativeBrowserDriverImpl::~AlternativeBrowserDriverImpl() {}
-
-bool AlternativeBrowserDriverImpl::TryLaunch(const GURL& url) {
-#if !defined(OS_MACOSX)
-  if (prefs_->GetAlternativeBrowserPath().empty()) {
-    LOG(ERROR) << "Alternative browser not configured. "
-               << "Aborting browser switch.";
-    return false;
-  }
-#endif
-
-  VLOG(2) << "Launching alternative browser...";
-  VLOG(2) << "  path = " << prefs_->GetAlternativeBrowserPath();
-  VLOG(2) << "  url = " << url.spec();
-
-  CHECK(url.SchemeIsHTTPOrHTTPS() || url.SchemeIsFile());
-
-  auto cmd_line = CreateCommandLine(url);
-  base::LaunchOptions options;
-  // Don't close the alternative browser when Chrome exits.
-  options.new_process_group = true;
-  if (!base::LaunchProcess(cmd_line, options).IsValid()) {
-    LOG(ERROR) << "Could not start the alternative browser!";
-    return false;
-  }
-  return true;
-}
-
-std::string AlternativeBrowserDriverImpl::GetBrowserName() const {
-  std::string path = prefs_->GetAlternativeBrowserPath();
-  const auto* mapping = FindBrowserMapping(path);
-  return mapping ? mapping->browser_name : std::string();
-}
-
-BrowserType AlternativeBrowserDriverImpl::GetBrowserType() const {
-  std::string path = prefs_->GetAlternativeBrowserPath();
-  const auto* mapping = FindBrowserMapping(path);
-  return mapping ? mapping->browser_type : BrowserType::kUnknown;
-}
-
-base::CommandLine AlternativeBrowserDriverImpl::CreateCommandLine(
-    const GURL& url) {
-  std::string path = prefs_->GetAlternativeBrowserPath();
+base::CommandLine CreateCommandLine(const GURL& url,
+                                    const std::string& original_path,
+                                    const std::vector<std::string>& params) {
+  std::string path = original_path;
   ExpandPresetBrowsers(&path);
   ExpandTilde(&path);
   ExpandEnvironmentVariables(&path);
 
-  const std::vector<std::string>& params =
-      prefs_->GetAlternativeBrowserParameters();
-
 #if defined(OS_MACOSX)
   // On MacOS, if the path doesn't start with a '/', it's probably not an
   // executable path. It is probably a name for an application, e.g. "Safari" or
@@ -240,4 +197,75 @@
   return cmd_line;
 }
 
+void TryLaunchBlocking(GURL url,
+                       std::string path,
+                       std::vector<std::string> params,
+                       LaunchCallback cb) {
+  base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
+                                                base::BlockingType::MAY_BLOCK);
+
+  CHECK(url.SchemeIsHTTPOrHTTPS() || url.SchemeIsFile());
+
+  auto cmd_line = CreateCommandLine(url, path, params);
+  base::LaunchOptions options;
+  // Don't close the alternative browser when Chrome exits.
+  options.new_process_group = true;
+  const bool success = base::LaunchProcess(cmd_line, options).IsValid();
+  if (!success)
+    LOG(ERROR) << "Could not start the alternative browser!";
+}
+
+}  // namespace
+
+AlternativeBrowserDriver::~AlternativeBrowserDriver() = default;
+
+AlternativeBrowserDriverImpl::AlternativeBrowserDriverImpl(
+    const BrowserSwitcherPrefs* prefs)
+    : prefs_(prefs) {}
+
+AlternativeBrowserDriverImpl::~AlternativeBrowserDriverImpl() = default;
+
+void AlternativeBrowserDriverImpl::TryLaunch(const GURL& url,
+                                             LaunchCallback cb) {
+#if !defined(OS_MACOSX)
+  if (prefs_->GetAlternativeBrowserPath().empty()) {
+    LOG(ERROR) << "Alternative browser not configured. "
+               << "Aborting browser switch.";
+    std::move(cb).Run(false);
+    return;
+  }
+#endif
+
+  VLOG(2) << "Launching alternative browser...";
+  VLOG(2) << "  path = " << prefs_->GetAlternativeBrowserPath();
+  VLOG(2) << "  url = " << url.spec();
+
+  base::ThreadPool::PostTask(
+      FROM_HERE,
+      {base::MayBlock(), base::TaskPriority::USER_BLOCKING,
+       base::TaskShutdownBehavior::BLOCK_SHUTDOWN},
+      base::BindOnce(&TryLaunchBlocking, url,
+                     prefs_->GetAlternativeBrowserPath(),
+                     prefs_->GetAlternativeBrowserParameters(), std::move(cb)));
+}
+
+std::string AlternativeBrowserDriverImpl::GetBrowserName() const {
+  std::string path = prefs_->GetAlternativeBrowserPath();
+  const auto* mapping = FindBrowserMapping(path);
+  return mapping ? mapping->browser_name : std::string();
+}
+
+BrowserType AlternativeBrowserDriverImpl::GetBrowserType() const {
+  std::string path = prefs_->GetAlternativeBrowserPath();
+  const auto* mapping = FindBrowserMapping(path);
+  return mapping ? mapping->browser_type : BrowserType::kUnknown;
+}
+
+base::CommandLine AlternativeBrowserDriverImpl::CreateCommandLine(
+    const GURL& url) {
+  return browser_switcher::CreateCommandLine(
+      url, prefs_->GetAlternativeBrowserPath(),
+      prefs_->GetAlternativeBrowserParameters());
+}
+
 }  // namespace browser_switcher
diff --git a/chrome/browser/browser_switcher/alternative_browser_driver_win.cc b/chrome/browser/browser_switcher/alternative_browser_driver_win.cc
index 34a57d64..a264acb 100644
--- a/chrome/browser/browser_switcher/alternative_browser_driver_win.cc
+++ b/chrome/browser/browser_switcher/alternative_browser_driver_win.cc
@@ -16,15 +16,22 @@
 #include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/task/post_task.h"
+#include "base/task/thread_pool.h"
+#include "base/threading/scoped_blocking_call.h"
 #include "base/win/registry.h"
 #include "chrome/browser/browser_switcher/browser_switcher_prefs.h"
 #include "chrome/grit/generated_resources.h"
+#include "content/public/browser/browser_task_traits.h"
+#include "content/public/browser/browser_thread.h"
 #include "url/gurl.h"
 
 namespace browser_switcher {
 
 namespace {
 
+using LaunchCallback = AlternativeBrowserDriver::LaunchCallback;
+
 const wchar_t kUrlVarName[] = L"${url}";
 
 const wchar_t kIExploreKey[] =
@@ -179,41 +186,16 @@
 }
 
 bool IsInternetExplorer(base::StringPiece path) {
-  // TODO(nicolaso): Check if the path looks like the default IEXPLORE.exe path.
+  // We don't treat IExplore.exe as Internet Explorer here. This way, admins can
+  // set |AlternativeBrowserPath| to IExplore.exe to disable DDE, if it's
+  // causing issues or slowness.
   return (path.empty() || base::EqualsASCII(kIExploreKey, path));
 }
 
-}  // namespace
-
-AlternativeBrowserDriver::~AlternativeBrowserDriver() {}
-
-AlternativeBrowserDriverImpl::AlternativeBrowserDriverImpl(
-    const BrowserSwitcherPrefs* prefs)
-    : prefs_(prefs) {}
-
-AlternativeBrowserDriverImpl::~AlternativeBrowserDriverImpl() {}
-
-bool AlternativeBrowserDriverImpl::TryLaunch(const GURL& url) {
-  VLOG(2) << "Launching alternative browser...";
-  VLOG(2) << "  path = " << prefs_->GetAlternativeBrowserPath();
-  VLOG(2) << "  url = " << url.spec();
-  return (TryLaunchWithDde(url) || TryLaunchWithExec(url));
-}
-
-std::string AlternativeBrowserDriverImpl::GetBrowserName() const {
-  std::wstring path = base::UTF8ToWide(prefs_->GetAlternativeBrowserPath());
-  const auto* mapping = FindBrowserMapping(path, false);
-  return mapping ? mapping->browser_name : std::string();
-}
-
-BrowserType AlternativeBrowserDriverImpl::GetBrowserType() const {
-  std::wstring path = base::UTF8ToWide(prefs_->GetAlternativeBrowserPath());
-  const auto* mapping = FindBrowserMapping(path, true);
-  return mapping ? mapping->browser_type : BrowserType::kUnknown;
-}
-
-bool AlternativeBrowserDriverImpl::TryLaunchWithDde(const GURL& url) {
-  if (!IsInternetExplorer(prefs_->GetAlternativeBrowserPath()))
+bool TryLaunchWithDde(const GURL& url, const std::string& path) {
+  base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
+                                                base::BlockingType::WILL_BLOCK);
+  if (!IsInternetExplorer(path))
     return false;
 
   DWORD dde_instance = 0;
@@ -270,10 +252,27 @@
   return success;
 }
 
-bool AlternativeBrowserDriverImpl::TryLaunchWithExec(const GURL& url) {
+base::CommandLine CreateCommandLine(const GURL& url,
+                                    const std::string& utf8_path,
+                                    const std::vector<std::string>& params) {
+  std::wstring path = base::UTF8ToWide(utf8_path);
+  ExpandPresetBrowsers(&path);
+  ExpandEnvironmentVariables(&path);
+  base::CommandLine cmd_line(std::vector<std::wstring>{path});
+
+  AppendCommandLineArguments(&cmd_line, params, url);
+
+  return cmd_line;
+}
+
+bool TryLaunchWithExec(const GURL& url,
+                       const std::string& path,
+                       const std::vector<std::string>& args) {
+  base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
+                                                base::BlockingType::MAY_BLOCK);
   CHECK(url.SchemeIsHTTPOrHTTPS() || url.SchemeIsFile());
 
-  auto cmd_line = CreateCommandLine(url);
+  auto cmd_line = CreateCommandLine(url, path, args);
 
   base::LaunchOptions options;
   if (!base::LaunchProcess(cmd_line, options).IsValid()) {
@@ -284,17 +283,61 @@
   return true;
 }
 
+void TryLaunchBlocking(GURL url,
+                       std::string path,
+                       std::vector<std::string> params,
+                       LaunchCallback cb) {
+  const bool success =
+      (TryLaunchWithDde(url, path) || TryLaunchWithExec(url, path, params));
+  base::PostTask(
+      FROM_HERE, {content::BrowserThread::UI},
+      base::BindOnce(
+          [](bool success, LaunchCallback cb) { std::move(cb).Run(success); },
+          success, std::move(cb)));
+}
+
+}  // namespace
+
+AlternativeBrowserDriver::~AlternativeBrowserDriver() = default;
+
+AlternativeBrowserDriverImpl::AlternativeBrowserDriverImpl(
+    const BrowserSwitcherPrefs* prefs)
+    : prefs_(prefs) {}
+
+AlternativeBrowserDriverImpl::~AlternativeBrowserDriverImpl() = default;
+
+void AlternativeBrowserDriverImpl::TryLaunch(const GURL& url,
+                                             LaunchCallback cb) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  VLOG(2) << "Launching alternative browser...";
+  VLOG(2) << "  path = " << prefs_->GetAlternativeBrowserPath();
+  VLOG(2) << "  url = " << url.spec();
+  base::ThreadPool::PostTask(
+      FROM_HERE,
+      {base::MayBlock(), base::TaskPriority::USER_BLOCKING,
+       base::TaskShutdownBehavior::BLOCK_SHUTDOWN},
+      base::BindOnce(&TryLaunchBlocking, url,
+                     prefs_->GetAlternativeBrowserPath(),
+                     prefs_->GetAlternativeBrowserParameters(), std::move(cb)));
+}
+
+std::string AlternativeBrowserDriverImpl::GetBrowserName() const {
+  std::wstring path = base::UTF8ToWide(prefs_->GetAlternativeBrowserPath());
+  const auto* mapping = FindBrowserMapping(path, false);
+  return mapping ? mapping->browser_name : std::string();
+}
+
+BrowserType AlternativeBrowserDriverImpl::GetBrowserType() const {
+  std::wstring path = base::UTF8ToWide(prefs_->GetAlternativeBrowserPath());
+  const auto* mapping = FindBrowserMapping(path, true);
+  return mapping ? mapping->browser_type : BrowserType::kUnknown;
+}
+
 base::CommandLine AlternativeBrowserDriverImpl::CreateCommandLine(
     const GURL& url) {
-  std::wstring path = base::UTF8ToWide(prefs_->GetAlternativeBrowserPath());
-  ExpandPresetBrowsers(&path);
-  ExpandEnvironmentVariables(&path);
-  base::CommandLine cmd_line(std::vector<std::wstring>{path});
-
-  AppendCommandLineArguments(&cmd_line,
-                             prefs_->GetAlternativeBrowserParameters(), url);
-
-  return cmd_line;
+  return browser_switcher::CreateCommandLine(
+      url, prefs_->GetAlternativeBrowserPath(),
+      prefs_->GetAlternativeBrowserParameters());
 }
 
 }  // namespace browser_switcher
diff --git a/chrome/browser/browser_switcher/mock_alternative_browser_driver.h b/chrome/browser/browser_switcher/mock_alternative_browser_driver.h
index 8c99d94..9813ee8 100644
--- a/chrome/browser/browser_switcher/mock_alternative_browser_driver.h
+++ b/chrome/browser/browser_switcher/mock_alternative_browser_driver.h
@@ -20,7 +20,7 @@
 
   MOCK_CONST_METHOD1(ExpandEnvVars, void(std::string*));
   MOCK_CONST_METHOD1(ExpandPresetBrowsers, void(std::string*));
-  MOCK_METHOD1(TryLaunch, bool(const GURL&));
+  MOCK_METHOD2(TryLaunch, void(const GURL&, LaunchCallback cb));
   MOCK_CONST_METHOD0(GetBrowserName, std::string());
 };
 
diff --git a/chrome/browser/browsing_data/browsing_data_history_observer_service.cc b/chrome/browser/browsing_data/browsing_data_history_observer_service.cc
index db0e66b..ccec1f9 100644
--- a/chrome/browser/browsing_data/browsing_data_history_observer_service.cc
+++ b/chrome/browser/browsing_data/browsing_data_history_observer_service.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/browsing_data/browsing_data_history_observer_service.h"
 
+#include "base/callback_helpers.h"
 #include "chrome/browser/browsing_data/navigation_entry_remover.h"
 #include "chrome/browser/history/history_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/chrome_security_exploit_browsertest.cc b/chrome/browser/chrome_security_exploit_browsertest.cc
index 887d66d..039cd93 100644
--- a/chrome/browser/chrome_security_exploit_browsertest.cc
+++ b/chrome/browser/chrome_security_exploit_browsertest.cc
@@ -5,6 +5,7 @@
 #include "base/bind.h"
 #include "base/command_line.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/metrics/histogram_tester.h"
diff --git a/chrome/browser/chromeos/accessibility/accessibility_manager.cc b/chrome/browser/chromeos/accessibility/accessibility_manager.cc
index c2d6c0a..380e03c 100644
--- a/chrome/browser/chromeos/accessibility/accessibility_manager.cc
+++ b/chrome/browser/chromeos/accessibility/accessibility_manager.cc
@@ -21,6 +21,7 @@
 #include "ash/shell.h"
 #include "ash/sticky_keys/sticky_keys_controller.h"
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/callback_helpers.h"
 #include "base/command_line.h"
diff --git a/chrome/browser/chromeos/arc/fileapi/arc_content_file_system_file_stream_reader.cc b/chrome/browser/chromeos/arc/fileapi/arc_content_file_system_file_stream_reader.cc
index ba21245..6ef1ffa 100644
--- a/chrome/browser/chromeos/arc/fileapi/arc_content_file_system_file_stream_reader.cc
+++ b/chrome/browser/chromeos/arc/fileapi/arc_content_file_system_file_stream_reader.cc
@@ -10,6 +10,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/files/file.h"
 #include "base/task/post_task.h"
 #include "base/task/thread_pool.h"
diff --git a/chrome/browser/chromeos/arc/fileapi/arc_content_file_system_file_stream_writer.cc b/chrome/browser/chromeos/arc/fileapi/arc_content_file_system_file_stream_writer.cc
index 8334eac..7d61684 100644
--- a/chrome/browser/chromeos/arc/fileapi/arc_content_file_system_file_stream_writer.cc
+++ b/chrome/browser/chromeos/arc/fileapi/arc_content_file_system_file_stream_writer.cc
@@ -9,6 +9,7 @@
 
 #include <utility>
 
+#include "base/bind_helpers.h"
 #include "base/files/file.h"
 #include "base/logging.h"
 #include "base/task/post_task.h"
diff --git a/chrome/browser/chromeos/arc/fileapi/arc_file_system_operation_runner.cc b/chrome/browser/chromeos/arc/fileapi/arc_file_system_operation_runner.cc
index 842792a..901b59fe 100644
--- a/chrome/browser/chromeos/arc/fileapi/arc_file_system_operation_runner.cc
+++ b/chrome/browser/chromeos/arc/fileapi/arc_file_system_operation_runner.cc
@@ -8,6 +8,7 @@
 
 #include "base/bind.h"
 #include "base/location.h"
+#include "base/memory/ptr_util.h"
 #include "base/memory/singleton.h"
 #include "base/optional.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service_unittest.cc b/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service_unittest.cc
index 59ddf04..7b8778c1 100644
--- a/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service_unittest.cc
+++ b/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service_unittest.cc
@@ -13,6 +13,7 @@
 #include "ash/public/cpp/keyboard/keyboard_switches.h"
 #include "ash/public/cpp/tablet_mode.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/run_loop.h"
 #include "base/stl_util.h"
diff --git a/chrome/browser/chromeos/arc/kiosk/arc_kiosk_bridge.cc b/chrome/browser/chromeos/arc/kiosk/arc_kiosk_bridge.cc
index 8e0d808f..24f7e6f5 100644
--- a/chrome/browser/chromeos/arc/kiosk/arc_kiosk_bridge.cc
+++ b/chrome/browser/chromeos/arc/kiosk/arc_kiosk_bridge.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "base/memory/ptr_util.h"
 #include "base/memory/singleton.h"
 #include "chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_service.h"
 #include "chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_service_factory.h"
diff --git a/chrome/browser/chromeos/assistant/assistant_util.cc b/chrome/browser/chromeos/assistant/assistant_util.cc
index d95d729b..8dc8a67e 100644
--- a/chrome/browser/chromeos/assistant/assistant_util.cc
+++ b/chrome/browser/chromeos/assistant/assistant_util.cc
@@ -26,6 +26,16 @@
 #include "third_party/icu/source/common/unicode/locid.h"
 #include "ui/chromeos/events/keyboard_layout_util.h"
 
+namespace {
+
+bool IsActiveDirectoryUser(const Profile* profile) {
+  const user_manager::User* user =
+      chromeos::ProfileHelper::Get()->GetUserByProfile(profile);
+  return user->IsActiveDirectoryUser();
+}
+
+}  // namespace
+
 namespace assistant {
 
 ash::mojom::AssistantAllowedState IsAssistantAllowedForProfile(
@@ -45,6 +55,9 @@
   if (user_manager::UserManager::Get()->IsLoggedInAsPublicAccount())
     return ash::mojom::AssistantAllowedState::DISALLOWED_BY_PUBLIC_SESSION;
 
+  if (IsActiveDirectoryUser(profile))
+    return ash::mojom::AssistantAllowedState::DISALLOWED_BY_ACCOUNT_TYPE;
+
   if (user_manager::UserManager::Get()->IsLoggedInAsAnyKioskApp()) {
     return ash::mojom::AssistantAllowedState::DISALLOWED_BY_KIOSK_MODE;
   }
diff --git a/chrome/browser/chromeos/assistant/assistant_util_unittest.cc b/chrome/browser/chromeos/assistant/assistant_util_unittest.cc
index 15e4e9f..0f3c38d 100644
--- a/chrome/browser/chromeos/assistant/assistant_util_unittest.cc
+++ b/chrome/browser/chromeos/assistant/assistant_util_unittest.cc
@@ -137,6 +137,10 @@
   DISALLOW_COPY_AND_ASSIGN(ScopedLogIn);
 };
 
+AccountId GetActiveDirectoryUserAccountId(const std::string& email) {
+  return AccountId::AdFromUserEmailObjGuid(email, "<obj_guid>");
+}
+
 }  // namespace
 
 class ChromeAssistantUtilTest : public testing::Test {
@@ -276,6 +280,17 @@
             IsAssistantAllowedForProfile(profile()));
 }
 
+TEST_F(ChromeAssistantUtilTest,
+       IsAssistantAllowedForProfile_ActiveDirectoryUser) {
+  ScopedLogIn login(
+      GetFakeUserManager(), identity_test_env(),
+      GetActiveDirectoryUserAccountId(profile()->GetProfileUserName()),
+      user_manager::USER_TYPE_ACTIVE_DIRECTORY);
+
+  EXPECT_EQ(ash::mojom::AssistantAllowedState::DISALLOWED_BY_ACCOUNT_TYPE,
+            IsAssistantAllowedForProfile(profile()));
+}
+
 TEST_F(ChromeAssistantUtilTest, IsAssistantAllowedForKiosk_KioskApp) {
   ScopedLogIn login(GetFakeUserManager(), identity_test_env(),
                     AccountId::FromUserEmail(profile()->GetProfileUserName()),
diff --git a/chrome/browser/chromeos/attestation/attestation_policy_observer.cc b/chrome/browser/chromeos/attestation/attestation_policy_observer.cc
index 0508f539..f5c84c5 100644
--- a/chrome/browser/chromeos/attestation/attestation_policy_observer.cc
+++ b/chrome/browser/chromeos/attestation/attestation_policy_observer.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "chrome/browser/chromeos/attestation/machine_certificate_uploader.h"
 #include "chrome/browser/chromeos/settings/cros_settings.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/chromeos/attestation/machine_certificate_uploader_impl.cc b/chrome/browser/chromeos/attestation/machine_certificate_uploader_impl.cc
index a39cd0a..350c77a 100644
--- a/chrome/browser/chromeos/attestation/machine_certificate_uploader_impl.cc
+++ b/chrome/browser/chromeos/attestation/machine_certificate_uploader_impl.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/location.h"
 #include "base/optional.h"
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.cc b/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.cc
index 34f37091..1a54c722 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.cc
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.cc
@@ -146,6 +146,7 @@
   registry->RegisterListPref(prefs::kPerAppTimeLimitsAppActivities);
   registry->RegisterInt64Pref(prefs::kPerAppTimeLimitsLastSuccessfulReportTime,
                               0);
+  registry->RegisterInt64Pref(prefs::kPerAppTimeLimitsLatestLimitUpdateTime, 0);
 }
 
 AppActivityRegistry::AppActivityRegistry(
@@ -190,8 +191,13 @@
 }
 
 void AppActivityRegistry::OnAppAvailable(const AppId& app_id) {
-  if (base::Contains(activity_registry_, app_id))
-    SetAppState(app_id, AppState::kAvailable);
+  if (!base::Contains(activity_registry_, app_id))
+    return;
+
+  if (GetAppState(app_id) == AppState::kLimitReached)
+    return;
+
+  SetAppState(app_id, AppState::kAvailable);
 }
 
 void AppActivityRegistry::OnAppBlocked(const AppId& app_id) {
@@ -205,6 +211,18 @@
   if (!base::Contains(activity_registry_, app_id))
     return;
 
+  // We are notified that a paused app is active. Notify observers to pause it.
+  if (GetAppState(app_id) == AppState::kLimitReached) {
+    for (auto& observer : app_state_observers_) {
+      const base::Optional<AppLimit>& limit =
+          activity_registry_.at(app_id).limit;
+      DCHECK(limit->daily_limit());
+      observer.OnAppLimitReached(app_id, limit->daily_limit().value(),
+                                 /* was_active */ true);
+    }
+    return;
+  }
+
   if (app_id == GetChromeAppId())
     return;
 
@@ -386,6 +404,7 @@
 
 void AppActivityRegistry::UpdateAppLimits(
     const std::map<AppId, AppLimit>& app_limits) {
+  base::Time latest_update = latest_app_limit_update_;
   for (auto& entry : activity_registry_) {
     const AppId& app_id = entry.first;
     base::Optional<AppLimit> new_limit;
@@ -404,7 +423,17 @@
     }
 
     SetAppLimit(app_id, new_limit);
+
+    if (new_limit && new_limit->last_updated() > latest_update)
+      latest_update = new_limit->last_updated();
   }
+
+  latest_app_limit_update_ = latest_update;
+
+  // Update the latest app limit update.
+  profile_->GetPrefs()->SetInt64(
+      prefs::kPerAppTimeLimitsLatestLimitUpdateTime,
+      latest_app_limit_update_.ToDeltaSinceWindowsEpoch().InMicroseconds());
 }
 
 void AppActivityRegistry::SetAppLimit(
@@ -473,6 +502,11 @@
 
   bool is_active = (state == ChromeAppActivityState::kActive);
 
+  // No need to notify observers that limit has reached. They will be notified
+  // in AppActivityRegistry::OnAppActive.
+  if (GetAppState(chrome_app_id) == AppState::kLimitReached && is_active)
+    return;
+
   // No change in state.
   if (was_active == is_active)
     return;
@@ -622,7 +656,7 @@
     if (app_activity.is_active()) {
       was_active = true;
       app_details.active_windows.clear();
-      app_activity.SetAppInactive(base::Time::Now());
+      SetAppInactive(app_id, base::Time::Now());
     }
 
     for (auto& observer : app_state_observers_) {
@@ -819,6 +853,12 @@
   if (app_id.app_type() == apps::mojom::AppType::kWeb)
     return;
 
+  // Don't show notification if the time limit's update was older than the
+  // latest update.
+  if (new_limit && new_limit->last_updated() <= latest_app_limit_update_) {
+    return;
+  }
+
   const bool had_time_limit =
       old_limit && old_limit->restriction() == AppRestriction::kTimeLimit;
   const bool has_time_limit =
@@ -872,6 +912,19 @@
 
 void AppActivityRegistry::InitializeRegistryFromPref() {
   PrefService* pref_service = profile_->GetPrefs();
+  DCHECK(pref_service);
+
+  int64_t last_limits_updates =
+      pref_service->GetInt64(prefs::kPerAppTimeLimitsLatestLimitUpdateTime);
+
+  latest_app_limit_update_ = base::Time::FromDeltaSinceWindowsEpoch(
+      base::TimeDelta::FromMicroseconds(last_limits_updates));
+
+  InitializeAppActivities();
+}
+
+void AppActivityRegistry::InitializeAppActivities() {
+  PrefService* pref_service = profile_->GetPrefs();
   const base::Value* value =
       pref_service->GetList(prefs::kPerAppTimeLimitsAppActivities);
   DCHECK(value);
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.h b/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.h
index 8fa6046f..f9a56970 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.h
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.h
@@ -227,6 +227,7 @@
   // Installed applications, their AppStates and their running active times will
   // be restored.
   void InitializeRegistryFromPref();
+  void InitializeAppActivities();
 
   // Updates |AppActivity::active_times_| to include the current activity up to
   // |timestamp| then creates the most up to date instance of PersistedAppInfo.
@@ -256,6 +257,9 @@
 
   // Repeating timer to trigger saving app activity to pref service.
   base::RepeatingTimer save_data_to_pref_service_;
+
+  // This records the timestamp of the latest set app limit.
+  base::Time latest_app_limit_update_;
 };
 
 }  // namespace app_time
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry_unittest.cc b/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry_unittest.cc
index 15a1316..ada8b487 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry_unittest.cc
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry_unittest.cc
@@ -52,6 +52,19 @@
                     chromeos::app_time::AppNotification));
 };
 
+class AppStateObserverMock : public AppActivityRegistry::AppStateObserver {
+ public:
+  AppStateObserverMock() = default;
+  AppStateObserverMock(const AppStateObserverMock&) = delete;
+  AppStateObserverMock& operator=(const AppStateObserverMock&) = delete;
+
+  ~AppStateObserverMock() = default;
+
+  MOCK_METHOD3(OnAppLimitReached, void(const AppId&, base::TimeDelta, bool));
+  MOCK_METHOD1(OnAppLimitRemoved, void(const AppId&));
+  MOCK_METHOD1(OnAppInstalled, void(const AppId&));
+};
+
 }  // namespace
 
 class AppActivityRegistryTest : public ChromeViewsTestBase {
@@ -66,7 +79,10 @@
   // ChromeViewsTestBase:
   void SetUp() override;
 
+  void InstallApps();
+
   aura::Window* CreateWindowForApp(const AppId& app_id);
+  aura::Window* GetWindowForApp(const AppId& app_id);
 
   void SetAppLimit(const AppId& app_id,
                    const base::Optional<AppLimit>& app_limit);
@@ -104,7 +120,10 @@
 void AppActivityRegistryTest::SetUp() {
   ChromeViewsTestBase::SetUp();
   ReInitializeRegistry();
+  InstallApps();
+}
 
+void AppActivityRegistryTest::InstallApps() {
   registry().OnAppInstalled(GetChromeAppId());
   registry().OnAppInstalled(kApp1);
   registry().OnAppInstalled(kApp2);
@@ -117,12 +136,18 @@
   std::unique_ptr<aura::Window> window =
       std::make_unique<aura::Window>(nullptr);
   window->Init(ui::LayerType::LAYER_NOT_DRAWN);
-
-  aura::Window* to_return = window.get();
+  auto* to_return = window.get();
   windows_[app_id].push_back(std::move(window));
   return to_return;
 }
 
+aura::Window* AppActivityRegistryTest::GetWindowForApp(const AppId& app_id) {
+  const std::vector<std::unique_ptr<aura::Window>>& app_windows =
+      windows_.at(app_id);
+  EXPECT_GE(app_windows.size(), 0u);
+  return app_windows[app_windows.size() - 1].get();
+}
+
 void AppActivityRegistryTest::SetAppLimit(
     const AppId& app_id,
     const base::Optional<AppLimit>& app_limit) {
@@ -764,5 +789,121 @@
   EXPECT_EQ(registry().GetAppState(GetChromeAppId()), AppState::kLimitReached);
 }
 
+TEST_F(AppActivityRegistryTest, OverrideLimitReachedState) {
+  AppStateObserverMock state_observer_mock;
+  registry().AddAppStateObserver(&state_observer_mock);
+  const base::TimeDelta limit = base::TimeDelta::FromMinutes(30);
+
+  std::map<AppId, AppLimit> app_limits = {
+      {kApp1, AppLimit(AppRestriction::kTimeLimit, limit, base::Time::Now())},
+      {GetChromeAppId(),
+       AppLimit(AppRestriction::kTimeLimit, limit, base::Time::Now())}};
+
+  registry().UpdateAppLimits(app_limits);
+
+  // Save app activity and reinitialize.
+  EXPECT_CALL(state_observer_mock,
+              OnAppLimitReached(kApp1, base::TimeDelta::FromMinutes(30),
+                                /* was_active */ true))
+      .Times(1);
+  EXPECT_CALL(state_observer_mock,
+              OnAppLimitReached(kApp2, base::TimeDelta::FromMinutes(30),
+                                /* was_active */ true))
+      .Times(1);
+  EXPECT_CALL(
+      state_observer_mock,
+      OnAppLimitReached(GetChromeAppId(), base::TimeDelta::FromMinutes(30),
+                        /* was_active */ false))
+      .Times(1);
+
+  // App limits will be reached.
+  CreateAppActivityForApp(kApp1, 2 * limit);
+  CreateAppActivityForApp(kApp2, 2 * limit);
+
+  // Save app activity and reinitialize.
+  registry().SaveAppActivity();
+  ReInitializeRegistry();
+  registry().AddAppStateObserver(&state_observer_mock);
+  registry().UpdateAppLimits(app_limits);
+  InstallApps();
+
+  EXPECT_EQ(registry().GetAppState(kApp1), AppState::kLimitReached);
+  EXPECT_EQ(registry().GetAppState(kApp2), AppState::kLimitReached);
+  EXPECT_EQ(registry().GetAppState(GetChromeAppId()), AppState::kLimitReached);
+
+  EXPECT_CALL(state_observer_mock,
+              OnAppLimitReached(kApp1, base::TimeDelta::FromMinutes(30),
+                                /* was_active */ true))
+      .Times(1);
+  EXPECT_CALL(state_observer_mock,
+              OnAppLimitReached(kApp2, base::TimeDelta::FromMinutes(30),
+                                /* was_active */ true))
+      .Times(1);
+
+  registry().OnAppActive(kApp1, GetWindowForApp(kApp1), base::Time::Now());
+  registry().OnAppActive(kApp2, GetWindowForApp(kApp2), base::Time::Now());
+}
+
+TEST_F(AppActivityRegistryTest, AvoidReduntantNotifications) {
+  const base::TimeDelta delta = base::TimeDelta::FromMinutes(5);
+  AppLimit chrome_limit(AppRestriction::kTimeLimit,
+                        base::TimeDelta::FromMinutes(30), base::Time::Now());
+  AppLimit app1_limit(AppRestriction::kTimeLimit,
+                      base::TimeDelta::FromMinutes(5),
+                      base::Time::Now() + delta);
+  std::map<AppId, AppLimit> app_limits = {{GetChromeAppId(), chrome_limit},
+                                          {kApp1, app1_limit}};
+  EXPECT_CALL(notification_delegate_mock(),
+              ShowAppTimeLimitNotification(
+                  GetChromeAppId(), chrome_limit.daily_limit(),
+                  chromeos::app_time::AppNotification::kTimeLimitChanged))
+      .Times(1);
+
+  EXPECT_CALL(notification_delegate_mock(),
+              ShowAppTimeLimitNotification(
+                  kApp1, app1_limit.daily_limit(),
+                  chromeos::app_time::AppNotification::kTimeLimitChanged))
+      .Times(1);
+
+  registry().UpdateAppLimits(app_limits);
+  registry().SaveAppActivity();
+
+  // Reinitialized the registry. We don't expect redundant time limit updatese
+  // will result in notifications.
+  ReInitializeRegistry();
+
+  EXPECT_CALL(notification_delegate_mock(),
+              ShowAppTimeLimitNotification(
+                  GetChromeAppId(), testing::_,
+                  chromeos::app_time::AppNotification::kTimeLimitChanged))
+      .Times(0);
+  EXPECT_CALL(notification_delegate_mock(),
+              ShowAppTimeLimitNotification(
+                  kApp1, testing::_,
+                  chromeos::app_time::AppNotification::kTimeLimitChanged))
+      .Times(0);
+
+  registry().UpdateAppLimits(app_limits);
+
+  // Update the limit for Chrome.
+  AppLimit new_chrome_limit(AppRestriction::kTimeLimit,
+                            base::TimeDelta::FromMinutes(15),
+                            base::Time::Now() + 2 * delta);
+  app_limits.at(GetChromeAppId()) = new_chrome_limit;
+
+  // Expect that there will be a notification for Chrome but not for kApp1.
+  EXPECT_CALL(notification_delegate_mock(),
+              ShowAppTimeLimitNotification(
+                  GetChromeAppId(), new_chrome_limit.daily_limit(),
+                  chromeos::app_time::AppNotification::kTimeLimitChanged))
+      .Times(1);
+  EXPECT_CALL(notification_delegate_mock(),
+              ShowAppTimeLimitNotification(
+                  kApp1, testing::_,
+                  chromeos::app_time::AppNotification::kTimeLimitChanged))
+      .Times(0);
+  registry().UpdateAppLimits(app_limits);
+}
+
 }  // namespace app_time
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_time_controller_unittest.cc b/chrome/browser/chromeos/child_accounts/time_limits/app_time_controller_unittest.cc
index 69cd249f..d060b8c5 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/app_time_controller_unittest.cc
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_time_controller_unittest.cc
@@ -369,8 +369,10 @@
   DismissNotifications();
 
   // Only update one time limit.
+  const base::TimeDelta delta = base::TimeDelta::FromMinutes(1);
   const AppLimit limit3(AppRestriction::kTimeLimit,
-                        base::TimeDelta::FromMinutes(10), base::Time::Now());
+                        base::TimeDelta::FromMinutes(10),
+                        base::Time::Now() + delta);
   registry->UpdateAppLimits({{kApp1, limit1}, {kApp2, limit3}});
   task_environment().RunUntilIdle();
   EXPECT_EQ(1u, GetNotificationsCount());
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_navigation_throttle.cc b/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_navigation_throttle.cc
index 1e3ab050..37f818d6 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_navigation_throttle.cc
+++ b/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_navigation_throttle.cc
@@ -7,6 +7,7 @@
 #include <string>
 
 #include "base/feature_list.h"
+#include "base/memory/ptr_util.h"
 #include "base/optional.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/child_accounts/child_user_service.h"
diff --git a/chrome/browser/chromeos/crostini/crostini_export_import.cc b/chrome/browser/chromeos/crostini/crostini_export_import.cc
index c0e6879..89d61068b1 100644
--- a/chrome/browser/chromeos/crostini/crostini_export_import.cc
+++ b/chrome/browser/chromeos/crostini/crostini_export_import.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/files/file_util.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
diff --git a/chrome/browser/chromeos/crostini/crostini_installer_unittest.cc b/chrome/browser/chromeos/crostini/crostini_installer_unittest.cc
index fde01feb..716eed97 100644
--- a/chrome/browser/chromeos/crostini/crostini_installer_unittest.cc
+++ b/chrome/browser/chromeos/crostini/crostini_installer_unittest.cc
@@ -7,6 +7,7 @@
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/optional.h"
 #include "base/run_loop.h"
 #include "base/test/bind_test_util.h"
diff --git a/chrome/browser/chromeos/crostini/crostini_manager_unittest.cc b/chrome/browser/chromeos/crostini/crostini_manager_unittest.cc
index 2adcd67..44061da5 100644
--- a/chrome/browser/chromeos/crostini/crostini_manager_unittest.cc
+++ b/chrome/browser/chromeos/crostini/crostini_manager_unittest.cc
@@ -9,6 +9,7 @@
 #include "base/barrier_closure.h"
 #include "base/base64.h"
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/files/file_util.h"
 #include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
diff --git a/chrome/browser/chromeos/crostini/crostini_port_forwarder.cc b/chrome/browser/chromeos/crostini/crostini_port_forwarder.cc
index 61b8b94..90f2453 100644
--- a/chrome/browser/chromeos/crostini/crostini_port_forwarder.cc
+++ b/chrome/browser/chromeos/crostini/crostini_port_forwarder.cc
@@ -7,6 +7,7 @@
 #include "chrome/browser/chromeos/crostini/crostini_port_forwarder.h"
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/no_destructor.h"
 #include "chrome/browser/chromeos/crostini/crostini_manager.h"
 #include "chrome/browser/chromeos/crostini/crostini_pref_names.h"
diff --git a/chrome/browser/chromeos/crostini/crostini_port_forwarder_unittest.cc b/chrome/browser/chromeos/crostini/crostini_port_forwarder_unittest.cc
index 8afdb40..3132d8e4 100644
--- a/chrome/browser/chromeos/crostini/crostini_port_forwarder_unittest.cc
+++ b/chrome/browser/chromeos/crostini/crostini_port_forwarder_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/chromeos/crostini/crostini_port_forwarder.h"
 
+#include "base/bind_helpers.h"
 #include "chrome/browser/chromeos/crostini/crostini_manager.h"
 #include "chrome/browser/chromeos/crostini/crostini_test_helper.h"
 #include "chrome/test/base/testing_profile.h"
diff --git a/chrome/browser/chromeos/crostini/crostini_util.cc b/chrome/browser/chromeos/crostini/crostini_util.cc
index 581794be..cb4dc76 100644
--- a/chrome/browser/chromeos/crostini/crostini_util.cc
+++ b/chrome/browser/chromeos/crostini/crostini_util.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/feature_list.h"
 #include "base/files/file_path.h"
diff --git a/chrome/browser/chromeos/drive/file_system_util.cc b/chrome/browser/chromeos/drive/file_system_util.cc
index b949dd9..058dc23 100644
--- a/chrome/browser/chromeos/drive/file_system_util.cc
+++ b/chrome/browser/chromeos/drive/file_system_util.cc
@@ -10,6 +10,7 @@
 #include <string>
 #include <vector>
 
+#include "base/bind_helpers.h"
 #include "base/command_line.h"
 #include "base/files/file_path.h"
 #include "base/logging.h"
diff --git a/chrome/browser/chromeos/eol_notification_unittest.cc b/chrome/browser/chromeos/eol_notification_unittest.cc
index 04d845e..869ff5e 100644
--- a/chrome/browser/chromeos/eol_notification_unittest.cc
+++ b/chrome/browser/chromeos/eol_notification_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/chromeos/eol_notification.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/test/simple_test_clock.h"
 #include "chrome/browser/notifications/notification_display_service_tester.h"
 #include "chrome/browser/notifications/notification_handler.h"
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_mount.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_mount.cc
index 48337e5..a9d99cb8 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_mount.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_mount.cc
@@ -9,6 +9,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/feature_list.h"
 #include "base/files/file_util.h"
 #include "base/format_macros.h"
diff --git a/chrome/browser/chromeos/extensions/file_manager/select_file_dialog_extension_user_data.cc b/chrome/browser/chromeos/extensions/file_manager/select_file_dialog_extension_user_data.cc
index 743d6ae..97249246 100644
--- a/chrome/browser/chromeos/extensions/file_manager/select_file_dialog_extension_user_data.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/select_file_dialog_extension_user_data.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/chromeos/extensions/file_manager/select_file_dialog_extension_user_data.h"
 
+#include "base/memory/ptr_util.h"
 #include "content/public/browser/web_contents.h"
 
 const char kSelectFileDialogExtensionUserDataKey[] =
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
index a034baa..d5603c3 100644
--- a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
+++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
@@ -530,9 +530,7 @@
         TestCase("directoryTreeExpandHorizontalScroll"),
         TestCase("directoryTreeExpandHorizontalScrollRTL"),
         TestCase("directoryTreeVerticalScroll"),
-        TestCase("directoryTreeClippedWindowResize"),
-        TestCase("directoryTreeExpandFolder"),
-        TestCase("directoryTreeClippedSplitterResize")));
+        TestCase("directoryTreeExpandFolder")));
 
 WRAPPED_INSTANTIATE_TEST_SUITE_P(
     DirectoryTreeContextMenu, /* directory_tree_context_menu.js */
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc
index 60b41c7..90d8252 100644
--- a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc
+++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc
@@ -1557,7 +1557,7 @@
 }
 
 bool FileManagerBrowserTestBase::GetEnableFilesNg() const {
-  return false;
+  return true;
 }
 
 bool FileManagerBrowserTestBase::GetEnableNativeSmb() const {
diff --git a/chrome/browser/chromeos/input_method/input_method_engine_unittest.cc b/chrome/browser/chromeos/input_method/input_method_engine_unittest.cc
index ae0eabda..d5c601d4 100644
--- a/chrome/browser/chromeos/input_method/input_method_engine_unittest.cc
+++ b/chrome/browser/chromeos/input_method/input_method_engine_unittest.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "base/bind_helpers.h"
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/metrics/histogram_macros.h"
diff --git a/chrome/browser/chromeos/login/app_launch_controller.cc b/chrome/browser/chromeos/login/app_launch_controller.cc
index 545b1e0..d9b91ea 100644
--- a/chrome/browser/chromeos/login/app_launch_controller.cc
+++ b/chrome/browser/chromeos/login/app_launch_controller.cc
@@ -6,6 +6,7 @@
 
 #include "ash/public/cpp/ash_features.h"
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/files/file_path.h"
 #include "base/json/json_file_value_serializer.h"
diff --git a/chrome/browser/chromeos/login/arc_terms_of_service_browsertest.cc b/chrome/browser/chromeos/login/arc_terms_of_service_browsertest.cc
index 384e56b7..28f16e9 100644
--- a/chrome/browser/chromeos/login/arc_terms_of_service_browsertest.cc
+++ b/chrome/browser/chromeos/login/arc_terms_of_service_browsertest.cc
@@ -6,6 +6,7 @@
 #include "base/command_line.h"
 #include "base/guid.h"
 #include "base/hash/sha1.h"
+#include "base/memory/ptr_util.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
 #include "chrome/browser/chromeos/arc/session/arc_service_launcher.h"
 #include "chrome/browser/chromeos/login/login_wizard.h"
diff --git a/chrome/browser/chromeos/login/configuration_based_oobe_browsertest.cc b/chrome/browser/chromeos/login/configuration_based_oobe_browsertest.cc
index bf7ecbff..b92ec21 100644
--- a/chrome/browser/chromeos/login/configuration_based_oobe_browsertest.cc
+++ b/chrome/browser/chromeos/login/configuration_based_oobe_browsertest.cc
@@ -186,8 +186,7 @@
 }
 
 // Check that language and input methods are set correctly.
-// TODO(crbug.com/1058582): Failing on linux-chromeos-dbg.
-IN_PROC_BROWSER_TEST_F(OobeConfigurationTest, DISABLED_TestSwitchLanguageIME) {
+IN_PROC_BROWSER_TEST_F(OobeConfigurationTest, TestSwitchLanguageIME) {
   LoadConfiguration();
   OobeScreenWaiter(NetworkScreenView::kScreenId).Wait();
 
diff --git a/chrome/browser/chromeos/login/demo_mode/demo_session.cc b/chrome/browser/chromeos/login/demo_mode/demo_session.cc
index dd7bc51..300bc56 100644
--- a/chrome/browser/chromeos/login/demo_mode/demo_session.cc
+++ b/chrome/browser/chromeos/login/demo_mode/demo_session.cc
@@ -28,6 +28,7 @@
 #include "chrome/browser/apps/platform_apps/app_load_service.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/browser_process_platform_part.h"
+#include "chrome/browser/chromeos/extensions/default_web_app_ids.h"
 #include "chrome/browser/chromeos/file_manager/path_util.h"
 #include "chrome/browser/chromeos/login/demo_mode/demo_resources.h"
 #include "chrome/browser/chromeos/login/demo_mode/demo_setup_controller.h"
@@ -341,7 +342,8 @@
     return true;
   return app_id != GetScreensaverAppId() &&
          app_id != extensions::kWebStoreAppId &&
-         app_id != extension_misc::kGeniusAppId;
+         app_id != extension_misc::kGeniusAppId &&
+         app_id != default_web_apps::kHelpAppId;
 }
 
 // static
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 fd1ecea..baf28ace 100644
--- a/chrome/browser/chromeos/login/demo_mode/demo_setup_browsertest.cc
+++ b/chrome/browser/chromeos/login/demo_mode/demo_setup_browsertest.cc
@@ -1081,8 +1081,7 @@
   EXPECT_TRUE(IsScreenShown(NetworkScreenView::kScreenId));
 }
 
-// TODO(crbug.com/1057814): Disabling flaky test.
-IN_PROC_BROWSER_TEST_F(DemoSetupTest, DISABLED_ClickNetworkOnNetworkScreen) {
+IN_PROC_BROWSER_TEST_F(DemoSetupTest, ClickNetworkOnNetworkScreen) {
   SkipToScreen(NetworkScreenView::kScreenId);
   EXPECT_FALSE(IsScreenDialogElementEnabled(NetworkScreenView::kScreenId,
                                             DemoSetupDialog::kNetwork,
@@ -1095,9 +1094,7 @@
   EXPECT_TRUE(IsScreenShown(EulaView::kScreenId));
 }
 
-// TODO(crbug.com/1057777): Disabling flaky test.
-IN_PROC_BROWSER_TEST_F(DemoSetupTest,
-                       DISABLED_ClickConnectedNetworkOnNetworkScreen) {
+IN_PROC_BROWSER_TEST_F(DemoSetupTest, ClickConnectedNetworkOnNetworkScreen) {
   SimulateNetworkConnected();
   SkipToScreen(NetworkScreenView::kScreenId);
   EXPECT_TRUE(IsScreenDialogElementEnabled(NetworkScreenView::kScreenId,
diff --git a/chrome/browser/chromeos/login/enrollment/enterprise_enrollment_helper_impl.cc b/chrome/browser/chromeos/login/enrollment/enterprise_enrollment_helper_impl.cc
index 47962af5..5e570e90 100644
--- a/chrome/browser/chromeos/login/enrollment/enterprise_enrollment_helper_impl.cc
+++ b/chrome/browser/chromeos/login/enrollment/enterprise_enrollment_helper_impl.cc
@@ -7,6 +7,8 @@
 #include <memory>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
 #include "base/command_line.h"
 #include "base/location.h"
 #include "base/logging.h"
diff --git a/chrome/browser/chromeos/login/lock/screen_locker_unittest.cc b/chrome/browser/chromeos/login/lock/screen_locker_unittest.cc
index d07f76d5..2cee00f 100644
--- a/chrome/browser/chromeos/login/lock/screen_locker_unittest.cc
+++ b/chrome/browser/chromeos/login/lock/screen_locker_unittest.cc
@@ -9,6 +9,7 @@
 #include "ash/public/cpp/login_screen_model.h"
 #include "ash/public/cpp/login_types.h"
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
diff --git a/chrome/browser/chromeos/login/login_screen_extensions_lifetime_manager.cc b/chrome/browser/chromeos/login/login_screen_extensions_lifetime_manager.cc
index 999e2108..59139658 100644
--- a/chrome/browser/chromeos/login/login_screen_extensions_lifetime_manager.cc
+++ b/chrome/browser/chromeos/login/login_screen_extensions_lifetime_manager.cc
@@ -7,6 +7,7 @@
 #include <string>
 #include <vector>
 
+#include "base/bind_helpers.h"
 #include "base/logging.h"
 #include "base/values.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
diff --git a/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc b/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc
index 96aced2..fcf72f8 100644
--- a/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc
+++ b/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc
@@ -762,16 +762,23 @@
   WaitForLoginDisplayHostShutdown();
 }
 
-// crbug.com/1054935: SimpleEndToEnd is flaky on ChromeOS.
-#if defined(OS_CHROMEOS)
-IN_PROC_BROWSER_TEST_P(OobeInteractiveUITest, DISABLED_SimpleEndToEnd) {
-  SimpleEndToEnd();
-}
+// Disabled on *San bots since they time out.
+#if defined(MEMORY_SANITIZER) || defined(ADDRESS_SANITIZER) || \
+    defined(LEAK_SANITIZER)
+#define MAYBE_SimpleEndToEnd DISABLED_SimpleEndToEnd
 #else
-IN_PROC_BROWSER_TEST_P(OobeInteractiveUITest, SimpleEndToEnd) {
+#define MAYBE_SimpleEndToEnd SimpleEndToEnd
+#endif
+
+// Note that this probably the largest test that is run on ChromeOS, and it
+// might be running close to time limits especially on instrumented builds.
+// As such it might sometimes cause flakiness.
+// Please do not disable it for whole ChromeOS, only for specific instrumented
+// bots. Another alternative is to increase respective multiplier in
+// base/test/test_timeouts.h.
+IN_PROC_BROWSER_TEST_P(OobeInteractiveUITest, MAYBE_SimpleEndToEnd) {
   SimpleEndToEnd();
 }
-#endif
 
 INSTANTIATE_TEST_SUITE_P(
     OobeInteractiveUITestImpl,
@@ -828,16 +835,21 @@
   WaitForLoginDisplayHostShutdown();
 }
 
-// crbug.com/997987. Disabled on MSAN since they time out. crbug.com/1004327
-// crbug.com/1054935: EndToEnd is flaky on ChromeOS.
+// crbug.com/997987. Disabled on MSAN since they time out.
 // crbug.com/1055853: EndToEnd is flaky on Linux Chromium OS ASan LSan
-#if defined(MEMORY_SANITIZER) || defined(OS_CHROMEOS) || \
-    defined(ADDRESS_SANITIZER) || defined(LEAK_SANITIZER)
+#if defined(MEMORY_SANITIZER) || defined(ADDRESS_SANITIZER) || \
+    defined(LEAK_SANITIZER)
 #define MAYBE_EndToEnd DISABLED_EndToEnd
 #else
 #define MAYBE_EndToEnd EndToEnd
 #endif
 
+// Note that this probably the largest test that is run on ChromeOS, and it
+// might be running close to time limits especially on instrumented builds.
+// As such it might sometimes cause flakiness.
+// Please do not disable it for whole ChromeOS, only for specific instrumented
+// bots. Another alternative is to increase respective multiplier in
+// base/test/test_timeouts.h.
 IN_PROC_BROWSER_TEST_P(OobeZeroTouchInteractiveUITest, MAYBE_EndToEnd) {
   ZeroTouchEndToEnd();
 }
diff --git a/chrome/browser/chromeos/login/screens/hid_detection_screen_browsertest.cc b/chrome/browser/chromeos/login/screens/hid_detection_screen_browsertest.cc
index d5ebe97..50635ff 100644
--- a/chrome/browser/chromeos/login/screens/hid_detection_screen_browsertest.cc
+++ b/chrome/browser/chromeos/login/screens/hid_detection_screen_browsertest.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/macros.h"
 #include "base/run_loop.h"
 #include "base/system/sys_info.h"
diff --git a/chrome/browser/chromeos/login/test/hid_controller_mixin.cc b/chrome/browser/chromeos/login/test/hid_controller_mixin.cc
index 051bfb1a..fe3d367 100644
--- a/chrome/browser/chromeos/login/test/hid_controller_mixin.cc
+++ b/chrome/browser/chromeos/login/test/hid_controller_mixin.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "chrome/browser/chromeos/login/screens/hid_detection_screen.h"
 #include "device/bluetooth/bluetooth_adapter_factory.h"
 #include "services/device/public/cpp/hid/fake_input_service_linux.h"
diff --git a/chrome/browser/chromeos/login/web_kiosk_controller.cc b/chrome/browser/chromeos/login/web_kiosk_controller.cc
index 146e741..3d5777c7 100644
--- a/chrome/browser/chromeos/login/web_kiosk_controller.cc
+++ b/chrome/browser/chromeos/login/web_kiosk_controller.cc
@@ -4,6 +4,7 @@
 
 #include <chrome/browser/chromeos/login/web_kiosk_controller.h>
 
+#include "base/bind_helpers.h"
 #include "base/syslog_logging.h"
 #include "chrome/browser/chromeos/app_mode/kiosk_app_launch_error.h"
 #include "chrome/browser/chromeos/app_mode/kiosk_app_manager_base.h"
diff --git a/chrome/browser/chromeos/night_light/night_light_client_unittest.cc b/chrome/browser/chromeos/night_light/night_light_client_unittest.cc
index 5af4bf4..6884268 100644
--- a/chrome/browser/chromeos/night_light/night_light_client_unittest.cc
+++ b/chrome/browser/chromeos/night_light/night_light_client_unittest.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/chromeos/night_light/night_light_client.h"
 
 #include "ash/public/cpp/night_light_controller.h"
+#include "base/memory/ptr_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/task_environment.h"
 #include "base/time/clock.h"
diff --git a/chrome/browser/chromeos/policy/auto_enrollment_client_impl.cc b/chrome/browser/chromeos/policy/auto_enrollment_client_impl.cc
index 8641f12..565ccb58 100644
--- a/chrome/browser/chromeos/policy/auto_enrollment_client_impl.cc
+++ b/chrome/browser/chromeos/policy/auto_enrollment_client_impl.cc
@@ -10,6 +10,7 @@
 #include "base/guid.h"
 #include "base/location.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/optional.h"
diff --git a/chrome/browser/chromeos/policy/device_account_initializer.cc b/chrome/browser/chromeos/policy/device_account_initializer.cc
index 662cd38..97a11dfb 100644
--- a/chrome/browser/chromeos/policy/device_account_initializer.cc
+++ b/chrome/browser/chromeos/policy/device_account_initializer.cc
@@ -8,6 +8,7 @@
 
 #include "base/base64.h"
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/command_line.h"
 #include "base/guid.h"
 #include "base/location.h"
diff --git a/chrome/browser/chromeos/policy/policy_certs_browsertest.cc b/chrome/browser/chromeos/policy/policy_certs_browsertest.cc
index 88d13a5..b091f1a 100644
--- a/chrome/browser/chromeos/policy/policy_certs_browsertest.cc
+++ b/chrome/browser/chromeos/policy/policy_certs_browsertest.cc
@@ -5,6 +5,7 @@
 #include <memory>
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/command_line.h"
 #include "base/json/json_writer.h"
 #include "base/message_loop/message_loop_current.h"
diff --git a/chrome/browser/chromeos/policy/scheduled_update_checker/device_scheduled_update_checker_unittest.cc b/chrome/browser/chromeos/policy/scheduled_update_checker/device_scheduled_update_checker_unittest.cc
index 937c44fe..e942758 100644
--- a/chrome/browser/chromeos/policy/scheduled_update_checker/device_scheduled_update_checker_unittest.cc
+++ b/chrome/browser/chromeos/policy/scheduled_update_checker/device_scheduled_update_checker_unittest.cc
@@ -9,6 +9,7 @@
 #include <string>
 #include <utility>
 
+#include "base/bind_helpers.h"
 #include "base/json/json_reader.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
diff --git a/chrome/browser/chromeos/policy/tpm_auto_update_mode_policy_handler_unittest.cc b/chrome/browser/chromeos/policy/tpm_auto_update_mode_policy_handler_unittest.cc
index 1cc20932..32f6492 100644
--- a/chrome/browser/chromeos/policy/tpm_auto_update_mode_policy_handler_unittest.cc
+++ b/chrome/browser/chromeos/policy/tpm_auto_update_mode_policy_handler_unittest.cc
@@ -8,6 +8,7 @@
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/timer/mock_timer.h"
 #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
diff --git a/chrome/browser/chromeos/policy/user_network_configuration_updater.cc b/chrome/browser/chromeos/policy/user_network_configuration_updater.cc
index a33fbb0..654dbcf 100644
--- a/chrome/browser/chromeos/policy/user_network_configuration_updater.cc
+++ b/chrome/browser/chromeos/policy/user_network_configuration_updater.cc
@@ -8,6 +8,7 @@
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
 #include "base/logging.h"
 #include "base/task/post_task.h"
 #include "base/values.h"
diff --git a/chrome/browser/chromeos/power/auto_screen_brightness/model_config_loader_impl.cc b/chrome/browser/chromeos/power/auto_screen_brightness/model_config_loader_impl.cc
index 4dd3060..7f57ce9 100644
--- a/chrome/browser/chromeos/power/auto_screen_brightness/model_config_loader_impl.cc
+++ b/chrome/browser/chromeos/power/auto_screen_brightness/model_config_loader_impl.cc
@@ -12,6 +12,7 @@
 #include "base/json/json_reader.h"
 #include "base/json/json_value_converter.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/field_trial_params.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
diff --git a/chrome/browser/chromeos/power/auto_screen_brightness/modeller_impl.cc b/chrome/browser/chromeos/power/auto_screen_brightness/modeller_impl.cc
index 03f5b54..9831bfc 100644
--- a/chrome/browser/chromeos/power/auto_screen_brightness/modeller_impl.cc
+++ b/chrome/browser/chromeos/power/auto_screen_brightness/modeller_impl.cc
@@ -11,6 +11,7 @@
 #include "base/files/file_util.h"
 #include "base/files/important_file_writer.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
diff --git a/chrome/browser/chromeos/printing/history/print_job_history_cleaner_unittest.cc b/chrome/browser/chromeos/printing/history/print_job_history_cleaner_unittest.cc
index 80de3fd..fa033e2 100644
--- a/chrome/browser/chromeos/printing/history/print_job_history_cleaner_unittest.cc
+++ b/chrome/browser/chromeos/printing/history/print_job_history_cleaner_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/chromeos/printing/history/print_job_history_cleaner.h"
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/run_loop.h"
 #include "base/test/task_environment.h"
 #include "base/time/clock.h"
diff --git a/chrome/browser/chromeos/settings/device_settings_provider_unittest.cc b/chrome/browser/chromeos/settings/device_settings_provider_unittest.cc
index a0a0067..ee8c1da 100644
--- a/chrome/browser/chromeos/settings/device_settings_provider_unittest.cc
+++ b/chrome/browser/chromeos/settings/device_settings_provider_unittest.cc
@@ -9,6 +9,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/files/file_util.h"
 #include "base/json/json_reader.h"
diff --git a/chrome/browser/chromeos/settings/scoped_cros_settings_test_helper.cc b/chrome/browser/chromeos/settings/scoped_cros_settings_test_helper.cc
index 634dbc2..66ff915 100644
--- a/chrome/browser/chromeos/settings/scoped_cros_settings_test_helper.cc
+++ b/chrome/browser/chromeos/settings/scoped_cros_settings_test_helper.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/chromeos/settings/scoped_cros_settings_test_helper.h"
 
+#include "base/bind_helpers.h"
 #include "base/logging.h"
 #include "base/values.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/chromeos/smb_client/smb_file_system.cc b/chrome/browser/chromeos/smb_client/smb_file_system.cc
index 2b853b9f..8dfe3753 100644
--- a/chrome/browser/chromeos/smb_client/smb_file_system.cc
+++ b/chrome/browser/chromeos/smb_client/smb_file_system.cc
@@ -10,6 +10,7 @@
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/posix/eintr_wrapper.h"
 #include "base/task/post_task.h"
diff --git a/chrome/browser/chromeos/smb_client/smb_service_unittest.cc b/chrome/browser/chromeos/smb_client/smb_service_unittest.cc
index b6396d9..97329f9 100644
--- a/chrome/browser/chromeos/smb_client/smb_service_unittest.cc
+++ b/chrome/browser/chromeos/smb_client/smb_service_unittest.cc
@@ -13,6 +13,7 @@
 #include "base/bind_helpers.h"
 #include "base/files/file_util.h"
 #include "base/json/json_reader.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_util.h"
diff --git a/chrome/browser/chromeos/system_token_cert_db_initializer.cc b/chrome/browser/chromeos/system_token_cert_db_initializer.cc
index 3a20ec82..30959b4 100644
--- a/chrome/browser/chromeos/system_token_cert_db_initializer.cc
+++ b/chrome/browser/chromeos/system_token_cert_db_initializer.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/location.h"
 #include "base/logging.h"
diff --git a/chrome/browser/chromeos/usb/cros_usb_detector.cc b/chrome/browser/chromeos/usb/cros_usb_detector.cc
index 1108cc50..1ae4ecf 100644
--- a/chrome/browser/chromeos/usb/cros_usb_detector.cc
+++ b/chrome/browser/chromeos/usb/cros_usb_detector.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "ash/public/cpp/notification_utils.h"
+#include "base/bind_helpers.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/stl_util.h"
 #include "chrome/browser/chromeos/crostini/crostini_features.h"
diff --git a/chrome/browser/complex_tasks/task_tab_helper_unittest.cc b/chrome/browser/complex_tasks/task_tab_helper_unittest.cc
index 504f49c..e6995ef 100644
--- a/chrome/browser/complex_tasks/task_tab_helper_unittest.cc
+++ b/chrome/browser/complex_tasks/task_tab_helper_unittest.cc
@@ -6,6 +6,7 @@
 
 #include <string>
 
+#include "base/memory/ptr_util.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
 #include "components/sessions/content/navigation_task_id.h"
diff --git a/chrome/browser/component_updater/tls_deprecation_config_component_installer.cc b/chrome/browser/component_updater/tls_deprecation_config_component_installer.cc
index 6274ce7e..cf6e903 100644
--- a/chrome/browser/component_updater/tls_deprecation_config_component_installer.cc
+++ b/chrome/browser/component_updater/tls_deprecation_config_component_installer.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/files/file_util.h"
 #include "base/logging.h"
 #include "base/memory/ref_counted.h"
diff --git a/chrome/browser/devtools/device/usb/android_usb_browsertest.cc b/chrome/browser/devtools/device/usb/android_usb_browsertest.cc
index aecce8b5..e61c5eb 100644
--- a/chrome/browser/devtools/device/usb/android_usb_browsertest.cc
+++ b/chrome/browser/devtools/device/usb/android_usb_browsertest.cc
@@ -12,6 +12,7 @@
 #include "base/bind.h"
 #include "base/containers/queue.h"
 #include "base/location.h"
+#include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted_memory.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
diff --git a/chrome/browser/dom_distiller/lazy_dom_distiller_service.cc b/chrome/browser/dom_distiller/lazy_dom_distiller_service.cc
index 98cf30b..be2bad9 100644
--- a/chrome/browser/dom_distiller/lazy_dom_distiller_service.cc
+++ b/chrome/browser/dom_distiller/lazy_dom_distiller_service.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "base/memory/ptr_util.h"
 #include "chrome/browser/dom_distiller/dom_distiller_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/dom_distiller/core/distilled_page_prefs.h"
diff --git a/chrome/browser/download/android/dangerous_download_infobar_delegate.cc b/chrome/browser/download/android/dangerous_download_infobar_delegate.cc
index 59b7d5df..25871d4 100644
--- a/chrome/browser/download/android/dangerous_download_infobar_delegate.cc
+++ b/chrome/browser/download/android/dangerous_download_infobar_delegate.cc
@@ -6,6 +6,7 @@
 
 #include <memory>
 
+#include "base/memory/ptr_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/android/android_theme_resources.h"
 #include "chrome/browser/infobars/infobar_service.h"
diff --git a/chrome/browser/download/android/intercept_oma_download_navigation_throttle.cc b/chrome/browser/download/android/intercept_oma_download_navigation_throttle.cc
index b9badde..d218ff0d 100644
--- a/chrome/browser/download/android/intercept_oma_download_navigation_throttle.cc
+++ b/chrome/browser/download/android/intercept_oma_download_navigation_throttle.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/download/android/intercept_oma_download_navigation_throttle.h"
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "chrome/browser/chrome_content_browser_client.h"
 #include "chrome/browser/download/android/download_controller_base.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/download/download_offline_content_provider.cc b/chrome/browser/download/download_offline_content_provider.cc
index 7be18749..1f235413 100644
--- a/chrome/browser/download/download_offline_content_provider.cc
+++ b/chrome/browser/download/download_offline_content_provider.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/time/time.h"
diff --git a/chrome/browser/enterprise_reporting/report_scheduler_unittest.cc b/chrome/browser/enterprise_reporting/report_scheduler_unittest.cc
index 5088c13fd..5e44390 100644
--- a/chrome/browser/enterprise_reporting/report_scheduler_unittest.cc
+++ b/chrome/browser/enterprise_reporting/report_scheduler_unittest.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "base/bind_helpers.h"
 #include "base/test/gmock_callback_support.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
diff --git a/chrome/browser/extensions/api/cast_streaming/cast_streaming_apitest.cc b/chrome/browser/extensions/api/cast_streaming/cast_streaming_apitest.cc
index f4910e3..a7d90604 100644
--- a/chrome/browser/extensions/api/cast_streaming/cast_streaming_apitest.cc
+++ b/chrome/browser/extensions/api/cast_streaming/cast_streaming_apitest.cc
@@ -131,11 +131,11 @@
   void WaitForExpectedTonesAndColors() {
     base::RunLoop run_loop;
     cast_env()->PostTask(
-        media::cast::CastEnvironment::MAIN,
-        FROM_HERE,
-        base::Bind(&TestPatternReceiver::NotifyOnceObservedAllTonesAndColors,
-                   base::Unretained(this),
-                   media::BindToCurrentLoop(run_loop.QuitClosure())));
+        media::cast::CastEnvironment::MAIN, FROM_HERE,
+        base::BindOnce(
+            &TestPatternReceiver::NotifyOnceObservedAllTonesAndColors,
+            base::Unretained(this),
+            media::BindToCurrentLoop(run_loop.QuitClosure())));
     run_loop.Run();
   }
 
diff --git a/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_unittest.cc b/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_unittest.cc
index c10b550..0e9e416c 100644
--- a/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_unittest.cc
+++ b/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_unittest.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "base/memory/ptr_util.h"
 #include "base/values.h"
 #include "chrome/browser/chromeos/attestation/mock_tpm_challenge_key.h"
 #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
diff --git a/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api_unittest.cc b/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api_unittest.cc
index 590e72b1..af225296c 100644
--- a/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api_unittest.cc
+++ b/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api_unittest.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "base/memory/ptr_util.h"
 #include "base/values.h"
 #include "chrome/browser/chromeos/attestation/mock_tpm_challenge_key.h"
 #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
diff --git a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc
index 2bbe893..c75267a 100644
--- a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc
+++ b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h"
 
+#include "base/bind_helpers.h"
 #include "build/build_config.h"
 
 #include <utility>
diff --git a/chrome/browser/extensions/api/settings_private/settings_private_apitest.cc b/chrome/browser/extensions/api/settings_private/settings_private_apitest.cc
index 259301c..5eda7d9 100644
--- a/chrome/browser/extensions/api/settings_private/settings_private_apitest.cc
+++ b/chrome/browser/extensions/api/settings_private/settings_private_apitest.cc
@@ -6,6 +6,7 @@
 
 #include "base/command_line.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop_current.h"
 #include "base/run_loop.h"
 #include "base/values.h"
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 6d8f4bc..37f7cf9 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/memory/ptr_util.h"
 #include "base/stl_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/extensions/extension_action.h"
diff --git a/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc b/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc
index f5cacaa1..b8491df 100644
--- a/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc
+++ b/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/command_line.h"
 #include "base/json/json_writer.h"
 #include "base/strings/string_split.h"
diff --git a/chrome/browser/extensions/component_loader.cc b/chrome/browser/extensions/component_loader.cc
index 2f1663c..86484b72 100644
--- a/chrome/browser/extensions/component_loader.cc
+++ b/chrome/browser/extensions/component_loader.cc
@@ -8,6 +8,7 @@
 
 #include "ash/public/cpp/ash_pref_names.h"
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/command_line.h"
 #include "base/feature_list.h"
 #include "base/files/file_util.h"
diff --git a/chrome/browser/extensions/forced_extensions/installation_tracker_unittest.cc b/chrome/browser/extensions/forced_extensions/installation_tracker_unittest.cc
index 687427d..1b280d7f 100644
--- a/chrome/browser/extensions/forced_extensions/installation_tracker_unittest.cc
+++ b/chrome/browser/extensions/forced_extensions/installation_tracker_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/extensions/forced_extensions/installation_tracker.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/timer/mock_timer.h"
 #include "base/values.h"
diff --git a/chrome/browser/extensions/scripting_permissions_modifier_unittest.cc b/chrome/browser/extensions/scripting_permissions_modifier_unittest.cc
index d813b06..b49f1e3 100644
--- a/chrome/browser/extensions/scripting_permissions_modifier_unittest.cc
+++ b/chrome/browser/extensions/scripting_permissions_modifier_unittest.cc
@@ -4,6 +4,7 @@
 
 #include <utility>
 
+#include "base/bind_helpers.h"
 #include "base/strings/stringprintf.h"
 #include "chrome/browser/extensions/chrome_test_extension_loader.h"
 #include "chrome/browser/extensions/extension_service.h"
diff --git a/chrome/browser/extensions/zipfile_installer_unittest.cc b/chrome/browser/extensions/zipfile_installer_unittest.cc
index 9c8f783..ab9ad9f 100644
--- a/chrome/browser/extensions/zipfile_installer_unittest.cc
+++ b/chrome/browser/extensions/zipfile_installer_unittest.cc
@@ -5,6 +5,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/command_line.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
diff --git a/chrome/browser/first_run/upgrade_util.cc b/chrome/browser/first_run/upgrade_util.cc
index 68b4dfb..0ec48605 100644
--- a/chrome/browser/first_run/upgrade_util.cc
+++ b/chrome/browser/first_run/upgrade_util.cc
@@ -9,6 +9,7 @@
 #include "base/callback.h"
 #include "base/command_line.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "build/build_config.h"
 #include "content/public/browser/browser_thread.h"
 
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index f39669e5..20073e3 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -2105,7 +2105,7 @@
   {
     "name": "enable-zero-state-app-reinstall-suggestions",
     "owners": ["robsc", "napper", "jennyz"],
-    "expiry_milestone": 80
+    "expiry_milestone": 90
   },
   {
     "name": "enable-zero-state-suggestions",
@@ -2541,11 +2541,6 @@
     "expiry_milestone": 83
   },
   {
-    "name": "mirroring-service",
-    "owners": [ "mfoltz", "takumif" ],
-    "expiry_milestone": 83
-  },
-  {
     "name": "mix-browser-type-tabs",
     "owners": [ "joelhockey", "tbuckley" ],
     "expiry_milestone": 85
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 0ce600e..250ceaa 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -2731,11 +2731,6 @@
 const char kKernelnextVMsDescription[] =
     "Enables VM support on devices running experimental kernel versions.";
 
-const char kMirroringServiceName[] = "Mirroring Service";
-const char kMirroringServiceDescription[] =
-    "Enables the native Mirroring Service for mirroring tabs or desktop to "
-    "Chromecast.  Requires AudioServiceAudioStreams to also be enabled.";
-
 const char kOmniboxDriveSuggestionsName[] =
     "Omnibox Google Drive Document suggestions";
 const char kOmniboxDriveSuggestionsDescriptions[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 13a3978..aac65a54 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1563,9 +1563,6 @@
 extern const char kKernelnextVMsName[];
 extern const char kKernelnextVMsDescription[];
 
-extern const char kMirroringServiceName[];
-extern const char kMirroringServiceDescription[];
-
 extern const char kOmniboxDriveSuggestionsName[];
 extern const char kOmniboxDriveSuggestionsDescriptions[];
 
diff --git a/chrome/browser/infobars/mock_infobar_service.cc b/chrome/browser/infobars/mock_infobar_service.cc
index 1f02643..2319395 100644
--- a/chrome/browser/infobars/mock_infobar_service.cc
+++ b/chrome/browser/infobars/mock_infobar_service.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/infobars/mock_infobar_service.h"
 
+#include "base/memory/ptr_util.h"
 #include "components/infobars/core/confirm_infobar_delegate.h"
 #include "components/infobars/core/infobar.h"
 
diff --git a/chrome/browser/large_sticky_ad_browsertest.cc b/chrome/browser/large_sticky_ad_browsertest.cc
index cf9648b9..b7adbca 100644
--- a/chrome/browser/large_sticky_ad_browsertest.cc
+++ b/chrome/browser/large_sticky_ad_browsertest.cc
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/bind_helpers.h"
 #include "chrome/browser/subresource_filter/subresource_filter_browser_test_harness.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/page_load_metrics/browser/page_load_metrics_test_waiter.h"
diff --git a/chrome/browser/lookalikes/lookalike_url_tab_storage.cc b/chrome/browser/lookalikes/lookalike_url_tab_storage.cc
index 68c537e4..3a9ab46 100644
--- a/chrome/browser/lookalikes/lookalike_url_tab_storage.cc
+++ b/chrome/browser/lookalikes/lookalike_url_tab_storage.cc
@@ -6,6 +6,7 @@
 
 #include <string>
 
+#include "base/memory/ptr_util.h"
 #include "content/public/browser/web_contents.h"
 
 // This bit of chaos ensures that kAllowlistKey is an arbitrary but
diff --git a/chrome/browser/media/cast_mirroring_service_host.cc b/chrome/browser/media/cast_mirroring_service_host.cc
index 1b910d1..3d429e6 100644
--- a/chrome/browser/media/cast_mirroring_service_host.cc
+++ b/chrome/browser/media/cast_mirroring_service_host.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/logging.h"
 #include "base/memory/ref_counted.h"
 #include "base/optional.h"
diff --git a/chrome/browser/media/cast_remoting_connector.cc b/chrome/browser/media/cast_remoting_connector.cc
index 82b1e29..800e6f6f 100644
--- a/chrome/browser/media/cast_remoting_connector.cc
+++ b/chrome/browser/media/cast_remoting_connector.cc
@@ -194,15 +194,6 @@
       active_bridge_(nullptr),
       pref_service_(pref_service) {
   DCHECK(permission_request_callback_);
-#if !defined(OS_ANDROID)
-  if (!media_router::ShouldUseMirroringService() && tab_id_.is_valid()) {
-    // Register this remoting source only when Mirroring Service is not used.
-    // Note: If mirroring service is not used, remoting is not supported for
-    // OffscreenTab mirroring as there is no valid tab_id associated with an
-    // OffscreenTab.
-    media_router_->RegisterRemotingSource(tab_id_, this);
-  }
-#endif  // !defined(OS_ANDROID)
   StartObservingPref();
 }
 
@@ -216,10 +207,6 @@
     notifyee->OnSinkGone();
     notifyee->OnCastRemotingConnectorDestroyed();
   }
-#if !defined(OS_ANDROID)
-  if (!media_router::ShouldUseMirroringService() && tab_id_.is_valid())
-    media_router_->UnregisterRemotingSource(tab_id_);
-#endif  // !defined(OS_ANDROID)
 }
 
 void CastRemotingConnector::ConnectToService(
diff --git a/chrome/browser/media/media_engagement_contents_observer_unittest.cc b/chrome/browser/media/media_engagement_contents_observer_unittest.cc
index 8de2c2a..af41e7c2 100644
--- a/chrome/browser/media/media_engagement_contents_observer_unittest.cc
+++ b/chrome/browser/media/media_engagement_contents_observer_unittest.cc
@@ -9,6 +9,7 @@
 #include <utility>
 #include <vector>
 
+#include "base/memory/ptr_util.h"
 #include "base/optional.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
diff --git a/chrome/browser/media/media_engagement_session_unittest.cc b/chrome/browser/media/media_engagement_session_unittest.cc
index 31b57e96..8f232bb 100644
--- a/chrome/browser/media/media_engagement_session_unittest.cc
+++ b/chrome/browser/media/media_engagement_session_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/media/media_engagement_session.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/test/simple_test_clock.h"
 #include "chrome/browser/media/media_engagement_service.h"
diff --git a/chrome/browser/media/protected_media_identifier_permission_context.cc b/chrome/browser/media/protected_media_identifier_permission_context.cc
index 45a5331..b589c65 100644
--- a/chrome/browser/media/protected_media_identifier_permission_context.cc
+++ b/chrome/browser/media/protected_media_identifier_permission_context.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/media/protected_media_identifier_permission_context.h"
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/command_line.h"
 #include "base/metrics/user_metrics.h"
 #include "base/strings/string_split.h"
diff --git a/chrome/browser/media/public_session_media_access_handler.cc b/chrome/browser/media/public_session_media_access_handler.cc
index db0c7f3a..1109b9c 100644
--- a/chrome/browser/media/public_session_media_access_handler.cc
+++ b/chrome/browser/media/public_session_media_access_handler.cc
@@ -9,6 +9,7 @@
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
 #include "chrome/browser/chromeos/extensions/public_session_permission_helper.h"
 #include "chrome/browser/profiles/profiles_state.h"
 #include "chromeos/login/login_state/login_state.h"
diff --git a/chrome/browser/media/public_session_tab_capture_access_handler.cc b/chrome/browser/media/public_session_tab_capture_access_handler.cc
index 8e87fe7..bad852ac 100644
--- a/chrome/browser/media/public_session_tab_capture_access_handler.cc
+++ b/chrome/browser/media/public_session_tab_capture_access_handler.cc
@@ -8,6 +8,7 @@
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
 #include "chrome/browser/chromeos/extensions/public_session_permission_helper.h"
 #include "chrome/browser/profiles/profiles_state.h"
 #include "chromeos/login/login_state/login_state.h"
diff --git a/chrome/browser/media/router/discovery/dial/dial_media_sink_service_impl_unittest.cc b/chrome/browser/media/router/discovery/dial/dial_media_sink_service_impl_unittest.cc
index 623cc49dd..a289d46 100644
--- a/chrome/browser/media/router/discovery/dial/dial_media_sink_service_impl_unittest.cc
+++ b/chrome/browser/media/router/discovery/dial/dial_media_sink_service_impl_unittest.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/media/router/discovery/dial/dial_media_sink_service_impl.h"
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/test/mock_callback.h"
 #include "base/timer/mock_timer.h"
 #include "chrome/browser/media/router/discovery/dial/dial_device_data.h"
diff --git a/chrome/browser/media/router/media_router_feature.cc b/chrome/browser/media/router/media_router_feature.cc
index 2d478ad..3ff8fee 100644
--- a/chrome/browser/media/router/media_router_feature.cc
+++ b/chrome/browser/media/router/media_router_feature.cc
@@ -9,7 +9,6 @@
 #include "base/strings/string_util.h"
 #include "build/build_config.h"
 #include "chrome/browser/profiles/profile.h"
-#include "components/mirroring/service/features.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/common/content_features.h"
 #include "crypto/random.h"
@@ -114,13 +113,6 @@
   return base::FeatureList::IsEnabled(kCastMediaRouteProvider);
 }
 
-bool ShouldUseMirroringService() {
-  // The native Cast MRP requires the mirroring service to do mirroring, so try
-  // to enable the service if the native Cast MRP is being used.
-  return base::FeatureList::IsEnabled(mirroring::features::kMirroringService) ||
-         base::FeatureList::IsEnabled(kCastMediaRouteProvider);
-}
-
 #endif  // !defined(OS_ANDROID)
 
 }  // namespace media_router
diff --git a/chrome/browser/media/router/media_router_feature.h b/chrome/browser/media/router/media_router_feature.h
index bc1d4b51..ec17654 100644
--- a/chrome/browser/media/router/media_router_feature.h
+++ b/chrome/browser/media/router/media_router_feature.h
@@ -62,10 +62,6 @@
 // Returns true if browser side Cast Media Route Provider and sink query are
 // enabled.
 bool CastMediaRouteProviderEnabled();
-
-// Returns true if Mirroring Service should be used for mirroring.
-bool ShouldUseMirroringService();
-
 #endif  // !defined(OS_ANDROID)
 
 }  // namespace media_router
diff --git a/chrome/browser/media/router/mojo/media_router_desktop.cc b/chrome/browser/media/router/mojo/media_router_desktop.cc
index 602461b..60e162a 100644
--- a/chrome/browser/media/router/mojo/media_router_desktop.cc
+++ b/chrome/browser/media/router/mojo/media_router_desktop.cc
@@ -102,10 +102,12 @@
   // discovery / sink query. We are migrating discovery from the external Media
   // Route Provider to the Media Router (https://crbug.com/687383), so we need
   // to disable it in the provider.
+  //
+  // FIXME: Remove config flags once all features are launched
   config->enable_cast_discovery = false;
   config->enable_dial_sink_query = false;
   config->enable_cast_sink_query = !CastMediaRouteProviderEnabled();
-  config->use_mirroring_service = ShouldUseMirroringService();
+  config->use_mirroring_service = true;
   std::move(callback).Run(instance_id(), std::move(config));
 
   SyncStateToMediaRouteProvider(provider_id);
diff --git a/chrome/browser/media/router/mojo/media_router_mojo_impl.cc b/chrome/browser/media/router/mojo/media_router_mojo_impl.cc
index c1d70487..de9d9b3b 100644
--- a/chrome/browser/media/router/mojo/media_router_mojo_impl.cc
+++ b/chrome/browser/media/router/mojo/media_router_mojo_impl.cc
@@ -981,12 +981,10 @@
 void MediaRouterMojoImpl::GetMirroringServiceHostForTab(
     int32_t target_tab_id,
     mojo::PendingReceiver<mirroring::mojom::MirroringServiceHost> receiver) {
-  if (ShouldUseMirroringService()) {
-    mirroring::CastMirroringServiceHost::GetForTab(
-        GetWebContentsFromId(target_tab_id, context_,
-                             true /* include_incognito */),
-        std::move(receiver));
-  }
+  mirroring::CastMirroringServiceHost::GetForTab(
+      GetWebContentsFromId(target_tab_id, context_,
+                           true /* include_incognito */),
+      std::move(receiver));
 }
 
 // TODO(crbug.com/809249): This method is currently part of a Mojo interface,
@@ -1015,7 +1013,7 @@
     }
     mirroring::CastMirroringServiceHost::GetForDesktop(media_id,
                                                        std::move(receiver));
-  } else if (ShouldUseMirroringService()) {
+  } else {
     // This code path is taken when the mirroring service is enabled
     // but the native Cast MRP is not.
     //
@@ -1032,7 +1030,7 @@
     const GURL& presentation_url,
     const std::string& presentation_id,
     mojo::PendingReceiver<mirroring::mojom::MirroringServiceHost> receiver) {
-  if (ShouldUseMirroringService() && IsValidPresentationUrl(presentation_url)) {
+  if (IsValidPresentationUrl(presentation_url)) {
     mirroring::CastMirroringServiceHost::GetForOffscreenTab(
         context_, presentation_url, presentation_id, std::move(receiver));
   }
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 795bcaf..7361d44 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
@@ -11,6 +11,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/optional.h"
 #include "base/run_loop.h"
 #include "base/task/post_task.h"
diff --git a/chrome/browser/media/router/providers/cast/cast_media_controller.cc b/chrome/browser/media/router/providers/cast/cast_media_controller.cc
index ec125c8..ac4134f4 100644
--- a/chrome/browser/media/router/providers/cast/cast_media_controller.cc
+++ b/chrome/browser/media/router/providers/cast/cast_media_controller.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/media/router/providers/cast/cast_media_controller.h"
 
+#include "base/bind_helpers.h"
 #include "base/rand_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/values.h"
diff --git a/chrome/browser/media/webrtc/native_desktop_media_list_unittest.cc b/chrome/browser/media/webrtc/native_desktop_media_list_unittest.cc
index fe430e58..5de558d 100644
--- a/chrome/browser/media/webrtc/native_desktop_media_list_unittest.cc
+++ b/chrome/browser/media/webrtc/native_desktop_media_list_unittest.cc
@@ -13,6 +13,7 @@
 
 #include "base/location.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/utf_string_conversions.h"
diff --git a/chrome/browser/media/webrtc/permission_bubble_media_access_handler.cc b/chrome/browser/media/webrtc/permission_bubble_media_access_handler.cc
index 5d9b604..d8bbf7e 100644
--- a/chrome/browser/media/webrtc/permission_bubble_media_access_handler.cc
+++ b/chrome/browser/media/webrtc/permission_bubble_media_access_handler.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/metrics/field_trial.h"
 #include "base/task/post_task.h"
 #include "build/build_config.h"
diff --git a/chrome/browser/media/webrtc/webrtc_event_log_manager.cc b/chrome/browser/media/webrtc/webrtc_event_log_manager.cc
index 72819cf..08e960e8 100644
--- a/chrome/browser/media/webrtc/webrtc_event_log_manager.cc
+++ b/chrome/browser/media/webrtc/webrtc_event_log_manager.cc
@@ -8,6 +8,7 @@
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/memory/ptr_util.h"
 #include "base/task/post_task.h"
 #include "base/task/thread_pool.h"
 #include "build/build_config.h"
diff --git a/chrome/browser/media/webrtc/webrtc_event_log_manager_unittest.cc b/chrome/browser/media/webrtc/webrtc_event_log_manager_unittest.cc
index 87acd7e..c475711 100644
--- a/chrome/browser/media/webrtc/webrtc_event_log_manager_unittest.cc
+++ b/chrome/browser/media/webrtc/webrtc_event_log_manager_unittest.cc
@@ -21,6 +21,7 @@
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
+#include "base/memory/ptr_util.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/optional.h"
 #include "base/run_loop.h"
diff --git a/chrome/browser/media_galleries/fileapi/device_media_async_file_util.cc b/chrome/browser/media_galleries/fileapi/device_media_async_file_util.cc
index 237eeb7..475cfba 100644
--- a/chrome/browser/media_galleries/fileapi/device_media_async_file_util.cc
+++ b/chrome/browser/media_galleries/fileapi/device_media_async_file_util.cc
@@ -10,6 +10,7 @@
 
 #include "base/bind.h"
 #include "base/callback.h"
+#include "base/callback_helpers.h"
 #include "base/files/file_util.h"
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
diff --git a/chrome/browser/notifications/notification_permission_context.cc b/chrome/browser/notifications/notification_permission_context.cc
index 5e1a070b..e949d9f5 100644
--- a/chrome/browser/notifications/notification_permission_context.cc
+++ b/chrome/browser/notifications/notification_permission_context.cc
@@ -6,6 +6,7 @@
 
 #include "base/bind.h"
 #include "base/callback.h"
+#include "base/callback_helpers.h"
 #include "base/containers/circular_deque.h"
 #include "base/location.h"
 #include "base/rand_util.h"
diff --git a/chrome/browser/notifications/notification_platform_bridge_linux.cc b/chrome/browser/notifications/notification_platform_bridge_linux.cc
index 9ad0ca5e..328b3a4 100644
--- a/chrome/browser/notifications/notification_platform_bridge_linux.cc
+++ b/chrome/browser/notifications/notification_platform_bridge_linux.cc
@@ -19,6 +19,7 @@
 #include "base/files/file_path_watcher.h"
 #include "base/files/file_util.h"
 #include "base/i18n/number_formatting.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/numerics/ranges.h"
 #include "base/strings/nullable_string16.h"
diff --git a/chrome/browser/notifications/notification_trigger_scheduler.cc b/chrome/browser/notifications/notification_trigger_scheduler.cc
index c43c90a..b4a86ad 100644
--- a/chrome/browser/notifications/notification_trigger_scheduler.cc
+++ b/chrome/browser/notifications/notification_trigger_scheduler.cc
@@ -6,6 +6,7 @@
 
 #include <memory>
 
+#include "base/memory/ptr_util.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/notifications/platform_notification_service_factory.h"
diff --git a/chrome/browser/notifications/notification_trigger_scheduler_unittest.cc b/chrome/browser/notifications/notification_trigger_scheduler_unittest.cc
index e6697a5..d891efd 100644
--- a/chrome/browser/notifications/notification_trigger_scheduler_unittest.cc
+++ b/chrome/browser/notifications/notification_trigger_scheduler_unittest.cc
@@ -5,6 +5,7 @@
 #include <map>
 #include <memory>
 
+#include "base/memory/ptr_util.h"
 #include "chrome/browser/notifications/notification_trigger_scheduler.h"
 #include "chrome/browser/notifications/platform_notification_service_factory.h"
 #include "chrome/browser/notifications/platform_notification_service_impl.h"
diff --git a/chrome/browser/notifications/scheduler/internal/icon_store_unittest.cc b/chrome/browser/notifications/scheduler/internal/icon_store_unittest.cc
index 43070dd..ecd8672 100644
--- a/chrome/browser/notifications/scheduler/internal/icon_store_unittest.cc
+++ b/chrome/browser/notifications/scheduler/internal/icon_store_unittest.cc
@@ -10,6 +10,7 @@
 #include <utility>
 #include <vector>
 
+#include "base/bind_helpers.h"
 #include "base/guid.h"
 #include "base/run_loop.h"
 #include "base/test/task_environment.h"
diff --git a/chrome/browser/notifications/scheduler/internal/notification_store_unittest.cc b/chrome/browser/notifications/scheduler/internal/notification_store_unittest.cc
index 0ea5f0c2..9676c10 100644
--- a/chrome/browser/notifications/scheduler/internal/notification_store_unittest.cc
+++ b/chrome/browser/notifications/scheduler/internal/notification_store_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/notifications/scheduler/internal/notification_store.h"
 
+#include "base/bind_helpers.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/task_environment.h"
 #include "chrome/browser/notifications/scheduler/internal/proto_conversion.h"
diff --git a/chrome/browser/offline_pages/recent_tab_helper.cc b/chrome/browser/offline_pages/recent_tab_helper.cc
index 67d6e724..49b64fc 100644
--- a/chrome/browser/offline_pages/recent_tab_helper.cc
+++ b/chrome/browser/offline_pages/recent_tab_helper.cc
@@ -8,6 +8,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/location.h"
 #include "base/macros.h"
 #include "base/metrics/histogram_macros.h"
diff --git a/chrome/browser/optimization_guide/optimization_guide_hints_manager.cc b/chrome/browser/optimization_guide/optimization_guide_hints_manager.cc
index 9eb4519..491a97c8 100644
--- a/chrome/browser/optimization_guide/optimization_guide_hints_manager.cc
+++ b/chrome/browser/optimization_guide/optimization_guide_hints_manager.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/logging.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
diff --git a/chrome/browser/optimization_guide/optimization_guide_hints_manager_unittest.cc b/chrome/browser/optimization_guide/optimization_guide_hints_manager_unittest.cc
index 55718b870..27e1360 100644
--- a/chrome/browser/optimization_guide/optimization_guide_hints_manager_unittest.cc
+++ b/chrome/browser/optimization_guide/optimization_guide_hints_manager_unittest.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/base64.h"
+#include "base/bind_helpers.h"
 #include "base/command_line.h"
 #include "base/files/file_util.h"
 #include "base/test/gtest_util.h"
diff --git a/chrome/browser/optimization_guide/optimization_guide_keyed_service.cc b/chrome/browser/optimization_guide/optimization_guide_keyed_service.cc
index c48e40e..5fb0503 100644
--- a/chrome/browser/optimization_guide/optimization_guide_keyed_service.cc
+++ b/chrome/browser/optimization_guide/optimization_guide_keyed_service.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h"
 
+#include "base/bind_helpers.h"
 #include "base/callback_forward.h"
 #include "base/files/file_path.h"
 #include "chrome/browser/optimization_guide/optimization_guide_hints_manager.h"
diff --git a/chrome/browser/page_load_metrics/observers/amp_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/amp_page_load_metrics_observer.cc
index 7d7e40a..9527fc67 100644
--- a/chrome/browser/page_load_metrics/observers/amp_page_load_metrics_observer.cc
+++ b/chrome/browser/page_load_metrics/observers/amp_page_load_metrics_observer.cc
@@ -7,6 +7,7 @@
 #include <algorithm>
 #include <string>
 
+#include "base/memory/ptr_util.h"
 #include "base/optional.h"
 #include "base/strings/string_util.h"
 #include "base/time/time.h"
diff --git a/chrome/browser/page_load_metrics/observers/amp_page_load_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/amp_page_load_metrics_observer_unittest.cc
index 988becd..8f93a06 100644
--- a/chrome/browser/page_load_metrics/observers/amp_page_load_metrics_observer_unittest.cc
+++ b/chrome/browser/page_load_metrics/observers/amp_page_load_metrics_observer_unittest.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/optional.h"
 #include "base/time/time.h"
 #include "chrome/browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.h"
diff --git a/chrome/browser/page_load_metrics/observers/android_page_load_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/android_page_load_metrics_observer_unittest.cc
index 43b7bb2..5bb6abe 100644
--- a/chrome/browser/page_load_metrics/observers/android_page_load_metrics_observer_unittest.cc
+++ b/chrome/browser/page_load_metrics/observers/android_page_load_metrics_observer_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/page_load_metrics/observers/android_page_load_metrics_observer.h"
 
+#include "base/memory/ptr_util.h"
 #include "chrome/browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/page_load_metrics/browser/page_load_tracker.h"
diff --git a/chrome/browser/page_load_metrics/observers/third_party_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/third_party_metrics_observer_unittest.cc
index 28a9e77..c3ff3e9 100644
--- a/chrome/browser/page_load_metrics/observers/third_party_metrics_observer_unittest.cc
+++ b/chrome/browser/page_load_metrics/observers/third_party_metrics_observer_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/page_load_metrics/observers/third_party_metrics_observer.h"
 
+#include "base/memory/ptr_util.h"
 #include "chrome/browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.h"
 #include "components/page_load_metrics/browser/page_load_tracker.h"
 #include "components/page_load_metrics/common/page_load_metrics.mojom.h"
diff --git a/chrome/browser/paint_preview/paint_preview_compositor_browsertest.cc b/chrome/browser/paint_preview/paint_preview_compositor_browsertest.cc
index 9dfd55f1..8bf3e32 100644
--- a/chrome/browser/paint_preview/paint_preview_compositor_browsertest.cc
+++ b/chrome/browser/paint_preview/paint_preview_compositor_browsertest.cc
@@ -7,6 +7,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/run_loop.h"
 #include "base/test/gtest_util.h"
 #include "base/unguessable_token.h"
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.cc b/chrome/browser/password_manager/chrome_password_manager_client.cc
index 591c391f..0c276a36 100644
--- a/chrome/browser/password_manager/chrome_password_manager_client.cc
+++ b/chrome/browser/password_manager/chrome_password_manager_client.cc
@@ -107,7 +107,6 @@
 #include "chrome/browser/password_manager/account_chooser_dialog_android.h"
 #include "chrome/browser/password_manager/auto_signin_first_run_dialog_android.h"
 #include "chrome/browser/password_manager/auto_signin_prompt_controller.h"
-#include "chrome/browser/password_manager/credential_leak_controller_android.h"
 #include "chrome/browser/password_manager/generated_password_saved_infobar_delegate_android.h"
 #include "chrome/browser/password_manager/password_accessory_controller.h"
 #include "chrome/browser/password_manager/password_accessory_controller_impl.h"
@@ -129,6 +128,11 @@
 #endif
 
 #if defined(OS_ANDROID)
+#if defined(ENABLE_PASSWORD_CHANGE)
+#include "chrome/browser/password_manager/credential_leak_password_change_controller_android.h"
+#else
+#include "chrome/browser/password_manager/credential_leak_controller_android.h"
+#endif
 using password_manager::CredentialCache;
 #endif
 
@@ -548,9 +552,15 @@
     const GURL& origin) {
 #if defined(OS_ANDROID)
   HideSavePasswordInfobar(web_contents());
+#if defined(ENABLE_PASSWORD_CHANGE)
+  (new CredentialLeakPasswordChangeControllerAndroid(
+       leak_type, origin, web_contents()->GetTopLevelNativeWindow()))
+      ->ShowDialog();
+#else
   (new CredentialLeakControllerAndroid(
        leak_type, origin, web_contents()->GetTopLevelNativeWindow()))
       ->ShowDialog();
+#endif
 #else   // !defined(OS_ANDROID)
   PasswordsClientUIDelegate* manage_passwords_ui_controller =
       PasswordsClientUIDelegateFromWebContents(web_contents());
@@ -777,8 +787,9 @@
 ChromePasswordManagerClient::GetProfilePasswordStore() const {
   // Always use EXPLICIT_ACCESS as the password manager checks IsIncognito
   // itself when it shouldn't access the PasswordStore.
-  return PasswordStoreFactory::GetForProfile(
-             profile_, ServiceAccessType::EXPLICIT_ACCESS).get();
+  return PasswordStoreFactory::GetForProfile(profile_,
+                                             ServiceAccessType::EXPLICIT_ACCESS)
+      .get();
 }
 
 password_manager::PasswordStore*
@@ -804,8 +815,7 @@
   if (log_manager_->IsLoggingActive()) {
     logger.reset(new password_manager::BrowserSavePasswordProgressLogger(
         log_manager_.get()));
-    logger->LogMessage(
-        Logger::STRING_WAS_LAST_NAVIGATION_HTTP_ERROR_METHOD);
+    logger->LogMessage(Logger::STRING_WAS_LAST_NAVIGATION_HTTP_ERROR_METHOD);
   }
 
   content::NavigationEntry* entry =
diff --git a/chrome/browser/password_manager/credential_leak_password_change_controller_android.cc b/chrome/browser/password_manager/credential_leak_password_change_controller_android.cc
new file mode 100644
index 0000000..c2ff7171
--- /dev/null
+++ b/chrome/browser/password_manager/credential_leak_password_change_controller_android.cc
@@ -0,0 +1,81 @@
+// 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/password_manager/credential_leak_password_change_controller_android.h"
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_string.h"
+#include "chrome/browser/ui/android/passwords/credential_leak_dialog_password_change_view_android.h"
+#include "chrome/common/url_constants.h"
+#include "components/password_manager/core/browser/leak_detection_dialog_utils.h"
+#include "ui/android/window_android.h"
+
+using password_manager::metrics_util::LeakDialogDismissalReason;
+using password_manager::metrics_util::LogLeakDialogTypeAndDismissalReason;
+
+CredentialLeakPasswordChangeControllerAndroid::
+    CredentialLeakPasswordChangeControllerAndroid(
+        password_manager::CredentialLeakType leak_type,
+        const GURL& origin,
+        ui::WindowAndroid* window_android)
+    : leak_type_(leak_type), origin_(origin), window_android_(window_android) {}
+
+CredentialLeakPasswordChangeControllerAndroid::
+    ~CredentialLeakPasswordChangeControllerAndroid() = default;
+
+void CredentialLeakPasswordChangeControllerAndroid::ShowDialog() {
+  dialog_view_.reset(new CredentialLeakDialogPasswordChangeViewAndroid(this));
+  dialog_view_->Show(window_android_);
+}
+
+void CredentialLeakPasswordChangeControllerAndroid::OnCancelDialog() {
+  LogLeakDialogTypeAndDismissalReason(
+      password_manager::GetLeakDialogType(leak_type_),
+      LeakDialogDismissalReason::kClickedClose);
+  delete this;
+}
+
+void CredentialLeakPasswordChangeControllerAndroid::OnAcceptDialog() {
+  LogLeakDialogTypeAndDismissalReason(
+      password_manager::GetLeakDialogType(leak_type_),
+      ShouldCheckPasswords() ? LeakDialogDismissalReason::kClickedCheckPasswords
+                             : LeakDialogDismissalReason::kClickedOk);
+  delete this;
+}
+
+void CredentialLeakPasswordChangeControllerAndroid::OnCloseDialog() {
+  LogLeakDialogTypeAndDismissalReason(
+      password_manager::GetLeakDialogType(leak_type_),
+      LeakDialogDismissalReason::kNoDirectInteraction);
+  delete this;
+}
+
+base::string16
+CredentialLeakPasswordChangeControllerAndroid::GetAcceptButtonLabel() const {
+  return password_manager::GetAcceptButtonLabel(leak_type_);
+}
+
+base::string16
+CredentialLeakPasswordChangeControllerAndroid::GetCancelButtonLabel() const {
+  return password_manager::GetCancelButtonLabel();
+}
+
+base::string16 CredentialLeakPasswordChangeControllerAndroid::GetDescription()
+    const {
+  return password_manager::GetDescription(leak_type_, origin_);
+}
+
+base::string16 CredentialLeakPasswordChangeControllerAndroid::GetTitle() const {
+  return password_manager::GetTitle(leak_type_);
+}
+
+bool CredentialLeakPasswordChangeControllerAndroid::ShouldCheckPasswords()
+    const {
+  return password_manager::ShouldCheckPasswords(leak_type_);
+}
+
+bool CredentialLeakPasswordChangeControllerAndroid::ShouldShowCancelButton()
+    const {
+  return password_manager::ShouldShowCancelButton(leak_type_);
+}
diff --git a/chrome/browser/password_manager/credential_leak_password_change_controller_android.h b/chrome/browser/password_manager/credential_leak_password_change_controller_android.h
new file mode 100644
index 0000000..82e67786
--- /dev/null
+++ b/chrome/browser/password_manager/credential_leak_password_change_controller_android.h
@@ -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.
+
+#ifndef CHROME_BROWSER_PASSWORD_MANAGER_CREDENTIAL_LEAK_PASSWORD_CHANGE_CONTROLLER_ANDROID_H_
+#define CHROME_BROWSER_PASSWORD_MANAGER_CREDENTIAL_LEAK_PASSWORD_CHANGE_CONTROLLER_ANDROID_H_
+
+#include <memory>
+#include "base/macros.h"
+#include "components/password_manager/core/browser/leak_detection_dialog_utils.h"
+#include "ui/gfx/range/range.h"
+#include "url/gurl.h"
+
+namespace ui {
+class WindowAndroid;
+}
+
+class CredentialLeakDialogPasswordChangeViewAndroid;
+
+// TODO (crbug/1058764) Unfork credential leak dialog password change when
+// prototype is done.
+
+// Class which manages the dialog displayed when a credential leak was
+// detected. It is self-owned and it owns the dialog view.
+class CredentialLeakPasswordChangeControllerAndroid {
+ public:
+  CredentialLeakPasswordChangeControllerAndroid(
+      password_manager::CredentialLeakType leak_type,
+      const GURL& origin,
+      ui::WindowAndroid* window_android);
+  ~CredentialLeakPasswordChangeControllerAndroid();
+
+  // Called when a leaked credential was detected.
+  void ShowDialog();
+
+  // Called from the UI when the "Close" button was pressed.
+  // Will destroy the controller.
+  void OnCancelDialog();
+
+  // Called from the UI when the okay or password check button was pressed.
+  // Will destroy the controller.
+  void OnAcceptDialog();
+
+  // Called from the UI when the dialog was dismissed by other means (e.g. back
+  // button).
+  // Will destroy the controller.
+  void OnCloseDialog();
+
+  // The label of the accept button. Varies by leak type.
+  base::string16 GetAcceptButtonLabel() const;
+
+  // The label of the cancel button. Varies by leak type.
+  base::string16 GetCancelButtonLabel() const;
+
+  // Text explaining the leak details. Varies by leak type.
+  base::string16 GetDescription() const;
+
+  // The title of the dialog displaying the leak warning.
+  base::string16 GetTitle() const;
+
+  // Checks whether the dialog should show the option to check passwords.
+  bool ShouldCheckPasswords() const;
+
+  // Checks whether the cancel button should be shown.
+  bool ShouldShowCancelButton() const;
+
+ private:
+  // Used to customize the UI.
+  const password_manager::CredentialLeakType leak_type_;
+
+  const GURL origin_;
+
+  ui::WindowAndroid* window_android_;
+
+  std::unique_ptr<CredentialLeakDialogPasswordChangeViewAndroid> dialog_view_;
+
+  DISALLOW_COPY_AND_ASSIGN(CredentialLeakPasswordChangeControllerAndroid);
+};
+
+#endif  // CHROME_BROWSER_PASSWORD_MANAGER_CREDENTIAL_LEAK_PASSWORD_CHANGE_CONTROLLER_ANDROID_H_
diff --git a/chrome/browser/password_manager/password_accessory_controller_impl.cc b/chrome/browser/password_manager/password_accessory_controller_impl.cc
index 18bbd62..06133aee 100644
--- a/chrome/browser/password_manager/password_accessory_controller_impl.cc
+++ b/chrome/browser/password_manager/password_accessory_controller_impl.cc
@@ -10,6 +10,7 @@
 #include "base/bind.h"
 #include "base/callback.h"
 #include "base/containers/span.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/autofill/manual_filling_controller.h"
diff --git a/chrome/browser/password_manager/password_accessory_controller_impl_unittest.cc b/chrome/browser/password_manager/password_accessory_controller_impl_unittest.cc
index d5c4b2b..d628e1f 100644
--- a/chrome/browser/password_manager/password_accessory_controller_impl_unittest.cc
+++ b/chrome/browser/password_manager/password_accessory_controller_impl_unittest.cc
@@ -11,6 +11,7 @@
 #include <vector>
 
 #include "base/callback.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/metrics/histogram_tester.h"
diff --git a/chrome/browser/password_manager/password_generation_controller_impl.cc b/chrome/browser/password_manager/password_generation_controller_impl.cc
index 2c17964..d6c2803b 100644
--- a/chrome/browser/password_manager/password_generation_controller_impl.cc
+++ b/chrome/browser/password_manager/password_generation_controller_impl.cc
@@ -8,6 +8,7 @@
 
 #include "base/bind.h"
 #include "base/callback.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "chrome/browser/autofill/manual_filling_controller.h"
 #include "chrome/browser/password_manager/chrome_password_manager_client.h"
diff --git a/chrome/browser/performance_manager/decorators/frame_priority_decorator_unittest.cc b/chrome/browser/performance_manager/decorators/frame_priority_decorator_unittest.cc
index a3ead17..09dc57a8 100644
--- a/chrome/browser/performance_manager/decorators/frame_priority_decorator_unittest.cc
+++ b/chrome/browser/performance_manager/decorators/frame_priority_decorator_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/performance_manager/decorators/frame_priority_decorator.h"
 
+#include "base/memory/ptr_util.h"
 #include "components/performance_manager/graph/frame_node_impl.h"
 #include "components/performance_manager/graph/page_node_impl.h"
 #include "components/performance_manager/graph/process_node_impl.h"
diff --git a/chrome/browser/performance_manager/decorators/frozen_frame_aggregator_unittest.cc b/chrome/browser/performance_manager/decorators/frozen_frame_aggregator_unittest.cc
index a2afb3e..1b24669 100644
--- a/chrome/browser/performance_manager/decorators/frozen_frame_aggregator_unittest.cc
+++ b/chrome/browser/performance_manager/decorators/frozen_frame_aggregator_unittest.cc
@@ -6,6 +6,7 @@
 
 #include <memory>
 
+#include "base/memory/ptr_util.h"
 #include "components/performance_manager/graph/frame_node_impl.h"
 #include "components/performance_manager/graph/page_node_impl.h"
 #include "components/performance_manager/graph/process_node_impl.h"
diff --git a/chrome/browser/performance_manager/decorators/helpers/page_live_state_decorator_helper_unittest.cc b/chrome/browser/performance_manager/decorators/helpers/page_live_state_decorator_helper_unittest.cc
index 66f56361..fc0ad25 100644
--- a/chrome/browser/performance_manager/decorators/helpers/page_live_state_decorator_helper_unittest.cc
+++ b/chrome/browser/performance_manager/decorators/helpers/page_live_state_decorator_helper_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/performance_manager/decorators/helpers/page_live_state_decorator_helper.h"
 
+#include "base/bind_helpers.h"
 #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
 #include "chrome/browser/media/webrtc/media_stream_capture_indicator.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
diff --git a/chrome/browser/performance_manager/decorators/process_priority_aggregator_unittest.cc b/chrome/browser/performance_manager/decorators/process_priority_aggregator_unittest.cc
index 61d0d42a..e82a3ab 100644
--- a/chrome/browser/performance_manager/decorators/process_priority_aggregator_unittest.cc
+++ b/chrome/browser/performance_manager/decorators/process_priority_aggregator_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/performance_manager/decorators/process_priority_aggregator.h"
 
+#include "base/memory/ptr_util.h"
 #include "components/performance_manager/graph/frame_node_impl.h"
 #include "components/performance_manager/graph/process_node_impl.h"
 #include "components/performance_manager/test_support/graph_test_harness.h"
diff --git a/chrome/browser/performance_manager/observers/isolation_context_metrics_unittest.cc b/chrome/browser/performance_manager/observers/isolation_context_metrics_unittest.cc
index 482e09e..59b3b05 100644
--- a/chrome/browser/performance_manager/observers/isolation_context_metrics_unittest.cc
+++ b/chrome/browser/performance_manager/observers/isolation_context_metrics_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/performance_manager/observers/isolation_context_metrics.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "components/performance_manager/graph/frame_node_impl.h"
diff --git a/chrome/browser/performance_manager/observers/metrics_collector_unittest.cc b/chrome/browser/performance_manager/observers/metrics_collector_unittest.cc
index 80f6321..9c4bc5b 100644
--- a/chrome/browser/performance_manager/observers/metrics_collector_unittest.cc
+++ b/chrome/browser/performance_manager/observers/metrics_collector_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/performance_manager/observers/metrics_collector.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "build/build_config.h"
 #include "components/performance_manager/graph/frame_node_impl.h"
diff --git a/chrome/browser/performance_manager/persistence/site_data/non_recording_site_data_cache_unittest.cc b/chrome/browser/performance_manager/persistence/site_data/non_recording_site_data_cache_unittest.cc
index 82c2aca..81e9ccf 100644
--- a/chrome/browser/performance_manager/persistence/site_data/non_recording_site_data_cache_unittest.cc
+++ b/chrome/browser/performance_manager/persistence/site_data/non_recording_site_data_cache_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/performance_manager/persistence/site_data/non_recording_site_data_cache.h"
 
+#include "base/memory/ptr_util.h"
 #include "chrome/browser/performance_manager/persistence/site_data/leveldb_site_data_store.h"
 #include "chrome/browser/performance_manager/persistence/site_data/site_data_cache.h"
 #include "chrome/browser/performance_manager/persistence/site_data/site_data_cache_factory.h"
diff --git a/chrome/browser/performance_manager/persistence/site_data/site_data_cache_impl_unittest.cc b/chrome/browser/performance_manager/persistence/site_data/site_data_cache_impl_unittest.cc
index 4272542f..0ba80494 100644
--- a/chrome/browser/performance_manager/persistence/site_data/site_data_cache_impl_unittest.cc
+++ b/chrome/browser/performance_manager/persistence/site_data/site_data_cache_impl_unittest.cc
@@ -7,6 +7,7 @@
 #include <set>
 
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/performance_manager/persistence/site_data/site_data_cache_factory.h"
 #include "chrome/browser/performance_manager/persistence/site_data/site_data_cache_inspector.h"
diff --git a/chrome/browser/performance_manager/render_process_host_proxy_unittest.cc b/chrome/browser/performance_manager/render_process_host_proxy_unittest.cc
index 823883f..81b1014 100644
--- a/chrome/browser/performance_manager/render_process_host_proxy_unittest.cc
+++ b/chrome/browser/performance_manager/render_process_host_proxy_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "components/performance_manager/public/render_process_host_proxy.h"
 
+#include "base/bind_helpers.h"
 #include "base/memory/weak_ptr.h"
 #include "base/process/process.h"
 #include "base/task/post_task.h"
diff --git a/chrome/browser/permissions/permission_update_infobar_delegate_android.cc b/chrome/browser/permissions/permission_update_infobar_delegate_android.cc
index a8bc39d..abe17bf 100644
--- a/chrome/browser/permissions/permission_update_infobar_delegate_android.cc
+++ b/chrome/browser/permissions/permission_update_infobar_delegate_android.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/android/jni_array.h"
+#include "base/memory/ptr_util.h"
 #include "chrome/android/chrome_jni_headers/PermissionUpdateInfoBarDelegate_jni.h"
 #include "chrome/browser/android/android_theme_resources.h"
 #include "chrome/browser/infobars/infobar_service.h"
diff --git a/chrome/browser/plugins/pdf_iframe_navigation_throttle.cc b/chrome/browser/plugins/pdf_iframe_navigation_throttle.cc
index 8d7b527..5b780f8b 100644
--- a/chrome/browser/plugins/pdf_iframe_navigation_throttle.cc
+++ b/chrome/browser/plugins/pdf_iframe_navigation_throttle.cc
@@ -8,13 +8,10 @@
 
 #include "base/feature_list.h"
 #include "base/memory/weak_ptr.h"
-#include "base/no_destructor.h"
 #include "base/task/post_task.h"
+#include "base/threading/sequenced_task_runner_handle.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/pdf_util.h"
-#include "content/public/browser/browser_context.h"
-#include "content/public/browser/browser_task_traits.h"
-#include "content/public/browser/browser_thread.h"
 #include "content/public/browser/download_utils.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/render_frame_host.h"
@@ -169,11 +166,14 @@
   // an antipattern. Use a helper object scoped to the WebContents lifetime to
   // scope the navigation task to the WebContents lifetime.
   content::WebContents* web_contents = navigation_handle()->GetWebContents();
+  if (!web_contents)
+    return;
+
   PdfWebContentsLifetimeHelper::CreateForWebContents(web_contents);
   PdfWebContentsLifetimeHelper* helper =
       PdfWebContentsLifetimeHelper::FromWebContents(web_contents);
-  base::PostTask(
-      FROM_HERE, {content::BrowserThread::UI},
+  base::SequencedTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE,
       base::BindOnce(&PdfWebContentsLifetimeHelper::NavigateIFrameToPlaceholder,
                      helper->GetWeakPtr(), std::move(params)));
 }
diff --git a/chrome/browser/policy/arc_policy_browsertest.cc b/chrome/browser/policy/arc_policy_browsertest.cc
index 4d9a5c0a..ff72841 100644
--- a/chrome/browser/policy/arc_policy_browsertest.cc
+++ b/chrome/browser/policy/arc_policy_browsertest.cc
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/memory/ptr_util.h"
 #include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/policy/configuration_policy_handler_chromeos.h"
 #include "chrome/browser/policy/policy_test_utils.h"
diff --git a/chrome/browser/policy/component_updater_policy_browsertest.cc b/chrome/browser/policy/component_updater_policy_browsertest.cc
index e52bb3e..e03588f 100644
--- a/chrome/browser/policy/component_updater_policy_browsertest.cc
+++ b/chrome/browser/policy/component_updater_policy_browsertest.cc
@@ -4,6 +4,7 @@
 
 #include "base/command_line.h"
 #include "base/json/json_reader.h"
+#include "base/memory/ptr_util.h"
 #include "base/task/post_task.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/component_updater/chrome_component_updater_configurator.h"
diff --git a/chrome/browser/policy/policy_test_utils.cc b/chrome/browser/policy/policy_test_utils.cc
index 1d3843e..50c7b8f 100644
--- a/chrome/browser/policy/policy_test_utils.cc
+++ b/chrome/browser/policy/policy_test_utils.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/policy/policy_test_utils.h"
 
+#include "base/bind_helpers.h"
 #include "base/message_loop/message_loop_current.h"
 #include "base/path_service.h"
 #include "base/strings/utf_string_conversions.h"
diff --git a/chrome/browser/preferences/BUILD.gn b/chrome/browser/preferences/BUILD.gn
index a3472be..5491897 100644
--- a/chrome/browser/preferences/BUILD.gn
+++ b/chrome/browser/preferences/BUILD.gn
@@ -9,6 +9,8 @@
     "android/java/src/org/chromium/chrome/browser/preferences/BaseChromePreferenceKeyChecker.java",
     "android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeyChecker.java",
     "android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java",
+    "android/java/src/org/chromium/chrome/browser/preferences/DeprecatedChromePreferenceKeys.java",
+    "android/java/src/org/chromium/chrome/browser/preferences/GrandfatheredChromePreferenceKeys.java",
     "android/java/src/org/chromium/chrome/browser/preferences/KeyPrefix.java",
     "android/java/src/org/chromium/chrome/browser/preferences/PrefChangeRegistrar.java",
     "android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java",
diff --git a/chrome/browser/preferences/OWNERS b/chrome/browser/preferences/OWNERS
index 1fa5c33..7ba5fcf 100644
--- a/chrome/browser/preferences/OWNERS
+++ b/chrome/browser/preferences/OWNERS
@@ -1,6 +1,4 @@
 chouinard@chromium.org
 hnakashima@chromium.org
 
-per-file *ChromePreferenceKeys.java=*
-
 # COMPONENT: Internals>Preferences
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeyChecker.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeyChecker.java
index 314493b6..7412a29e 100644
--- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeyChecker.java
+++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeyChecker.java
@@ -33,9 +33,8 @@
      * ChromePreferenceKeys}.
      */
     private ChromePreferenceKeyChecker() {
-        this(ChromePreferenceKeys.createKeysInUse(),
-                ChromePreferenceKeys.createGrandfatheredKeysInUse(),
-                ChromePreferenceKeys.createGrandfatheredPrefixesInUse());
+        this(ChromePreferenceKeys.getKeysInUse(), GrandfatheredChromePreferenceKeys.getKeysInUse(),
+                GrandfatheredChromePreferenceKeys.getPrefixesInUse());
     }
 
     /**
@@ -97,7 +96,7 @@
         if (isPrefixed) {
             // Key with prefix in format "Chrome.[Feature].[KeyPrefix].[Suffix]".
 
-            // Check if its prefix is whitelisted in |mKeysInUse|.
+            // Check if its prefix is registered in |mKeysInUse|.
             String prefixFormat =
                     TextUtils.join(".", Arrays.asList(parts[0], parts[1], parts[2], "*"));
             if (!mKeysInUse.contains(prefixFormat)) return false;
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
index d68c1f5..79966b3 100644
--- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
+++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
@@ -7,7 +7,6 @@
 import org.chromium.base.annotations.CheckDiscard;
 
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 
 /**
@@ -18,22 +17,25 @@
  * To add a new key:
  * 1. Declare it as a String constant in this class. Its value should follow the format
  *    "Chrome.[Feature].[Key]" and the constants names should be in alphabetical order.
- * 2. Add it to {@link #createKeysInUse()}.
+ * 2. Add it to {@link #getKeysInUse()}.
  *
  * To deprecate a key that is not used anymore:
- * 1. Add its constant value to createDeprecatedKeysForTesting(), in alphabetical order by value.
- * 2. Remove the key from {@link #createKeysInUse()} or {@link #createGrandfatheredKeysInUse()}.
+ * 1. Add its constant value to {@link DeprecatedChromePreferenceKeys#getKeysForTesting()}, in
+ * alphabetical order by value.
+ * 2. Remove the key from {@link #getKeysInUse()} or {@link
+ * GrandfatheredChromePreferenceKeys#getKeysInUse()}.
  * 3. Delete the constant.
  *
  * To add a new KeyPrefix:
  * 1. Declare it as a KeyPrefix constant in this class. Its value should follow the format
  *    "Chrome.[Feature].[KeyPrefix].*" and the constants names should be in alphabetical order.
- * 2. Add PREFIX_CONSTANT.pattern() to {@link #createKeysInUse()}}.
+ * 2. Add PREFIX_CONSTANT.pattern() to {@link #getKeysInUse()}}.
  *
  * To deprecate a KeyPrefix that is not used anymore:
- * 1. Add its String value to {@link #createDeprecatedKeysForTesting()}, including the ".*", in
- *    alphabetical order by value.
- * 2. Remove it from {@link #createKeysInUse()}.
+ * 1. Add its String value to {@link DeprecatedChromePreferenceKeys#getPrefixesForTesting()},
+ * including the ".*", in alphabetical order by value.
+ * 2. Remove it from {@link #getKeysInUse()} or {@link
+ * GrandfatheredChromePreferenceKeys#getPrefixesInUse()}.
  * 3. Delete the KeyPrefix constant.
  *
  * Tests in ChromePreferenceKeysTest and checks in {@link ChromePreferenceKeyChecker} ensure the
@@ -664,12 +666,13 @@
 
     /**
      * These values are currently used as SharedPreferences keys, along with the keys in
-     * {@link #createGrandfatheredKeysInUse()}. Add new SharedPreferences keys here.
+     * {@link GrandfatheredChromePreferenceKeys#getKeysInUse()}. Add new SharedPreferences keys
+     * here.
      *
      * @return The list of [keys in use] conforming to the format.
      */
     @CheckDiscard("Validation is performed in tests and in debug builds.")
-    static List<String> createKeysInUse() {
+    static List<String> getKeysInUse() {
         // clang-format off
         return Arrays.asList(
                 CONTEXT_MENU_OPEN_IMAGE_IN_EPHEMERAL_TAB_CLICKED,
@@ -686,264 +689,5 @@
         // clang-format on
     }
 
-    /**
-     * These values have been used as SharedPreferences keys in the past and should not be reused
-     * reused. Do not remove values from this list.
-     *
-     * @return The list of [deprecated keys].
-     */
-    @CheckDiscard("Validation is performed in tests and in debug builds.")
-    static List<String> createDeprecatedKeysForTesting() {
-        // clang-format off
-        return Arrays.asList(
-                "PersistedNotificationId",
-                "PhysicalWeb.ActivityReferral",
-                "PhysicalWeb.HasDeferredMetrics",
-                "PhysicalWeb.OptIn.DeclineButtonPressed",
-                "PhysicalWeb.OptIn.EnableButtonPressed",
-                "PhysicalWeb.Prefs.FeatureDisabled",
-                "PhysicalWeb.Prefs.FeatureEnabled",
-                "PhysicalWeb.Prefs.LocationDenied",
-                "PhysicalWeb.Prefs.LocationGranted",
-                "PhysicalWeb.ResolveTime.Background",
-                "PhysicalWeb.ResolveTime.Foreground",
-                "PhysicalWeb.ResolveTime.Refresh",
-                "PhysicalWeb.State",
-                "PhysicalWeb.TotalUrls.OnInitialDisplay",
-                "PhysicalWeb.TotalUrls.OnRefresh",
-                "PhysicalWeb.UrlSelected",
-                "PrefMigrationVersion",
-                "ServiceManagerFeatures",
-                "allow_low_end_device_ui",
-                "allow_starting_service_manager_only",
-                "bookmark_search_history",
-                "cellular_experiment",
-                "chrome_home_enabled_date",
-                "chrome_home_info_promo_shown",
-                "chrome_home_opt_out_snackbar_shown",
-                "chrome_home_user_enabled",
-                "chrome_modern_design_enabled",
-                "click_to_call_open_dialer_directly",
-                "crash_dump_upload",
-                "crash_dump_upload_no_cellular",
-                "home_page_button_force_enabled",
-                "homepage_tile_enabled",
-                "inflate_toolbar_on_background_thread",
-                "night_mode_available",
-                "night_mode_cct_available",
-                "night_mode_default_to_light",
-                "ntp_button_enabled",
-                "ntp_button_variant",
-                "physical_web",
-                "physical_web_sharing",
-                "sole_integration_enabled",
-                "tab_persistent_store_task_runner_enabled",
-                "webapk_number_of_uninstalls",
-                "website_settings_filter"
-        );
-        // clang-format on
-    }
-
-    /**
-     * Do not add new constants to this list unless you are migrating old SharedPreferences keys.
-     * Instead, declare new keys in the format "Chrome.[Feature].[Key]", for example
-     * "Chrome.FooBar.FooEnabled", and add them to {@link #createKeysInUse()}.
-     *
-     * @return The list of [keys in use] that do not conform to the "Chrome.[Feature].[Key]"
-     *     format.
-     */
-    @CheckDiscard("Validation is performed in tests and in debug builds.")
-    static List<String> createGrandfatheredKeysInUse() {
-        // clang-format off
-        return Arrays.asList(
-                ACCESSIBILITY_TAB_SWITCHER,
-                APP_LOCALE,
-                AUTOFILL_ASSISTANT_ENABLED,
-                AUTOFILL_ASSISTANT_ONBOARDING_ACCEPTED,
-                AUTOFILL_ASSISTANT_SKIP_INIT_SCREEN,
-                BACKUP_FIRST_BACKUP_DONE,
-                BOOKMARKS_LAST_MODIFIED_FOLDER_ID,
-                BOOKMARKS_LAST_USED_URL,
-                BOOKMARKS_LAST_USED_PARENT,
-                CHROME_DEFAULT_BROWSER,
-                CONTENT_SUGGESTIONS_SHOWN,
-                CONTEXTUAL_SEARCH_ALL_TIME_OPEN_COUNT,
-                CONTEXTUAL_SEARCH_ALL_TIME_TAP_COUNT,
-                CONTEXTUAL_SEARCH_ALL_TIME_TAP_QUICK_ANSWER_COUNT,
-                CONTEXTUAL_SEARCH_CURRENT_WEEK_NUMBER,
-                CONTEXTUAL_SEARCH_ENTITY_IMPRESSIONS_COUNT,
-                CONTEXTUAL_SEARCH_ENTITY_OPENS_COUNT,
-                CONTEXTUAL_SEARCH_LAST_ANIMATION_TIME,
-                CONTEXTUAL_SEARCH_NEWEST_WEEK,
-                CONTEXTUAL_SEARCH_OLDEST_WEEK,
-                CONTEXTUAL_SEARCH_PREVIOUS_INTERACTION_ENCODED_OUTCOMES,
-                CONTEXTUAL_SEARCH_PREVIOUS_INTERACTION_EVENT_ID,
-                CONTEXTUAL_SEARCH_PREVIOUS_INTERACTION_TIMESTAMP,
-                CONTEXTUAL_SEARCH_PROMO_OPEN_COUNT,
-                CONTEXTUAL_SEARCH_QUICK_ACTIONS_IGNORED_COUNT,
-                CONTEXTUAL_SEARCH_QUICK_ACTIONS_TAKEN_COUNT,
-                CONTEXTUAL_SEARCH_QUICK_ACTION_IMPRESSIONS_COUNT,
-                CONTEXTUAL_SEARCH_TAP_SINCE_OPEN_COUNT,
-                CONTEXTUAL_SEARCH_TAP_SINCE_OPEN_QUICK_ANSWER_COUNT,
-                CONTEXTUAL_SEARCH_TAP_TRIGGERED_PROMO_COUNT,
-                CRASH_UPLOAD_FAILURE_BROWSER,
-                CRASH_UPLOAD_FAILURE_GPU,
-                CRASH_UPLOAD_FAILURE_OTHER,
-                CRASH_UPLOAD_FAILURE_RENDERER,
-                CRASH_UPLOAD_SUCCESS_BROWSER,
-                CRASH_UPLOAD_SUCCESS_GPU,
-                CRASH_UPLOAD_SUCCESS_OTHER,
-                CRASH_UPLOAD_SUCCESS_RENDERER,
-                CUSTOM_TABS_LAST_URL,
-                DATA_REDUCTION_DISPLAYED_FRE_OR_SECOND_PROMO_TIME_MS,
-                DATA_REDUCTION_DISPLAYED_FRE_OR_SECOND_PROMO_VERSION,
-                DATA_REDUCTION_DISPLAYED_FRE_OR_SECOND_RUN_PROMO,
-                DATA_REDUCTION_DISPLAYED_INFOBAR_PROMO,
-                DATA_REDUCTION_DISPLAYED_INFOBAR_PROMO_VERSION,
-                DATA_REDUCTION_DISPLAYED_MILESTONE_PROMO_SAVED_BYTES,
-                DATA_REDUCTION_ENABLED,
-                DATA_REDUCTION_FIRST_ENABLED_TIME,
-                DATA_REDUCTION_FRE_PROMO_OPT_OUT,
-                DATA_REDUCTION_SITE_BREAKDOWN_ALLOWED_DATE,
-                DOWNLOAD_AUTO_RESUMPTION_ATTEMPT_LEFT,
-                DOWNLOAD_FOREGROUND_SERVICE_OBSERVERS,
-                DOWNLOAD_IS_DOWNLOAD_HOME_ENABLED,
-                DOWNLOAD_NEXT_DOWNLOAD_NOTIFICATION_ID,
-                DOWNLOAD_PENDING_DOWNLOAD_NOTIFICATIONS,
-                DOWNLOAD_PENDING_OMA_DOWNLOADS,
-                DOWNLOAD_UMA_ENTRY,
-                FIRST_RUN_CACHED_TOS_ACCEPTED,
-                FIRST_RUN_FLOW_COMPLETE,
-                FIRST_RUN_FLOW_SIGNIN_ACCOUNT_NAME,
-                FIRST_RUN_FLOW_SIGNIN_COMPLETE,
-                FIRST_RUN_FLOW_SIGNIN_SETUP,
-                FIRST_RUN_LIGHTWEIGHT_FLOW_COMPLETE,
-                FIRST_RUN_SKIP_WELCOME_PAGE,
-                FLAGS_CACHED_ADAPTIVE_TOOLBAR_ENABLED,
-                FLAGS_CACHED_BOTTOM_TOOLBAR_ENABLED,
-                FLAGS_CACHED_COMMAND_LINE_ON_NON_ROOTED_ENABLED,
-                FLAGS_CACHED_DOWNLOAD_AUTO_RESUMPTION_IN_NATIVE,
-                FLAGS_CACHED_GRID_TAB_SWITCHER_ENABLED,
-                FLAGS_CACHED_IMMERSIVE_UI_MODE_ENABLED,
-                FLAGS_CACHED_INTEREST_FEED_CONTENT_SUGGESTIONS,
-                FLAGS_CACHED_LABELED_BOTTOM_TOOLBAR_ENABLED,
-                FLAGS_CACHED_NETWORK_SERVICE_WARM_UP_ENABLED,
-                FLAGS_CACHED_PRIORITIZE_BOOTSTRAP_TASKS,
-                FLAGS_CACHED_SERVICE_MANAGER_FOR_BACKGROUND_PREFETCH,
-                FLAGS_CACHED_SERVICE_MANAGER_FOR_DOWNLOAD_RESUMPTION,
-                FLAGS_CACHED_START_SURFACE_ENABLED,
-                FLAGS_CACHED_SWAP_PIXEL_FORMAT_TO_FIX_CONVERT_FROM_TRANSLUCENT,
-                FLAGS_CACHED_TAB_GROUPS_ANDROID_ENABLED,
-                FONT_USER_FONT_SCALE_FACTOR,
-                FONT_USER_SET_FORCE_ENABLE_ZOOM,
-                HISTORY_SHOW_HISTORY_INFO,
-                HOMEPAGE_CUSTOM_URI,
-                HOMEPAGE_ENABLED,
-                HOMEPAGE_USE_DEFAULT_URI,
-                INCOGNITO_SHORTCUT_ADDED,
-                INVALIDATIONS_UUID_PREF_KEY,
-                LATEST_UNSUPPORTED_VERSION,
-                LOCALE_MANAGER_AUTO_SWITCH,
-                LOCALE_MANAGER_PROMO_SHOWN,
-                LOCALE_MANAGER_SEARCH_ENGINE_PROMO_SHOW_STATE,
-                LOCALE_MANAGER_WAS_IN_SPECIAL_LOCALE,
-                MEDIA_WEBRTC_NOTIFICATION_IDS,
-                METRICS_MAIN_INTENT_LAUNCH_COUNT,
-                METRICS_MAIN_INTENT_LAUNCH_TIMESTAMP,
-                NOTIFICATIONS_CHANNELS_VERSION,
-                NOTIFICATIONS_LAST_SHOWN_NOTIFICATION_TYPE,
-                NOTIFICATIONS_NEXT_TRIGGER,
-                NTP_SNIPPETS_IS_SCHEDULED,
-                OFFLINE_AUTO_FETCH_SHOWING_IN_PROGRESS,
-                OFFLINE_AUTO_FETCH_USER_CANCEL_ACTION_IN_PROGRESS,
-                OFFLINE_INDICATOR_V2_ENABLED,
-                PAYMENTS_PAYMENT_COMPLETE_ONCE,
-                PREFETCH_HAS_NEW_PAGES,
-                PREFETCH_IGNORED_NOTIFICATION_COUNTER,
-                PREFETCH_NOTIFICATION_ENABLED,
-                PREFETCH_NOTIFICATION_TIME,
-                PREFETCH_OFFLINE_COUNTER,
-                PRIVACY_ALLOW_PRERENDER_OLD,
-                PRIVACY_BANDWIDTH_NO_CELLULAR_OLD,
-                PRIVACY_BANDWIDTH_OLD,
-                PRIVACY_METRICS_IN_SAMPLE,
-                PRIVACY_METRICS_REPORTING,
-                PRIVACY_NETWORK_PREDICTIONS,
-                PROFILES_BOOT_TIMESTAMP,
-                PROMOS_SKIPPED_ON_FIRST_START,
-                REACHED_CODE_PROFILER_GROUP,
-                RLZ_NOTIFIED,
-                SEARCH_ENGINE_CHOICE_DEFAULT_TYPE_BEFORE,
-                SEARCH_ENGINE_CHOICE_PRESENTED_VERSION,
-                SEARCH_ENGINE_CHOICE_REQUESTED_TIMESTAMP,
-                SEND_TAB_TO_SELF_ACTIVE_NOTIFICATIONS,
-                SEND_TAB_TO_SELF_NEXT_NOTIFICATION_ID,
-                SETTINGS_DEVELOPER_ENABLED,
-                SETTINGS_DEVELOPER_TRACING_CATEGORIES,
-                SETTINGS_DEVELOPER_TRACING_MODE,
-                SETTINGS_PRIVACY_OTHER_FORMS_OF_HISTORY_DIALOG_SHOWN,
-                SETTINGS_SYNC_SIGN_OUT_ALLOWED,
-                SETTINGS_WEBSITE_FAILED_BUILD_VERSION,
-                SHARING_LAST_SHARED_CLASS_NAME,
-                SHARING_LAST_SHARED_PACKAGE_NAME,
-                SIGNIN_ACCOUNTS_CHANGED,
-                SIGNIN_ACCOUNT_RENAMED,
-                SIGNIN_ACCOUNT_RENAME_EVENT_INDEX,
-                SIGNIN_AND_SYNC_PROMO_SHOW_COUNT,
-                SIGNIN_PROMO_IMPRESSIONS_COUNT_BOOKMARKS,
-                SIGNIN_PROMO_IMPRESSIONS_COUNT_SETTINGS,
-                SIGNIN_PROMO_LAST_SHOWN_ACCOUNT_NAMES,
-                SIGNIN_PROMO_LAST_SHOWN_MAJOR_VERSION,
-                SIGNIN_PROMO_NTP_PROMO_DISMISSED,
-                SIGNIN_PROMO_NTP_PROMO_SUPPRESSION_PERIOD_START,
-                SIGNIN_PROMO_PERSONALIZED_DECLINED,
-                SIGNIN_PROMO_SETTINGS_PERSONALIZED_DISMISSED,
-                SNAPSHOT_DATABASE_REMOVED,
-                START_SURFACE_SINGLE_PANE_ENABLED_KEY,
-                SURVEY_DATE_LAST_ROLLED,
-                SURVEY_INFO_BAR_DISPLAYED,
-                SYNC_SESSIONS_UUID,
-                TABBED_ACTIVITY_LAST_BACKGROUNDED_TIME_MS_PREF,
-                TABMODEL_ACTIVE_TAB_ID,
-                TABMODEL_HAS_COMPUTED_MAX_ID,
-                TABMODEL_HAS_RUN_FILE_MIGRATION,
-                TABMODEL_HAS_RUN_MULTI_INSTANCE_FILE_MIGRATION,
-                TAB_ID_MANAGER_NEXT_ID,
-                TOS_ACKED_ACCOUNTS,
-                TWA_DIALOG_NUMBER_OF_DISMISSALS_ON_CLEAR_DATA,
-                TWA_DIALOG_NUMBER_OF_DISMISSALS_ON_UNINSTALL,
-                TWA_DISCLOSURE_ACCEPTED_PACKAGES,
-                UI_THEME_DARKEN_WEBSITES_ENABLED,
-                UI_THEME_SETTING,
-                VARIATION_CACHED_BOTTOM_TOOLBAR,
-                VERIFIED_DIGITAL_ASSET_LINKS,
-                VR_EXIT_TO_2D_COUNT,
-                VR_FEEDBACK_OPT_OUT,
-                VR_SHOULD_REGISTER_ASSETS_COMPONENT_ON_STARTUP,
-                WEBAPK_EXTRACTED_DEX_VERSION,
-                WEBAPK_LAST_SDK_VERSION,
-                WEBAPK_UNINSTALLED_PACKAGES
-        );
-        // clang-format on
-    }
-
-    @CheckDiscard("Validation is performed in tests and in debug builds.")
-    static List<KeyPrefix> createGrandfatheredPrefixesInUse() {
-        // clang-format off
-        return Arrays.asList(
-                CONTEXTUAL_SEARCH_CLICKS_WEEK_PREFIX,
-                CONTEXTUAL_SEARCH_IMPRESSIONS_WEEK_PREFIX,
-                CUSTOM_TABS_DEX_LAST_UPDATE_TIME_PREF_PREFIX,
-                PAYMENTS_PAYMENT_INSTRUMENT_USE_COUNT,
-                PAYMENTS_PAYMENT_INSTRUMENT_USE_DATE
-        );
-        // clang-format on
-    }
-
-    @CheckDiscard("Validation is performed in tests and in debug builds.")
-    static List<KeyPrefix> createDeprecatedPrefixesForTesting() {
-        return Collections.EMPTY_LIST;
-    }
-
     private ChromePreferenceKeys() {}
 }
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeysTest.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeysTest.java
index bf66c36..090612e 100644
--- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeysTest.java
+++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeysTest.java
@@ -40,11 +40,11 @@
     @Test
     @SmallTest
     public void testKeysAreNotReused() {
-        doTestKeysAreNotReused(ChromePreferenceKeys.createKeysInUse(),
-                ChromePreferenceKeys.createGrandfatheredKeysInUse(),
-                ChromePreferenceKeys.createDeprecatedKeysForTesting(),
-                ChromePreferenceKeys.createGrandfatheredPrefixesInUse(),
-                ChromePreferenceKeys.createDeprecatedPrefixesForTesting());
+        doTestKeysAreNotReused(ChromePreferenceKeys.getKeysInUse(),
+                GrandfatheredChromePreferenceKeys.getKeysInUse(),
+                DeprecatedChromePreferenceKeys.getKeysForTesting(),
+                GrandfatheredChromePreferenceKeys.getPrefixesInUse(),
+                DeprecatedChromePreferenceKeys.getPrefixesForTesting());
     }
 
     private void doTestKeysAreNotReused(List<String> usedList, List<String> grandfatheredUsedList,
@@ -185,17 +185,17 @@
     @Test
     @SmallTest
     public void testKeysConformToFormat() {
-        doTestKeysConformToFormat(ChromePreferenceKeys.createKeysInUse());
+        doTestKeysConformToFormat(ChromePreferenceKeys.getKeysInUse());
     }
 
     /**
      * Old constants grandfathered in are checked to see if they shouldn't be in
-     * {@link ChromePreferenceKeys#createKeysInUse()}.
+     * {@link ChromePreferenceKeys#getKeysInUse()}.
      */
     @Test
     @SmallTest
     public void testGrandfatheredKeysDoNotConformToFormat() {
-        doTestKeysDoNotConformToFormat(ChromePreferenceKeys.createGrandfatheredKeysInUse());
+        doTestKeysDoNotConformToFormat(GrandfatheredChromePreferenceKeys.getKeysInUse());
     }
 
     private void doTestKeysConformToFormat(List<String> usedList) {
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/DeprecatedChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/DeprecatedChromePreferenceKeys.java
new file mode 100644
index 0000000..6316b05
--- /dev/null
+++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/DeprecatedChromePreferenceKeys.java
@@ -0,0 +1,73 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.preferences;
+
+import org.chromium.base.annotations.CheckDiscard;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * These values have been used as SharedPreferences keys in the past and should not be reused.
+ * Do not remove values from this list.
+ */
+@CheckDiscard("Validation is performed in tests and in debug builds.")
+public class DeprecatedChromePreferenceKeys {
+    static List<String> getKeysForTesting() {
+        // clang-format off
+        return Arrays.asList(
+                "PersistedNotificationId",
+                "PhysicalWeb.ActivityReferral",
+                "PhysicalWeb.HasDeferredMetrics",
+                "PhysicalWeb.OptIn.DeclineButtonPressed",
+                "PhysicalWeb.OptIn.EnableButtonPressed",
+                "PhysicalWeb.Prefs.FeatureDisabled",
+                "PhysicalWeb.Prefs.FeatureEnabled",
+                "PhysicalWeb.Prefs.LocationDenied",
+                "PhysicalWeb.Prefs.LocationGranted",
+                "PhysicalWeb.ResolveTime.Background",
+                "PhysicalWeb.ResolveTime.Foreground",
+                "PhysicalWeb.ResolveTime.Refresh",
+                "PhysicalWeb.State",
+                "PhysicalWeb.TotalUrls.OnInitialDisplay",
+                "PhysicalWeb.TotalUrls.OnRefresh",
+                "PhysicalWeb.UrlSelected",
+                "PrefMigrationVersion",
+                "ServiceManagerFeatures",
+                "allow_low_end_device_ui",
+                "allow_starting_service_manager_only",
+                "bookmark_search_history",
+                "cellular_experiment",
+                "chrome_home_enabled_date",
+                "chrome_home_info_promo_shown",
+                "chrome_home_opt_out_snackbar_shown",
+                "chrome_home_user_enabled",
+                "chrome_modern_design_enabled",
+                "click_to_call_open_dialer_directly",
+                "crash_dump_upload",
+                "crash_dump_upload_no_cellular",
+                "home_page_button_force_enabled",
+                "homepage_tile_enabled",
+                "inflate_toolbar_on_background_thread",
+                "night_mode_available",
+                "night_mode_cct_available",
+                "night_mode_default_to_light",
+                "ntp_button_enabled",
+                "ntp_button_variant",
+                "physical_web",
+                "physical_web_sharing",
+                "sole_integration_enabled",
+                "tab_persistent_store_task_runner_enabled",
+                "webapk_number_of_uninstalls",
+                "website_settings_filter"
+        );
+        // clang-format on
+    }
+
+    static List<KeyPrefix> getPrefixesForTesting() {
+        return Collections.EMPTY_LIST;
+    }
+}
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/GrandfatheredChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/GrandfatheredChromePreferenceKeys.java
new file mode 100644
index 0000000..97ed6002c
--- /dev/null
+++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/GrandfatheredChromePreferenceKeys.java
@@ -0,0 +1,209 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.preferences;
+
+import org.chromium.base.annotations.CheckDiscard;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Do not add new constants to this list unless you are migrating old SharedPreferences keys.
+ * Instead, declare new keys in the format "Chrome.[Feature].[Key]", for example
+ * "Chrome.FooBar.FooEnabled", and add them to {@link ChromePreferenceKeys#getKeysInUse()}.
+ */
+@CheckDiscard("Validation is performed in tests and in debug builds.")
+public class GrandfatheredChromePreferenceKeys {
+
+    /**
+     * @return The list of [keys in use] that do not conform to the "Chrome.[Feature].[Key]"
+     *     format.
+     */
+    static List<String> getKeysInUse() {
+        // clang-format off
+        return Arrays.asList(
+                ChromePreferenceKeys.ACCESSIBILITY_TAB_SWITCHER,
+                ChromePreferenceKeys.APP_LOCALE,
+                ChromePreferenceKeys.AUTOFILL_ASSISTANT_ENABLED,
+                ChromePreferenceKeys.AUTOFILL_ASSISTANT_ONBOARDING_ACCEPTED,
+                ChromePreferenceKeys.AUTOFILL_ASSISTANT_SKIP_INIT_SCREEN,
+                ChromePreferenceKeys.BACKUP_FIRST_BACKUP_DONE,
+                ChromePreferenceKeys.BOOKMARKS_LAST_MODIFIED_FOLDER_ID,
+                ChromePreferenceKeys.BOOKMARKS_LAST_USED_URL,
+                ChromePreferenceKeys.BOOKMARKS_LAST_USED_PARENT,
+                ChromePreferenceKeys.CHROME_DEFAULT_BROWSER,
+                ChromePreferenceKeys.CONTENT_SUGGESTIONS_SHOWN,
+                ChromePreferenceKeys.CONTEXTUAL_SEARCH_ALL_TIME_OPEN_COUNT,
+                ChromePreferenceKeys.CONTEXTUAL_SEARCH_ALL_TIME_TAP_COUNT,
+                ChromePreferenceKeys.CONTEXTUAL_SEARCH_ALL_TIME_TAP_QUICK_ANSWER_COUNT,
+                ChromePreferenceKeys.CONTEXTUAL_SEARCH_CURRENT_WEEK_NUMBER,
+                ChromePreferenceKeys.CONTEXTUAL_SEARCH_ENTITY_IMPRESSIONS_COUNT,
+                ChromePreferenceKeys.CONTEXTUAL_SEARCH_ENTITY_OPENS_COUNT,
+                ChromePreferenceKeys.CONTEXTUAL_SEARCH_LAST_ANIMATION_TIME,
+                ChromePreferenceKeys.CONTEXTUAL_SEARCH_NEWEST_WEEK,
+                ChromePreferenceKeys.CONTEXTUAL_SEARCH_OLDEST_WEEK,
+                ChromePreferenceKeys.CONTEXTUAL_SEARCH_PREVIOUS_INTERACTION_ENCODED_OUTCOMES,
+                ChromePreferenceKeys.CONTEXTUAL_SEARCH_PREVIOUS_INTERACTION_EVENT_ID,
+                ChromePreferenceKeys.CONTEXTUAL_SEARCH_PREVIOUS_INTERACTION_TIMESTAMP,
+                ChromePreferenceKeys.CONTEXTUAL_SEARCH_PROMO_OPEN_COUNT,
+                ChromePreferenceKeys.CONTEXTUAL_SEARCH_QUICK_ACTIONS_IGNORED_COUNT,
+                ChromePreferenceKeys.CONTEXTUAL_SEARCH_QUICK_ACTIONS_TAKEN_COUNT,
+                ChromePreferenceKeys.CONTEXTUAL_SEARCH_QUICK_ACTION_IMPRESSIONS_COUNT,
+                ChromePreferenceKeys.CONTEXTUAL_SEARCH_TAP_SINCE_OPEN_COUNT,
+                ChromePreferenceKeys.CONTEXTUAL_SEARCH_TAP_SINCE_OPEN_QUICK_ANSWER_COUNT,
+                ChromePreferenceKeys.CONTEXTUAL_SEARCH_TAP_TRIGGERED_PROMO_COUNT,
+                ChromePreferenceKeys.CRASH_UPLOAD_FAILURE_BROWSER,
+                ChromePreferenceKeys.CRASH_UPLOAD_FAILURE_GPU,
+                ChromePreferenceKeys.CRASH_UPLOAD_FAILURE_OTHER,
+                ChromePreferenceKeys.CRASH_UPLOAD_FAILURE_RENDERER,
+                ChromePreferenceKeys.CRASH_UPLOAD_SUCCESS_BROWSER,
+                ChromePreferenceKeys.CRASH_UPLOAD_SUCCESS_GPU,
+                ChromePreferenceKeys.CRASH_UPLOAD_SUCCESS_OTHER,
+                ChromePreferenceKeys.CRASH_UPLOAD_SUCCESS_RENDERER,
+                ChromePreferenceKeys.CUSTOM_TABS_LAST_URL,
+                ChromePreferenceKeys.DATA_REDUCTION_DISPLAYED_FRE_OR_SECOND_PROMO_TIME_MS,
+                ChromePreferenceKeys.DATA_REDUCTION_DISPLAYED_FRE_OR_SECOND_PROMO_VERSION,
+                ChromePreferenceKeys.DATA_REDUCTION_DISPLAYED_FRE_OR_SECOND_RUN_PROMO,
+                ChromePreferenceKeys.DATA_REDUCTION_DISPLAYED_INFOBAR_PROMO,
+                ChromePreferenceKeys.DATA_REDUCTION_DISPLAYED_INFOBAR_PROMO_VERSION,
+                ChromePreferenceKeys.DATA_REDUCTION_DISPLAYED_MILESTONE_PROMO_SAVED_BYTES,
+                ChromePreferenceKeys.DATA_REDUCTION_ENABLED,
+                ChromePreferenceKeys.DATA_REDUCTION_FIRST_ENABLED_TIME,
+                ChromePreferenceKeys.DATA_REDUCTION_FRE_PROMO_OPT_OUT,
+                ChromePreferenceKeys.DATA_REDUCTION_SITE_BREAKDOWN_ALLOWED_DATE,
+                ChromePreferenceKeys.DOWNLOAD_AUTO_RESUMPTION_ATTEMPT_LEFT,
+                ChromePreferenceKeys.DOWNLOAD_FOREGROUND_SERVICE_OBSERVERS,
+                ChromePreferenceKeys.DOWNLOAD_IS_DOWNLOAD_HOME_ENABLED,
+                ChromePreferenceKeys.DOWNLOAD_NEXT_DOWNLOAD_NOTIFICATION_ID,
+                ChromePreferenceKeys.DOWNLOAD_PENDING_DOWNLOAD_NOTIFICATIONS,
+                ChromePreferenceKeys.DOWNLOAD_PENDING_OMA_DOWNLOADS,
+                ChromePreferenceKeys.DOWNLOAD_UMA_ENTRY,
+                ChromePreferenceKeys.FIRST_RUN_CACHED_TOS_ACCEPTED,
+                ChromePreferenceKeys.FIRST_RUN_FLOW_COMPLETE,
+                ChromePreferenceKeys.FIRST_RUN_FLOW_SIGNIN_ACCOUNT_NAME,
+                ChromePreferenceKeys.FIRST_RUN_FLOW_SIGNIN_COMPLETE,
+                ChromePreferenceKeys.FIRST_RUN_FLOW_SIGNIN_SETUP,
+                ChromePreferenceKeys.FIRST_RUN_LIGHTWEIGHT_FLOW_COMPLETE,
+                ChromePreferenceKeys.FIRST_RUN_SKIP_WELCOME_PAGE,
+                ChromePreferenceKeys.FLAGS_CACHED_ADAPTIVE_TOOLBAR_ENABLED,
+                ChromePreferenceKeys.FLAGS_CACHED_BOTTOM_TOOLBAR_ENABLED,
+                ChromePreferenceKeys.FLAGS_CACHED_COMMAND_LINE_ON_NON_ROOTED_ENABLED,
+                ChromePreferenceKeys.FLAGS_CACHED_DOWNLOAD_AUTO_RESUMPTION_IN_NATIVE,
+                ChromePreferenceKeys.FLAGS_CACHED_GRID_TAB_SWITCHER_ENABLED,
+                ChromePreferenceKeys.FLAGS_CACHED_IMMERSIVE_UI_MODE_ENABLED,
+                ChromePreferenceKeys.FLAGS_CACHED_INTEREST_FEED_CONTENT_SUGGESTIONS,
+                ChromePreferenceKeys.FLAGS_CACHED_LABELED_BOTTOM_TOOLBAR_ENABLED,
+                ChromePreferenceKeys.FLAGS_CACHED_NETWORK_SERVICE_WARM_UP_ENABLED,
+                ChromePreferenceKeys.FLAGS_CACHED_PRIORITIZE_BOOTSTRAP_TASKS,
+                ChromePreferenceKeys.FLAGS_CACHED_SERVICE_MANAGER_FOR_BACKGROUND_PREFETCH,
+                ChromePreferenceKeys.FLAGS_CACHED_SERVICE_MANAGER_FOR_DOWNLOAD_RESUMPTION,
+                ChromePreferenceKeys.FLAGS_CACHED_START_SURFACE_ENABLED,
+                ChromePreferenceKeys.FLAGS_CACHED_SWAP_PIXEL_FORMAT_TO_FIX_CONVERT_FROM_TRANSLUCENT,
+                ChromePreferenceKeys.FLAGS_CACHED_TAB_GROUPS_ANDROID_ENABLED,
+                ChromePreferenceKeys.FONT_USER_FONT_SCALE_FACTOR,
+                ChromePreferenceKeys.FONT_USER_SET_FORCE_ENABLE_ZOOM,
+                ChromePreferenceKeys.HISTORY_SHOW_HISTORY_INFO,
+                ChromePreferenceKeys.HOMEPAGE_CUSTOM_URI,
+                ChromePreferenceKeys.HOMEPAGE_ENABLED,
+                ChromePreferenceKeys.HOMEPAGE_USE_DEFAULT_URI,
+                ChromePreferenceKeys.INCOGNITO_SHORTCUT_ADDED,
+                ChromePreferenceKeys.INVALIDATIONS_UUID_PREF_KEY,
+                ChromePreferenceKeys.LATEST_UNSUPPORTED_VERSION,
+                ChromePreferenceKeys.LOCALE_MANAGER_AUTO_SWITCH,
+                ChromePreferenceKeys.LOCALE_MANAGER_PROMO_SHOWN,
+                ChromePreferenceKeys.LOCALE_MANAGER_SEARCH_ENGINE_PROMO_SHOW_STATE,
+                ChromePreferenceKeys.LOCALE_MANAGER_WAS_IN_SPECIAL_LOCALE,
+                ChromePreferenceKeys.MEDIA_WEBRTC_NOTIFICATION_IDS,
+                ChromePreferenceKeys.METRICS_MAIN_INTENT_LAUNCH_COUNT,
+                ChromePreferenceKeys.METRICS_MAIN_INTENT_LAUNCH_TIMESTAMP,
+                ChromePreferenceKeys.NOTIFICATIONS_CHANNELS_VERSION,
+                ChromePreferenceKeys.NOTIFICATIONS_LAST_SHOWN_NOTIFICATION_TYPE,
+                ChromePreferenceKeys.NOTIFICATIONS_NEXT_TRIGGER,
+                ChromePreferenceKeys.NTP_SNIPPETS_IS_SCHEDULED,
+                ChromePreferenceKeys.OFFLINE_AUTO_FETCH_SHOWING_IN_PROGRESS,
+                ChromePreferenceKeys.OFFLINE_AUTO_FETCH_USER_CANCEL_ACTION_IN_PROGRESS,
+                ChromePreferenceKeys.OFFLINE_INDICATOR_V2_ENABLED,
+                ChromePreferenceKeys.PAYMENTS_PAYMENT_COMPLETE_ONCE,
+                ChromePreferenceKeys.PREFETCH_HAS_NEW_PAGES,
+                ChromePreferenceKeys.PREFETCH_IGNORED_NOTIFICATION_COUNTER,
+                ChromePreferenceKeys.PREFETCH_NOTIFICATION_ENABLED,
+                ChromePreferenceKeys.PREFETCH_NOTIFICATION_TIME,
+                ChromePreferenceKeys.PREFETCH_OFFLINE_COUNTER,
+                ChromePreferenceKeys.PRIVACY_ALLOW_PRERENDER_OLD,
+                ChromePreferenceKeys.PRIVACY_BANDWIDTH_NO_CELLULAR_OLD,
+                ChromePreferenceKeys.PRIVACY_BANDWIDTH_OLD,
+                ChromePreferenceKeys.PRIVACY_METRICS_IN_SAMPLE,
+                ChromePreferenceKeys.PRIVACY_METRICS_REPORTING,
+                ChromePreferenceKeys.PRIVACY_NETWORK_PREDICTIONS,
+                ChromePreferenceKeys.PROFILES_BOOT_TIMESTAMP,
+                ChromePreferenceKeys.PROMOS_SKIPPED_ON_FIRST_START,
+                ChromePreferenceKeys.REACHED_CODE_PROFILER_GROUP,
+                ChromePreferenceKeys.RLZ_NOTIFIED,
+                ChromePreferenceKeys.SEARCH_ENGINE_CHOICE_DEFAULT_TYPE_BEFORE,
+                ChromePreferenceKeys.SEARCH_ENGINE_CHOICE_PRESENTED_VERSION,
+                ChromePreferenceKeys.SEARCH_ENGINE_CHOICE_REQUESTED_TIMESTAMP,
+                ChromePreferenceKeys.SEND_TAB_TO_SELF_ACTIVE_NOTIFICATIONS,
+                ChromePreferenceKeys.SEND_TAB_TO_SELF_NEXT_NOTIFICATION_ID,
+                ChromePreferenceKeys.SETTINGS_DEVELOPER_ENABLED,
+                ChromePreferenceKeys.SETTINGS_DEVELOPER_TRACING_CATEGORIES,
+                ChromePreferenceKeys.SETTINGS_DEVELOPER_TRACING_MODE,
+                ChromePreferenceKeys.SETTINGS_PRIVACY_OTHER_FORMS_OF_HISTORY_DIALOG_SHOWN,
+                ChromePreferenceKeys.SETTINGS_SYNC_SIGN_OUT_ALLOWED,
+                ChromePreferenceKeys.SETTINGS_WEBSITE_FAILED_BUILD_VERSION,
+                ChromePreferenceKeys.SHARING_LAST_SHARED_CLASS_NAME,
+                ChromePreferenceKeys.SHARING_LAST_SHARED_PACKAGE_NAME,
+                ChromePreferenceKeys.SIGNIN_ACCOUNTS_CHANGED,
+                ChromePreferenceKeys.SIGNIN_ACCOUNT_RENAMED,
+                ChromePreferenceKeys.SIGNIN_ACCOUNT_RENAME_EVENT_INDEX,
+                ChromePreferenceKeys.SIGNIN_AND_SYNC_PROMO_SHOW_COUNT,
+                ChromePreferenceKeys.SIGNIN_PROMO_IMPRESSIONS_COUNT_BOOKMARKS,
+                ChromePreferenceKeys.SIGNIN_PROMO_IMPRESSIONS_COUNT_SETTINGS,
+                ChromePreferenceKeys.SIGNIN_PROMO_LAST_SHOWN_ACCOUNT_NAMES,
+                ChromePreferenceKeys.SIGNIN_PROMO_LAST_SHOWN_MAJOR_VERSION,
+                ChromePreferenceKeys.SIGNIN_PROMO_NTP_PROMO_DISMISSED,
+                ChromePreferenceKeys.SIGNIN_PROMO_NTP_PROMO_SUPPRESSION_PERIOD_START,
+                ChromePreferenceKeys.SIGNIN_PROMO_PERSONALIZED_DECLINED,
+                ChromePreferenceKeys.SIGNIN_PROMO_SETTINGS_PERSONALIZED_DISMISSED,
+                ChromePreferenceKeys.SNAPSHOT_DATABASE_REMOVED,
+                ChromePreferenceKeys.START_SURFACE_SINGLE_PANE_ENABLED_KEY,
+                ChromePreferenceKeys.SURVEY_DATE_LAST_ROLLED,
+                ChromePreferenceKeys.SURVEY_INFO_BAR_DISPLAYED,
+                ChromePreferenceKeys.SYNC_SESSIONS_UUID,
+                ChromePreferenceKeys.TABBED_ACTIVITY_LAST_BACKGROUNDED_TIME_MS_PREF,
+                ChromePreferenceKeys.TABMODEL_ACTIVE_TAB_ID,
+                ChromePreferenceKeys.TABMODEL_HAS_COMPUTED_MAX_ID,
+                ChromePreferenceKeys.TABMODEL_HAS_RUN_FILE_MIGRATION,
+                ChromePreferenceKeys.TABMODEL_HAS_RUN_MULTI_INSTANCE_FILE_MIGRATION,
+                ChromePreferenceKeys.TAB_ID_MANAGER_NEXT_ID,
+                ChromePreferenceKeys.TOS_ACKED_ACCOUNTS,
+                ChromePreferenceKeys.TWA_DIALOG_NUMBER_OF_DISMISSALS_ON_CLEAR_DATA,
+                ChromePreferenceKeys.TWA_DIALOG_NUMBER_OF_DISMISSALS_ON_UNINSTALL,
+                ChromePreferenceKeys.TWA_DISCLOSURE_ACCEPTED_PACKAGES,
+                ChromePreferenceKeys.UI_THEME_DARKEN_WEBSITES_ENABLED,
+                ChromePreferenceKeys.UI_THEME_SETTING,
+                ChromePreferenceKeys.VARIATION_CACHED_BOTTOM_TOOLBAR,
+                ChromePreferenceKeys.VERIFIED_DIGITAL_ASSET_LINKS,
+                ChromePreferenceKeys.VR_EXIT_TO_2D_COUNT,
+                ChromePreferenceKeys.VR_FEEDBACK_OPT_OUT,
+                ChromePreferenceKeys.VR_SHOULD_REGISTER_ASSETS_COMPONENT_ON_STARTUP,
+                ChromePreferenceKeys.WEBAPK_EXTRACTED_DEX_VERSION,
+                ChromePreferenceKeys.WEBAPK_LAST_SDK_VERSION,
+                ChromePreferenceKeys.WEBAPK_UNINSTALLED_PACKAGES
+        );
+        // clang-format on
+    }
+
+    static List<KeyPrefix> getPrefixesInUse() {
+        // clang-format off
+        return Arrays.asList(
+                ChromePreferenceKeys.CONTEXTUAL_SEARCH_CLICKS_WEEK_PREFIX,
+                ChromePreferenceKeys.CONTEXTUAL_SEARCH_IMPRESSIONS_WEEK_PREFIX,
+                ChromePreferenceKeys.CUSTOM_TABS_DEX_LAST_UPDATE_TIME_PREF_PREFIX,
+                ChromePreferenceKeys.PAYMENTS_PAYMENT_INSTRUMENT_USE_COUNT,
+                ChromePreferenceKeys.PAYMENTS_PAYMENT_INSTRUMENT_USE_DATE
+        );
+        // clang-format on
+    }
+}
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/OWNERS b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/OWNERS
new file mode 100644
index 0000000..2686a87
--- /dev/null
+++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/OWNERS
@@ -0,0 +1,5 @@
+# For simple additions and deprecations.
+per-file ChromePreferenceKeys.java=*
+per-file DeprecatedChromePreferenceKeys.java=*
+
+# COMPONENT: Internals>Preferences
diff --git a/chrome/browser/prerender/prerender_contents.cc b/chrome/browser/prerender/prerender_contents.cc
index 7dd33e9..7df1e86 100644
--- a/chrome/browser/prerender/prerender_contents.cc
+++ b/chrome/browser/prerender/prerender_contents.cc
@@ -10,6 +10,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/stl_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/post_task.h"
diff --git a/chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc b/chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc
index eeb7158..95cbc94 100644
--- a/chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc
+++ b/chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/command_line.h"
 #include "base/memory/ref_counted.h"
 #include "base/metrics/statistics_recorder.h"
diff --git a/chrome/browser/previews/previews_offline_helper_unittest.cc b/chrome/browser/previews/previews_offline_helper_unittest.cc
index d3896b4..0f56c29 100644
--- a/chrome/browser/previews/previews_offline_helper_unittest.cc
+++ b/chrome/browser/previews/previews_offline_helper_unittest.cc
@@ -8,6 +8,7 @@
 #include <string>
 #include <vector>
 
+#include "base/bind_helpers.h"
 #include "base/metrics/field_trial.h"
 #include "base/metrics/field_trial_params.h"
 #include "base/strings/stringprintf.h"
diff --git a/chrome/browser/printing/cloud_print/test/cloud_print_proxy_process_browsertest.cc b/chrome/browser/printing/cloud_print/test/cloud_print_proxy_process_browsertest.cc
index 5003548..d7612ab 100644
--- a/chrome/browser/printing/cloud_print/test/cloud_print_proxy_process_browsertest.cc
+++ b/chrome/browser/printing/cloud_print/test/cloud_print_proxy_process_browsertest.cc
@@ -15,6 +15,7 @@
 #include "base/bind_helpers.h"
 #include "base/command_line.h"
 #include "base/files/scoped_temp_dir.h"
+#include "base/memory/ptr_util.h"
 #include "base/message_loop/message_pump.h"
 #include "base/message_loop/message_pump_type.h"
 #include "base/process/kill.h"
diff --git a/chrome/browser/profile_card/android/DEPS b/chrome/browser/profile_card/android/DEPS
index 0d019e1..5159172 100644
--- a/chrome/browser/profile_card/android/DEPS
+++ b/chrome/browser/profile_card/android/DEPS
@@ -1,3 +1,4 @@
 include_rules = [
   "+content/public/android/java",
+  "+components/browser_ui/widget/android/java",
 ]
diff --git a/chrome/browser/profile_card/android/internal/BUILD.gn b/chrome/browser/profile_card/android/internal/BUILD.gn
index 00362d0f..1bade25 100644
--- a/chrome/browser/profile_card/android/internal/BUILD.gn
+++ b/chrome/browser/profile_card/android/internal/BUILD.gn
@@ -20,6 +20,7 @@
     ":java_resources",
     "//base:base_java",
     "//chrome/browser/profile_card/android:java",
+    "//components/browser_ui/widget/android:java",
     "//ui/android:ui_full_java",
   ]
 }
diff --git a/chrome/browser/profile_card/android/internal/java/src/org/chromium/chrome/browser/profile_card/ProfileCardCoordinatorImpl.java b/chrome/browser/profile_card/android/internal/java/src/org/chromium/chrome/browser/profile_card/ProfileCardCoordinatorImpl.java
index 4ac2a95..66653d0 100644
--- a/chrome/browser/profile_card/android/internal/java/src/org/chromium/chrome/browser/profile_card/ProfileCardCoordinatorImpl.java
+++ b/chrome/browser/profile_card/android/internal/java/src/org/chromium/chrome/browser/profile_card/ProfileCardCoordinatorImpl.java
@@ -24,7 +24,8 @@
     @Override
     public void init(View anchorView, CreatorMetadata creatorMetadata) {
         ViewRectProvider rectProvider = new ViewRectProvider(anchorView);
-        mView = new ProfileCardView(anchorView.getContext());
+        mView = new ProfileCardView(anchorView.getContext(), anchorView, /*stringId=*/"",
+                /*accessibilityStringId=*/"", rectProvider);
         mCreatorMetadata = creatorMetadata;
         mModel = new PropertyModel(ProfileCardProperties.ALL_KEYS);
         mModelChangeProcessor =
diff --git a/chrome/browser/profile_card/android/internal/java/src/org/chromium/chrome/browser/profile_card/ProfileCardView.java b/chrome/browser/profile_card/android/internal/java/src/org/chromium/chrome/browser/profile_card/ProfileCardView.java
index 76b3a1ae..6279d09 100644
--- a/chrome/browser/profile_card/android/internal/java/src/org/chromium/chrome/browser/profile_card/ProfileCardView.java
+++ b/chrome/browser/profile_card/android/internal/java/src/org/chromium/chrome/browser/profile_card/ProfileCardView.java
@@ -14,13 +14,15 @@
 import android.widget.TextView;
 
 import org.chromium.chrome.browser.profile_card.internal.R;
+import org.chromium.components.browser_ui.widget.textbubble.TextBubble;
+import org.chromium.ui.widget.RectProvider;
 
 import java.util.ArrayList;
 
 /**
  * UI component that handles showing a profile card view.
  */
-public class ProfileCardView extends LinearLayout {
+public class ProfileCardView extends TextBubble {
     private View mMainContentView;
     private TextView mTitleTextView;
     private TextView mDescriptionTextView;
@@ -28,20 +30,31 @@
     private TextView mPostFrequencyTextView;
     private LinearLayout mPostsContainer;
 
-    public ProfileCardView(Context context) {
-        super(context);
+    /**
+     * Constructs a {@link ProfileCardView} instance.
+     * @param context  Context to draw resources from.
+     * @param rootView The {@link View} to use for size calculations and for display.
+     * @param stringId The id of the string resource for the text that should be shown.
+     * @param accessibilityStringId The id of the string resource of the accessibility text.
+     * @param anchorRectProvider The {@link RectProvider} used to anchor the text bubble.
+     */
+    public ProfileCardView(Context context, View rootView, String stringId,
+            String accessibilityStringId, RectProvider anchorRectProvider) {
+        super(context, rootView, stringId, accessibilityStringId, /*showArrow=*/true,
+                anchorRectProvider, /*isAccessibilityEnabled=*/true);
+        setDismissOnTouchInteraction(true);
     }
 
     @Override
-    protected void onFinishInflate() {
-        super.onFinishInflate();
+    protected View createContentView() {
         mMainContentView =
-                LayoutInflater.from(getContext()).inflate(R.layout.profile_card, /*root=*/null);
+                LayoutInflater.from(mContext).inflate(R.layout.profile_card, /*root=*/null);
         mTitleTextView = mMainContentView.findViewById(R.id.title);
         mDescriptionTextView = mMainContentView.findViewById(R.id.description);
         mDescriptionTextView.setMovementMethod(new ScrollingMovementMethod());
         mPostFrequencyTextView = mMainContentView.findViewById(R.id.post_freq);
         mPostsContainer = mMainContentView.findViewById(R.id.posts_container);
+        return mMainContentView;
     }
 
     void setAvatarBitmap(Bitmap avatarBitmap) {
@@ -72,9 +85,9 @@
 
     void setVisibility(boolean visible) {
         if (visible) {
-            mMainContentView.setVisibility(View.VISIBLE);
+            show();
         } else {
-            mMainContentView.setVisibility(View.GONE);
+            dismiss();
         }
     }
 
@@ -82,7 +95,7 @@
         if (postsDataList == null) return;
 
         for (ContentPreviewPostData postData : postsDataList) {
-            ContentPreviewPostView postView = new ContentPreviewPostView(getContext());
+            ContentPreviewPostView postView = new ContentPreviewPostView(mContext);
             if (postData.getImageBitmap() != null) {
                 postView.setImageBitmap(postData.getImageBitmap());
             }
diff --git a/chrome/browser/profiles/independent_otr_profile_manager.cc b/chrome/browser/profiles/independent_otr_profile_manager.cc
index 80773fa..9cfc8a5e 100644
--- a/chrome/browser/profiles/independent_otr_profile_manager.cc
+++ b/chrome/browser/profiles/independent_otr_profile_manager.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/stl_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/chrome_notification_types.h"
diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc
index 2e1162a..88153cb 100644
--- a/chrome/browser/profiles/profile_impl.cc
+++ b/chrome/browser/profiles/profile_impl.cc
@@ -13,6 +13,7 @@
 
 #include "base/barrier_closure.h"
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/command_line.h"
 #include "base/compiler_specific.h"
@@ -22,6 +23,7 @@
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/memory/weak_ptr.h"
 #include "base/no_destructor.h"
 #include "base/path_service.h"
diff --git a/chrome/browser/renderer_context_menu/context_menu_content_type_factory.cc b/chrome/browser/renderer_context_menu/context_menu_content_type_factory.cc
index d984364..3f3370c 100644
--- a/chrome/browser/renderer_context_menu/context_menu_content_type_factory.cc
+++ b/chrome/browser/renderer_context_menu/context_menu_content_type_factory.cc
@@ -7,6 +7,7 @@
 #include <memory>
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "chrome/common/url_constants.h"
 #include "components/renderer_context_menu/context_menu_content_type.h"
 #include "content/public/browser/web_contents.h"
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_data_store_unittest.cc b/chrome/browser/resource_coordinator/local_site_characteristics_data_store_unittest.cc
index 6ce110f..da1af9c 100644
--- a/chrome/browser/resource_coordinator/local_site_characteristics_data_store_unittest.cc
+++ b/chrome/browser/resource_coordinator/local_site_characteristics_data_store_unittest.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/resource_coordinator/local_site_characteristics_data_store.h"
 
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/simple_test_tick_clock.h"
 #include "chrome/browser/resource_coordinator/local_site_characteristics_data_impl.h"
diff --git a/chrome/browser/resource_coordinator/tab_manager.h b/chrome/browser/resource_coordinator/tab_manager.h
index 073c63f9..3c046f0 100644
--- a/chrome/browser/resource_coordinator/tab_manager.h
+++ b/chrome/browser/resource_coordinator/tab_manager.h
@@ -10,6 +10,8 @@
 #include <memory>
 #include <vector>
 
+#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
 #include "base/compiler_specific.h"
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
diff --git a/chrome/browser/resource_coordinator/tab_manager_delegate_chromeos_unittest.cc b/chrome/browser/resource_coordinator/tab_manager_delegate_chromeos_unittest.cc
index 4ff5ec0..dc1c2d2 100644
--- a/chrome/browser/resource_coordinator/tab_manager_delegate_chromeos_unittest.cc
+++ b/chrome/browser/resource_coordinator/tab_manager_delegate_chromeos_unittest.cc
@@ -9,6 +9,7 @@
 #include <utility>
 #include <vector>
 
+#include "base/bind_helpers.h"
 #include "base/macros.h"
 #include "base/process/process_handle.h"
 #include "base/test/scoped_feature_list.h"
diff --git a/chrome/browser/resource_coordinator/tab_metrics_logger_unittest.cc b/chrome/browser/resource_coordinator/tab_metrics_logger_unittest.cc
index 95f5b7f..156d26f 100644
--- a/chrome/browser/resource_coordinator/tab_metrics_logger_unittest.cc
+++ b/chrome/browser/resource_coordinator/tab_metrics_logger_unittest.cc
@@ -9,6 +9,7 @@
 
 #include "base/containers/flat_map.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/test/task_environment.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/engagement/site_engagement_service.h"
diff --git a/chrome/browser/resources/chromeos/login/security_token_pin.css b/chrome/browser/resources/chromeos/login/security_token_pin.css
index 0c4ca7ba..fd9252e 100644
--- a/chrome/browser/resources/chromeos/login/security_token_pin.css
+++ b/chrome/browser/resources/chromeos/login/security_token_pin.css
@@ -11,7 +11,7 @@
   --pin-keyboard-pin-input-style: {
     width: 192px;
   };
-  --pin-keyboard-input-letter-spacing: 14px;
+  --pin-keyboard-input-letter-spacing: 13px;
   --pin-keyboard-number-color: var(--google-grey-900);
   --cr-icon-button-margin-start: 5px;
 }
@@ -19,7 +19,7 @@
 #errorContainer {
   color: var(--google-red-600);
   font-size: 12px;
-  padding: 1px 0 3px;
+  padding: 4px 0 0;
   text-align: center;
   width: 100%;
 }
diff --git a/chrome/browser/resources/chromeos/login/security_token_pin_browsertest.js b/chrome/browser/resources/chromeos/login/security_token_pin_browsertest.js
new file mode 100644
index 0000000..05eddba
--- /dev/null
+++ b/chrome/browser/resources/chromeos/login/security_token_pin_browsertest.js
@@ -0,0 +1,59 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview Tests for the <security-token-pin> Polymer element.
+ */
+
+GEN_INCLUDE([
+  '//chrome/test/data/webui/polymer_browser_test_base.js',
+]);
+
+var PolymerSecurityTokenPinTest = class extends PolymerTest {
+  /** @override */
+  get browsePreload() {
+    return 'chrome://oobe/login';
+  }
+};
+
+TEST_F('PolymerSecurityTokenPinTest', 'All', function() {
+  const DEFAULT_PARAMETERS = {
+    codeType: OobeTypes.SecurityTokenPinDialogType.PIN,
+    enableUserInput: true,
+    errorLabel: OobeTypes.SecurityTokenPinDialogErrorType.NONE,
+    attemptsLeft: -1
+  };
+
+  let securityTokenPin;
+  let inputField;
+
+  setup(() => {
+    securityTokenPin = document.createElement('security-token-pin');
+    document.body.appendChild(securityTokenPin);
+    securityTokenPin.parameters = DEFAULT_PARAMETERS;
+
+    inputField =
+        securityTokenPin.$$('#pinKeyboard').$$('#pinInput').$$('input');
+    assert(inputField);
+  });
+
+  // Test that no scrolling is necessary in order to see all dots after entering
+  // a PIN of a typical length.
+  test('8-digit PIN fits into input', () => {
+    const PIN_LENGTH = 8;
+    inputField.value = '0'.repeat(PIN_LENGTH);
+    expectGT(inputField.scrollWidth, 0);
+    expectLE(inputField.scrollWidth, inputField.clientWidth);
+  });
+
+  // Test that the distance between characters (dots) is set in a correct way
+  // and doesn't fall back to the default value.
+  test('PIN input letter-spacing is correctly set up', () => {
+    expectNotEquals(
+        getComputedStyle(inputField).getPropertyValue('letter-spacing'),
+        'normal');
+  });
+
+  mocha.run();
+});
diff --git a/chrome/browser/resources/omnibox/.eslintrc.js b/chrome/browser/resources/omnibox/.eslintrc.js
new file mode 100644
index 0000000..18f6e95
--- /dev/null
+++ b/chrome/browser/resources/omnibox/.eslintrc.js
@@ -0,0 +1,11 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module.exports = {
+  'env': {
+    'browser': true,
+    'es6': true,
+  },
+  'rules': {'eqeqeq': ['error', 'always', {'null': 'ignore'}]},
+};
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.html b/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.html
index f24beaf..972402b 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.html
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.html
@@ -247,7 +247,9 @@
         on-settings-boolean-control-change=
             "updateShelfNavigationButtonsEnabledPref_"
         label="$i18n{tabletModeShelfNavigationButtonsSettingLabel}"
-        sub-label="$i18n{tabletModeShelfNavigationButtonsSettingDescription}">
+        sub-label="$i18n{tabletModeShelfNavigationButtonsSettingDescription}"
+        learn-more-url="$i18n{tabletModeShelfNavigationButtonsLearnMoreUrl}"
+        on-learn-more-clicked="onShelfNavigationButtonsLearnMoreClicked_">
     </settings-toggle-button>
 
     <h2>$i18n{audioAndCaptionsHeading}</h2>
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js
index c323a03..c6d8591 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js
@@ -342,6 +342,12 @@
         'settings.a11y.tablet_mode_shelf_nav_buttons_enabled', this.prefs));
   },
 
+  /** @private */
+  onShelfNavigationButtonsLearnMoreClicked_() {
+    chrome.metricsPrivate.recordUserAction(
+        'Settings_A11y_ShelfNavigationButtonsLearnMoreClicked');
+  },
+
   /**
    * Handles the <code>tablet_mode_shelf_nav_buttons_enabled</code> setting's
    * toggle changes. It updates the backing pref value, unless the setting is
diff --git a/chrome/browser/resources/settings/controls/settings_toggle_button.html b/chrome/browser/resources/settings/controls/settings_toggle_button.html
index 2e98ecc0..3ead3be 100644
--- a/chrome/browser/resources/settings/controls/settings_toggle_button.html
+++ b/chrome/browser/resources/settings/controls/settings_toggle_button.html
@@ -56,9 +56,17 @@
     <div id="outerRow" noSubLabel$="[[!subLabel]]">
       <div class="flex" id="labelWrapper" hidden$="[[!label]]">
         <div class="label" aria-hidden="true">[[label]]</div>
-        <div class="secondary label" id="sub-label"
-            aria-hidden="true">
-          [[subLabel]]
+        <div class="secondary label" id="sub-label">
+          <span id="sub-label-text" aria-hidden="true">
+            [[subLabel]]
+          </span>
+          <template is="dom-if" if="[[learnMoreUrl]]">
+            <a id="learn-more" href="[[learnMoreUrl]]" target="_blank"
+                aria-labeledby="sub-label-text learn-more"
+                on-click="onLearnMoreClicked_">
+              $i18n{learnMore}
+            </a>
+          </template>
         </div>
       </div>
       <slot name="more-actions"></slot>
@@ -69,7 +77,7 @@
       <cr-toggle id="control" checked="{{checked}}"
           on-change="onChange_"
           aria-label$="[[getAriaLabel_(label, ariaLabel)]]"
-          aria-describedby="sub-label"
+          aria-describedby="sub-label-text"
           disabled="[[controlDisabled(disabled, pref)]]">
       </cr-toggle>
     </div>
diff --git a/chrome/browser/resources/settings/controls/settings_toggle_button.js b/chrome/browser/resources/settings/controls/settings_toggle_button.js
index 13ea337..8b18bb5 100644
--- a/chrome/browser/resources/settings/controls/settings_toggle_button.js
+++ b/chrome/browser/resources/settings/controls/settings_toggle_button.js
@@ -23,6 +23,11 @@
       type: Boolean,
       reflectToAttribute: true,
     },
+
+    learnMoreUrl: {
+      type: String,
+      reflectToAttribute: true,
+    },
   },
 
   listeners: {
@@ -88,6 +93,14 @@
    * @param {!CustomEvent<boolean>} e
    * @private
    */
+  onLearnMoreClicked_(e) {
+    this.fire('learn-more-clicked');
+  },
+
+  /**
+   * @param {!CustomEvent<boolean>} e
+   * @private
+   */
   onChange_(e) {
     this.checked = e.detail;
     this.notifyChangedByUserInteraction();
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page.js b/chrome/browser/resources/settings/privacy_page/privacy_page.js
index 7dde1d2..764cee60 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_page.js
+++ b/chrome/browser/resources/settings/privacy_page/privacy_page.js
@@ -446,7 +446,7 @@
 
     /** @private */
     onDoNotTrackDialogClosed_() {
-      cr.ui.focusWithoutInk(this.$.doNotTrack);
+      cr.ui.focusWithoutInk(assert(this.$$('#doNotTrack')));
     },
 
     /**
@@ -454,7 +454,7 @@
      * @private
      */
     onDoNotTrackDialogConfirm_() {
-      /** @type {!SettingsToggleButtonElement} */ (this.$.doNotTrack)
+      /** @type {!SettingsToggleButtonElement} */ (this.$$('#doNotTrack'))
           .sendPrefChange();
       this.closeDoNotTrackDialog_();
     },
@@ -465,7 +465,7 @@
      * @private
      */
     onDoNotTrackDialogCancel_() {
-      /** @type {!SettingsToggleButtonElement} */ (this.$.doNotTrack)
+      /** @type {!SettingsToggleButtonElement} */ (this.$$('#doNotTrack'))
           .resetToPrefValue();
       this.closeDoNotTrackDialog_();
     },
@@ -543,7 +543,7 @@
     onDialogClosed_() {
       settings.Router.getInstance().navigateTo(
           settings.routes.CLEAR_BROWSER_DATA.parent);
-      cr.ui.focusWithoutInk(assert(this.$.clearBrowsingData));
+      cr.ui.focusWithoutInk(assert(this.$$('#clearBrowsingData')));
     },
 
     /** @private */
diff --git a/chrome/browser/resources/tab_strip/.eslintrc.js b/chrome/browser/resources/tab_strip/.eslintrc.js
new file mode 100644
index 0000000..18f6e95
--- /dev/null
+++ b/chrome/browser/resources/tab_strip/.eslintrc.js
@@ -0,0 +1,11 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module.exports = {
+  'env': {
+    'browser': true,
+    'es6': true,
+  },
+  'rules': {'eqeqeq': ['error', 'always', {'null': 'ignore'}]},
+};
diff --git a/chrome/browser/safe_browsing/ad_redirect_trigger_browsertest.cc b/chrome/browser/safe_browsing/ad_redirect_trigger_browsertest.cc
index 1bad51c..2f7907b 100644
--- a/chrome/browser/safe_browsing/ad_redirect_trigger_browsertest.cc
+++ b/chrome/browser/safe_browsing/ad_redirect_trigger_browsertest.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/memory/ref_counted.h"
 #include "base/strings/strcat.h"
 #include "base/strings/utf_string_conversions.h"
diff --git a/chrome/browser/safe_browsing/chrome_cleaner/mock_chrome_cleaner_process_win.cc b/chrome/browser/safe_browsing/chrome_cleaner/mock_chrome_cleaner_process_win.cc
index 01106e7..8d071efc 100644
--- a/chrome/browser/safe_browsing/chrome_cleaner/mock_chrome_cleaner_process_win.cc
+++ b/chrome/browser/safe_browsing/chrome_cleaner/mock_chrome_cleaner_process_win.cc
@@ -14,6 +14,7 @@
 
 #include "base/bind.h"
 #include "base/callback.h"
+#include "base/callback_helpers.h"
 #include "base/command_line.h"
 #include "base/logging.h"
 #include "base/memory/scoped_refptr.h"
diff --git a/chrome/browser/safe_browsing/client_side_detection_host.cc b/chrome/browser/safe_browsing/client_side_detection_host.cc
index 836074d..a302f90 100644
--- a/chrome/browser/safe_browsing/client_side_detection_host.cc
+++ b/chrome/browser/safe_browsing/client_side_detection_host.cc
@@ -11,6 +11,7 @@
 #include "base/bind.h"
 #include "base/logging.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service_unittest.cc b/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service_unittest.cc
index 81c37a1..29512bb7 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service_unittest.cc
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service_unittest.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/callback_forward.h"
 #include "base/time/time.h"
 #include "chrome/browser/safe_browsing/advanced_protection_status_manager.h"
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.cc b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.cc
index 74bcbc4..0144b384 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.cc
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.h"
+#include "base/bind_helpers.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/fake_deep_scanning_dialog_delegate.h"
 #include "chrome/browser/safe_browsing/dm_token_utils.h"
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.cc b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.cc
index 97db02c..90778d9 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.cc
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.cc
@@ -29,6 +29,7 @@
 #include "chrome/browser/file_util_service.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.h"
 #include "chrome/browser/safe_browsing/dm_token_utils.h"
 #include "chrome/browser/safe_browsing/download_protection/check_client_download_request.h"
 #include "chrome/grit/generated_resources.h"
@@ -166,13 +167,28 @@
 
   for (int i = 0; i < verdict.triggered_rules_size(); ++i) {
     if (verdict.triggered_rules(i).action() ==
-        DlpDeepScanningVerdict::TriggeredRule::BLOCK) {
+            DlpDeepScanningVerdict::TriggeredRule::BLOCK ||
+        verdict.triggered_rules(i).action() ==
+            DlpDeepScanningVerdict::TriggeredRule::WARN) {
       return false;
     }
   }
   return true;
 }
 
+bool ShouldShowWarning(const DlpDeepScanningVerdict& verdict) {
+  // Show a warning if one of the triggered rules is WARN and no other rule is
+  // BLOCK.
+  auto rules = verdict.triggered_rules();
+  bool no_block = std::all_of(rules.begin(), rules.end(), [](const auto& rule) {
+    return rule.action() != DlpDeepScanningVerdict::TriggeredRule::BLOCK;
+  });
+  bool warning = std::any_of(rules.begin(), rules.end(), [](const auto& rule) {
+    return rule.action() == DlpDeepScanningVerdict::TriggeredRule::WARN;
+  });
+  return no_block && warning;
+}
+
 std::string GetFileMimeType(base::FilePath path) {
   // TODO(crbug.com/1013252): Obtain a more accurate MimeType by parsing the
   // file content.
@@ -285,13 +301,54 @@
     DeepScanningDialogDelegate::FileContents&& other) = default;
 DeepScanningDialogDelegate::~DeepScanningDialogDelegate() = default;
 
-void DeepScanningDialogDelegate::Cancel() {
+void DeepScanningDialogDelegate::BypassWarnings() {
   if (callback_.is_null())
     return;
 
-  RecordDeepScanMetrics(access_point_,
-                        base::TimeTicks::Now() - upload_start_time_, 0,
-                        "CancelledByUser", false);
+  // Mark the full text as complying and report a warning bypass.
+  if (text_warning_) {
+    std::fill(result_.text_results.begin(), result_.text_results.end(), true);
+
+    int64_t content_size = 0;
+    for (const base::string16& entry : data_.text)
+      content_size += (entry.size() * sizeof(base::char16));
+
+    ReportSensitiveDataWarningBypass(
+        Profile::FromBrowserContext(web_contents_->GetBrowserContext()),
+        web_contents_->GetLastCommittedURL(), "Text data", std::string(),
+        "text/plain",
+        extensions::SafeBrowsingPrivateEventRouter::kTriggerWebContentUpload,
+        content_size);
+  }
+
+  // Mark every "warning" file as complying and report a warning bypass.
+  for (size_t index : file_warnings_) {
+    result_.paths_results[index] = true;
+
+    ReportSensitiveDataWarningBypass(
+        Profile::FromBrowserContext(web_contents_->GetBrowserContext()),
+        web_contents_->GetLastCommittedURL(), data_.paths[index].AsUTF8Unsafe(),
+        base::HexEncode(file_info_[index].sha256.data(),
+                        file_info_[index].sha256.size()),
+        file_info_[index].mime_type,
+        extensions::SafeBrowsingPrivateEventRouter::kTriggerFileUpload,
+        file_info_[index].size);
+  }
+
+  RunCallback();
+}
+
+void DeepScanningDialogDelegate::Cancel(bool warning) {
+  if (callback_.is_null())
+    return;
+
+  // Don't report this upload as cancelled if the user didn't bypass the
+  // warning.
+  if (!warning) {
+    RecordDeepScanMetrics(access_point_,
+                          base::TimeTicks::Now() - upload_start_time_, 0,
+                          "CancelledByUser", false);
+  }
 
   // Make sure to reject everything.
   FillAllResultsWith(false);
@@ -499,6 +556,16 @@
                        DlpTriggeredRulesOK(response.dlp_scan_verdict());
   std::fill(result_.text_results.begin(), result_.text_results.end(),
             text_complies);
+
+  if (!text_complies) {
+    if (ShouldShowWarning(response.dlp_scan_verdict())) {
+      text_warning_ = true;
+      UpdateFinalResult(DeepScanningFinalResult::WARNING);
+    } else {
+      UpdateFinalResult(DeepScanningFinalResult::FAILURE);
+    }
+  }
+
   MaybeCompleteScanRequest();
 }
 
@@ -508,6 +575,7 @@
     BinaryUploadService::Result result,
     DeepScanningClientResponse response,
     std::string mime_type) {
+  file_info_[index].mime_type = mime_type;
   MaybeReportDeepScanningVerdict(
       Profile::FromBrowserContext(web_contents_->GetBrowserContext()),
       web_contents_->GetLastCommittedURL(), path.AsUTF8Unsafe(),
@@ -528,10 +596,18 @@
 
   ++file_result_count_;
 
-  if (!file_complies && result == BinaryUploadService::Result::FILE_TOO_LARGE)
-    upload_status_ = DeepScanUploadStatus::LARGE_FILES;
-  if (!file_complies && result == BinaryUploadService::Result::FILE_ENCRYPTED)
-    upload_status_ = DeepScanUploadStatus::ENCRYPTED_FILES;
+  if (!file_complies) {
+    if (result == BinaryUploadService::Result::FILE_TOO_LARGE) {
+      UpdateFinalResult(DeepScanningFinalResult::LARGE_FILES);
+    } else if (result == BinaryUploadService::Result::FILE_ENCRYPTED) {
+      UpdateFinalResult(DeepScanningFinalResult::ENCRYPTED_FILES);
+    } else if (ShouldShowWarning(response.dlp_scan_verdict())) {
+      file_warnings_.insert(index);
+      UpdateFinalResult(DeepScanningFinalResult::WARNING);
+    } else {
+      UpdateFinalResult(DeepScanningFinalResult::FAILURE);
+    }
+  }
 
   MaybeCompleteScanRequest();
 }
@@ -694,17 +770,11 @@
     upload_service->MaybeUploadForDeepScanning(std::move(request));
 }
 
-bool DeepScanningDialogDelegate::CloseTabModalDialog() {
+bool DeepScanningDialogDelegate::UpdateDialog() {
   if (!dialog_)
     return false;
 
-  auto is_true = [](bool x) { return x; };
-  bool success = std::all_of(result_.text_results.begin(),
-                             result_.text_results.end(), is_true) &&
-                 std::all_of(result_.paths_results.begin(),
-                             result_.paths_results.end(), is_true);
-
-  dialog_->ShowResult(success, upload_status_);
+  dialog_->ShowResult(final_result_);
   return true;
 }
 
@@ -712,9 +782,12 @@
   if (!text_request_complete_ || file_result_count_ < data_.paths.size())
     return;
 
-  RunCallback();
+  // If showing the warning message, wait before running the callback. The
+  // callback will be called either in BypassWarnings or Cancel.
+  if (final_result_ != DeepScanningFinalResult::WARNING)
+    RunCallback();
 
-  if (!CloseTabModalDialog()) {
+  if (!UpdateDialog()) {
     // No UI was shown.  Delete |this| to cleanup.
     delete this;
   }
@@ -735,4 +808,10 @@
   file_info_[index].size = size;
 }
 
+void DeepScanningDialogDelegate::UpdateFinalResult(
+    DeepScanningFinalResult result) {
+  if (result < final_result_)
+    final_result_ = result;
+}
+
 }  // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.h b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.h
index 19e252c1..2c604ce8 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.h
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.h
@@ -115,6 +115,9 @@
 
     // File size in bytes. -1 represents an unknown size.
     uint64_t size = 0;
+
+    // File mime type.
+    std::string mime_type;
   };
 
   // File contents used as input for |file_info_| and the BinaryUploadService.
@@ -133,19 +136,24 @@
     std::string sha256;
   };
 
-  // Enum to identify special cases when deep scanning doesn't happen either
-  // because the file is too large or encrypted. This is used to show
-  // appropriate messages in the upload UI dialog to inform the user of why
-  // their file(s) we not scanned and blocked.
-  enum class DeepScanUploadStatus {
-    // The data was uploaded and scanned.
-    NORMAL,
+  // Enum to identify which message to show once scanning is complete. Ordered
+  // by precedence for when multiple files have conflicting results.
+  // TODO(crbug.com/1055785): Refactor this to whatever solution is chosen.
+  enum class DeepScanningFinalResult {
+    // Show that an issue was found and that the upload is blocked.
+    FAILURE = 0,
 
-    // The file(s) were not uploaded since they were too large.
-    LARGE_FILES,
+    // Show that files were not uploaded since they were too large.
+    LARGE_FILES = 1,
 
-    // The file(s) were not uploaded since they were encrypted.
-    ENCRYPTED_FILES,
+    // Show that files were not uploaded since they were encrypted.
+    ENCRYPTED_FILES = 2,
+
+    // Show that DLP checks failed, but that the user can proceed if they want.
+    WARNING = 3,
+
+    // Show that no issue was found and that the user may proceed.
+    SUCCESS = 4,
   };
 
   // Callback used with ShowForWebContents() that informs caller of verdict
@@ -169,9 +177,15 @@
       delete;
   virtual ~DeepScanningDialogDelegate();
 
+  // Called when the user decides to bypass the verdict they obtained from DLP.
+  // This will allow the upload of files marked as DLP warnings.
+  void BypassWarnings();
+
   // Called when the user decides to cancel the file upload. This will stop the
-  // upload to Chrome since the scan wasn't allowed to complete.
-  void Cancel();
+  // upload to Chrome since the scan wasn't allowed to complete. If |warning| is
+  // true, it means the user clicked Cancel after getting a warning, meaning the
+  // "CancelledByUser" metrics should not be recorded.
+  void Cancel(bool warning);
 
   // Returns true if the deep scanning feature is enabled in the upload
   // direction via enterprise policies.  If the appropriate enterprise policies
@@ -261,10 +275,10 @@
       const base::FilePath& path,
       std::unique_ptr<BinaryUploadService::Request> request);
 
-  // Closes the tab modal dialog.  Returns false if the UI was not enabled to
-  // indicate no action was taken.  Otherwise returns true.
-  // Virtual to override in tests.
-  virtual bool CloseTabModalDialog();
+  // Updates the tab modal dialog to show the scanning results. Returns false if
+  // the UI was not enabled to indicate no action was taken. Virtual to override
+  // in tests.
+  virtual bool UpdateDialog();
 
   // Calls the CompletionCallback |callback_| if all requests associated with
   // scans of |data_| are finished.  This function may delete |this| so no
@@ -288,6 +302,10 @@
                                    DeepScanningClientResponse response,
                                    std::string mime_type);
 
+  // Updates |final_result_| following the precedence established by the
+  // DeepScanningFinalResult enum.
+  void UpdateFinalResult(DeepScanningFinalResult message);
+
   // The web contents that is attempting to access the data.
   content::WebContents* web_contents_ = nullptr;
 
@@ -298,6 +316,12 @@
   Result result_;
   std::vector<FileInfo> file_info_;
 
+  // Set to true if the full text got a DLP warning verdict.
+  bool text_warning_ = false;
+
+  // Indexes of files that got DLP warning verdicts.
+  std::set<size_t> file_warnings_;
+
   // Set to true once the scan of text has completed.  If the scan request has
   // no text requiring deep scanning, this is set to true immediately.
   bool text_request_complete_ = false;
@@ -316,9 +340,8 @@
   // Access point to use to record UMA metrics.
   DeepScanAccessPoint access_point_;
 
-  // Upload status indicating if one of the files was not scanned because of
-  // policies.
-  DeepScanUploadStatus upload_status_ = DeepScanUploadStatus::NORMAL;
+  // Scanning result to be shown to the user once every request is done.
+  DeepScanningFinalResult final_result_ = DeepScanningFinalResult::SUCCESS;
 
   base::TimeTicks upload_start_time_;
 
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views.cc b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views.cc
index 508885b..427e580f 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views.cc
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views.cc
@@ -6,6 +6,7 @@
 
 #include <memory>
 
+#include "base/bind.h"
 #include "base/task/post_task.h"
 #include "cc/paint/paint_flags.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.h"
@@ -147,7 +148,7 @@
   using DeepScanningBaseView::DeepScanningBaseView;
 
   void Update() {
-    if (dialog()->is_failure())
+    if (dialog()->is_failure() || dialog()->is_warning())
       SetEnabledColor(dialog()->GetSideImageBackgroundColor());
   }
 
@@ -193,9 +194,15 @@
   return base::string16();
 }
 
-bool DeepScanningDialogViews::Cancel() {
-  delegate_->Cancel();
-  return true;
+void DeepScanningDialogViews::AcceptButtonCallback() {
+  DCHECK(delegate_);
+  DCHECK(is_warning());
+  delegate_->BypassWarnings();
+}
+
+void DeepScanningDialogViews::CancelButtonCallback() {
+  DCHECK(delegate_);
+  delegate_->Cancel(is_warning());
 }
 
 bool DeepScanningDialogViews::ShouldShowCloseButton() const {
@@ -223,18 +230,28 @@
 }
 
 void DeepScanningDialogViews::ShowResult(
-    bool success,
-    DeepScanningDialogDelegate::DeepScanUploadStatus upload_status) {
+    DeepScanningDialogDelegate::DeepScanningFinalResult result) {
   DCHECK(is_pending());
-  dialog_status_ = success ? DeepScanningDialogStatus::SUCCESS
-                           : DeepScanningDialogStatus::FAILURE;
-  upload_status_ = upload_status;
+  final_result_ = result;
+  switch (final_result_) {
+    case DeepScanningDialogDelegate::DeepScanningFinalResult::ENCRYPTED_FILES:
+    case DeepScanningDialogDelegate::DeepScanningFinalResult::LARGE_FILES:
+    case DeepScanningDialogDelegate::DeepScanningFinalResult::FAILURE:
+      dialog_status_ = DeepScanningDialogStatus::FAILURE;
+      break;
+    case DeepScanningDialogDelegate::DeepScanningFinalResult::SUCCESS:
+      dialog_status_ = DeepScanningDialogStatus::SUCCESS;
+      break;
+    case DeepScanningDialogDelegate::DeepScanningFinalResult::WARNING:
+      dialog_status_ = DeepScanningDialogStatus::WARNING;
+      break;
+  }
 
   // Do nothing if the pending dialog wasn't shown, the delayed |Show| callback
   // will show the negative result later if that's the verdict.
   if (!shown_) {
     // Cleanup if the pending dialog wasn't shown and the verdict is safe.
-    if (success)
+    if (is_success())
       delete this;
     return;
   }
@@ -296,7 +313,7 @@
   }
 
   if (observer_for_testing)
-    observer_for_testing->DialogUpdated(this, is_success());
+    observer_for_testing->DialogUpdated(this, final_result_);
 
   // Cancel the dialog as it is updated in tests in the failure dialog case.
   // This is necessary to terminate tests that end when the dialog is closed.
@@ -347,16 +364,37 @@
 
 void DeepScanningDialogViews::SetupButtons() {
   // TODO(domfc): Add "Learn more" button on scan failure.
-  if (is_pending() || is_failure()) {
-    DialogDelegate::set_buttons(ui::DIALOG_BUTTON_CANCEL);
+  if (is_warning()) {
+    // Include the Ok and Cancel buttons if there is a bypassable warning.
+    DialogDelegate::set_buttons(ui::DIALOG_BUTTON_CANCEL |
+                                ui::DIALOG_BUTTON_OK);
+    DialogDelegate::set_default_button(ui::DIALOG_BUTTON_CANCEL);
+
     DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL,
                                      GetCancelButtonText());
+    DialogDelegate::set_cancel_callback(
+        base::BindOnce(&DeepScanningDialogViews::CancelButtonCallback,
+                       weak_ptr_factory_.GetWeakPtr()));
+
+    DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK,
+                                     GetBypassWarningButtonText());
+    DialogDelegate::set_accept_callback(
+        base::BindOnce(&DeepScanningDialogViews::AcceptButtonCallback,
+                       weak_ptr_factory_.GetWeakPtr()));
+  } else if (is_failure() || is_pending()) {
+    // Include the Cancel button when the scan is pending or failing.
+    DialogDelegate::set_buttons(ui::DIALOG_BUTTON_CANCEL);
     DialogDelegate::set_default_button(ui::DIALOG_BUTTON_NONE);
+
+    DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL,
+                                     GetCancelButtonText());
+    DialogDelegate::set_cancel_callback(
+        base::BindOnce(&DeepScanningDialogViews::CancelButtonCallback,
+                       weak_ptr_factory_.GetWeakPtr()));
   } else {
+    // Include no buttons otherwise.
     DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
   }
-
-  // TODO(domfc): Add "Learn more" button setup for scan failures.
 }
 
 base::string16 DeepScanningDialogViews::GetDialogMessage() const {
@@ -371,22 +409,44 @@
     case DeepScanningDialogStatus::SUCCESS:
       text_id = IDS_DEEP_SCANNING_DIALOG_SUCCESS_MESSAGE;
       break;
+    case DeepScanningDialogStatus::WARNING:
+      text_id = GetWarningMessageId();
+      break;
   }
   return l10n_util::GetStringUTF16(text_id);
 }
 
 base::string16 DeepScanningDialogViews::GetCancelButtonText() const {
-  if (is_pending()) {
-    return l10n_util::GetStringUTF16(
-        IDS_DEEP_SCANNING_DIALOG_CANCEL_UPLOAD_BUTTON);
+  int text_id;
+  switch (dialog_status_) {
+    case DeepScanningDialogStatus::SUCCESS:
+      NOTREACHED();
+      FALLTHROUGH;
+    case DeepScanningDialogStatus::PENDING:
+      text_id = IDS_DEEP_SCANNING_DIALOG_CANCEL_UPLOAD_BUTTON;
+      break;
+    case DeepScanningDialogStatus::FAILURE:
+      text_id = IDS_CLOSE;
+      break;
+    case DeepScanningDialogStatus::WARNING:
+      text_id = IDS_DEEP_SCANNING_DIALOG_CANCEL_WARNING_BUTTON;
+      break;
   }
-  DCHECK(!is_success());
-  return l10n_util::GetStringUTF16(IDS_CLOSE);
+  return l10n_util::GetStringUTF16(text_id);
+}
+
+base::string16 DeepScanningDialogViews::GetBypassWarningButtonText() const {
+  DCHECK(is_warning());
+  return l10n_util::GetStringUTF16(IDS_DEEP_SCANNING_DIALOG_PROCEED_BUTTON);
 }
 
 void DeepScanningDialogViews::Show() {
   DCHECK(!shown_);
-  DCHECK(is_pending() || is_failure());
+
+  // The only state that cannot be shown immediately is SUCCESS, the dialog
+  // doesn't appear in that case.
+  DCHECK(!is_success());
+
   shown_ = true;
   first_shown_timestamp_ = base::TimeTicks::Now();
 
@@ -457,7 +517,7 @@
   // The side icon is created either:
   // - When the pending dialog is shown
   // - When the response was fast enough that the failure dialog is shown first
-  DCHECK(is_pending() || !is_success());
+  DCHECK(!is_success());
 
   // The icon left of the text has the appearance of a blue "Enterprise" logo
   // with a spinner when the scan is pending.
@@ -527,13 +587,13 @@
 int DeepScanningDialogViews::GetFailureMessageId() const {
   DCHECK(is_failure());
 
-  if (upload_status_ ==
-      DeepScanningDialogDelegate::DeepScanUploadStatus::LARGE_FILES) {
+  if (final_result_ ==
+      DeepScanningDialogDelegate::DeepScanningFinalResult::LARGE_FILES) {
     return IDS_DEEP_SCANNING_DIALOG_LARGE_FILE_FAILURE_MESSAGE;
   }
 
-  if (upload_status_ ==
-      DeepScanningDialogDelegate::DeepScanUploadStatus::ENCRYPTED_FILES) {
+  if (final_result_ ==
+      DeepScanningDialogDelegate::DeepScanningFinalResult::ENCRYPTED_FILES) {
     return IDS_DEEP_SCANNING_DIALOG_ENCRYPTED_FILE_FAILURE_MESSAGE;
   }
 
@@ -553,6 +613,24 @@
   }
 }
 
+int DeepScanningDialogViews::GetWarningMessageId() const {
+  DCHECK(is_warning());
+  switch (access_point_) {
+    case DeepScanAccessPoint::DOWNLOAD:
+      // This dialog should not appear on the download path. If it somehow does,
+      // treat it as an upload.
+      NOTREACHED();
+      FALLTHROUGH;
+    case DeepScanAccessPoint::UPLOAD:
+      return IDS_DEEP_SCANNING_DIALOG_UPLOAD_WARNING_MESSAGE;
+    case DeepScanAccessPoint::PASTE:
+      return IDS_DEEP_SCANNING_DIALOG_PASTE_WARNING_MESSAGE;
+    case DeepScanAccessPoint::DRAG_AND_DROP:
+      return is_file_scan_ ? IDS_DEEP_SCANNING_DIALOG_DRAG_FILES_WARNING_MESSAGE
+                           : IDS_DEEP_SCANNING_DIALOG_DRAG_DATA_WARNING_MESSAGE;
+  }
+}
+
 const gfx::ImageSkia* DeepScanningDialogViews::GetTopImage() const {
   const bool use_dark = color_utils::IsDark(GetBackgroundColor(GetWidget()));
   const bool treat_as_text_paste =
@@ -575,6 +653,7 @@
           ui::NativeTheme::kColorId_ThrobberSpinningColor);
     case DeepScanningDialogStatus::SUCCESS:
     case DeepScanningDialogStatus::FAILURE:
+    case DeepScanningDialogStatus::WARNING:
       // In a result state the background will have the result's color, so the
       // logo should have the same color as the background.
       return GetBackgroundColor(widget);
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views.h b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views.h
index a1a02061..acb865a 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views.h
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views.h
@@ -52,6 +52,11 @@
     // and that the user may not proceed with their upload, drag-and-drop or
     // paste.
     FAILURE,
+
+    // The dialog is shown with a message indicating that the scan was a
+    // failure, but that the user may proceed with their upload, drag-and-drop
+    // or paste if they want to.
+    WARNING,
   };
 
   // TestObserver should be implemented by tests that need to track when certain
@@ -75,8 +80,10 @@
 
     // Called at the end of DeepScanningDialogViews::UpdateDialog. |result| is
     // the value that UpdatedDialog used to transition from the pending state to
-    // the success or failure state.
-    virtual void DialogUpdated(DeepScanningDialogViews* views, bool result) {}
+    // the success/failure/warning state.
+    virtual void DialogUpdated(
+        DeepScanningDialogViews* views,
+        DeepScanningDialogDelegate::DeepScanningFinalResult result) {}
 
     // Called at the end of DeepScanningDialogViews's destructor. |views| is a
     // pointer to the DeepScanningDialogViews being destructed. It can be used
@@ -102,7 +109,6 @@
 
   // views::DialogDelegate:
   base::string16 GetWindowTitle() const override;
-  bool Cancel() override;
   bool ShouldShowCloseButton() const override;
   views::View* GetContentsView() override;
   views::Widget* GetWidget() override;
@@ -112,9 +118,7 @@
 
   // Updates the dialog with the result, and simply delete it from memory if
   // nothing should be shown.
-  void ShowResult(
-      bool success,
-      DeepScanningDialogDelegate::DeepScanUploadStatus upload_status);
+  void ShowResult(DeepScanningDialogDelegate::DeepScanningFinalResult result);
 
   // Accessors to simplify |dialog_status_| checking.
   inline bool is_success() const {
@@ -125,7 +129,11 @@
     return dialog_status_ == DeepScanningDialogStatus::FAILURE;
   }
 
-  inline bool is_result() const { return is_success() || is_failure(); }
+  inline bool is_warning() const {
+    return dialog_status_ == DeepScanningDialogStatus::WARNING;
+  }
+
+  inline bool is_result() const { return !is_pending(); }
 
   inline bool is_pending() const {
     return dialog_status_ == DeepScanningDialogStatus::PENDING;
@@ -159,9 +167,12 @@
   // Returns the appropriate dialog message depending on |dialog_status_|.
   base::string16 GetDialogMessage() const;
 
-  // Returns the appropriate dialog message depending on |dialog_status_|.
+  // Returns the text for the Cancel button depending on |dialog_status_|.
   base::string16 GetCancelButtonText() const;
 
+  // Returns the text for the Ok button for the warning case.
+  base::string16 GetBypassWarningButtonText() const;
+
   // Returns the appropriate paste top image ID depending on |dialog_status_|.
   int GetPasteImageId(bool use_dark) const;
 
@@ -176,9 +187,16 @@
   // |is_file_scan_|.
   int GetFailureMessageId() const;
 
+  // Returns the appropriate warning message ID depending on |access_point_| and
+  // |is_file_scan_|.
+  int GetWarningMessageId() const;
+
   // Show the dialog. Sets |shown_| to true.
   void Show();
 
+  void AcceptButtonCallback();
+  void CancelButtonCallback();
+
   std::unique_ptr<DeepScanningDialogDelegate> delegate_;
 
   content::WebContents* web_contents_;
@@ -197,9 +215,9 @@
   // Used to show the appropriate dialog depending on the scan's status.
   DeepScanningDialogStatus dialog_status_ = DeepScanningDialogStatus::PENDING;
 
-  // Used to show the appropriate message if the scan did not occur.
-  DeepScanningDialogDelegate::DeepScanUploadStatus upload_status_ =
-      DeepScanningDialogDelegate::DeepScanUploadStatus::NORMAL;
+  // Used to show the appropriate message.
+  DeepScanningDialogDelegate::DeepScanningFinalResult final_result_ =
+      DeepScanningDialogDelegate::DeepScanningFinalResult::SUCCESS;
 
   // Used to animate dialog height changes.
   std::unique_ptr<views::BoundsAnimator> bounds_animator_;
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views_browsertest.cc b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views_browsertest.cc
index f27d6dc..31888915 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views_browsertest.cc
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views_browsertest.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "base/test/metrics/histogram_tester.h"
+#include "build/build_config.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/fake_deep_scanning_dialog_delegate.h"
@@ -80,7 +81,9 @@
     views_first_shown_ = true;
   }
 
-  void DialogUpdated(DeepScanningDialogViews* views, bool result) override {
+  void DialogUpdated(
+      DeepScanningDialogViews* views,
+      DeepScanningDialogDelegate::DeepScanningFinalResult result) override {
     DCHECK_EQ(views, dialog_);
     dialog_updated_timestamp_ = base::TimeTicks::Now();
 
@@ -93,13 +96,16 @@
 
     // The dialog can only be updated to the success or failure case.
     EXPECT_TRUE(dialog_->is_result());
-    EXPECT_EQ(dialog_->is_success(), result);
+    bool is_success =
+        result == DeepScanningDialogDelegate::DeepScanningFinalResult::SUCCESS;
+    EXPECT_EQ(dialog_->is_success(), is_success);
     EXPECT_EQ(dialog_->is_success(), expected_scan_result_);
 
     // The dialog's buttons should be Cancel in the fail case and nothing in the
     // success case.
-    ui::DialogButton expected_buttons =
-        result ? ui::DIALOG_BUTTON_NONE : ui::DIALOG_BUTTON_CANCEL;
+    ui::DialogButton expected_buttons = dialog_->is_success()
+                                            ? ui::DIALOG_BUTTON_NONE
+                                            : ui::DIALOG_BUTTON_CANCEL;
     EXPECT_EQ(expected_buttons, dialog_->GetDialogButtons());
 
     // The dialog should only be updated once some time after being shown.
@@ -213,6 +219,70 @@
   base::HistogramTester histograms_;
 };
 
+// Tests the behavior of the dialog in the following ways:
+// - It shows the appropriate buttons depending when showing a warning.
+// - It calls the appropriate methods when the user bypasses/respects the
+//   warning.
+// - It shows up in the warning state immediately if the response is fast.
+class DeepScanningDialogViewsWarningBrowserTest
+    : public DeepScanningBrowserTestBase,
+      public DeepScanningDialogViews::TestObserver,
+      public testing::WithParamInterface<std::tuple<base::TimeDelta, bool>> {
+ public:
+  DeepScanningDialogViewsWarningBrowserTest() {
+    DeepScanningDialogViews::SetObserverForTesting(this);
+  }
+
+  void ViewsFirstShown(DeepScanningDialogViews* views,
+                       base::TimeTicks timestamp) override {
+    // The dialog is first shown in the pending state if the response is slow or
+    // in the warning state if it's not slow.
+    ASSERT_TRUE(views->is_pending() || views->is_warning());
+
+    // If the warning dialog was shown immediately, ensure that was expected and
+    // set |warning_shown_immediately_| for future assertions.
+    if (views->is_warning()) {
+      ASSERT_EQ(response_delay(), kNoDelay);
+      warning_shown_immediately_ = true;
+      ASSERT_EQ(views->GetDialogButtons(),
+                ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL);
+      SimulateClickAndEndTest(views);
+    } else {
+      ASSERT_EQ(response_delay(), kSmallDelay);
+      ASSERT_EQ(views->GetDialogButtons(), ui::DIALOG_BUTTON_CANCEL);
+    }
+  }
+
+  void DialogUpdated(
+      DeepScanningDialogViews* views,
+      DeepScanningDialogDelegate::DeepScanningFinalResult result) override {
+    ASSERT_FALSE(warning_shown_immediately_);
+    ASSERT_TRUE(views->is_warning());
+
+    // The dialog's buttons should be Ok and Cancel.
+    ASSERT_EQ(ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL,
+              views->GetDialogButtons());
+
+    SimulateClickAndEndTest(views);
+  }
+
+  void SimulateClickAndEndTest(DeepScanningDialogViews* views) {
+    if (user_bypasses_warning())
+      views->AcceptDialog();
+    else
+      views->CancelDialog();
+
+    CallQuitClosure();
+  }
+
+  base::TimeDelta response_delay() { return std::get<0>(GetParam()); }
+
+  bool user_bypasses_warning() { return std::get<1>(GetParam()); }
+
+ private:
+  bool warning_shown_immediately_ = false;
+};
+
 }  // namespace
 
 IN_PROC_BROWSER_TEST_P(DeepScanningDialogViewsBehaviorBrowserTest, Test) {
@@ -293,8 +363,13 @@
         /*response_delay*/
         testing::Values(kNoDelay, kSmallDelay, kNormalDelay)));
 
+#if defined(OS_MACOSX)
+#define MAYBE_Test DISABLED_Test
+#else
+#define MAYBE_Test Test
+#endif
 IN_PROC_BROWSER_TEST_F(DeepScanningDialogViewsCancelPendingScanBrowserTest,
-                       Test) {
+                       MAYBE_Test) {
   // Setup policies to enable deep scanning, its UI and the responses to be
   // simulated.
   SetDlpPolicy(CHECK_UPLOADS);
@@ -336,4 +411,59 @@
   ValidateMetrics();
 }
 
+IN_PROC_BROWSER_TEST_P(DeepScanningDialogViewsWarningBrowserTest, Test) {
+  // Setup policies.
+  SetDlpPolicy(CHECK_UPLOADS);
+  SetWaitPolicy(DELAY_UPLOADS);
+
+  // Setup the DLP warning response.
+  DeepScanningClientResponse response;
+  response.mutable_dlp_scan_verdict()->set_status(
+      DlpDeepScanningVerdict::SUCCESS);
+  DlpDeepScanningVerdict::TriggeredRule* rule =
+      response.mutable_dlp_scan_verdict()->add_triggered_rules();
+  rule->set_rule_name("warning_rule_name");
+  rule->set_action(DlpDeepScanningVerdict::TriggeredRule::WARN);
+  SetStatusCallbackResponse(response);
+
+  // Set up delegate test values.
+  FakeDeepScanningDialogDelegate::SetResponseDelay(response_delay());
+  SetUpDelegate();
+
+  bool called = false;
+  base::RunLoop run_loop;
+  SetQuitClosure(run_loop.QuitClosure());
+
+  DeepScanningDialogDelegate::Data data;
+  data.do_dlp_scan = true;
+  data.text.emplace_back(base::UTF8ToUTF16("foo"));
+  data.text.emplace_back(base::UTF8ToUTF16("bar"));
+  data.paths.emplace_back(FILE_PATH_LITERAL("/tmp/foo.doc"));
+  data.paths.emplace_back(FILE_PATH_LITERAL("/tmp/bar.doc"));
+
+  DeepScanningDialogDelegate::ShowForWebContents(
+      browser()->tab_strip_model()->GetActiveWebContents(), std::move(data),
+      base::BindOnce(
+          [](bool* called, bool user_bypasses_warning,
+             const DeepScanningDialogDelegate::Data& data,
+             const DeepScanningDialogDelegate::Result& result) {
+            ASSERT_EQ(result.text_results.size(), 2u);
+            ASSERT_EQ(result.text_results[0], user_bypasses_warning);
+            ASSERT_EQ(result.text_results[1], user_bypasses_warning);
+            ASSERT_EQ(result.paths_results.size(), 2u);
+            ASSERT_EQ(result.paths_results[0], user_bypasses_warning);
+            ASSERT_EQ(result.paths_results[1], user_bypasses_warning);
+            *called = true;
+          },
+          &called, user_bypasses_warning()),
+      DeepScanAccessPoint::UPLOAD);
+  run_loop.Run();
+  EXPECT_TRUE(called);
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    DeepScanningDialogViewsWarningBrowserTest,
+    DeepScanningDialogViewsWarningBrowserTest,
+    testing::Combine(testing::Values(kNoDelay, kSmallDelay), testing::Bool()));
+
 }  // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.cc b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.cc
index 42d5ada..76925c17 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.cc
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.cc
@@ -129,6 +129,23 @@
   }
 }
 
+void ReportSensitiveDataWarningBypass(Profile* profile,
+                                      const GURL& url,
+                                      const std::string& file_name,
+                                      const std::string& download_digest_sha256,
+                                      const std::string& mime_type,
+                                      const std::string& trigger,
+                                      const int64_t content_size) {
+  DCHECK(std::all_of(download_digest_sha256.begin(),
+                     download_digest_sha256.end(), [](const char& c) {
+                       return (c >= '0' && c <= '9') ||
+                              (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f');
+                     }));
+  extensions::SafeBrowsingPrivateEventRouterFactory::GetForProfile(profile)
+      ->OnSensitiveDataWarningBypassed(url, file_name, download_digest_sha256,
+                                       mime_type, trigger, content_size);
+}
+
 std::string DeepScanAccessPointToString(DeepScanAccessPoint access_point) {
   switch (access_point) {
     case DeepScanAccessPoint::DOWNLOAD:
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.h b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.h
index 3afb213..dafcbd0 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.h
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.h
@@ -27,6 +27,18 @@
                                     BinaryUploadService::Result result,
                                     DeepScanningClientResponse response);
 
+// Helper function to report the user bypassed a warning to the enterprise
+// admin. This is split from MaybeReportDeepScanningVerdict since it happens
+// after getting a response. |download_digest_sha256| must be encoded using
+// base::HexEncode.
+void ReportSensitiveDataWarningBypass(Profile* profile,
+                                      const GURL& url,
+                                      const std::string& file_name,
+                                      const std::string& download_digest_sha256,
+                                      const std::string& mime_type,
+                                      const std::string& trigger,
+                                      const int64_t content_size);
+
 // Access points used to record UMA metrics and specify which code location is
 // initiating a deep scan. Any new caller of
 // DeepScanningDialogDelegate::ShowForWebContents should add an access point
diff --git a/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc b/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc
index 1bbd1fe..d50741d 100644
--- a/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc
@@ -16,6 +16,7 @@
 #include "base/command_line.h"
 #include "base/feature_list.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
diff --git a/chrome/browser/safe_browsing/safe_browsing_navigation_throttle.cc b/chrome/browser/safe_browsing/safe_browsing_navigation_throttle.cc
index 63f3c803..bcb9935 100644
--- a/chrome/browser/safe_browsing/safe_browsing_navigation_throttle.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_navigation_throttle.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/safe_browsing/safe_browsing_navigation_throttle.h"
 
+#include "base/memory/ptr_util.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/interstitials/enterprise_util.h"
 #include "chrome/browser/safe_browsing/safe_browsing_blocking_page.h"
diff --git a/chrome/browser/safe_browsing/safe_browsing_service.cc b/chrome/browser/safe_browsing/safe_browsing_service.cc
index 7e2c981..5b7031d 100644
--- a/chrome/browser/safe_browsing/safe_browsing_service.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_service.cc
@@ -41,6 +41,7 @@
 #include "components/safe_browsing/core/browser/safe_browsing_network_context.h"
 #include "components/safe_browsing/core/common/safebrowsing_constants.h"
 #include "components/safe_browsing/core/db/database_manager.h"
+#include "components/safe_browsing/core/features.h"
 #include "components/safe_browsing/core/file_type_policies.h"
 #include "components/safe_browsing/core/ping_manager.h"
 #include "components/safe_browsing/core/realtime/policy_engine.h"
@@ -170,6 +171,26 @@
   return network_context_->GetURLLoaderFactory();
 }
 
+network::mojom::NetworkContext* SafeBrowsingService::GetNetworkContext(
+    Profile* profile) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  if (!base::FeatureList::IsEnabled(kSafeBrowsingSeparateNetworkContexts))
+    return GetNetworkContext();
+
+  return services_delegate_->GetSafeBrowsingNetworkContext(profile)
+      ->GetNetworkContext();
+}
+
+scoped_refptr<network::SharedURLLoaderFactory>
+SafeBrowsingService::GetURLLoaderFactory(Profile* profile) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  if (!base::FeatureList::IsEnabled(kSafeBrowsingSeparateNetworkContexts))
+    return GetURLLoaderFactory();
+
+  return services_delegate_->GetSafeBrowsingNetworkContext(profile)
+      ->GetURLLoaderFactory();
+}
+
 void SafeBrowsingService::FlushNetworkInterfaceForTesting() {
   if (network_context_)
     network_context_->FlushForTesting();
@@ -362,12 +383,14 @@
   services_delegate_->RemovePasswordProtectionService(profile);
   services_delegate_->RemoveTelemetryService(profile);
   services_delegate_->RemoveBinaryUploadService(profile);
+  services_delegate_->RemoveSafeBrowsingNetworkContext(profile);
 }
 
 void SafeBrowsingService::CreateServicesForProfile(Profile* profile) {
   services_delegate_->CreatePasswordProtectionService(profile);
   services_delegate_->CreateTelemetryService(profile);
   services_delegate_->CreateBinaryUploadService(profile);
+  services_delegate_->CreateSafeBrowsingNetworkContext(profile);
   observed_profiles_.Add(profile);
 }
 
diff --git a/chrome/browser/safe_browsing/safe_browsing_service.h b/chrome/browser/safe_browsing/safe_browsing_service.h
index 77e4efdf..272dbc79 100644
--- a/chrome/browser/safe_browsing/safe_browsing_service.h
+++ b/chrome/browser/safe_browsing/safe_browsing_service.h
@@ -125,9 +125,17 @@
 
   // NetworkContext and URLLoaderFactory used for safe browsing requests.
   // Called on UI thread.
+  // TODO(crbug/1049833): Transition all callers of these functions to the
+  // per-profile methods below.
   network::mojom::NetworkContext* GetNetworkContext();
   virtual scoped_refptr<network::SharedURLLoaderFactory> GetURLLoaderFactory();
 
+  // Get the NetworkContext or URLLoaderFactory attached to |profile|. Called on
+  // UI thread.
+  network::mojom::NetworkContext* GetNetworkContext(Profile* profile);
+  virtual scoped_refptr<network::SharedURLLoaderFactory> GetURLLoaderFactory(
+      Profile* profile);
+
   // Flushes above two interfaces to avoid races in tests.
   void FlushNetworkInterfaceForTesting();
 
diff --git a/chrome/browser/safe_browsing/safe_browsing_subresource_tab_helper.cc b/chrome/browser/safe_browsing/safe_browsing_subresource_tab_helper.cc
index 386c8b2..72686db9 100644
--- a/chrome/browser/safe_browsing/safe_browsing_subresource_tab_helper.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_subresource_tab_helper.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/safe_browsing/safe_browsing_subresource_tab_helper.h"
 
+#include "base/memory/ptr_util.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/safe_browsing/safe_browsing_blocking_page.h"
 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
diff --git a/chrome/browser/safe_browsing/services_delegate.cc b/chrome/browser/safe_browsing/services_delegate.cc
index 1c5b8a3a..a08bb711 100644
--- a/chrome/browser/safe_browsing/services_delegate.cc
+++ b/chrome/browser/safe_browsing/services_delegate.cc
@@ -4,22 +4,28 @@
 
 #include "chrome/browser/safe_browsing/services_delegate.h"
 
+#include <memory>
 #include <utility>
 
 #include "base/bind.h"
 #include "base/command_line.h"
+#include "base/feature_list.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/string_util.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "chrome/browser/history/history_service_factory.h"
+#include "chrome/browser/net/system_network_context_manager.h"
 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
 #include "chrome/browser/safe_browsing/telemetry/telemetry_service.h"
 #include "chrome/common/chrome_switches.h"
 #include "components/keyed_service/core/service_access_type.h"
 #include "components/safe_browsing/buildflags.h"
+#include "components/safe_browsing/core/browser/safe_browsing_network_context.h"
 #include "components/safe_browsing/core/db/v4_local_database_manager.h"
+#include "components/safe_browsing/core/features.h"
 #include "content/public/browser/browser_thread.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
+#include "services/network/public/mojom/network_context.mojom.h"
 #include "services/preferences/public/mojom/tracked_preference_validation_delegate.mojom.h"
 
 namespace safe_browsing {
@@ -64,6 +70,64 @@
 void ServicesDelegate::ShutdownServices() {
   // Delete the ChromePasswordProtectionService instances.
   password_protection_service_map_.clear();
+
+  // Delete the NetworkContexts and associated ProxyConfigMonitors
+  network_context_map_.clear();
+  proxy_config_monitor_map_.clear();
+}
+
+void ServicesDelegate::CreateSafeBrowsingNetworkContext(Profile* profile) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  DCHECK(profile);
+
+  if (!base::FeatureList::IsEnabled(kSafeBrowsingSeparateNetworkContexts))
+    return;
+
+  auto it = network_context_map_.find(profile);
+  DCHECK(it == network_context_map_.end());
+  network_context_map_[profile] = std::make_unique<SafeBrowsingNetworkContext>(
+      profile->GetPath(),
+      base::BindRepeating(&ServicesDelegate::CreateNetworkContextParams,
+                          base::Unretained(this), profile));
+  proxy_config_monitor_map_[profile] =
+      std::make_unique<ProxyConfigMonitor>(profile);
+}
+
+void ServicesDelegate::RemoveSafeBrowsingNetworkContext(Profile* profile) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  DCHECK(profile);
+
+  if (!base::FeatureList::IsEnabled(kSafeBrowsingSeparateNetworkContexts))
+    return;
+
+  auto it = network_context_map_.find(profile);
+  if (it != network_context_map_.end()) {
+    it->second->ServiceShuttingDown();
+    network_context_map_.erase(it);
+  }
+
+  auto proxy_it = proxy_config_monitor_map_.find(profile);
+  if (proxy_it != proxy_config_monitor_map_.end())
+    proxy_config_monitor_map_.erase(proxy_it);
+}
+
+SafeBrowsingNetworkContext* ServicesDelegate::GetSafeBrowsingNetworkContext(
+    Profile* profile) const {
+  DCHECK(profile);
+  DCHECK(base::FeatureList::IsEnabled(kSafeBrowsingSeparateNetworkContexts));
+  auto it = network_context_map_.find(profile);
+  DCHECK(it != network_context_map_.end());
+  return it->second.get();
+}
+
+network::mojom::NetworkContextParamsPtr
+ServicesDelegate::CreateNetworkContextParams(Profile* profile) {
+  auto params = SystemNetworkContextManager::GetInstance()
+                    ->CreateDefaultNetworkContextParams();
+  auto it = proxy_config_monitor_map_.find(profile);
+  DCHECK(it != proxy_config_monitor_map_.end());
+  it->second->AddToNetworkContextParams(params.get());
+  return params;
 }
 
 }  // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/services_delegate.h b/chrome/browser/safe_browsing/services_delegate.h
index f42db2e..68ba051 100644
--- a/chrome/browser/safe_browsing/services_delegate.h
+++ b/chrome/browser/safe_browsing/services_delegate.h
@@ -12,8 +12,10 @@
 #include "chrome/browser/safe_browsing/chrome_password_protection_service.h"
 #include "chrome/browser/safe_browsing/incident_reporting/delayed_analysis_callback.h"
 #include "components/safe_browsing/content/password_protection/password_protection_service.h"
+#include "services/network/public/mojom/network_context.mojom.h"
 
 class Profile;
+class ProxyConfigMonitor;
 
 namespace content {
 class DownloadManager;
@@ -41,6 +43,7 @@
 class SafeBrowsingService;
 class SafeBrowsingDatabaseManager;
 struct V4ProtocolConfig;
+class SafeBrowsingNetworkContext;
 
 // Abstraction to help organize code for mobile vs full safe browsing modes.
 // This helper class should be owned by a SafeBrowsingService, and it handles
@@ -134,21 +137,37 @@
   virtual BinaryUploadService* GetBinaryUploadService(
       Profile* profile) const = 0;
 
+  virtual void CreateSafeBrowsingNetworkContext(Profile* profile);
+  virtual void RemoveSafeBrowsingNetworkContext(Profile* profile);
+  virtual SafeBrowsingNetworkContext* GetSafeBrowsingNetworkContext(
+      Profile* profile) const;
+
   virtual std::string GetSafetyNetId() const = 0;
 
  protected:
+  network::mojom::NetworkContextParamsPtr CreateNetworkContextParams(
+      Profile* profile);
+
   // Unowned pointer
   SafeBrowsingService* const safe_browsing_service_;
 
   // Unowned pointer
   ServicesCreator* const services_creator_;
 
+  std::unique_ptr<ProxyConfigMonitor> proxy_config_monitor_;
+
   // Tracks existing Profiles, and their corresponding
   // ChromePasswordProtectionService instances.
   // Accessed on UI thread.
   base::flat_map<Profile*, std::unique_ptr<ChromePasswordProtectionService>>
       password_protection_service_map_;
 
+  // Tracks existing Profiles, and their corresponding
+  // SafeBrowsingNetworkContexts. Accessed on UI thread.
+  base::flat_map<Profile*, std::unique_ptr<SafeBrowsingNetworkContext>>
+      network_context_map_;
+  base::flat_map<Profile*, std::unique_ptr<ProxyConfigMonitor>>
+      proxy_config_monitor_map_;
 };
 
 }  // namespace safe_browsing
diff --git a/chrome/browser/search/instant_service.cc b/chrome/browser/search/instant_service.cc
index 3db5920..32ff628 100644
--- a/chrome/browser/search/instant_service.cc
+++ b/chrome/browser/search/instant_service.cc
@@ -10,6 +10,7 @@
 #include "base/bind.h"
 #include "base/callback.h"
 #include "base/files/file_util.h"
+#include "base/memory/ptr_util.h"
 #include "base/path_service.h"
 #include "base/scoped_observer.h"
 #include "base/strings/string_util.h"
diff --git a/chrome/browser/search_engines/template_url_service_test_util.cc b/chrome/browser/search_engines/template_url_service_test_util.cc
index 79cb820..8ad26c47 100644
--- a/chrome/browser/search_engines/template_url_service_test_util.cc
+++ b/chrome/browser/search_engines/template_url_service_test_util.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "base/bind_helpers.h"
 #include "base/macros.h"
 #include "base/run_loop.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/chrome/browser/sharing/sharing_fcm_handler.cc b/chrome/browser/sharing/sharing_fcm_handler.cc
index 9297de99..9db5b34 100644
--- a/chrome/browser/sharing/sharing_fcm_handler.cc
+++ b/chrome/browser/sharing/sharing_fcm_handler.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/sharing/sharing_fcm_handler.h"
 
+#include "base/bind_helpers.h"
 #include "base/no_destructor.h"
 #include "base/strings/strcat.h"
 #include "base/time/time.h"
diff --git a/chrome/browser/sharing/sharing_fcm_sender_unittest.cc b/chrome/browser/sharing/sharing_fcm_sender_unittest.cc
index 74bbd4eb..fd4a8dd 100644
--- a/chrome/browser/sharing/sharing_fcm_sender_unittest.cc
+++ b/chrome/browser/sharing/sharing_fcm_sender_unittest.cc
@@ -8,6 +8,7 @@
 
 #include "base/base64.h"
 #include "base/callback_list.h"
+#include "base/memory/ptr_util.h"
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/sharing/features.h"
 #include "chrome/browser/sharing/proto/sharing_message.pb.h"
diff --git a/chrome/browser/sharing/web_push/web_push_sender_unittest.cc b/chrome/browser/sharing/web_push/web_push_sender_unittest.cc
index 6eeda9d..39825b99 100644
--- a/chrome/browser/sharing/web_push/web_push_sender_unittest.cc
+++ b/chrome/browser/sharing/web_push/web_push_sender_unittest.cc
@@ -6,6 +6,7 @@
 
 #include "base/base64.h"
 #include "base/base64url.h"
+#include "base/bind_helpers.h"
 #include "base/json/json_reader.h"
 #include "content/public/test/browser_task_environment.h"
 #include "crypto/ec_private_key.h"
diff --git a/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.cc b/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.cc
index 1443fd6..01de1fa69 100644
--- a/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.cc
+++ b/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.cc
@@ -6,6 +6,7 @@
 
 #include "base/barrier_closure.h"
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/supports_user_data.h"
 #include "build/buildflag.h"
 #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/signin/chrome_signin_url_loader_throttle.cc b/chrome/browser/signin/chrome_signin_url_loader_throttle.cc
index 8b2bf706..490284d 100644
--- a/chrome/browser/signin/chrome_signin_url_loader_throttle.cc
+++ b/chrome/browser/signin/chrome_signin_url_loader_throttle.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/signin/chrome_signin_url_loader_throttle.h"
 
+#include "base/memory/ptr_util.h"
 #include "chrome/browser/signin/chrome_signin_helper.h"
 #include "chrome/browser/signin/header_modification_delegate.h"
 #include "components/signin/core/browser/signin_header_helper.h"
diff --git a/chrome/browser/signin/chrome_signin_url_loader_throttle_unittest.cc b/chrome/browser/signin/chrome_signin_url_loader_throttle_unittest.cc
index 8410ae4..18a8222 100644
--- a/chrome/browser/signin/chrome_signin_url_loader_throttle_unittest.cc
+++ b/chrome/browser/signin/chrome_signin_url_loader_throttle_unittest.cc
@@ -6,6 +6,7 @@
 
 #include "base/bind.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/test/mock_callback.h"
 #include "chrome/browser/signin/chrome_signin_helper.h"
 #include "chrome/browser/signin/header_modification_delegate.h"
diff --git a/chrome/browser/site_isolation/spellcheck_per_process_browsertest.cc b/chrome/browser/site_isolation/spellcheck_per_process_browsertest.cc
index 4136d987..dd1ebbc 100644
--- a/chrome/browser/site_isolation/spellcheck_per_process_browsertest.cc
+++ b/chrome/browser/site_isolation/spellcheck_per_process_browsertest.cc
@@ -7,6 +7,7 @@
 
 // spellcheck_per_process_browsertest.cc
 
+#include "base/bind_helpers.h"
 #include "base/feature_list.h"
 #include "base/run_loop.h"
 #include "base/task/post_task.h"
diff --git a/chrome/browser/spellchecker/spellcheck_service_browsertest.cc b/chrome/browser/spellchecker/spellcheck_service_browsertest.cc
index 2d02072..109bf1ae 100644
--- a/chrome/browser/spellchecker/spellcheck_service_browsertest.cc
+++ b/chrome/browser/spellchecker/spellcheck_service_browsertest.cc
@@ -8,6 +8,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/path_service.h"
 #include "base/run_loop.h"
 #include "base/stl_util.h"
diff --git a/chrome/browser/ssl/typed_navigation_timing_throttle.cc b/chrome/browser/ssl/typed_navigation_timing_throttle.cc
index 3e0be96..b061f6f 100644
--- a/chrome/browser/ssl/typed_navigation_timing_throttle.cc
+++ b/chrome/browser/ssl/typed_navigation_timing_throttle.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/ssl/typed_navigation_timing_throttle.h"
 
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/time/time.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/storage_access_api/BUILD.gn b/chrome/browser/storage_access_api/BUILD.gn
index e6bdb2b..001ffa4 100644
--- a/chrome/browser/storage_access_api/BUILD.gn
+++ b/chrome/browser/storage_access_api/BUILD.gn
@@ -8,5 +8,14 @@
     "storage_access_grant_permission_context.h",
   ]
 
-  deps = [ "//chrome/common" ]
+  public_deps = [
+    "//components/permissions",
+  ]
+
+  deps = [
+    "//chrome/common",
+    "//components/content_settings/core/browser",
+    "//content/public/browser",
+    "//services/network/public/mojom",
+  ]
 }
diff --git a/chrome/browser/supervised_user/kids_management_url_checker_client_unittest.cc b/chrome/browser/supervised_user/kids_management_url_checker_client_unittest.cc
index 323aa99..b174a99 100644
--- a/chrome/browser/supervised_user/kids_management_url_checker_client_unittest.cc
+++ b/chrome/browser/supervised_user/kids_management_url_checker_client_unittest.cc
@@ -9,6 +9,7 @@
 
 #include "base/bind.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/values.h"
 #include "chrome/browser/supervised_user/kids_chrome_management/kids_chrome_management_client.h"
diff --git a/chrome/browser/supervised_user/supervised_user_navigation_observer.cc b/chrome/browser/supervised_user/supervised_user_navigation_observer.cc
index ac677899..ba7b902 100644
--- a/chrome/browser/supervised_user/supervised_user_navigation_observer.cc
+++ b/chrome/browser/supervised_user/supervised_user_navigation_observer.cc
@@ -8,6 +8,7 @@
 
 #include "base/bind.h"
 #include "base/callback.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "chrome/browser/history/history_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/sync/sync_encryption_keys_tab_helper.cc b/chrome/browser/sync/sync_encryption_keys_tab_helper.cc
index 4da0be7..3f674ee 100644
--- a/chrome/browser/sync/sync_encryption_keys_tab_helper.cc
+++ b/chrome/browser/sync/sync_encryption_keys_tab_helper.cc
@@ -8,6 +8,7 @@
 #include <utility>
 #include <vector>
 
+#include "base/memory/ptr_util.h"
 #include "base/no_destructor.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/sync/profile_sync_service_factory.h"
diff --git a/chrome/browser/sync/sync_error_infobar_delegate_android.cc b/chrome/browser/sync/sync_error_infobar_delegate_android.cc
index b752d21..dbedf0ed 100644
--- a/chrome/browser/sync/sync_error_infobar_delegate_android.cc
+++ b/chrome/browser/sync/sync_error_infobar_delegate_android.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/sync/sync_error_infobar_delegate_android.h"
 
+#include "base/memory/ptr_util.h"
 #include "chrome/android/chrome_jni_headers/SyncErrorInfoBar_jni.h"
 #include "chrome/browser/infobars/infobar_service.h"
 #include "chrome/browser/ui/android/infobars/sync_error_infobar.h"
diff --git a/chrome/browser/sync_file_system/local/syncable_file_operation_runner_unittest.cc b/chrome/browser/sync_file_system/local/syncable_file_operation_runner_unittest.cc
index 646b773d..ce62a47 100644
--- a/chrome/browser/sync_file_system/local/syncable_file_operation_runner_unittest.cc
+++ b/chrome/browser/sync_file_system/local/syncable_file_operation_runner_unittest.cc
@@ -11,6 +11,7 @@
 #include <string>
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/files/file.h"
 #include "base/files/file_util.h"
 #include "base/location.h"
diff --git a/chrome/browser/tab_contents/form_interaction_tab_helper_unittest.cc b/chrome/browser/tab_contents/form_interaction_tab_helper_unittest.cc
index fafa912..0839aca 100644
--- a/chrome/browser/tab_contents/form_interaction_tab_helper_unittest.cc
+++ b/chrome/browser/tab_contents/form_interaction_tab_helper_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/tab_contents/form_interaction_tab_helper.h"
 
+#include "base/bind_helpers.h"
 #include "base/run_loop.h"
 #include "base/task/post_task.h"
 #include "base/task/task_traits.h"
diff --git a/chrome/browser/tab_contents/view_source_browsertest.cc b/chrome/browser/tab_contents/view_source_browsertest.cc
index 34d54e3..0231b9e9 100644
--- a/chrome/browser/tab_contents/view_source_browsertest.cc
+++ b/chrome/browser/tab_contents/view_source_browsertest.cc
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/bind_helpers.h"
 #include "base/command_line.h"
 #include "base/macros.h"
 #include "base/strings/utf_string_conversions.h"
diff --git a/chrome/browser/task_manager/providers/worker_task_provider_browsertest.cc b/chrome/browser/task_manager/providers/worker_task_provider_browsertest.cc
index 8a01783..fc1952d 100644
--- a/chrome/browser/task_manager/providers/worker_task_provider_browsertest.cc
+++ b/chrome/browser/task_manager/providers/worker_task_provider_browsertest.cc
@@ -5,6 +5,7 @@
 #include <memory>
 #include <vector>
 
+#include "base/bind_helpers.h"
 #include "base/callback_forward.h"
 #include "base/command_line.h"
 #include "base/stl_util.h"
diff --git a/chrome/browser/task_manager/web_contents_tags.cc b/chrome/browser/task_manager/web_contents_tags.cc
index e7e9f1c..c2d762b 100644
--- a/chrome/browser/task_manager/web_contents_tags.cc
+++ b/chrome/browser/task_manager/web_contents_tags.cc
@@ -6,6 +6,7 @@
 
 #include <memory>
 
+#include "base/memory/ptr_util.h"
 #include "build/build_config.h"
 #include "content/public/browser/web_contents.h"
 #include "extensions/browser/view_type_utils.h"
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 3233e4e..baafa9e 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -415,6 +415,8 @@
     "//chrome/common",
     "//chrome/common/net",
     "//chrome/installer/util:with_no_strings",
+    "//chrome/services/qrcode_generator/public/cpp",
+    "//chrome/services/qrcode_generator/public/mojom",
     "//components/about_ui",
     "//components/account_id",
     "//components/autofill/content/browser:risk_proto",
@@ -802,6 +804,13 @@
       ]
       deps += [ "//components/feed/core/common:feed_core_common" ]
     }
+
+    if (enable_password_change_in_leaked_dialog) {
+      sources += [
+        "android/passwords/credential_leak_dialog_password_change_view_android.cc",
+        "android/passwords/credential_leak_dialog_password_change_view_android.h",
+      ]
+    }
     deps += [
       "//chrome/android:jni_headers",
       "//chrome/android/features/dev_ui:buildflags",
@@ -1202,9 +1211,6 @@
       "task_manager/task_manager_table_model.h",
       "thumbnails/thumbnail_image.cc",
       "thumbnails/thumbnail_image.h",
-      "thumbnails/thumbnail_page_event_adapter.cc",
-      "thumbnails/thumbnail_page_event_adapter.h",
-      "thumbnails/thumbnail_page_observer.h",
       "thumbnails/thumbnail_tab_helper.cc",
       "thumbnails/thumbnail_tab_helper.h",
       "toolbar/app_menu_icon_controller.cc",
diff --git a/chrome/browser/ui/android/passwords/credential_leak_dialog_password_change_view_android.cc b/chrome/browser/ui/android/passwords/credential_leak_dialog_password_change_view_android.cc
new file mode 100644
index 0000000..960eaee
--- /dev/null
+++ b/chrome/browser/ui/android/passwords/credential_leak_dialog_password_change_view_android.cc
@@ -0,0 +1,70 @@
+// 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/ui/android/passwords/credential_leak_dialog_password_change_view_android.h"
+#include <cstdint>
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_string.h"
+#include "base/strings/string16.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/android/chrome_jni_headers/CredentialLeakDialogPasswordChangeBridge_jni.h"
+#include "chrome/browser/password_manager/chrome_password_manager_client.h"
+#include "chrome/browser/password_manager/credential_leak_password_change_controller_android.h"
+#include "chrome/grit/generated_resources.h"
+#include "components/password_manager/core/browser/password_form_manager_for_ui.h"
+#include "components/password_manager/core/common/password_manager_pref_names.h"
+#include "components/prefs/pref_service.h"
+#include "components/strings/grit/components_strings.h"
+#include "content/public/browser/web_contents.h"
+#include "ui/android/window_android.h"
+#include "ui/base/l10n/l10n_util.h"
+
+CredentialLeakDialogPasswordChangeViewAndroid::
+    CredentialLeakDialogPasswordChangeViewAndroid(
+        CredentialLeakPasswordChangeControllerAndroid* controller)
+    : controller_(controller) {}
+
+CredentialLeakDialogPasswordChangeViewAndroid::
+    ~CredentialLeakDialogPasswordChangeViewAndroid() {
+  Java_CredentialLeakDialogPasswordChangeBridge_destroy(
+      base::android::AttachCurrentThread(), java_object_);
+}
+
+void CredentialLeakDialogPasswordChangeViewAndroid::Show(
+    ui::WindowAndroid* window_android) {
+  JNIEnv* env = base::android::AttachCurrentThread();
+  java_object_.Reset(Java_CredentialLeakDialogPasswordChangeBridge_create(
+      env, window_android->GetJavaObject(), reinterpret_cast<intptr_t>(this)));
+
+  Java_CredentialLeakDialogPasswordChangeBridge_showDialog(
+      env, java_object_,
+      base::android::ConvertUTF16ToJavaString(env, controller_->GetTitle()),
+      base::android::ConvertUTF16ToJavaString(env,
+                                              controller_->GetDescription()),
+      base::android::ConvertUTF16ToJavaString(
+          env, controller_->GetAcceptButtonLabel()),
+      controller_->ShouldShowCancelButton()
+          ? base::android::ConvertUTF16ToJavaString(
+                env, controller_->GetCancelButtonLabel())
+          : nullptr);
+}
+
+void CredentialLeakDialogPasswordChangeViewAndroid::Accepted(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& obj) {
+  controller_->OnAcceptDialog();
+}
+
+void CredentialLeakDialogPasswordChangeViewAndroid::Cancelled(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& obj) {
+  controller_->OnCancelDialog();
+}
+
+void CredentialLeakDialogPasswordChangeViewAndroid::Closed(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& obj) {
+  controller_->OnCloseDialog();
+}
diff --git a/chrome/browser/ui/android/passwords/credential_leak_dialog_password_change_view_android.h b/chrome/browser/ui/android/passwords/credential_leak_dialog_password_change_view_android.h
new file mode 100644
index 0000000..95679f4
--- /dev/null
+++ b/chrome/browser/ui/android/passwords/credential_leak_dialog_password_change_view_android.h
@@ -0,0 +1,54 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_ANDROID_PASSWORDS_CREDENTIAL_LEAK_DIALOG_PASSWORD_CHANGE_VIEW_ANDROID_H_
+#define CHROME_BROWSER_UI_ANDROID_PASSWORDS_CREDENTIAL_LEAK_DIALOG_PASSWORD_CHANGE_VIEW_ANDROID_H_
+
+#include <jni.h>
+
+#include "base/android/scoped_java_ref.h"
+#include "chrome/browser/ui/passwords/password_dialog_prompts.h"
+
+namespace ui {
+class WindowAndroid;
+}
+
+class CredentialLeakPasswordChangeControllerAndroid;
+
+// TODO (crbug/1058764) Unfork credential leak dialog password change when
+// prototype is done.
+
+// Modal dialog displaying a warning for the user when an entered credential was
+// detected to have been part of a leak. Communicated with its Java counterpart
+// and passes responses back to the
+// |CredentialLeakPasswordChangeControllerAndroid|.
+class CredentialLeakDialogPasswordChangeViewAndroid {
+ public:
+  explicit CredentialLeakDialogPasswordChangeViewAndroid(
+      CredentialLeakPasswordChangeControllerAndroid* controller);
+  ~CredentialLeakDialogPasswordChangeViewAndroid();
+
+  // Called to create and show the dialog.
+  void Show(ui::WindowAndroid* window_android);
+
+  // Called from Java via JNI.
+  void Accepted(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
+
+  // Called from Java via JNI.
+  void Cancelled(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
+
+  // Called from Java via JNI.
+  void Closed(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
+
+ private:
+  // The controller which owns this dialog and handles the dialog events.
+  CredentialLeakPasswordChangeControllerAndroid* controller_;
+
+  // The corresponding java object.
+  base::android::ScopedJavaGlobalRef<jobject> java_object_;
+
+  DISALLOW_COPY_AND_ASSIGN(CredentialLeakDialogPasswordChangeViewAndroid);
+};
+
+#endif  // CHROME_BROWSER_UI_ANDROID_PASSWORDS_CREDENTIAL_LEAK_DIALOG_PASSWORD_CHANGE_VIEW_ANDROID_H_
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
index 32df36c..ae17f38 100644
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -2986,6 +2986,14 @@
         See downloads
       </message>
 
+      <!-- Offline indicator v2 -->
+      <message name="IDS_OFFLINE_INDICATOR_V2_OFFLINE_TEXT" desc="Text to be displayed in the status indicator above the toolbar that lets the users know they are offline.">
+        No internet connection
+      </message>
+      <message name="IDS_OFFLINE_INDICATOR_V2_BACK_ONLINE_TEXT" desc="Text to be displayed in the status indicator above the toolbar when the device goes back online.">
+        Back online
+      </message>
+
       <!-- Find in page -->
       <message name="IDS_HINT_FIND_IN_PAGE" desc="Hint text to show for the find in page search field when the search field is empty.">
         Find in page
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_OFFLINE_INDICATOR_V2_BACK_ONLINE_TEXT.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_OFFLINE_INDICATOR_V2_BACK_ONLINE_TEXT.png.sha1
new file mode 100644
index 0000000..7a52bde
--- /dev/null
+++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_OFFLINE_INDICATOR_V2_BACK_ONLINE_TEXT.png.sha1
@@ -0,0 +1 @@
+4762643cd3a3599e3bf15952b96ba688982070a4
\ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_OFFLINE_INDICATOR_V2_OFFLINE_TEXT.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_OFFLINE_INDICATOR_V2_OFFLINE_TEXT.png.sha1
new file mode 100644
index 0000000..98fc88a
--- /dev/null
+++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_OFFLINE_INDICATOR_V2_OFFLINE_TEXT.png.sha1
@@ -0,0 +1 @@
+09604c33a54c4113aa3874f6f178dede6334c846
\ No newline at end of file
diff --git a/chrome/browser/ui/app_list/app_service/app_service_context_menu.cc b/chrome/browser/ui/app_list/app_service/app_service_context_menu.cc
index 8c580fd..9b32816 100644
--- a/chrome/browser/ui/app_list/app_service/app_service_context_menu.cc
+++ b/chrome/browser/ui/app_list/app_service/app_service_context_menu.cc
@@ -154,22 +154,17 @@
 bool AppServiceContextMenu::IsCommandIdChecked(int command_id) const {
   switch (app_type_) {
     case apps::mojom::AppType::kWeb:
-      if (base::FeatureList::IsEnabled(
-              features::kDesktopPWAsWithoutExtensions)) {
-        if (command_id >= ash::USE_LAUNCH_TYPE_COMMAND_START &&
-            command_id < ash::USE_LAUNCH_TYPE_COMMAND_END) {
-          auto* provider = web_app::WebAppProvider::Get(profile());
-          DCHECK(provider);
-          web_app::DisplayMode effective_display_mode =
-              provider->registrar().GetAppEffectiveDisplayMode(app_id());
-          return effective_display_mode != web_app::DisplayMode::kUndefined &&
-                 effective_display_mode ==
-                     ConvertUseLaunchTypeCommandToDisplayMode(command_id);
-        }
-        return AppContextMenu::IsCommandIdChecked(command_id);
+      if (command_id >= ash::USE_LAUNCH_TYPE_COMMAND_START &&
+          command_id < ash::USE_LAUNCH_TYPE_COMMAND_END) {
+        auto* provider = web_app::WebAppProvider::Get(profile());
+        DCHECK(provider);
+        web_app::DisplayMode effective_display_mode =
+            provider->registrar().GetAppEffectiveDisplayMode(app_id());
+        return effective_display_mode != web_app::DisplayMode::kUndefined &&
+               effective_display_mode ==
+                   ConvertUseLaunchTypeCommandToDisplayMode(command_id);
       }
-      // Otherwise deliberately fall through to fallback on Bookmark Apps.
-      FALLTHROUGH;
+      return AppContextMenu::IsCommandIdChecked(command_id);
     case apps::mojom::AppType::kExtension:
       if (command_id >= ash::USE_LAUNCH_TYPE_COMMAND_START &&
           command_id < ash::USE_LAUNCH_TYPE_COMMAND_END) {
@@ -295,22 +290,18 @@
 
 void AppServiceContextMenu::SetLaunchType(int command_id) {
   switch (app_type_) {
-    case apps::mojom::AppType::kWeb:
-      if (base::FeatureList::IsEnabled(
-              features::kDesktopPWAsWithoutExtensions)) {
-        // Web apps can only toggle between kStandalone and kBrowser.
-        web_app::DisplayMode user_display_mode =
-            ConvertUseLaunchTypeCommandToDisplayMode(command_id);
-        if (user_display_mode != web_app::DisplayMode::kUndefined) {
-          auto* provider = web_app::WebAppProvider::Get(profile());
-          DCHECK(provider);
-          provider->registry_controller().SetAppUserDisplayMode(
-              app_id(), user_display_mode);
-        }
-        return;
+    case apps::mojom::AppType::kWeb: {
+      // Web apps can only toggle between kStandalone and kBrowser.
+      web_app::DisplayMode user_display_mode =
+          ConvertUseLaunchTypeCommandToDisplayMode(command_id);
+      if (user_display_mode != web_app::DisplayMode::kUndefined) {
+        auto* provider = web_app::WebAppProvider::Get(profile());
+        DCHECK(provider);
+        provider->registry_controller().SetAppUserDisplayMode(
+            app_id(), user_display_mode);
       }
-      // Otherwise deliberately fall through to fallback on Bookmark Apps.
-      FALLTHROUGH;
+      return;
+    }
     case apps::mojom::AppType::kExtension: {
       // Hosted apps can only toggle between LAUNCH_TYPE_WINDOW and
       // LAUNCH_TYPE_REGULAR.
diff --git a/chrome/browser/ui/app_list/search/arc/arc_app_reinstall_search_provider_unittest.cc b/chrome/browser/ui/app_list/search/arc/arc_app_reinstall_search_provider_unittest.cc
index f6e975e..d309106 100644
--- a/chrome/browser/ui/app_list/search/arc/arc_app_reinstall_search_provider_unittest.cc
+++ b/chrome/browser/ui/app_list/search/arc/arc_app_reinstall_search_provider_unittest.cc
@@ -10,6 +10,7 @@
 
 #include "ash/public/cpp/app_list/app_list_features.h"
 #include "base/command_line.h"
+#include "base/memory/ptr_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
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 cbce4a7e..3a4b690 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
@@ -851,7 +851,7 @@
   views::Widget* CreateArcWindow(const std::string& window_app_id) {
     views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
     params.bounds = gfx::Rect(5, 5, 20, 20);
-    params.context = ash_test_helper()->CurrentContext();
+    params.context = ash_test_helper()->GetContext();
     views::Widget* widget = new views::Widget();
     widget->Init(std::move(params));
     // Set ARC id before showing the window to be recognized in
diff --git a/chrome/browser/ui/ash/launcher/shelf_context_menu_unittest.cc b/chrome/browser/ui/ash/launcher/shelf_context_menu_unittest.cc
index 8a8f7d8..7d48ddc5 100644
--- a/chrome/browser/ui/ash/launcher/shelf_context_menu_unittest.cc
+++ b/chrome/browser/ui/ash/launcher/shelf_context_menu_unittest.cc
@@ -103,7 +103,7 @@
   views::Widget* CreateArcWindow(const std::string& window_app_id) {
     views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
     views::Widget* widget = new views::Widget();
-    params.context = CurrentContext();
+    params.context = GetContext();
     widget->Init(std::move(params));
     widget->Show();
     widget->Activate();
diff --git a/chrome/browser/ui/ash/network/mobile_data_notifications_unittest.cc b/chrome/browser/ui/ash/network/mobile_data_notifications_unittest.cc
index 21c46d3d080..f50feac7 100644
--- a/chrome/browser/ui/ash/network/mobile_data_notifications_unittest.cc
+++ b/chrome/browser/ui/ash/network/mobile_data_notifications_unittest.cc
@@ -10,6 +10,7 @@
 #include <utility>
 
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
diff --git a/chrome/browser/ui/autofill/payments/save_upi_bubble_controller_impl_browsertest.cc b/chrome/browser/ui/autofill/payments/save_upi_bubble_controller_impl_browsertest.cc
index 62b4971..a5b114d 100644
--- a/chrome/browser/ui/autofill/payments/save_upi_bubble_controller_impl_browsertest.cc
+++ b/chrome/browser/ui/autofill/payments/save_upi_bubble_controller_impl_browsertest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/autofill/payments/save_upi_bubble_controller_impl.h"
 
+#include "base/bind_helpers.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/test/test_browser_dialog.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/ui/blocked_content/popup_tracker.cc b/chrome/browser/ui/blocked_content/popup_tracker.cc
index 08f055e..2b98f853 100644
--- a/chrome/browser/ui/blocked_content/popup_tracker.cc
+++ b/chrome/browser/ui/blocked_content/popup_tracker.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/ui/blocked_content/popup_tracker.h"
 
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/time/default_tick_clock.h"
 #include "chrome/browser/ui/blocked_content/popup_opener_tab_helper.h"
diff --git a/chrome/browser/ui/extensions/extension_installed_waiter_unittest.cc b/chrome/browser/ui/extensions/extension_installed_waiter_unittest.cc
index 45975a3..2cc173f 100644
--- a/chrome/browser/ui/extensions/extension_installed_waiter_unittest.cc
+++ b/chrome/browser/ui/extensions/extension_installed_waiter_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/extensions/extension_installed_waiter.h"
 
+#include "base/bind_helpers.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/load_error_reporter.h"
 #include "chrome/browser/extensions/test_extension_system.h"
diff --git a/chrome/browser/ui/input_method/input_method_engine_unittest.cc b/chrome/browser/ui/input_method/input_method_engine_unittest.cc
index cb1408f..4f65d6c 100644
--- a/chrome/browser/ui/input_method/input_method_engine_unittest.cc
+++ b/chrome/browser/ui/input_method/input_method_engine_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/input_method/input_method_engine.h"
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/run_loop.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "chrome/browser/profiles/profile_manager.h"
diff --git a/chrome/browser/ui/startup/startup_browser_creator.cc b/chrome/browser/ui/startup/startup_browser_creator.cc
index 2c013f1..55c7e1304 100644
--- a/chrome/browser/ui/startup/startup_browser_creator.cc
+++ b/chrome/browser/ui/startup/startup_browser_creator.cc
@@ -20,6 +20,7 @@
 #include "base/lazy_instance.h"
 #include "base/logging.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_base.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/statistics_recorder.h"
diff --git a/chrome/browser/ui/tab_helpers.cc b/chrome/browser/ui/tab_helpers.cc
index dcdcb23df..3067a9ff 100644
--- a/chrome/browser/ui/tab_helpers.cc
+++ b/chrome/browser/ui/tab_helpers.cc
@@ -134,6 +134,10 @@
 #include "components/zoom/zoom_controller.h"
 #endif  // defined(OS_ANDROID)
 
+#if defined(OS_CHROMEOS)
+#include "chrome/browser/chromeos/child_accounts/time_limits/web_time_navigation_observer.h"
+#endif
+
 #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
 #include "chrome/browser/ui/blocked_content/framebust_block_tab_helper.h"
 #include "chrome/browser/ui/hats/hats_helper.h"
@@ -171,10 +175,6 @@
 #include "chrome/browser/supervised_user/supervised_user_navigation_observer.h"
 #endif
 
-#if defined(OS_CHROMEOS)
-#include "chrome/browser/chromeos/child_accounts/time_limits/web_time_navigation_observer.h"
-#endif
-
 using content::WebContents;
 
 namespace {
@@ -197,7 +197,8 @@
                             std::make_unique<base::SupportsUserData::Data>());
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
-  // Set the view type.
+  // Set the view type. This is done first because some tab helpers (TODO(avi):
+  // which ones? https://crbug.com/1058951) rely on it being set.
   extensions::SetViewType(web_contents, extensions::VIEW_TYPE_TAB_CONTENTS);
 #endif
 
@@ -213,7 +214,11 @@
   zoom::ZoomController::CreateForWebContents(web_contents);
 #endif
 
-  // --- Common tab helpers ---
+  Profile* profile =
+      Profile::FromBrowserContext(web_contents->GetBrowserContext());
+
+  // --- Section 1: Common tab helpers ---
+
   autofill::ChromeAutofillClient::CreateForWebContents(web_contents);
   autofill::ContentAutofillDriverFactory::CreateForWebContentsAndDelegate(
       web_contents,
@@ -236,9 +241,6 @@
   ExternalProtocolObserver::CreateForWebContents(web_contents);
   favicon::CreateContentFaviconDriverForWebContents(web_contents);
   FindBarState::ConfigureWebContents(web_contents);
-
-  Profile* profile =
-      Profile::FromBrowserContext(web_contents->GetBrowserContext());
   download::DownloadNavigationObserver::CreateForWebContents(
       web_contents,
       download::NavigationMonitorFactory::GetForKey(profile->GetProfileKey()));
@@ -248,6 +250,10 @@
   InfoBarService::CreateForWebContents(web_contents);
   InstallableManager::CreateForWebContents(web_contents);
   IsolatedPrerenderTabHelper::CreateForWebContents(web_contents);
+  if (MediaEngagementService::IsEnabled())
+    MediaEngagementService::CreateWebContentsObserver(web_contents);
+  if (base::FeatureList::IsEnabled(media::kUseMediaHistoryStore))
+    MediaHistoryContentsObserver::CreateForWebContents(web_contents);
   metrics::RendererUptimeWebContentsObserver::CreateForWebContents(
       web_contents);
   MixedContentSettingsTabHelper::CreateForWebContents(web_contents);
@@ -260,17 +266,27 @@
   OutOfMemoryReporter::CreateForWebContents(web_contents);
   chrome::InitializePageLoadMetricsForWebContents(web_contents);
   PDFPluginPlaceholderObserver::CreateForWebContents(web_contents);
+  if (auto* performance_manager_registry =
+          performance_manager::PerformanceManagerRegistry::GetInstance()) {
+    performance_manager_registry->CreatePageNodeForWebContents(web_contents);
+  }
   permissions::PermissionRequestManager::CreateForWebContents(web_contents);
   // The PopupBlockerTabHelper has an implicit dependency on
   // ChromeSubresourceFilterClient being available in its constructor.
   PopupBlockerTabHelper::CreateForWebContents(web_contents);
   PopupOpenerTabHelper::CreateForWebContents(
       web_contents, base::DefaultTickClock::GetInstance());
+  if (predictors::LoadingPredictorFactory::GetForProfile(profile))
+    predictors::LoadingPredictorTabHelper::CreateForWebContents(web_contents);
   PrefsTabHelper::CreateForWebContents(web_contents);
   prerender::PrerenderTabHelper::CreateForWebContents(web_contents);
   PreviewsLitePageRedirectPredictor::CreateForWebContents(web_contents);
   PreviewsUITabHelper::CreateForWebContents(web_contents);
   RecentlyAudibleHelper::CreateForWebContents(web_contents);
+  // TODO(siggi): Remove this once the Resource Coordinator refactoring is done.
+  //     See https://crbug.com/910288.
+  resource_coordinator::ResourceCoordinatorTabHelper::CreateForWebContents(
+      web_contents);
   ResourceLoadingHintsWebContentsObserver::CreateForWebContents(web_contents);
   safe_browsing::SafeBrowsingNavigationObserver::MaybeCreateForWebContents(
       web_contents);
@@ -288,17 +304,18 @@
       web_contents,
       sync_sessions::SyncSessionsWebContentsRouterFactory::GetForProfile(
           profile));
-
   TabSpecificContentSettings::CreateForWebContents(web_contents);
   TabUIHelper::CreateForWebContents(web_contents);
   tasks::TaskTabHelper::CreateForWebContents(web_contents);
+  if (tracing::NavigationTracingObserver::IsEnabled())
+    tracing::NavigationTracingObserver::CreateForWebContents(web_contents);
   ukm::InitializeSourceUrlRecorderForWebContents(web_contents);
   vr::VrTabHelper::CreateForWebContents(web_contents);
 
   // NO! Do not just add your tab helper here. This is a large alphabetized
   // block; please insert your tab helper above in alphabetical order.
 
-  // --- Platform-specific tab helpers ---
+  // --- Section 2: Platform-specific tab helpers ---
 
 #if defined(OS_ANDROID)
   {
@@ -353,6 +370,11 @@
   web_modal::WebContentsModalDialogManager::CreateForWebContents(web_contents);
 #endif
 
+#if defined(OS_CHROMEOS)
+  chromeos::app_time::WebTimeNavigationObserver::MaybeCreateForWebContents(
+      web_contents);
+#endif
+
 #if defined(OS_WIN) || defined(OS_MACOSX) || \
     (defined(OS_LINUX) && !defined(OS_CHROMEOS))
   metrics::DesktopSessionDurationObserver::CreateForWebContents(web_contents);
@@ -367,7 +389,8 @@
   }
 #endif
 
-  // --- Feature tab helpers behind flags ---
+  // --- Section 3: Feature tab helpers behind BUILDFLAGs ---
+  // NOT for "if enabled"; put those in section 1.
 
 #if BUILDFLAG(ENABLE_CAPTIVE_PORTAL_DETECTION)
   captive_portal::CaptivePortalTabHelper::CreateForWebContents(
@@ -394,6 +417,7 @@
   HungPluginTabHelper::CreateForWebContents(web_contents);
   PluginObserver::CreateForWebContents(web_contents);
 #endif
+
 #if BUILDFLAG(ENABLE_PRINTING)
   printing::InitializePrinting(web_contents);
 #endif
@@ -402,30 +426,19 @@
   SupervisedUserNavigationObserver::MaybeCreateForWebContents(web_contents);
 #endif
 
-#if defined(OS_CHROMEOS)
-  chromeos::app_time::WebTimeNavigationObserver::MaybeCreateForWebContents(
-      web_contents);
-#endif
+  // --- Section 4: The warning ---
 
-  if (predictors::LoadingPredictorFactory::GetForProfile(profile))
-    predictors::LoadingPredictorTabHelper::CreateForWebContents(web_contents);
+  // NONO    NO   NONONO   !
+  // NO NO   NO  NO    NO  !
+  // NO  NO  NO  NO    NO  !
+  // NO   NO NO  NO    NO
+  // NO    NONO   NONONO   !
 
-  if (tracing::NavigationTracingObserver::IsEnabled())
-    tracing::NavigationTracingObserver::CreateForWebContents(web_contents);
+  // Do NOT just drop your tab helpers here! There are three sections above (1.
+  // All platforms, 2. Some platforms, 3. Behind BUILDFLAGs). Each is in rough
+  // alphabetical order. PLEASE PLEASE PLEASE add your flag to the correct
+  // section in the correct order.
 
-  if (MediaEngagementService::IsEnabled())
-    MediaEngagementService::CreateWebContentsObserver(web_contents);
-
-  if (base::FeatureList::IsEnabled(media::kUseMediaHistoryStore))
-    MediaHistoryContentsObserver::CreateForWebContents(web_contents);
-
-  if (auto* performance_manager_registry =
-          performance_manager::PerformanceManagerRegistry::GetInstance()) {
-    performance_manager_registry->CreatePageNodeForWebContents(web_contents);
-  }
-
-  // TODO(siggi): Remove this once the Resource Coordinator refactoring is done.
-  //     See https://crbug.com/910288.
-  resource_coordinator::ResourceCoordinatorTabHelper::CreateForWebContents(
-      web_contents);
+  // This is common code for all of us. PLEASE DO YOUR PART to keep it tidy and
+  // organized.
 }
diff --git a/chrome/browser/ui/tab_sharing/tab_sharing_infobar_delegate.cc b/chrome/browser/ui/tab_sharing/tab_sharing_infobar_delegate.cc
index f02714a..b30e998 100644
--- a/chrome/browser/ui/tab_sharing/tab_sharing_infobar_delegate.cc
+++ b/chrome/browser/ui/tab_sharing/tab_sharing_infobar_delegate.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "base/memory/ptr_util.h"
 #include "chrome/browser/infobars/infobar_service.h"
 #include "chrome/browser/ui/tab_sharing/tab_sharing_ui.h"
 #include "chrome/grit/generated_resources.h"
diff --git a/chrome/browser/ui/thumbnails/thumbnail_page_event_adapter.cc b/chrome/browser/ui/thumbnails/thumbnail_page_event_adapter.cc
deleted file mode 100644
index 8ae245c..0000000
--- a/chrome/browser/ui/thumbnails/thumbnail_page_event_adapter.cc
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/thumbnails/thumbnail_page_event_adapter.h"
-
-#include "content/public/browser/navigation_handle.h"
-#include "content/public/browser/render_view_host.h"
-#include "content/public/browser/render_widget_host.h"
-#include "content/public/browser/render_widget_host_view.h"
-#include "content/public/browser/web_contents.h"
-
-namespace thumbnails {
-
-namespace {
-
-bool IsMainFrame(content::RenderFrameHost* render_frame_host) {
-  return !render_frame_host->GetParent();
-}
-
-}  // namespace
-
-ThumbnailPageEventAdapter::ThumbnailPageEventAdapter(
-    content::WebContents* contents)
-    : content::WebContentsObserver(contents) {}
-
-ThumbnailPageEventAdapter::~ThumbnailPageEventAdapter() = default;
-
-void ThumbnailPageEventAdapter::AddObserver(ThumbnailPageObserver* observer) {
-  observers_.AddObserver(observer);
-}
-
-void ThumbnailPageEventAdapter::RemoveObserver(
-    ThumbnailPageObserver* observer) {
-  if (observers_.HasObserver(observer))
-    observers_.RemoveObserver(observer);
-}
-
-void ThumbnailPageEventAdapter::OnVisibilityChanged(
-    content::Visibility visibility) {
-  const bool visible = visibility == content::Visibility::VISIBLE;
-  for (auto& observer : observers_)
-    observer.VisibilityChanged(visible);
-}
-
-void ThumbnailPageEventAdapter::DidStartNavigation(
-    content::NavigationHandle* navigation_handle) {
-  if (navigation_handle->IsInMainFrame() &&
-      !navigation_handle->IsSameDocument()) {
-    const GURL& url = navigation_handle->GetWebContents()->GetVisibleURL();
-    for (auto& observer : observers_)
-      observer.TopLevelNavigationStarted(url);
-  }
-}
-
-void ThumbnailPageEventAdapter::DidRedirectNavigation(
-    content::NavigationHandle* navigation_handle) {
-  if (navigation_handle->IsInMainFrame() &&
-      !navigation_handle->IsSameDocument()) {
-    const GURL& url = navigation_handle->GetWebContents()->GetVisibleURL();
-    for (auto& observer : observers_)
-      observer.TopLevelNavigationStarted(url);
-  }
-}
-
-void ThumbnailPageEventAdapter::DidFinishNavigation(
-    content::NavigationHandle* navigation_handle) {
-  if (navigation_handle->IsInMainFrame()) {
-    const GURL& url = navigation_handle->GetWebContents()->GetVisibleURL();
-    for (auto& observer : observers_)
-      observer.TopLevelNavigationEnded(url);
-  }
-}
-
-void ThumbnailPageEventAdapter::DocumentAvailableInMainFrame() {
-  for (auto& observer : observers_)
-    observer.PageLoadStarted();
-}
-
-void ThumbnailPageEventAdapter::DidFirstVisuallyNonEmptyPaint() {
-  for (auto& observer : observers_)
-    observer.PagePainted();
-}
-
-void ThumbnailPageEventAdapter::DidFinishLoad(
-    content::RenderFrameHost* render_frame_host,
-    const GURL& validated_url) {
-  if (IsMainFrame(render_frame_host)) {
-    for (auto& observer : observers_)
-      observer.PageLoadFinished();
-  }
-}
-
-void ThumbnailPageEventAdapter::DidFailLoad(
-    content::RenderFrameHost* render_frame_host,
-    const GURL& validated_url,
-    int error_code) {
-  if (IsMainFrame(render_frame_host)) {
-    for (auto& observer : observers_)
-      observer.PageLoadFinished();
-  }
-}
-
-void ThumbnailPageEventAdapter::NavigationStopped() {
-  const GURL& url = web_contents()->GetVisibleURL();
-  for (auto& observer : observers_) {
-    observer.TopLevelNavigationEnded(url);
-    observer.PageLoadFinished();
-  }
-}
-
-void ThumbnailPageEventAdapter::BeforeUnloadFired(
-    bool proceed,
-    const base::TimeTicks& proceed_time) {
-  is_unloading_ = true;
-}
-
-void ThumbnailPageEventAdapter::BeforeUnloadDialogCancelled() {
-  is_unloading_ = false;
-}
-
-}  // namespace thumbnails
diff --git a/chrome/browser/ui/thumbnails/thumbnail_page_event_adapter.h b/chrome/browser/ui/thumbnails/thumbnail_page_event_adapter.h
deleted file mode 100644
index 4e71dce..0000000
--- a/chrome/browser/ui/thumbnails/thumbnail_page_event_adapter.h
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_THUMBNAILS_THUMBNAIL_PAGE_EVENT_ADAPTER_H_
-#define CHROME_BROWSER_UI_THUMBNAILS_THUMBNAIL_PAGE_EVENT_ADAPTER_H_
-
-#include "base/macros.h"
-#include "base/scoped_observer.h"
-#include "chrome/browser/ui/thumbnails/thumbnail_page_observer.h"
-#include "content/public/browser/web_contents_observer.h"
-#include "url/gurl.h"
-
-namespace content {
-class NavigationHandle;
-class RenderFrameHost;
-}  // namespace content
-
-namespace thumbnails {
-
-// Base class for thumbnail tab helper; processes specific web contents events
-// into a filtered-down set of navigation and loading events for ease of
-// processing.
-class ThumbnailPageEventAdapter : public content::WebContentsObserver {
- public:
-  explicit ThumbnailPageEventAdapter(content::WebContents* contents);
-  ~ThumbnailPageEventAdapter() override;
-
-  bool is_unloading() const { return is_unloading_; }
-
-  void AddObserver(ThumbnailPageObserver* observer);
-  void RemoveObserver(ThumbnailPageObserver* observer);
-
- protected:
-  // WebContentsObserver:
-  void OnVisibilityChanged(content::Visibility visibility) override;
-  void DidStartNavigation(
-      content::NavigationHandle* navigation_handle) override;
-  void DidRedirectNavigation(
-      content::NavigationHandle* navigation_handle) override;
-  void DidFinishNavigation(
-      content::NavigationHandle* navigation_handle) override;
-  void DocumentAvailableInMainFrame() override;
-  void DidFirstVisuallyNonEmptyPaint() override;
-  void DidFinishLoad(content::RenderFrameHost* render_frame_host,
-                     const GURL& validated_url) override;
-  void DidFailLoad(content::RenderFrameHost* render_frame_host,
-                   const GURL& validated_url,
-                   int error_code) override;
-  void NavigationStopped() override;
-  void BeforeUnloadFired(bool proceed,
-                         const base::TimeTicks& proceed_time) override;
-  void BeforeUnloadDialogCancelled() override;
-
- private:
-  base::ObserverList<ThumbnailPageObserver> observers_;
-
-  // True if the current page is in the process of being unloaded from the
-  // browser (e.g. on a tab or window close).
-  bool is_unloading_ = false;
-
-  DISALLOW_COPY_AND_ASSIGN(ThumbnailPageEventAdapter);
-};
-
-}  // namespace thumbnails
-
-#endif  // CHROME_BROWSER_UI_THUMBNAILS_THUMBNAIL_PAGE_EVENT_ADAPTER_H_
diff --git a/chrome/browser/ui/thumbnails/thumbnail_page_observer.h b/chrome/browser/ui/thumbnails/thumbnail_page_observer.h
deleted file mode 100644
index 70c03a2b..0000000
--- a/chrome/browser/ui/thumbnails/thumbnail_page_observer.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_THUMBNAILS_THUMBNAIL_PAGE_OBSERVER_H_
-#define CHROME_BROWSER_UI_THUMBNAILS_THUMBNAIL_PAGE_OBSERVER_H_
-
-#include "base/observer_list_types.h"
-#include "url/gurl.h"
-
-namespace thumbnails {
-
-// Observer of navigation and loading events relevant to thumbnail processing.
-//
-// Note that while most page loads receive the following signals in order:
-//   - Navigation Started
-//   - Navigation Ended
-//   - Page Load Started
-//   - Page Load Finished
-//
-// Not all page transitions will receive all of these or in that order.
-// Classes implementing this interface should be able to handle a navigation end
-// without a start, or a frame load without a prior navigation.
-class ThumbnailPageObserver : public base::CheckedObserver {
- public:
-  // Called when navigation in the top-level browser window starts.
-  virtual void TopLevelNavigationStarted(const GURL& url) = 0;
-
-  // Called when navigation in the top-level browser window completes.
-  virtual void TopLevelNavigationEnded(const GURL& url) = 0;
-
-  // Called when the page/tab's visibility changes.
-  virtual void VisibilityChanged(bool visible) = 0;
-
-  // Called when the page is painted for the first time.
-  virtual void PagePainted() = 0;
-
-  // Called when a page begins to load.
-  virtual void PageLoadStarted() = 0;
-
-  // Called when a page finishes loading.
-  virtual void PageLoadFinished() = 0;
-};
-
-}  // namespace thumbnails
-
-#endif  // CHROME_BROWSER_UI_THUMBNAILS_THUMBNAIL_PAGE_OBSERVER_H_
diff --git a/chrome/browser/ui/thumbnails/thumbnail_tab_helper.h b/chrome/browser/ui/thumbnails/thumbnail_tab_helper.h
index 972cf87..ceaa1a4 100644
--- a/chrome/browser/ui/thumbnails/thumbnail_tab_helper.h
+++ b/chrome/browser/ui/thumbnails/thumbnail_tab_helper.h
@@ -12,8 +12,6 @@
 #include "base/scoped_observer.h"
 #include "base/time/time.h"
 #include "chrome/browser/ui/thumbnails/thumbnail_image.h"
-#include "chrome/browser/ui/thumbnails/thumbnail_page_event_adapter.h"
-#include "chrome/browser/ui/thumbnails/thumbnail_page_observer.h"
 #include "components/viz/host/client_frame_sink_video_capturer.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/web_contents_observer.h"
diff --git a/chrome/browser/ui/views/DEPS b/chrome/browser/ui/views/DEPS
index 64314b9..b6849eb3 100644
--- a/chrome/browser/ui/views/DEPS
+++ b/chrome/browser/ui/views/DEPS
@@ -11,6 +11,9 @@
     "+ash/shell.h",
     "+ash/wm/window_state.h",
   ],
+  "qrcode_generator\.*": [
+    "+chrome/services/qrcode_generator/public/cpp/qrcode_generator_service.h"
+  ],
   # mash-ok
   "screen_capture_notification_ui_views\.cc": [
     "+ash/shell.h",
diff --git a/chrome/browser/ui/views/autofill/payments/virtual_card_selection_dialog_browsertest.cc b/chrome/browser/ui/views/autofill/payments/virtual_card_selection_dialog_browsertest.cc
index a405f1b0..7c29f37 100644
--- a/chrome/browser/ui/views/autofill/payments/virtual_card_selection_dialog_browsertest.cc
+++ b/chrome/browser/ui/views/autofill/payments/virtual_card_selection_dialog_browsertest.cc
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/bind_helpers.h"
 #include "base/run_loop.h"
 #include "chrome/browser/ui/autofill/payments/virtual_card_selection_dialog_controller_impl.h"
 #include "chrome/browser/ui/autofill/payments/virtual_card_selection_dialog_view.h"
diff --git a/chrome/browser/ui/views/autofill/payments/webauthn_dialog_browsertest.cc b/chrome/browser/ui/views/autofill/payments/webauthn_dialog_browsertest.cc
index 41de9cc..dfc51c4 100644
--- a/chrome/browser/ui/views/autofill/payments/webauthn_dialog_browsertest.cc
+++ b/chrome/browser/ui/views/autofill/payments/webauthn_dialog_browsertest.cc
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/bind_helpers.h"
 #include "base/run_loop.h"
 #include "chrome/browser/ui/autofill/payments/webauthn_dialog_controller_impl.h"
 #include "chrome/browser/ui/autofill/payments/webauthn_dialog_view.h"
diff --git a/chrome/browser/ui/views/crostini/crostini_ansible_software_config_view.cc b/chrome/browser/ui/views/crostini/crostini_ansible_software_config_view.cc
index 94af388..c9fe5a8a 100644
--- a/chrome/browser/ui/views/crostini/crostini_ansible_software_config_view.cc
+++ b/chrome/browser/ui/views/crostini/crostini_ansible_software_config_view.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/views/crostini/crostini_ansible_software_config_view.h"
 
+#include "base/bind_helpers.h"
 #include "base/logging.h"
 #include "chrome/browser/chromeos/crostini/crostini_util.h"
 #include "chrome/browser/ui/browser_dialogs.h"
diff --git a/chrome/browser/ui/views/crostini/crostini_uninstaller_view_browsertest.cc b/chrome/browser/ui/views/crostini/crostini_uninstaller_view_browsertest.cc
index ecd60f5..c0a3b55 100644
--- a/chrome/browser/ui/views/crostini/crostini_uninstaller_view_browsertest.cc
+++ b/chrome/browser/ui/views/crostini/crostini_uninstaller_view_browsertest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/views/crostini/crostini_uninstaller_view.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_base.h"
 #include "base/run_loop.h"
 #include "base/test/metrics/histogram_tester.h"
diff --git a/chrome/browser/ui/views/global_media_controls/media_dialog_view_interactive_browsertest.cc b/chrome/browser/ui/views/global_media_controls/media_dialog_view_interactive_browsertest.cc
index 1c2d8b0..ab4ec9d 100644
--- a/chrome/browser/ui/views/global_media_controls/media_dialog_view_interactive_browsertest.cc
+++ b/chrome/browser/ui/views/global_media_controls/media_dialog_view_interactive_browsertest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/views/global_media_controls/media_dialog_view.h"
 
+#include "base/bind_helpers.h"
 #include "base/run_loop.h"
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/media/router/media_router_factory.h"
diff --git a/chrome/browser/ui/views/hung_plugin_tab_helper_unittest.cc b/chrome/browser/ui/views/hung_plugin_tab_helper_unittest.cc
index b607cf7..8c08faa 100644
--- a/chrome/browser/ui/views/hung_plugin_tab_helper_unittest.cc
+++ b/chrome/browser/ui/views/hung_plugin_tab_helper_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/hung_plugin_tab_helper.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/scoped_observer.h"
 #include "chrome/browser/infobars/infobar_service.h"
 #include "chrome/browser/ui/views/infobars/confirm_infobar.h"
diff --git a/chrome/browser/ui/views/location_bar/icon_label_bubble_view_unittest.cc b/chrome/browser/ui/views/location_bar/icon_label_bubble_view_unittest.cc
index 63e6935..48b480450 100644
--- a/chrome/browser/ui/views/location_bar/icon_label_bubble_view_unittest.cc
+++ b/chrome/browser/ui/views/location_bar/icon_label_bubble_view_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/views/location_bar/icon_label_bubble_view.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/optional.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/ui/layout_constants.h"
diff --git a/chrome/browser/ui/views/native_file_system/native_file_system_directory_access_confirmation_view.cc b/chrome/browser/ui/views/native_file_system/native_file_system_directory_access_confirmation_view.cc
index 8330324..a17d5b0 100644
--- a/chrome/browser/ui/views/native_file_system/native_file_system_directory_access_confirmation_view.cc
+++ b/chrome/browser/ui/views/native_file_system/native_file_system_directory_access_confirmation_view.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/ui/views/native_file_system/native_file_system_directory_access_confirmation_view.h"
 
 #include "base/files/file_path.h"
+#include "base/memory/ptr_util.h"
 #include "chrome/app/vector_icons/vector_icons.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/browser/ui/views/chrome_typography.h"
diff --git a/chrome/browser/ui/views/native_file_system/native_file_system_permission_view.cc b/chrome/browser/ui/views/native_file_system/native_file_system_permission_view.cc
index 592e212..04c46ab5 100644
--- a/chrome/browser/ui/views/native_file_system/native_file_system_permission_view.cc
+++ b/chrome/browser/ui/views/native_file_system/native_file_system_permission_view.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/ui/views/native_file_system/native_file_system_permission_view.h"
 
 #include "base/files/file_path.h"
+#include "base/memory/ptr_util.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/browser/ui/views/chrome_typography.h"
 #include "chrome/browser/ui/views/native_file_system/native_file_system_ui_helpers.h"
diff --git a/chrome/browser/ui/views/native_file_system/native_file_system_restricted_directory_dialog_view.cc b/chrome/browser/ui/views/native_file_system/native_file_system_restricted_directory_dialog_view.cc
index be74c256..ae8db228 100644
--- a/chrome/browser/ui/views/native_file_system/native_file_system_restricted_directory_dialog_view.cc
+++ b/chrome/browser/ui/views/native_file_system/native_file_system_restricted_directory_dialog_view.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/views/native_file_system/native_file_system_restricted_directory_dialog_view.h"
 
+#include "base/memory/ptr_util.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/browser/ui/views/chrome_typography.h"
 #include "chrome/browser/ui/views/native_file_system/native_file_system_ui_helpers.h"
diff --git a/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view_unittest.cc b/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view_unittest.cc
index 5e2041c..1c5800a 100644
--- a/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view_unittest.cc
+++ b/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view.h"
 
+#include "base/bind_helpers.h"
 #include "chrome/browser/content_settings/tab_specific_content_settings.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/test/base/testing_profile.h"
diff --git a/chrome/browser/ui/views/passwords/password_save_update_with_account_store_view_unittest.cc b/chrome/browser/ui/views/passwords/password_save_update_with_account_store_view_unittest.cc
index ad04885..4203946 100644
--- a/chrome/browser/ui/views/passwords/password_save_update_with_account_store_view_unittest.cc
+++ b/chrome/browser/ui/views/passwords/password_save_update_with_account_store_view_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/views/passwords/password_save_update_with_account_store_view.h"
 
+#include "base/memory/ptr_util.h"
 #include "chrome/browser/password_manager/password_store_factory.h"
 #include "chrome/browser/signin/identity_test_environment_profile_adaptor.h"
 #include "chrome/browser/ui/passwords/manage_passwords_ui_controller.h"
diff --git a/chrome/browser/ui/views/profiles/incognito_menu_view.cc b/chrome/browser/ui/views/profiles/incognito_menu_view.cc
index 6f376f2..5ca1756 100644
--- a/chrome/browser/ui/views/profiles/incognito_menu_view.cc
+++ b/chrome/browser/ui/views/profiles/incognito_menu_view.cc
@@ -9,6 +9,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/macros.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
diff --git a/chrome/browser/ui/views/qrcode_generator/qrcode_generator_bubble.cc b/chrome/browser/ui/views/qrcode_generator/qrcode_generator_bubble.cc
index 3cf9f961..c9eb40e9 100644
--- a/chrome/browser/ui/views/qrcode_generator/qrcode_generator_bubble.cc
+++ b/chrome/browser/ui/views/qrcode_generator/qrcode_generator_bubble.cc
@@ -50,7 +50,7 @@
 gfx::ImageSkia GetPlaceholderImageSkia(unsigned r, unsigned g, unsigned b) {
   SkBitmap bitmap;
   bitmap.allocN32Pixels(kQRImageSizePx, kQRImageSizePx);
-  bitmap.eraseARGB(r, g, b, 0);
+  bitmap.eraseARGB(0xFF, r, g, b);
   return gfx::ImageSkia(gfx::ImageSkiaRep(bitmap, 1.0f));
 }
 
@@ -95,12 +95,30 @@
 }
 
 void QRCodeGeneratorBubble::UpdateQRContent() {
-  // TODO(skare): Generate QR code OOP.
-  // This is being done in a mojo service in a follow-on change.
-  // At that time, handle error code for url-too-long, and !url_.valid().
-  // As a placeholder, we cycle colors randomly as input changes.
-  UpdateQRImage(
-      GetPlaceholderImageSkia(rand() % 0x100, rand() % 0x100, rand() % 0x100));
+  mojom::GenerateQRCodeRequestPtr request = mojom::GenerateQRCodeRequest::New();
+  request->data = base::UTF16ToASCII(textfield_url_->GetText());
+  request->should_render = true;
+  request->render_dino = true;
+  request->render_module_style = mojom::ModuleStyle::CIRCLES;
+  request->render_locator_style = mojom::LocatorStyle::ROUNDED;
+
+  mojom::QRCodeGeneratorService* generator = qr_code_service_remote_.get();
+  // Rationale for Unretained(): Closing dialog closes the communication
+  // channel; callback will not run.
+  auto callback = base::BindOnce(
+      &QRCodeGeneratorBubble::OnCodeGeneratorResponse, base::Unretained(this));
+  generator->GenerateQRCode(std::move(request), std::move(callback));
+}
+
+void QRCodeGeneratorBubble::OnCodeGeneratorResponse(
+    const mojom::GenerateQRCodeResponsePtr response) {
+  if (response->error_code != mojom::QRCodeGeneratorError::NONE) {
+    UpdateQRImage(GetPlaceholderImageSkia(0xFF, 0xFF, 0xFF));
+    return;
+  }
+
+  gfx::ImageSkia image = gfx::ImageSkia::CreateFrom1xBitmap(response->bitmap);
+  UpdateQRImage(image);
 }
 
 void QRCodeGeneratorBubble::UpdateQRImage(gfx::ImageSkia qr_image) {
@@ -159,7 +177,8 @@
   qr_code_image->SetVerticalAlignment(Alignment::kCenter);
   qr_code_image->SetImageSize(GetQRImageSize());
   qr_code_image->SetPreferredSize(GetQRImageSize());
-  qr_code_image->SetImage(GetPlaceholderImageSkia(0x33, 0x33, 0xCC));
+  // google-gray-300
+  qr_code_image->SetImage(GetPlaceholderImageSkia(0xDA, 0xDC, 0xE0));
   layout->StartRow(views::GridLayout::kFixedSize, kSingleColumnSetId);
   qr_code_image_ = layout->AddView(std::move(qr_code_image));
 
@@ -209,6 +228,9 @@
   download_button->SetHorizontalAlignment(gfx::ALIGN_RIGHT);
   download_button_ = layout->AddView(std::move(download_button));
   // End controls row
+
+  // Initialize Service
+  qr_code_service_remote_ = qrcode_generator::LaunchQRCodeGeneratorService();
 }
 
 void QRCodeGeneratorBubble::ContentsChanged(
diff --git a/chrome/browser/ui/views/qrcode_generator/qrcode_generator_bubble.h b/chrome/browser/ui/views/qrcode_generator/qrcode_generator_bubble.h
index dad2338..0a6d549 100644
--- a/chrome/browser/ui/views/qrcode_generator/qrcode_generator_bubble.h
+++ b/chrome/browser/ui/views/qrcode_generator/qrcode_generator_bubble.h
@@ -11,6 +11,7 @@
 #include "base/memory/weak_ptr.h"
 #include "chrome/browser/ui/qrcode_generator/qrcode_generator_bubble_view.h"
 #include "chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.h"
+#include "chrome/services/qrcode_generator/public/cpp/qrcode_generator_service.h"
 #include "ui/views/controls/button/button.h"
 #include "ui/views/controls/textfield/textfield_controller.h"
 #include "url/gurl.h"
@@ -79,6 +80,12 @@
   // ButtonListener:
   void ButtonPressed(views::Button* sender, const ui::Event& event) override;
 
+  // Callback for the request to the OOP service to generate a new image.
+  void OnCodeGeneratorResponse(const mojom::GenerateQRCodeResponsePtr response);
+
+  // Remote to service instance to generate QR code images.
+  mojo::Remote<mojom::QRCodeGeneratorService> qr_code_service_remote_;
+
   // URL for which the QR code is being generated.
   // Used for validation.
   GURL url_;
@@ -91,8 +98,6 @@
 
   QRCodeGeneratorBubbleController* controller_;  // weak.
 
-  base::WeakPtrFactory<QRCodeGeneratorBubble> weak_factory_{this};
-
   DISALLOW_COPY_AND_ASSIGN(QRCodeGeneratorBubble);
 };
 
diff --git a/chrome/browser/ui/views/relaunch_notification/relaunch_notification_controller_unittest.cc b/chrome/browser/ui/views/relaunch_notification/relaunch_notification_controller_unittest.cc
index de59aa3..7b2d7cf7 100644
--- a/chrome/browser/ui/views/relaunch_notification/relaunch_notification_controller_unittest.cc
+++ b/chrome/browser/ui/views/relaunch_notification/relaunch_notification_controller_unittest.cc
@@ -7,7 +7,9 @@
 #include <memory>
 #include <utility>
 
+#include "base/bind_helpers.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/optional.h"
 #include "base/power_monitor/power_monitor.h"
diff --git a/chrome/browser/ui/views/safe_browsing/password_reuse_modal_warning_dialog.cc b/chrome/browser/ui/views/safe_browsing/password_reuse_modal_warning_dialog.cc
index 7ecfc8f..c4dbeaa8 100644
--- a/chrome/browser/ui/views/safe_browsing/password_reuse_modal_warning_dialog.cc
+++ b/chrome/browser/ui/views/safe_browsing/password_reuse_modal_warning_dialog.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/views/safe_browsing/password_reuse_modal_warning_dialog.h"
 
+#include "base/bind_helpers.h"
 #include "base/i18n/rtl.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/app/vector_icons/vector_icons.h"
diff --git a/chrome/browser/ui/views/sharing/click_to_call_browsertest.cc b/chrome/browser/ui/views/sharing/click_to_call_browsertest.cc
index 23babbb..b33add2 100644
--- a/chrome/browser/ui/views/sharing/click_to_call_browsertest.cc
+++ b/chrome/browser/ui/views/sharing/click_to_call_browsertest.cc
@@ -5,6 +5,7 @@
 #include <memory>
 #include <string>
 
+#include "base/bind_helpers.h"
 #include "base/macros.h"
 #include "base/run_loop.h"
 #include "base/strings/strcat.h"
diff --git a/chrome/browser/ui/views/sharing/sharing_browsertest.cc b/chrome/browser/ui/views/sharing/sharing_browsertest.cc
index 52e30c8..5f2ab24 100644
--- a/chrome/browser/ui/views/sharing/sharing_browsertest.cc
+++ b/chrome/browser/ui/views/sharing/sharing_browsertest.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/ui/views/sharing/sharing_browsertest.h"
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_piece.h"
diff --git a/chrome/browser/ui/views/tab_contents/chrome_web_contents_view_focus_helper.cc b/chrome/browser/ui/views/tab_contents/chrome_web_contents_view_focus_helper.cc
index a1df254..2848278 100644
--- a/chrome/browser/ui/views/tab_contents/chrome_web_contents_view_focus_helper.cc
+++ b/chrome/browser/ui/views/tab_contents/chrome_web_contents_view_focus_helper.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/views/tab_contents/chrome_web_contents_view_focus_helper.h"
 
+#include "base/memory/ptr_util.h"
 #include "chrome/browser/ui/sad_tab_helper.h"
 #include "chrome/browser/ui/views/sad_tab_view.h"
 #include "components/web_modal/web_contents_modal_dialog_manager.h"
diff --git a/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.cc b/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.cc
index c2e70b5..eb5ed0e 100644
--- a/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.cc
+++ b/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "base/memory/ptr_util.h"
 #include "base/stl_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
diff --git a/chrome/browser/ui/views/task_manager_view.cc b/chrome/browser/ui/views/task_manager_view.cc
index 5d6ac74..3e87569 100644
--- a/chrome/browser/ui/views/task_manager_view.cc
+++ b/chrome/browser/ui/views/task_manager_view.cc
@@ -6,6 +6,7 @@
 
 #include <stddef.h>
 
+#include "base/bind_helpers.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile_manager.h"
diff --git a/chrome/browser/ui/views/try_chrome_dialog_win/try_chrome_dialog.cc b/chrome/browser/ui/views/try_chrome_dialog_win/try_chrome_dialog.cc
index f4d43fa7..928fcaf 100644
--- a/chrome/browser/ui/views/try_chrome_dialog_win/try_chrome_dialog.cc
+++ b/chrome/browser/ui/views/try_chrome_dialog_win/try_chrome_dialog.cc
@@ -10,6 +10,7 @@
 
 #include "base/bind.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/stl_util.h"
 #include "base/strings/string16.h"
diff --git a/chrome/browser/ui/web_applications/web_app_browser_controller.cc b/chrome/browser/ui/web_applications/web_app_browser_controller.cc
index 645b2bd..e83a4a9 100644
--- a/chrome/browser/ui/web_applications/web_app_browser_controller.cc
+++ b/chrome/browser/ui/web_applications/web_app_browser_controller.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/web_applications/web_app_browser_controller.h"
 
+#include "base/bind_helpers.h"
 #include "base/strings/string_util.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
diff --git a/chrome/browser/ui/webauthn/authenticator_dialog_browsertest.cc b/chrome/browser/ui/webauthn/authenticator_dialog_browsertest.cc
index ddf7995..8ed53f01 100644
--- a/chrome/browser/ui/webauthn/authenticator_dialog_browsertest.cc
+++ b/chrome/browser/ui/webauthn/authenticator_dialog_browsertest.cc
@@ -5,6 +5,7 @@
 #include <memory>
 #include <utility>
 
+#include "base/bind_helpers.h"
 #include "build/build_config.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_window.h"
diff --git a/chrome/browser/ui/webui/browser_switch/browser_switch_ui.cc b/chrome/browser/ui/webui/browser_switch/browser_switch_ui.cc
index f7db04b..47c701f 100644
--- a/chrome/browser/ui/webui/browser_switch/browser_switch_ui.cc
+++ b/chrome/browser/ui/webui/browser_switch/browser_switch_ui.cc
@@ -180,6 +180,10 @@
   // JavaScript promise is not resolved, because we close the tab anyways.
   void HandleLaunchAlternativeBrowserAndCloseTab(const base::ListValue* args);
 
+  void OnLaunchFinished(base::TimeTicks start,
+                        std::string callback_id,
+                        bool success);
+
   // Navigates to the New Tab Page.
   void HandleGotoNewTabPage(const base::ListValue* args);
 
@@ -237,6 +241,8 @@
       browser_switcher::BrowserSwitcherService::CallbackSubscription>
       service_subscription_;
 
+  base::WeakPtrFactory<BrowserSwitchHandler> weak_ptr_factory_{this};
+
   DISALLOW_COPY_AND_ASSIGN(BrowserSwitchHandler);
 };
 
@@ -324,24 +330,31 @@
     return;
   }
 
-  bool success;
-  {
-    SCOPED_UMA_HISTOGRAM_TIMER("BrowserSwitcher.LaunchTime");
-    success = service->driver()->TryLaunch(url);
-    UMA_HISTOGRAM_BOOLEAN("BrowserSwitcher.LaunchSuccess", success);
-  }
+  service->driver()->TryLaunch(
+      url, base::BindOnce(&BrowserSwitchHandler::OnLaunchFinished,
+                          weak_ptr_factory_.GetWeakPtr(),
+                          base::TimeTicks::Now(), std::move(callback_id)));
+}
+
+void BrowserSwitchHandler::OnLaunchFinished(base::TimeTicks start,
+                                            std::string callback_id,
+                                            bool success) {
+  const base::TimeDelta runtime = base::TimeTicks::Now() - start;
+  UMA_HISTOGRAM_TIMES("BrowserSwitcher.LaunchTime", runtime);
+  UMA_HISTOGRAM_BOOLEAN("BrowserSwitcher.LaunchSuccess", success);
 
   if (!success) {
-    RejectJavascriptCallback(args->GetList()[0], base::Value());
+    RejectJavascriptCallback(base::Value(callback_id), base::Value());
     return;
   }
 
+  auto* service = GetBrowserSwitcherService(web_ui());
   auto* profile = Profile::FromWebUI(web_ui());
-
+  // We don't need to resolve the promise, because the tab will close (or
+  // navigate to about:newtab) anyways.
   if (service->prefs().KeepLastTab() && IsLastTab(profile)) {
     GotoNewTabPage(web_ui()->GetWebContents());
   } else {
-    // We don't need to resolve the promise, because the tab will close anyways.
     base::ThreadTaskRunnerHandle::Get()->PostTask(
         FROM_HERE,
         base::BindOnce(&content::WebContents::ClosePage,
diff --git a/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.cc b/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.cc
index ffb38d7..c1d1352 100644
--- a/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/strings/string16.h"
 #include "base/system/sys_info.h"
 #include "chrome/browser/chromeos/crostini/crostini_installer.h"
diff --git a/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_page_handler.cc b/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_page_handler.cc
index 51a80a4..bf1a201 100644
--- a/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_page_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_page_handler.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "chrome/browser/chromeos/crostini/crostini_util.h"
 #include "chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_dialog.h"
 #include "content/public/browser/web_contents.h"
diff --git a/chrome/browser/ui/webui/chromeos/edu_account_login_handler_unittest.cc b/chrome/browser/ui/webui/chromeos/edu_account_login_handler_unittest.cc
index 8f2afe48..909a8b8 100644
--- a/chrome/browser/ui/webui/chromeos/edu_account_login_handler_unittest.cc
+++ b/chrome/browser/ui/webui/chromeos/edu_account_login_handler_unittest.cc
@@ -6,6 +6,7 @@
 
 #include <memory>
 
+#include "base/bind_helpers.h"
 #include "base/json/json_writer.h"
 #include "base/values.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
diff --git a/chrome/browser/ui/webui/favicon_source_unittest.cc b/chrome/browser/ui/webui/favicon_source_unittest.cc
index 39e33cf..d975527 100644
--- a/chrome/browser/ui/webui/favicon_source_unittest.cc
+++ b/chrome/browser/ui/webui/favicon_source_unittest.cc
@@ -7,6 +7,8 @@
 #include <memory>
 #include <utility>
 
+#include "base/bind_helpers.h"
+#include "base/memory/ptr_util.h"
 #include "base/strings/strcat.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/metrics/histogram_tester.h"
diff --git a/chrome/browser/ui/webui/interstitials/interstitial_ui.cc b/chrome/browser/ui/webui/interstitials/interstitial_ui.cc
index e651c6e..a31e5fb 100644
--- a/chrome/browser/ui/webui/interstitials/interstitial_ui.cc
+++ b/chrome/browser/ui/webui/interstitials/interstitial_ui.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/atomic_sequence_num.h"
+#include "base/memory/ptr_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/time/time.h"
diff --git a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
index 11b0db6..5f787a1d 100644
--- a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
@@ -14,6 +14,7 @@
 #include "base/files/file_util.h"
 #include "base/json/json_string_value_serializer.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/optional.h"
 #include "base/path_service.h"
diff --git a/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider.cc
index b26d934..8c8638f 100644
--- a/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider.cc
@@ -339,6 +339,9 @@
       "showTabletModeShelfNavigationButtonsSettings",
       ash::features::IsHideShelfControlsInTabletModeEnabled());
 
+  html_source->AddString("tabletModeShelfNavigationButtonsLearnMoreUrl",
+                         chrome::kTabletModeGesturesLearnMoreURL);
+
   html_source->AddBoolean("enableLiveCaption",
                           base::FeatureList::IsEnabled(media::kLiveCaption));
 
diff --git a/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.cc b/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.cc
index ae0407a..0294ca4 100644
--- a/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.cc
@@ -18,6 +18,7 @@
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/feature_list.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_functions.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc b/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc
index 9da827e..6149a51 100644
--- a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc
+++ b/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
diff --git a/chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.cc b/chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.cc
index 96ef261..33c45b5 100644
--- a/chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.cc
+++ b/chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.cc
@@ -8,6 +8,7 @@
 
 #include "base/json/json_reader.h"
 #include "base/json/json_writer.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/user_metrics.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser_dialogs.h"
diff --git a/chrome/browser/web_applications/manifest_update_manager_browsertest.cc b/chrome/browser/web_applications/manifest_update_manager_browsertest.cc
index a736cd6..9f6546a 100644
--- a/chrome/browser/web_applications/manifest_update_manager_browsertest.cc
+++ b/chrome/browser/web_applications/manifest_update_manager_browsertest.cc
@@ -7,6 +7,7 @@
 #include <string>
 #include <vector>
 
+#include "base/bind_helpers.h"
 #include "base/strings/string_util.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/metrics/histogram_tester.h"
diff --git a/chrome/browser/web_applications/pending_app_registration_task.cc b/chrome/browser/web_applications/pending_app_registration_task.cc
index 5f419c4d..dde6a33 100644
--- a/chrome/browser/web_applications/pending_app_registration_task.cc
+++ b/chrome/browser/web_applications/pending_app_registration_task.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/web_applications/pending_app_registration_task.h"
 
+#include "base/bind_helpers.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/web_applications/components/pending_app_manager.h"
 #include "chrome/browser/web_applications/components/web_app_url_loader.h"
diff --git a/chrome/browser/win/conflicts/module_list_component_updater.cc b/chrome/browser/win/conflicts/module_list_component_updater.cc
index c8ea954..f87606f 100644
--- a/chrome/browser/win/conflicts/module_list_component_updater.cc
+++ b/chrome/browser/win/conflicts/module_list_component_updater.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "base/bind_helpers.h"
 #include "base/task/post_task.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/win/conflicts/module_database.h"
diff --git a/chrome/browser/win/jumplist.cc b/chrome/browser/win/jumplist.cc
index 2b9d637d..b75d278 100644
--- a/chrome/browser/win/jumplist.cc
+++ b/chrome/browser/win/jumplist.cc
@@ -25,11 +25,14 @@
 #include "base/threading/thread.h"
 #include "base/timer/elapsed_timer.h"
 #include "base/trace_event/trace_event.h"
+#include "chrome/browser/browser_process.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/favicon/favicon_service_factory.h"
 #include "chrome/browser/history/top_sites_factory.h"
 #include "chrome/browser/metrics/jumplist_metrics_win.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_attributes_storage.h"
+#include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/sessions/tab_restore_service_factory.h"
 #include "chrome/browser/shell_integration_win.h"
 #include "chrome/browser/win/jumplist_file_util.h"
@@ -98,18 +101,25 @@
     base::TimeDelta::FromMilliseconds(1000);
 
 // Appends the common switches to each shell link.
-void AppendCommonSwitches(ShellLinkItem* shell_link) {
+void AppendCommonSwitches(const base::FilePath& cmd_line_profile_dir,
+                          ShellLinkItem* shell_link) {
   const char* kSwitchNames[] = { switches::kUserDataDir };
   const base::CommandLine& command_line =
       *base::CommandLine::ForCurrentProcess();
   shell_link->GetCommandLine()->CopySwitchesFrom(command_line, kSwitchNames,
                                                  base::size(kSwitchNames));
+  if (!cmd_line_profile_dir.empty()) {
+    shell_link->GetCommandLine()->AppendSwitchPath(switches::kProfileDirectory,
+                                                   cmd_line_profile_dir);
+  }
 }
 
-// Creates a ShellLinkItem preloaded with common switches.
-scoped_refptr<ShellLinkItem> CreateShellLink() {
+// Creates a ShellLinkItem preloaded with common switches, and the profile
+// directory, if |profile_dir| is non-empty.
+scoped_refptr<ShellLinkItem> CreateShellLink(
+    const base::FilePath& cmd_line_profile_dir) {
   auto link = base::MakeRefCounted<ShellLinkItem>();
-  AppendCommonSwitches(link.get());
+  AppendCommonSwitches(cmd_line_profile_dir, link.get());
   return link;
 }
 
@@ -152,9 +162,9 @@
 }
 
 // Updates the "Tasks" category of the JumpList.
-bool UpdateTaskCategory(
-    JumpListUpdater* jumplist_updater,
-    IncognitoModePrefs::Availability incognito_availability) {
+bool UpdateTaskCategory(JumpListUpdater* jumplist_updater,
+                        IncognitoModePrefs::Availability incognito_availability,
+                        const base::FilePath& cmd_line_profile_dir) {
   base::FilePath chrome_path;
   if (!base::PathService::Get(base::FILE_EXE, &chrome_path))
     return false;
@@ -168,7 +178,7 @@
   // We remove '&' characters from this string so we can share it with our
   // system menu.
   if (incognito_availability != IncognitoModePrefs::FORCED) {
-    scoped_refptr<ShellLinkItem> chrome = CreateShellLink();
+    scoped_refptr<ShellLinkItem> chrome = CreateShellLink(cmd_line_profile_dir);
     base::string16 chrome_title = l10n_util::GetStringUTF16(IDS_NEW_WINDOW);
     base::ReplaceSubstringsAfterOffset(
         &chrome_title, 0, L"&", base::StringPiece16());
@@ -180,7 +190,8 @@
   // Create an IShellLink object which launches Chrome in incognito mode, and
   // add it to the collection.
   if (incognito_availability != IncognitoModePrefs::DISABLED) {
-    scoped_refptr<ShellLinkItem> incognito = CreateShellLink();
+    scoped_refptr<ShellLinkItem> incognito =
+        CreateShellLink(cmd_line_profile_dir);
     incognito->GetCommandLine()->AppendSwitch(switches::kIncognito);
     base::string16 incognito_title =
         l10n_util::GetStringUTF16(IDS_NEW_INCOGNITO_WINDOW);
@@ -411,18 +422,20 @@
 
   recently_closed_pages_.clear();
 
+  base::FilePath profile_dir(GetCmdLineProfileDir());
+
   for (const auto& entry : tab_restore_service->entries()) {
     if (recently_closed_pages_.size() >= kRecentlyClosedItems)
       break;
     switch (entry->type) {
       case sessions::TabRestoreService::TAB:
         AddTab(static_cast<const sessions::TabRestoreService::Tab&>(*entry),
-               kRecentlyClosedItems);
+               profile_dir, kRecentlyClosedItems);
         break;
       case sessions::TabRestoreService::WINDOW:
         AddWindow(
             static_cast<const sessions::TabRestoreService::Window&>(*entry),
-            kRecentlyClosedItems);
+            profile_dir, kRecentlyClosedItems);
         break;
     }
   }
@@ -442,11 +455,11 @@
     return;
 
   most_visited_pages_.clear();
-
+  base::FilePath profile_dir = GetCmdLineProfileDir();
   const size_t num_items = std::min(urls.size(), kMostVisitedItems);
   for (size_t i = 0; i < num_items; ++i) {
     const history::MostVisitedURL& url = urls[i];
-    scoped_refptr<ShellLinkItem> link = CreateShellLink();
+    scoped_refptr<ShellLinkItem> link = CreateShellLink(profile_dir);
     std::string url_string = url.url.spec();
     base::string16 url_string_wide = base::UTF8ToUTF16(url_string);
     link->GetCommandLine()->AppendArgNative(url_string_wide);
@@ -466,6 +479,7 @@
 }
 
 bool JumpList::AddTab(const sessions::TabRestoreService::Tab& tab,
+                      const base::FilePath& cmd_line_profile_dir,
                       size_t max_items) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
@@ -474,7 +488,7 @@
   if (recently_closed_pages_.size() >= max_items)
     return false;
 
-  scoped_refptr<ShellLinkItem> link = CreateShellLink();
+  scoped_refptr<ShellLinkItem> link = CreateShellLink(cmd_line_profile_dir);
   const sessions::SerializedNavigationEntry& current_navigation =
       tab.navigations.at(tab.current_navigation_index);
   std::string url = current_navigation.virtual_url().spec();
@@ -491,12 +505,13 @@
 }
 
 void JumpList::AddWindow(const sessions::TabRestoreService::Window& window,
+                         const base::FilePath& cmd_line_profile_dir,
                          size_t max_items) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(!window.tabs.empty());
 
   for (const auto& tab : window.tabs) {
-    if (!AddTab(*tab, max_items))
+    if (!AddTab(*tab, cmd_line_profile_dir, max_items))
       return;
   }
 }
@@ -572,19 +587,19 @@
   // Parameter evaluation order is unspecified in C++. Do the first bind and
   // then move it into PostTaskAndReply to ensure the pointer value is obtained
   // before base::Passed() is called.
-  auto run_update =
-      base::Bind(&JumpList::RunUpdateJumpList, app_id_, profile_dir,
-                 most_visited_pages_, recently_closed_pages_,
-                 most_visited_should_update_, recently_closed_should_update_,
-                 incognito_availability, update_transaction.get());
+  auto run_update = base::BindOnce(
+      &JumpList::RunUpdateJumpList, app_id_, profile_dir, most_visited_pages_,
+      recently_closed_pages_, GetCmdLineProfileDir(),
+      most_visited_should_update_, recently_closed_should_update_,
+      incognito_availability, update_transaction.get());
 
   // Post a task to update the JumpList, which consists of 1) create new icons,
   // 2) notify the OS, 3) delete old icons.
   if (!update_jumplist_task_runner_->PostTaskAndReply(
           FROM_HERE, std::move(run_update),
-          base::Bind(&JumpList::OnRunUpdateCompletion,
-                     weak_ptr_factory_.GetWeakPtr(),
-                     base::Passed(std::move(update_transaction))))) {
+          base::BindOnce(&JumpList::OnRunUpdateCompletion,
+                         weak_ptr_factory_.GetWeakPtr(),
+                         base::Passed(std::move(update_transaction))))) {
     OnRunUpdateCompletion(std::make_unique<UpdateTransaction>());
   }
 }
@@ -674,6 +689,7 @@
     const base::FilePath& profile_dir,
     const ShellLinkItemList& most_visited_pages,
     const ShellLinkItemList& recently_closed_pages,
+    const base::FilePath& cmd_line_profile_dir,
     bool most_visited_should_update,
     bool recently_closed_should_update,
     IncognitoModePrefs::Availability incognito_availability,
@@ -687,9 +703,9 @@
 
   CreateNewJumpListAndNotifyOS(
       app_id, most_visited_icon_dir, recently_closed_icon_dir,
-      most_visited_pages, recently_closed_pages, most_visited_should_update,
-      recently_closed_should_update, incognito_availability,
-      update_transaction);
+      most_visited_pages, recently_closed_pages, cmd_line_profile_dir,
+      most_visited_should_update, recently_closed_should_update,
+      incognito_availability, update_transaction);
 
   // Delete any obsolete icon files.
   if (most_visited_should_update) {
@@ -709,6 +725,7 @@
     const base::FilePath& recently_closed_icon_dir,
     const ShellLinkItemList& most_visited_pages,
     const ShellLinkItemList& recently_closed_pages,
+    const base::FilePath& cmd_line_profile_dir,
     bool most_visited_should_update,
     bool recently_closed_should_update,
     IncognitoModePrefs::Availability incognito_availability,
@@ -794,7 +811,8 @@
   }
 
   // Update the "Tasks" category of the JumpList.
-  if (!UpdateTaskCategory(&jumplist_updater, incognito_availability))
+  if (!UpdateTaskCategory(&jumplist_updater, incognito_availability,
+                          cmd_line_profile_dir))
     return;
 
   base::ElapsedTimer commit_update_timer;
@@ -893,3 +911,11 @@
 
   DeleteNonCachedFiles(icon_dir, cached_files);
 }
+
+base::FilePath JumpList::GetCmdLineProfileDir() {
+  return g_browser_process->profile_manager()
+                     ->GetProfileAttributesStorage()
+                     .GetNumberOfProfiles() < 2
+             ? base::FilePath()
+             : profile_->GetPath().BaseName();
+}
diff --git a/chrome/browser/win/jumplist.h b/chrome/browser/win/jumplist.h
index e59413de..d3cb3581 100644
--- a/chrome/browser/win/jumplist.h
+++ b/chrome/browser/win/jumplist.h
@@ -170,12 +170,18 @@
   void OnMostVisitedURLsAvailable(const history::MostVisitedURLList& data);
 
   // Adds a new ShellLinkItem for |tab| to the JumpList data provided that doing
-  // so will not exceed |max_items|.
-  bool AddTab(const sessions::TabRestoreService::Tab& tab, size_t max_items);
+  // so will not exceed |max_items|. If |cmd_line_profile_dir| is not empty,
+  // it will be added to the command line switch --profile-directory.
+  bool AddTab(const sessions::TabRestoreService::Tab& tab,
+              const base::FilePath& cmd_line_profile_dir,
+              size_t max_items);
 
   // Adds a new ShellLinkItem for each tab in |window| to the JumpList data
-  // provided that doing so will not exceed |max_items|.
+  // provided that doing so will not exceed |max_items|. If
+  // |cmd_line_profile_dir| is not empty, it will be added to the command line
+  // switch --profile-directory.
   void AddWindow(const sessions::TabRestoreService::Window& window,
+                 const base::FilePath& cmd_line_profile_dir,
                  size_t max_items);
 
   // Starts loading a favicon for each URL in |icon_urls_|.
@@ -218,6 +224,7 @@
       const base::FilePath& profile_dir,
       const ShellLinkItemList& most_visited_pages,
       const ShellLinkItemList& recently_closed_pages,
+      const base::FilePath& cmd_line_profile_dir,
       bool most_visited_should_update,
       bool recently_closed_should_update,
       IncognitoModePrefs::Availability incognito_availability,
@@ -231,6 +238,7 @@
       const base::FilePath& recently_closed_icon_dir,
       const ShellLinkItemList& most_visited_pages,
       const ShellLinkItemList& recently_closed_pages,
+      const base::FilePath& cmd_line_profile_dir,
       bool most_visited_should_update,
       bool recently_closed_should_update,
       IncognitoModePrefs::Availability incognito_availability,
@@ -262,6 +270,11 @@
   static void DeleteIconFiles(const base::FilePath& icon_dir,
                               const URLIconCache& icons_cache);
 
+  // Gets the basename of the profile directory for |profile_|, suitable for
+  // appending --profile-directory=<profile name> to jumplist items' command
+  // lines. If the user has only one profile, this returns an empty FilePath.
+  base::FilePath GetCmdLineProfileDir();
+
   // Tracks FaviconService tasks.
   base::CancelableTaskTracker cancelable_task_tracker_;
 
diff --git a/chrome/chrome_cleaner/engines/controllers/uwe_engine_cleaner_wrapper.cc b/chrome/chrome_cleaner/engines/controllers/uwe_engine_cleaner_wrapper.cc
index 9ee5896..6639a6bf 100644
--- a/chrome/chrome_cleaner/engines/controllers/uwe_engine_cleaner_wrapper.cc
+++ b/chrome/chrome_cleaner/engines/controllers/uwe_engine_cleaner_wrapper.cc
@@ -11,6 +11,7 @@
 #include <vector>
 
 #include "base/barrier_closure.h"
+#include "base/bind_helpers.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/files/important_file_writer.h"
diff --git a/chrome/common/features.gni b/chrome/common/features.gni
index c0d25ae..cb1ce802 100644
--- a/chrome/common/features.gni
+++ b/chrome/common/features.gni
@@ -51,6 +51,9 @@
   enable_one_click_signin =
       is_win || is_mac || (is_linux && !is_chromeos && !is_chromecast)
 
+  # Enables password change in leaked password dialog, disabled by default.
+  enable_password_change_in_leaked_dialog = false
+
   enable_service_discovery = (enable_mdns && !is_android) || is_mac
 
   # Enables use of the session service, which is enabled by default.
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index c1eb1a6..a56ee94c 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -964,6 +964,10 @@
 const char kPerAppTimeLimitsLastSuccessfulReportTime[] =
     "child_user.per_app_time_limits.last_successful_report_time";
 
+// Int64 to specify the latest AppLimit update timestamp from.
+const char kPerAppTimeLimitsLatestLimitUpdateTime[] =
+    "child_user.per_app_time_limits.latest_limit_update_time";
+
 // Dictionary pref containing the per-app time limits configuration for
 // child user. Controlled by PerAppTimeLimits policy.
 const char kPerAppTimeLimitsPolicy[] = "child_user.per_app_time_limits.policy";
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index 4a870e2..905b1ac6 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -313,6 +313,7 @@
 extern const char kPerAppTimeLimitsAppActivities[];
 extern const char kPerAppTimeLimitsLastResetTime[];
 extern const char kPerAppTimeLimitsLastSuccessfulReportTime[];
+extern const char kPerAppTimeLimitsLatestLimitUpdateTime[];
 extern const char kPerAppTimeLimitsPolicy[];
 extern const char kPerAppTimeLimitsWhitelistPolicy[];
 extern const char kDeviceWallpaperImageFilePath[];
diff --git a/chrome/common/url_constants.cc b/chrome/common/url_constants.cc
index 106c0c2..1eb6fb0 100644
--- a/chrome/common/url_constants.cc
+++ b/chrome/common/url_constants.cc
@@ -387,6 +387,9 @@
 
 const char kSmbSharesLearnMoreURL[] =
     "https://support.google.com/chromebook?p=network_file_shares";
+
+const char kTabletModeGesturesLearnMoreURL[] =
+    "https://support.google.com/chromebook?p=tablet_mode_gestures";
 #endif  // defined(OS_CHROMEOS)
 
 #if defined(OS_MACOSX)
diff --git a/chrome/common/url_constants.h b/chrome/common/url_constants.h
index 34a1c60..cbde79c 100644
--- a/chrome/common/url_constants.h
+++ b/chrome/common/url_constants.h
@@ -335,6 +335,13 @@
 
 // The URL for the "Learn more" page for the network file shares settings page.
 extern const char kSmbSharesLearnMoreURL[];
+
+// The URL to a support article with more information about gestures available
+// in tablet mode on Chrome OS (gesture to go to home screen, overview, or to go
+// back). Used as a "Learn more" link URL for the accessibility option to shelf
+// navigation buttons in tablet mode (the buttons are hidden by default in
+// favour of the gestures in question).
+extern const char kTabletModeGesturesLearnMoreURL[];
 #endif  // defined(OS_CHROMEOS)
 
 #if defined(OS_MACOSX)
diff --git a/chrome/renderer/media/cast_receiver_session_delegate.cc b/chrome/renderer/media/cast_receiver_session_delegate.cc
index 38fef1c9..c6b6a10 100644
--- a/chrome/renderer/media/cast_receiver_session_delegate.cc
+++ b/chrome/renderer/media/cast_receiver_session_delegate.cc
@@ -64,8 +64,8 @@
   // Let's re-use the audio decoder thread.
   cast_environment_->PostTask(
       media::cast::CastEnvironment::AUDIO, FROM_HERE,
-      base::Bind(&CastReceiverAudioValve::DeliverDecodedAudio, audio_valve_,
-                 base::Owned(audio_bus.release()), playout_time));
+      base::BindOnce(&CastReceiverAudioValve::DeliverDecodedAudio, audio_valve_,
+                     base::Owned(audio_bus.release()), playout_time));
   cast_receiver_->RequestDecodedAudioFrame(on_audio_decoded_cb_);
 }
 
diff --git a/chrome/renderer/net/net_error_helper_core_unittest.cc b/chrome/renderer/net/net_error_helper_core_unittest.cc
index 07d70ab..bbf1101 100644
--- a/chrome/renderer/net/net_error_helper_core_unittest.cc
+++ b/chrome/renderer/net/net_error_helper_core_unittest.cc
@@ -14,6 +14,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/json/json_reader.h"
 #include "base/json/json_writer.h"
 #include "base/logging.h"
diff --git a/chrome/renderer/subresource_redirect/subresource_redirect_url_loader_throttle.cc b/chrome/renderer/subresource_redirect/subresource_redirect_url_loader_throttle.cc
index cb0a6c8..5968de2 100644
--- a/chrome/renderer/subresource_redirect/subresource_redirect_url_loader_throttle.cc
+++ b/chrome/renderer/subresource_redirect/subresource_redirect_url_loader_throttle.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/renderer/subresource_redirect/subresource_redirect_url_loader_throttle.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_macros.h"
 #include "chrome/renderer/previews/resource_loading_hints_agent.h"
diff --git a/chrome/renderer/url_loader_throttle_provider_impl.cc b/chrome/renderer/url_loader_throttle_provider_impl.cc
index bebc9b44..331e97f6 100644
--- a/chrome/renderer/url_loader_throttle_provider_impl.cc
+++ b/chrome/renderer/url_loader_throttle_provider_impl.cc
@@ -9,6 +9,7 @@
 #include "base/bind.h"
 #include "base/command_line.h"
 #include "base/feature_list.h"
+#include "base/memory/ptr_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "chrome/common/google_url_loader_throttle.h"
diff --git a/chrome/renderer/websocket_handshake_throttle_provider_impl.cc b/chrome/renderer/websocket_handshake_throttle_provider_impl.cc
index 8a677f4..40cde97e 100644
--- a/chrome/renderer/websocket_handshake_throttle_provider_impl.cc
+++ b/chrome/renderer/websocket_handshake_throttle_provider_impl.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "base/memory/ptr_util.h"
 #include "components/safe_browsing/content/renderer/websocket_sb_handshake_throttle.h"
 #include "content/public/common/service_names.mojom.h"
 #include "content/public/renderer/render_thread.h"
diff --git a/chrome/renderer/worker_content_settings_client.cc b/chrome/renderer/worker_content_settings_client.cc
index 799d8ab..73afe84 100644
--- a/chrome/renderer/worker_content_settings_client.cc
+++ b/chrome/renderer/worker_content_settings_client.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/renderer/worker_content_settings_client.h"
 
+#include "base/memory/ptr_util.h"
 #include "chrome/common/render_messages.h"
 #include "chrome/renderer/content_settings_agent_impl.h"
 #include "content/public/renderer/render_frame.h"
diff --git a/chrome/services/qrcode_generator/BUILD.gn b/chrome/services/qrcode_generator/BUILD.gn
new file mode 100644
index 0000000..cc4e19b
--- /dev/null
+++ b/chrome/services/qrcode_generator/BUILD.gn
@@ -0,0 +1,25 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/features.gni")
+
+source_set("qrcode_generator") {
+  sources = [
+    "qrcode_generator_service_impl.cc",
+    "qrcode_generator_service_impl.h",
+  ]
+
+  deps = [
+    "//base",
+    "//chrome:strings",
+    "//chrome/common/qr_code_generator",
+    "//mojo/public/cpp/bindings",
+    "//net",
+  ]
+
+  public_deps = [
+    "//chrome/services/qrcode_generator/public/mojom",
+    "//mojo/public/mojom/base",
+  ]
+}
diff --git a/chrome/services/qrcode_generator/DEPS b/chrome/services/qrcode_generator/DEPS
new file mode 100644
index 0000000..0fc51a2e
--- /dev/null
+++ b/chrome/services/qrcode_generator/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+chrome/common/qr_code_generator.h",
+]
diff --git a/chrome/services/qrcode_generator/OWNERS b/chrome/services/qrcode_generator/OWNERS
new file mode 100644
index 0000000..945a5a2
--- /dev/null
+++ b/chrome/services/qrcode_generator/OWNERS
@@ -0,0 +1,4 @@
+# Send-tab-to-self (Chrome Sharing team) owns this feature.
+file://components/send_tab_to_self/OWNERS
+
+# COMPONENT: UI>Browser>Sharing
diff --git a/chrome/services/qrcode_generator/public/cpp/BUILD.gn b/chrome/services/qrcode_generator/public/cpp/BUILD.gn
new file mode 100644
index 0000000..98a2bfe
--- /dev/null
+++ b/chrome/services/qrcode_generator/public/cpp/BUILD.gn
@@ -0,0 +1,18 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+source_set("cpp") {
+  sources = [
+    "qrcode_generator_service.cc",
+    "qrcode_generator_service.h",
+  ]
+
+  deps = [
+    "//base",
+    "//chrome:strings",
+    "//chrome/services/qrcode_generator/public/mojom",
+    "//content/public/browser",
+    "//skia",
+  ]
+}
diff --git a/chrome/services/qrcode_generator/public/cpp/DEPS b/chrome/services/qrcode_generator/public/cpp/DEPS
new file mode 100644
index 0000000..2dae3d7c4
--- /dev/null
+++ b/chrome/services/qrcode_generator/public/cpp/DEPS
@@ -0,0 +1,4 @@
+include_rules = [
+    "+content/public/browser/service_process_host.h",
+]
+
diff --git a/chrome/services/qrcode_generator/public/cpp/qrcode_generator_service.cc b/chrome/services/qrcode_generator/public/cpp/qrcode_generator_service.cc
new file mode 100644
index 0000000..b46a176
--- /dev/null
+++ b/chrome/services/qrcode_generator/public/cpp/qrcode_generator_service.cc
@@ -0,0 +1,23 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/services/qrcode_generator/public/cpp/qrcode_generator_service.h"
+
+#include "base/no_destructor.h"
+#include "chrome/grit/generated_resources.h"
+#include "chrome/services/qrcode_generator/public/mojom/qrcode_generator.mojom.h"
+#include "content/public/browser/service_process_host.h"
+
+namespace qrcode_generator {
+
+mojo::Remote<mojom::QRCodeGeneratorService> LaunchQRCodeGeneratorService() {
+  // TODO: check default sandboxtype
+  return content::ServiceProcessHost::Launch<mojom::QRCodeGeneratorService>(
+      content::ServiceProcessHost::Options()
+          .WithSandboxType(service_manager::SandboxType::kUtility)
+          .WithDisplayName(IDS_UTILITY_PROCESS_QRCODE_GENERATOR_SERVICE_NAME)
+          .Pass());
+}
+
+}  //  namespace qrcode_generator
diff --git a/chrome/services/qrcode_generator/public/cpp/qrcode_generator_service.h b/chrome/services/qrcode_generator/public/cpp/qrcode_generator_service.h
new file mode 100644
index 0000000..fd9b138
--- /dev/null
+++ b/chrome/services/qrcode_generator/public/cpp/qrcode_generator_service.h
@@ -0,0 +1,23 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_SERVICES_QRCODE_GENERATOR_PUBLIC_CPP_QRCODE_GENERATOR_SERVICE_H_
+#define CHROME_SERVICES_QRCODE_GENERATOR_PUBLIC_CPP_QRCODE_GENERATOR_SERVICE_H_
+
+#include "base/callback.h"
+#include "chrome/services/qrcode_generator/public/mojom/qrcode_generator.mojom.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
+
+namespace qrcode_generator {
+
+// Launches a new instance of the QRCodeGeneratorService in an isolated,
+// sandboxed process, and returns a remote interface to control the service. The
+// lifetime of the process is tied to that of the Remote. May be called from any
+// thread.
+mojo::Remote<mojom::QRCodeGeneratorService> LaunchQRCodeGeneratorService();
+
+}  // namespace qrcode_generator
+
+#endif  // CHROME_SERVICES_QRCODE_GENERATOR_PUBLIC_CPP_QRCODE_GENERATOR_SERVICE_H_
diff --git a/chrome/services/qrcode_generator/public/mojom/BUILD.gn b/chrome/services/qrcode_generator/public/mojom/BUILD.gn
new file mode 100644
index 0000000..35a8d4e4
--- /dev/null
+++ b/chrome/services/qrcode_generator/public/mojom/BUILD.gn
@@ -0,0 +1,16 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/features.gni")
+import("//mojo/public/tools/bindings/mojom.gni")
+
+mojom("mojom") {
+  sources = [ "qrcode_generator.mojom" ]
+
+  public_deps = [
+    "//mojo/public/mojom/base",
+    "//skia/public/mojom",
+    "//ui/gfx/geometry/mojom",
+  ]
+}
diff --git a/chrome/services/qrcode_generator/public/mojom/OWNERS b/chrome/services/qrcode_generator/public/mojom/OWNERS
new file mode 100644
index 0000000..08850f4
--- /dev/null
+++ b/chrome/services/qrcode_generator/public/mojom/OWNERS
@@ -0,0 +1,2 @@
+per-file *.mojom=set noparent
+per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/chrome/services/qrcode_generator/public/mojom/qrcode_generator.mojom b/chrome/services/qrcode_generator/public/mojom/qrcode_generator.mojom
new file mode 100644
index 0000000..4275260
--- /dev/null
+++ b/chrome/services/qrcode_generator/public/mojom/qrcode_generator.mojom
@@ -0,0 +1,77 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module qrcode_generator.mojom;
+
+import "skia/public/mojom/bitmap.mojom";
+import "ui/gfx/geometry/mojom/geometry.mojom";
+
+enum QRCodeGeneratorError {
+  // No error.
+  NONE,
+
+  // Input string was too long.
+  INPUT_TOO_LONG,
+
+  // Unknown error.
+  UNKNOWN_ERROR,
+};
+
+// How to render qr code pixels.
+// This does not affect the main locators.
+enum ModuleStyle {
+  DEFAULT_SQUARES,
+  CIRCLES,
+};
+
+// Style for the corner locators.
+enum LocatorStyle {
+  DEFAULT_SQUARE,
+  ROUNDED,
+};
+
+// Structure for requesting QR Code data or image.
+struct GenerateQRCodeRequest {
+  // Data to generate the QR code.
+  string data;
+
+  // Whether to render the QR code. If false, provides data back to the caller.
+  bool should_render;
+
+  // Whether to superimpose a Chrome dino over the center of the image.
+  bool render_dino;
+
+  // Style for the individual modules. Does not apply to locators.
+  ModuleStyle render_module_style;
+
+  // Whether the renderer should include rounded corners.
+  LocatorStyle render_locator_style;
+};
+
+// Structure for returning QR Code image data.
+struct GenerateQRCodeResponse {
+  // Return code stating success or failure.
+  QRCodeGeneratorError error_code;
+
+  // Image data for generated QR code. May be null on error, or if rendering
+  // was not requested.
+  skia.mojom.Bitmap? bitmap;
+
+  // QR Code data.
+  array<uint8> data;
+
+  // 2-D size of |data| in elements. Note |bitmap| will be upscaled, so this
+  // does not represent the returned image size.
+  gfx.mojom.Size data_size;
+};
+
+// Interface for generating QR codes for a given string of input data.
+// This is usually run outside the browser process if the data is untrusted.
+interface QRCodeGeneratorService {
+  // Tries to generate a QR code for |data|.
+  // Populates |response.error| on error; if kNone then |response.data|
+  // should be considered valid.
+  GenerateQRCode(GenerateQRCodeRequest request)
+      => (GenerateQRCodeResponse response);
+};
diff --git a/chrome/services/qrcode_generator/qrcode_generator_service_impl.cc b/chrome/services/qrcode_generator/qrcode_generator_service_impl.cc
new file mode 100644
index 0000000..5755c187
--- /dev/null
+++ b/chrome/services/qrcode_generator/qrcode_generator_service_impl.cc
@@ -0,0 +1,259 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/services/qrcode_generator/qrcode_generator_service_impl.h"
+
+#include <memory>
+#include <string>
+#include <utility>
+
+#include "base/strings/string_util.h"
+#include "chrome/common/qr_code_generator/dino_image.h"
+#include "chrome/common/qr_code_generator/qr_code_generator.h"
+#include "ui/gfx/canvas.h"
+#include "ui/gfx/geometry/size.h"
+
+namespace qrcode_generator {
+
+// Allow each element to render as this many pixels.
+static const int kModuleSizePixels = 10;
+
+// Allow each dino tile to render as this many pixels.
+static const int kDinoTileSizePixels = 5;
+
+// Size of a QR locator, in modules.
+static const int kLocatorSizeModules = 7;
+
+// Maximum supported data length.
+// Will likely change with higher-supported versions.
+constexpr int kMaxInputLength = 512;
+
+QRCodeGeneratorServiceImpl::QRCodeGeneratorServiceImpl(
+    mojo::PendingReceiver<mojom::QRCodeGeneratorService> receiver)
+    : receiver_(this, std::move(receiver)) {
+  InitializeDinoBitmap();
+}
+
+QRCodeGeneratorServiceImpl::~QRCodeGeneratorServiceImpl() = default;
+
+void QRCodeGeneratorServiceImpl::InitializeDinoBitmap() {
+  // The dino is taller than it is wide; validate this assumption in debug
+  // builds to simplify some calculations later.
+  DCHECK_GE(dino_image::kDinoHeight, dino_image::kDinoWidth);
+
+  dino_bitmap_.allocN32Pixels(dino_image::kDinoWidth, dino_image::kDinoHeight);
+  dino_bitmap_.eraseARGB(0xFF, 0xFF, 0xFF, 0xFF);
+  SkCanvas canvas(dino_bitmap_);
+  SkPaint paint;
+  paint.setColor(SK_ColorBLACK);
+
+  constexpr int bytes_per_row = (dino_image::kDinoHeight + 7) / 8;
+
+  // Helper: Copies |src_num_rows| of dino data from |src_array| to
+  // canvas (obtained via closure), starting at |dest_row|.
+  auto copyPixelBitData = [&](const unsigned char* src_array, int src_num_rows,
+                              int dest_row) {
+    for (int row = 0; row < src_num_rows; row++) {
+      int which_byte = (row * bytes_per_row);
+      unsigned char mask = 0b10000000;
+      for (int col = 0; col < dino_image::kDinoWidth; col++) {
+        if (*(src_array + which_byte) & mask) {
+          canvas.drawIRect({col, dest_row + row, col + 1, dest_row + row + 1},
+                           paint);
+        }
+        mask >>= 1;
+        if (mask == 0) {
+          mask = 0b10000000;
+          which_byte++;
+        }
+      }
+    }
+  };
+
+  copyPixelBitData(dino_image::kDinoHeadRight, dino_image::kDinoHeadHeight, 0);
+  copyPixelBitData(dino_image::kDinoBody, dino_image::kDinoBodyHeight,
+                   dino_image::kDinoHeadHeight);
+}
+
+void QRCodeGeneratorServiceImpl::DrawDino(SkCanvas* canvas,
+                                          const SkRect& canvas_bounds,
+                                          const int pixels_per_dino_tile,
+                                          const int dino_border_px,
+                                          const SkPaint& paint_foreground,
+                                          const SkPaint& paint_background) {
+  int dino_width_px = pixels_per_dino_tile * dino_image::kDinoHeight;
+  int dino_height_px = pixels_per_dino_tile * dino_image::kDinoHeight;
+
+  // If we request too big a dino, we'll clip. In practice the dino size
+  // should be significantly smaller than the canvas to leave room for the
+  // data payload and locators, so alert if we take over 25% of the area.
+  DCHECK_GE(canvas_bounds.height() / 2,
+            dino_image::kDinoHeight * pixels_per_dino_tile + dino_border_px);
+  DCHECK_GE(canvas_bounds.width() / 2,
+            dino_image::kDinoWidth * pixels_per_dino_tile + dino_border_px);
+
+  // Assemble the target rect for the dino image data.
+  SkRect dest_rect = SkRect::MakeWH(dino_width_px, dino_height_px);
+  dest_rect.offset((canvas_bounds.width() - dest_rect.width()) / 2,
+                   (canvas_bounds.height() - dest_rect.height()) / 2);
+
+  // Clear out a little room for a border, snapped to some number of modules.
+  SkRect background = SkRect::MakeLTRB(
+      (dest_rect.left() - dino_border_px) / kModuleSizePixels *
+          kModuleSizePixels,
+      (dest_rect.top() - dino_border_px) / kModuleSizePixels *
+          kModuleSizePixels,
+      (dest_rect.right() + dino_border_px + kModuleSizePixels - 1) /
+          kModuleSizePixels * kModuleSizePixels,
+      (dest_rect.bottom() + dino_border_px + kModuleSizePixels - 1) /
+          kModuleSizePixels * kModuleSizePixels);
+
+  canvas->drawRect(background, paint_background);
+  SkRect dino_bounds;
+  dino_bitmap_.getBounds(&dino_bounds);
+  canvas->drawBitmapRect(dino_bitmap_, dino_bounds, dest_rect, nullptr);
+}
+
+// Draws QR locators at three corners of |canvas|.
+static void DrawLocators(SkCanvas* canvas,
+                         const gfx::Size data_size,
+                         const SkPaint& paint_foreground,
+                         const SkPaint& paint_background,
+                         mojom::LocatorStyle style) {
+  SkScalar radius = style == mojom::LocatorStyle::ROUNDED ? 10 : 0;
+
+  // Draw a locator with upper left corner at {x, y} in terms of module
+  // coordinates.
+  auto drawOneLocator = [&](int left_x_modules, int top_y_modules) {
+    // Outermost square, 7x7 modules.
+    int left_x_pixels = left_x_modules * kModuleSizePixels;
+    int top_y_pixels = top_y_modules * kModuleSizePixels;
+    int dim_pixels = kModuleSizePixels * kLocatorSizeModules;
+    canvas->drawRoundRect(
+        {left_x_pixels, top_y_pixels, left_x_pixels + dim_pixels,
+         top_y_pixels + dim_pixels},
+        radius, radius, paint_foreground);
+    // Middle square, one module smaller in all dimensions (5x5).
+    left_x_pixels += kModuleSizePixels;
+    top_y_pixels += kModuleSizePixels;
+    dim_pixels -= 2 * kModuleSizePixels;
+    canvas->drawRoundRect(
+        {left_x_pixels, top_y_pixels, left_x_pixels + dim_pixels,
+         top_y_pixels + dim_pixels},
+        radius, radius, paint_background);
+    // Inner square, one additional module smaller in all dimensions (3x3).
+    left_x_pixels += kModuleSizePixels;
+    top_y_pixels += kModuleSizePixels;
+    dim_pixels -= 2 * kModuleSizePixels;
+    canvas->drawRoundRect(
+        {left_x_pixels, top_y_pixels, left_x_pixels + dim_pixels,
+         top_y_pixels + dim_pixels},
+        radius, radius, paint_foreground);
+  };
+
+  // Top-left
+  drawOneLocator(0, 0);
+  // Top-right
+  drawOneLocator(data_size.width() - kLocatorSizeModules, 0);
+  // Bottom-left
+  drawOneLocator(0, data_size.height() - kLocatorSizeModules);
+  // No locator on bottom-right.
+}
+
+void QRCodeGeneratorServiceImpl::RenderBitmap(
+    const uint8_t* data,
+    const gfx::Size data_size,
+    const mojom::GenerateQRCodeRequestPtr& request,
+    mojom::GenerateQRCodeResponsePtr* response) {
+  if (!request->should_render)
+    return;
+
+  // Setup: create colors and clear canvas.
+  SkBitmap bitmap;
+  bitmap.allocN32Pixels(data_size.width() * kModuleSizePixels,
+                        data_size.height() * kModuleSizePixels);
+  bitmap.eraseARGB(0xFF, 0xFF, 0xFF, 0xFF);
+  SkCanvas canvas(bitmap);
+  SkPaint paint_black;
+  paint_black.setColor(SK_ColorBLACK);
+  SkPaint paint_white;
+  paint_white.setColor(SK_ColorWHITE);
+
+  // Loop over qr module data and paint to canvas.
+  // Paint data modules first, then locators and dino.
+  int data_index = 0;
+  for (int y = 0; y < data_size.height(); y++) {
+    for (int x = 0; x < data_size.width(); x++) {
+      if (data[data_index++] & 0x1) {
+        bool is_locator =
+            (y <= kLocatorSizeModules &&
+             (x <= kLocatorSizeModules ||
+              x >= data_size.width() - kLocatorSizeModules - 1)) ||
+            (y >= data_size.height() - kLocatorSizeModules - 1 &&
+             x <= kLocatorSizeModules);
+        if (is_locator) {
+          continue;
+        }
+
+        if (request->render_module_style == mojom::ModuleStyle::CIRCLES) {
+          float xc = (x + 0.5) * kModuleSizePixels;
+          float yc = (y + 0.5) * kModuleSizePixels;
+          SkScalar radius = kModuleSizePixels / 2 - 1;
+          canvas.drawCircle(xc, yc, radius, paint_black);
+        } else {
+          canvas.drawRect(
+              {x * kModuleSizePixels, y * kModuleSizePixels,
+               (x + 1) * kModuleSizePixels, (y + 1) * kModuleSizePixels},
+              paint_black);
+        }
+      }
+    }
+  }
+
+  DrawLocators(&canvas, data_size, paint_black, paint_white,
+               request->render_locator_style);
+
+  if (request->render_dino) {
+    SkRect bitmap_bounds;
+    bitmap.getBounds(&bitmap_bounds);
+    DrawDino(&canvas, bitmap_bounds, kDinoTileSizePixels, 2, paint_black,
+             paint_white);
+  }
+
+  (*response)->bitmap = bitmap;
+}
+
+void QRCodeGeneratorServiceImpl::GenerateQRCode(
+    mojom::GenerateQRCodeRequestPtr request,
+    GenerateQRCodeCallback callback) {
+  mojom::GenerateQRCodeResponsePtr response =
+      mojom::GenerateQRCodeResponse::New();
+
+  if (request->data.length() > kMaxInputLength) {
+    response->error_code = mojom::QRCodeGeneratorError::INPUT_TOO_LONG;
+    std::move(callback).Run(std::move(response));
+    return;
+  }
+
+  // TODO(skare): Use a higher QR code vdersion. Until then, use kSize=29x29
+  // from the common encoder.
+  const gfx::Size qr_output_data_size = {29, 29};
+  // TODO(skare): cap string length with message in the UI.
+  uint8_t input[kMaxInputLength + 1] = {0};
+  base::strlcpy(reinterpret_cast<char*>(input), request->data.c_str(),
+                kMaxInputLength);
+  QRCodeGenerator qr;
+  auto qr_data_span = qr.Generate(input);
+
+  for (uint8_t i : qr_data_span) {
+    response->data.push_back(i);
+  }
+  response->data_size = qr_output_data_size;
+  response->error_code = mojom::QRCodeGeneratorError::NONE;
+  RenderBitmap(qr_data_span.data(), qr_output_data_size, request, &response);
+
+  std::move(callback).Run(std::move(response));
+}
+
+}  // namespace qrcode_generator
diff --git a/chrome/services/qrcode_generator/qrcode_generator_service_impl.h b/chrome/services/qrcode_generator/qrcode_generator_service_impl.h
new file mode 100644
index 0000000..15a1bcd
--- /dev/null
+++ b/chrome/services/qrcode_generator/qrcode_generator_service_impl.h
@@ -0,0 +1,65 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_SERVICES_QRCODE_GENERATOR_QRCODE_GENERATOR_SERVICE_IMPL_H_
+#define CHROME_SERVICES_QRCODE_GENERATOR_QRCODE_GENERATOR_SERVICE_IMPL_H_
+
+#include <vector>
+
+#include "chrome/services/qrcode_generator/public/mojom/qrcode_generator.mojom.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "third_party/skia/include/core/SkCanvas.h"
+
+namespace qrcode_generator {
+
+// qrcode_generator.QRCodeGenerator handler.
+//
+// This handler accepts a potentially untrusted URL string and generates
+// a QR code for it.
+// It is intended to operate in an out-of-browser-process service.
+class QRCodeGeneratorServiceImpl : public mojom::QRCodeGeneratorService {
+ public:
+  explicit QRCodeGeneratorServiceImpl(
+      mojo::PendingReceiver<mojom::QRCodeGeneratorService> receiver);
+  ~QRCodeGeneratorServiceImpl() override;
+
+ private:
+  // chrome::mojom::QRCodeGeneratorService override.
+  void GenerateQRCode(mojom::GenerateQRCodeRequestPtr request,
+                      GenerateQRCodeCallback callback) override;
+
+  // Renders dino data into a 1x bitmap, |dino_bitmap_|, owned by the class.
+  // This is simpler and faster than repainting it from static source data
+  // each time.
+  void InitializeDinoBitmap();
+
+  // Draws a dino image at the center of |canvas|.
+  // In the common case where drawing at the same scale as QR modules, note that
+  // the QR Code versions from the spec all consist of n*n modules, with n odd,
+  // while the dino data is w*h for w,h even, so it will be offset.
+  void DrawDino(SkCanvas* canvas,
+                const SkRect& canvas_bounds,
+                const int pixels_per_dino_tile,
+                const int dino_border_px,
+                const SkPaint& paint_foreground,
+                const SkPaint& paint_background);
+
+  // Renders the QR code with pixel information in |data| and render parameters
+  // in |request|. Result is stored into |response|.
+  void RenderBitmap(const uint8_t* data,
+                    const gfx::Size data_size,
+                    const mojom::GenerateQRCodeRequestPtr& request,
+                    mojom::GenerateQRCodeResponsePtr* response);
+
+  mojo::Receiver<mojom::QRCodeGeneratorService> receiver_;
+
+  SkBitmap dino_bitmap_;
+
+  DISALLOW_COPY_AND_ASSIGN(QRCodeGeneratorServiceImpl);
+};
+
+}  // namespace qrcode_generator
+
+#endif  // CHROME_SERVICES_QRCODE_GENERATOR_QRCODE_GENERATOR_SERVICE_IMPL_H_
diff --git a/chrome/test/base/browser_with_test_window_test.cc b/chrome/test/base/browser_with_test_window_test.cc
index d9f7900..8b312be 100644
--- a/chrome/test/base/browser_with_test_window_test.cc
+++ b/chrome/test/base/browser_with_test_window_test.cc
@@ -51,8 +51,7 @@
 void BrowserWithTestWindowTest::SetUp() {
   testing::Test::SetUp();
 #if defined(OS_CHROMEOS)
-  ash::AshTestHelper::InitParams init_params;
-  ash_test_helper_.SetUp(init_params);
+  ash_test_helper_.SetUp();
 #elif defined(TOOLKIT_VIEWS)
   views_test_helper_.reset(new views::ScopedViewsTestHelper());
 #endif
@@ -127,7 +126,7 @@
 
 gfx::NativeWindow BrowserWithTestWindowTest::GetContext() {
 #if defined(OS_CHROMEOS)
-  return ash_test_helper_.CurrentContext();
+  return ash_test_helper_.GetContext();
 #elif defined(TOOLKIT_VIEWS)
   return views_test_helper_->GetContext();
 #else
diff --git a/chrome/test/base/chrome_test_launcher.cc b/chrome/test/base/chrome_test_launcher.cc
index d8b6155..bfedb561 100644
--- a/chrome/test/base/chrome_test_launcher.cc
+++ b/chrome/test/base/chrome_test_launcher.cc
@@ -51,6 +51,7 @@
 #endif
 
 #if defined(OS_WIN)
+#include <Shlobj.h>
 #include "base/win/registry.h"
 #include "base/win/scoped_com_initializer.h"
 #include "chrome/app/chrome_crash_reporter_client_win.h"
@@ -160,8 +161,10 @@
       << "Failed to cleanup PreferenceMACs: " << result;
 
   // Add firewall rules for the test binary so that Windows doesn't show a
-  // firewall dialog during the test run.
-  firewall_rules_ = std::make_unique<ScopedFirewallRules>();
+  // firewall dialog during the test run. Silently do nothing if not running as
+  // an admin, to avoid error messages.
+  if (IsUserAnAdmin())
+    firewall_rules_ = std::make_unique<ScopedFirewallRules>();
 #endif
 }
 
diff --git a/chrome/test/base/perf/drag_event_generator.cc b/chrome/test/base/perf/drag_event_generator.cc
index fafce91..3949d21 100644
--- a/chrome/test/base/perf/drag_event_generator.cc
+++ b/chrome/test/base/perf/drag_event_generator.cc
@@ -7,6 +7,7 @@
 #include "base/bind.h"
 #include "base/callback.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn
index 4a90a3c4..d11f415 100644
--- a/chrome/test/data/webui/BUILD.gn
+++ b/chrome/test/data/webui/BUILD.gn
@@ -129,6 +129,7 @@
 
   if (is_chromeos) {
     sources += [
+      "../../../browser/resources/chromeos/login/security_token_pin_browsertest.js",
       "../../../browser/ui/webui/chromeos/account_migration_welcome_test.js",
       "../../../browser/ui/webui/chromeos/bluetooth_pairing_dialog_browsertest.js",
       "../../../browser/ui/webui/chromeos/certificate_manager_dialog_browsertest.js",
diff --git a/chrome/test/data/webui/settings/a11y/passwords_a11y_test.js b/chrome/test/data/webui/settings/a11y/passwords_a11y_test.js
index cf5cf8b..17153301 100644
--- a/chrome/test/data/webui/settings/a11y/passwords_a11y_test.js
+++ b/chrome/test/data/webui/settings/a11y/passwords_a11y_test.js
@@ -94,7 +94,7 @@
     'Accessible with 10 passwords': function() {
       const fakePasswords = [];
       for (let i = 0; i < 10; i++) {
-        fakePasswords.push(FakeDataMaker.passwordEntry());
+        fakePasswords.push(autofill_test_util.createPasswordEntry());
       }
       // Set list of passwords.
       this.passwordManager.lastCallback.addSavedPasswordListChangedListener(
diff --git a/chrome/test/data/webui/settings/autofill_page_test.js b/chrome/test/data/webui/settings/autofill_page_test.js
index 4a1853e..72922ff2 100644
--- a/chrome/test/data/webui/settings/autofill_page_test.js
+++ b/chrome/test/data/webui/settings/autofill_page_test.js
@@ -76,10 +76,10 @@
     /**
      * Creates PasswordManagerExpectations with the values expected after first
      * creating the element.
-     * @return {!PasswordManagerExpectations}
+     * @return {!autofill_test_util.PasswordManagerExpectations}
      */
     function basePasswordExpectations() {
-      const expected = new PasswordManagerExpectations();
+      const expected = new autofill_test_util.PasswordManagerExpectations();
       expected.requested.passwords = 1;
       expected.requested.exceptions = 1;
       expected.requested.accountStorageOptInState = 1;
@@ -92,10 +92,10 @@
     /**
      * Creates AutofillManagerExpectations with the values expected after first
      * creating the element.
-     * @return {!AutofillManagerExpectations}
+     * @return {!autofill_test_util.AutofillManagerExpectations}
      */
     function baseAutofillExpectations() {
-      const expected = new AutofillManagerExpectations();
+      const expected = new autofill_test_util.AutofillManagerExpectations();
       expected.requestedAddresses = 1;
       expected.listeningAddresses = 1;
       return expected;
@@ -104,10 +104,10 @@
     /**
      * Creates PaymentsManagerExpectations with the values expected after first
      * creating the element.
-     * @return {!PaymentsManagerExpectations}
+     * @return {!autofill_test_util.PaymentsManagerExpectations}
      */
     function basePaymentsExpectations() {
-      const expected = new PaymentsManagerExpectations();
+      const expected = new autofill_test_util.PaymentsManagerExpectations();
       expected.requestedCreditCards = 1;
       expected.listeningCreditCards = 1;
       return expected;
@@ -127,11 +127,11 @@
       PasswordManagerImpl.instance_ = passwordManager;
 
       // Override the AutofillManagerImpl for testing.
-      autofillManager = new TestAutofillManager();
+      autofillManager = new autofill_test_util.TestAutofillManager();
       settings.AutofillManagerImpl.instance_ = autofillManager;
 
       // Override the PaymentsManagerImpl for testing.
-      paymentsManager = new TestPaymentsManager();
+      paymentsManager = new autofill_test_util.TestPaymentsManager();
       settings.PaymentsManagerImpl.instance_ = paymentsManager;
     });
 
@@ -170,8 +170,10 @@
       return createPrefs(true, true).then(function(prefs) {
         const element = createAutofillElement(prefs);
 
-        const list =
-            [FakeDataMaker.passwordEntry(), FakeDataMaker.passwordEntry()];
+        const list = [
+          autofill_test_util.createPasswordEntry(),
+          autofill_test_util.createPasswordEntry()
+        ];
 
         passwordManager.lastCallback.addSavedPasswordListChangedListener(list);
         Polymer.dom.flush();
@@ -195,8 +197,10 @@
       return createPrefs(true, true).then(function(prefs) {
         const element = createAutofillElement(prefs);
 
-        const list =
-            [FakeDataMaker.exceptionEntry(), FakeDataMaker.exceptionEntry()];
+        const list = [
+          autofill_test_util.createExceptionEntry(),
+          autofill_test_util.createExceptionEntry()
+        ];
         passwordManager.lastCallback.addExceptionListChangedListener(list);
         Polymer.dom.flush();
 
@@ -216,10 +220,14 @@
       return createPrefs(true, true).then(function(prefs) {
         const element = createAutofillElement(prefs);
 
-        const addressList =
-            [FakeDataMaker.addressEntry(), FakeDataMaker.addressEntry()];
-        const cardList =
-            [FakeDataMaker.creditCardEntry(), FakeDataMaker.creditCardEntry()];
+        const addressList = [
+          autofill_test_util.createAddressEntry(),
+          autofill_test_util.createAddressEntry()
+        ];
+        const cardList = [
+          autofill_test_util.createCreditCardEntry(),
+          autofill_test_util.createCreditCardEntry()
+        ];
         autofillManager.lastCallback.setPersonalDataManagerListener(
             addressList, cardList);
         Polymer.dom.flush();
@@ -240,10 +248,14 @@
       return createPrefs(true, true).then(function(prefs) {
         const element = createAutofillElement(prefs);
 
-        const addressList =
-            [FakeDataMaker.addressEntry(), FakeDataMaker.addressEntry()];
-        const cardList =
-            [FakeDataMaker.creditCardEntry(), FakeDataMaker.creditCardEntry()];
+        const addressList = [
+          autofill_test_util.createAddressEntry(),
+          autofill_test_util.createAddressEntry()
+        ];
+        const cardList = [
+          autofill_test_util.createCreditCardEntry(),
+          autofill_test_util.createCreditCardEntry()
+        ];
         paymentsManager.lastCallback.setPersonalDataManagerListener(
             addressList, cardList);
         Polymer.dom.flush();
diff --git a/chrome/test/data/webui/settings/autofill_section_test.js b/chrome/test/data/webui/settings/autofill_section_test.js
index 9eb1a17..dbaa27a 100644
--- a/chrome/test/data/webui/settings/autofill_section_test.js
+++ b/chrome/test/data/webui/settings/autofill_section_test.js
@@ -58,7 +58,7 @@
    */
   function createAutofillSection(addresses, prefValues) {
     // Override the AutofillManagerImpl for testing.
-    this.autofillManager = new TestAutofillManager();
+    this.autofillManager = new autofill_test_util.TestAutofillManager();
     this.autofillManager.data.addresses = addresses;
     settings.AutofillManagerImpl.instance_ = this.autofillManager;
 
@@ -153,11 +153,11 @@
 
     test('verifyAddressCount', function() {
       const addresses = [
-        FakeDataMaker.addressEntry(),
-        FakeDataMaker.addressEntry(),
-        FakeDataMaker.addressEntry(),
-        FakeDataMaker.addressEntry(),
-        FakeDataMaker.addressEntry(),
+        autofill_test_util.createAddressEntry(),
+        autofill_test_util.createAddressEntry(),
+        autofill_test_util.createAddressEntry(),
+        autofill_test_util.createAddressEntry(),
+        autofill_test_util.createAddressEntry(),
       ];
 
       const section =
@@ -182,7 +182,7 @@
     });
 
     test('verifyAddressFields', function() {
-      const address = FakeDataMaker.addressEntry();
+      const address = autofill_test_util.createAddressEntry();
       const section = createAutofillSection([address], {});
       const addressList = section.$.addressList;
       const row = addressList.children[0];
@@ -203,7 +203,7 @@
     });
 
     test('verifyAddressRowButtonIsDropdownWhenLocal', function() {
-      const address = FakeDataMaker.addressEntry();
+      const address = autofill_test_util.createAddressEntry();
       address.metadata.isLocal = true;
       const section = createAutofillSection([address], {});
       const addressList = section.$.addressList;
@@ -216,7 +216,7 @@
     });
 
     test('verifyAddressRowButtonIsOutlinkWhenRemote', function() {
-      const address = FakeDataMaker.addressEntry();
+      const address = autofill_test_util.createAddressEntry();
       address.metadata.isLocal = false;
       const section = createAutofillSection([address], {});
       const addressList = section.$.addressList;
@@ -229,7 +229,7 @@
     });
 
     test('verifyAddAddressDialog', function() {
-      return createAddressDialog(FakeDataMaker.emptyAddressEntry())
+      return createAddressDialog(autofill_test_util.createEmptyAddressEntry())
           .then(function(dialog) {
             const title = dialog.$$('[slot=title]');
             assertEquals(
@@ -240,7 +240,7 @@
     });
 
     test('verifyEditAddressDialog', function() {
-      return createAddressDialog(FakeDataMaker.addressEntry())
+      return createAddressDialog(autofill_test_util.createAddressEntry())
           .then(function(dialog) {
             const title = dialog.$$('[slot=title]');
             assertEquals(
@@ -252,7 +252,7 @@
     });
 
     test('verifyCountryIsSaved', function() {
-      const address = FakeDataMaker.emptyAddressEntry();
+      const address = autofill_test_util.createEmptyAddressEntry();
       return createAddressDialog(address).then(function(dialog) {
         const countrySelect = dialog.$$('select');
         assertEquals('', countrySelect.value);
@@ -266,7 +266,7 @@
     });
 
     test('verifyPhoneAndEmailAreSaved', function() {
-      const address = FakeDataMaker.emptyAddressEntry();
+      const address = autofill_test_util.createEmptyAddressEntry();
       return createAddressDialog(address).then(function(dialog) {
         assertEquals('', dialog.$.phoneInput.value);
         assertFalse(!!(address.phoneNumbers && address.phoneNumbers[0]));
@@ -293,7 +293,7 @@
     });
 
     test('verifyPhoneAndEmailAreRemoved', function() {
-      const address = FakeDataMaker.emptyAddressEntry();
+      const address = autofill_test_util.createEmptyAddressEntry();
 
       const phoneNumber = '(555) 555-5555';
       const emailAddress = 'no-reply@chromium.org';
@@ -322,7 +322,7 @@
     // save button is enabled, then it will clear the field and verify that the
     // save button is disabled. Test passes after all elements have been tested.
     test('verifySaveIsNotClickableIfAllInputFieldsAreEmpty', function() {
-      return createAddressDialog(FakeDataMaker.emptyAddressEntry())
+      return createAddressDialog(autofill_test_util.createEmptyAddressEntry())
           .then(function(dialog) {
             const saveButton = dialog.$.saveButton;
             const testElements =
@@ -366,7 +366,7 @@
         countrySelect.dispatchEvent(new CustomEvent('change'));
       };
 
-      return createAddressDialog(FakeDataMaker.emptyAddressEntry())
+      return createAddressDialog(autofill_test_util.createEmptyAddressEntry())
           .then(function(d) {
             dialog = d;
             assertTrue(dialog.$.saveButton.disabled);
@@ -389,7 +389,7 @@
 
     // Test will timeout if save-address event is not fired.
     test('verifyDefaultCountryIsAppliedWhenSaving', function() {
-      const address = FakeDataMaker.emptyAddressEntry();
+      const address = autofill_test_util.createEmptyAddressEntry();
       address.fullNames = ['Name'];
       return createAddressDialog(address).then(function(dialog) {
         return expectEvent(dialog, 'save-address', function() {
@@ -404,7 +404,7 @@
     });
 
     test('verifyCancelDoesNotSaveAddress', function(done) {
-      createAddressDialog(FakeDataMaker.addressEntry())
+      createAddressDialog(autofill_test_util.createAddressEntry())
           .then(function(dialog) {
             test_util.eventToPromise('save-address', dialog).then(function() {
               // Fail the test because the save event should not be called when
@@ -435,7 +435,7 @@
 
     // US address has 3 fields on the same line.
     test('verifyEditingUSAddress', function() {
-      const address = FakeDataMaker.emptyAddressEntry();
+      const address = autofill_test_util.createEmptyAddressEntry();
       const company_enabled = loadTimeData.getBoolean('EnableCompanyName');
       address.fullNames = ['Name'];
       address.companyName = 'Organization';
@@ -499,7 +499,7 @@
 
     // GB address has 1 field per line for all lines that change.
     test('verifyEditingGBAddress', function() {
-      const address = FakeDataMaker.emptyAddressEntry();
+      const address = autofill_test_util.createEmptyAddressEntry();
       const company_enabled = loadTimeData.getBoolean('EnableCompanyName');
 
       address.fullNames = ['Name'];
@@ -568,7 +568,7 @@
     // IL address has 2 fields on the same line and is an RTL locale.
     // RTL locale shouldn't affect this test.
     test('verifyEditingILAddress', function() {
-      const address = FakeDataMaker.emptyAddressEntry();
+      const address = autofill_test_util.createEmptyAddressEntry();
       const company_enabled = loadTimeData.getBoolean('EnableCompanyName');
 
       address.fullNames = ['Name'];
@@ -632,7 +632,7 @@
     // US has an extra field 'State'. Validate that this field is
     // persisted when switching to IL then back to US.
     test('verifyAddressPersistanceWhenSwitchingCountries', function() {
-      const address = FakeDataMaker.emptyAddressEntry();
+      const address = autofill_test_util.createEmptyAddressEntry();
       const company_enabled = loadTimeData.getBoolean('EnableCompanyName');
       address.countryCode = 'US';
 
diff --git a/chrome/test/data/webui/settings/password_check_test.js b/chrome/test/data/webui/settings/password_check_test.js
index 264177f..af3dbb8 100644
--- a/chrome/test/data/webui/settings/password_check_test.js
+++ b/chrome/test/data/webui/settings/password_check_test.js
@@ -77,11 +77,14 @@
     // Test verifies that compromised credentials are displayed in a proper way
     test('testSomeCompromisedCredentials', function() {
       const leakedPasswords = [
-        FakeDataMaker.makeCompromisedCredentials('one.com', 'test4', 'LEAKED'),
-        FakeDataMaker.makeCompromisedCredentials('two.com', 'test3', 'PHISHED'),
+        autofill_test_util.makeCompromisedCredentials(
+            'one.com', 'test4', 'LEAKED'),
+        autofill_test_util.makeCompromisedCredentials(
+            'two.com', 'test3', 'PHISHED'),
       ];
-      const leakedPasswordsInfo = FakeDataMaker.makeCompromisedCredentialsInfo(
-          leakedPasswords, '5 min ago');
+      const leakedPasswordsInfo =
+          autofill_test_util.makeCompromisedCredentialsInfo(
+              leakedPasswords, '5 min ago');
       passwordManager.data.leakedCredentials = leakedPasswordsInfo;
       const checkPasswordSection = createCheckPasswordSection();
       return passwordManager.whenCalled('getCompromisedCredentialsInfo')
diff --git a/chrome/test/data/webui/settings/passwords_and_autofill_fake_data.js b/chrome/test/data/webui/settings/passwords_and_autofill_fake_data.js
index 8835fa5a..f43055d 100644
--- a/chrome/test/data/webui/settings/passwords_and_autofill_fake_data.js
+++ b/chrome/test/data/webui/settings/passwords_and_autofill_fake_data.js
@@ -2,406 +2,420 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-/**
- * Used to create fake data for both passwords and autofill.
- * These sections are related, so it made sense to share this.
- */
-function FakeDataMaker() {}
-
-/**
- * Creates a single item for the list of passwords.
- * @param {string=} url
- * @param {string=} username
- * @param {number=} passwordLength
- * @param {number=} id
- * @return {chrome.passwordsPrivate.PasswordUiEntry}
- */
-FakeDataMaker.passwordEntry = function(url, username, passwordLength, id) {
-  // Generate fake data if param is undefined.
-  url = url || FakeDataMaker.patternMaker_('www.xxxxxx.com', 16);
-  username = username || FakeDataMaker.patternMaker_('user_xxxxx', 16);
-  passwordLength = passwordLength || Math.floor(Math.random() * 15) + 3;
-  id = id || 0;
-
-  return {
-    urls: {
-      origin: 'http://' + url + '/login',
-      shown: url,
-      link: 'http://' + url + '/login',
-    },
-    username: username,
-    numCharactersInPassword: passwordLength,
-    id: id,
-  };
-};
-
-/**
- * Creates a single item for the list of password exceptions.
- * @param {string=} url
- * @param {number=} id
- * @return {chrome.passwordsPrivate.ExceptionEntry}
- */
-FakeDataMaker.exceptionEntry = function(url, id) {
-  url = url || FakeDataMaker.patternMaker_('www.xxxxxx.com', 16);
-  id = id || 0;
-  return {
-    urls: {
-      origin: 'http://' + url + '/login',
-      shown: url,
-      link: 'http://' + url + '/login',
-    },
-    id: id,
-  };
-};
-
-/**
- * Creates a new fake address entry for testing.
- * @return {!chrome.autofillPrivate.AddressEntry}
- */
-FakeDataMaker.emptyAddressEntry = function() {
-  return {};
-};
-
-/**
- * Creates a fake address entry for testing.
- * @return {!chrome.autofillPrivate.AddressEntry}
- */
-FakeDataMaker.addressEntry = function() {
-  const ret = {};
-  ret.guid = FakeDataMaker.makeGuid_();
-  ret.fullNames = ['John Doe'];
-  ret.companyName = 'Google';
-  ret.addressLines = FakeDataMaker.patternMaker_('xxxx Main St', 10);
-  ret.addressLevel1 = 'CA';
-  ret.addressLevel2 = 'Venice';
-  ret.postalCode = FakeDataMaker.patternMaker_('xxxxx', 10);
-  ret.countryCode = 'US';
-  ret.phoneNumbers = [FakeDataMaker.patternMaker_('(xxx) xxx-xxxx', 10)];
-  ret.emailAddresses = [FakeDataMaker.patternMaker_('userxxxx@gmail.com', 16)];
-  ret.languageCode = 'EN-US';
-  ret.metadata = {isLocal: true};
-  ret.metadata.summaryLabel = ret.fullNames[0];
-  ret.metadata.summarySublabel = ', ' + ret.addressLines;
-  return ret;
-};
-
-/**
- * Creates a new empty credit card entry for testing.
- * @return {!chrome.autofillPrivate.CreditCardEntry}
- */
-FakeDataMaker.emptyCreditCardEntry = function() {
-  const now = new Date();
-  const expirationMonth = now.getMonth() + 1;
-  const ret = {};
-  ret.expirationMonth = expirationMonth.toString();
-  ret.expirationYear = now.getFullYear().toString();
-  return ret;
-};
-
-/**
- * Creates a new random credit card entry for testing.
- * @return {!chrome.autofillPrivate.CreditCardEntry}
- */
-FakeDataMaker.creditCardEntry = function() {
-  const ret = {};
-  ret.guid = FakeDataMaker.makeGuid_();
-  ret.name = 'Jane Doe';
-  ret.cardNumber = FakeDataMaker.patternMaker_('xxxx xxxx xxxx xxxx', 10);
-  ret.expirationMonth = Math.ceil(Math.random() * 11).toString();
-  ret.expirationYear = (2016 + Math.floor(Math.random() * 5)).toString();
-  ret.metadata = {isLocal: true};
-  const cards = ['Visa', 'Mastercard', 'Discover', 'Card'];
-  const card = cards[Math.floor(Math.random() * cards.length)];
-  ret.metadata.summaryLabel = card + ' ' +
-      '****' + ret.cardNumber.substr(-4);
-  return ret;
-};
-
-/**
- * Creates a new random GUID for testing.
- * @return {string}
- * @private
- */
-FakeDataMaker.makeGuid_ = function() {
-  return FakeDataMaker.patternMaker_(
-      'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', 16);
-};
-
-/**
- * Replaces any 'x' in a string with a random number of the base.
- * @param {string} pattern The pattern that should be used as an input.
- * @param {number} base The number base. ie: 16 for hex or 10 for decimal.
- * @return {string}
- * @private
- */
-FakeDataMaker.patternMaker_ = function(pattern, base) {
-  return pattern.replace(/x/g, function() {
-    return Math.floor(Math.random() * base).toString(base);
-  });
-};
-
-/**
- * Creates a new compromised credential.
- * @param {string=} url
- * @param {string=} username
- * @param {string=} type
- * @return {chrome.passwordsPrivate.CompromisedCredential}
- * @private
- */
-FakeDataMaker.makeCompromisedCredentials = function(url, username, type) {
-  return {
-    formattedOrigin: url,
-    changePasswordUrl: 'http://${url}/',
-    username: username,
-    elapsedTimeSinceCompromise:
-        (Math.floor(Math.random() * 60)).toString() + ' min ago',
-    compromiseType: type,
-  };
-};
-
-/**
- * Creates a new compromised credential info.
- * @param {!Array<!chrome.passwordsPrivate.CompromisedCredential>} list
- * @param {string=} lastCheck
- * @return {chrome.passwordsPrivate.CompromisedCredentialsInfo}
- * @private
- */
-FakeDataMaker.makeCompromisedCredentialsInfo = function(list, lastCheck) {
-  return {
-    compromisedCredentials: list,
-    elapsedTimeSinceLastCheck: lastCheck,
-  };
-};
-
-/**
- * Helper class for creating password-section sub-element from fake data and
- * appending them to the document.
- */
-class PasswordSectionElementFactory {
+cr.define('autofill_test_util', function() {
   /**
-   * @param {HTMLDocument} document The test's |document| object.
+   * Creates a single item for the list of passwords.
+   * @param {string=} url
+   * @param {string=} username
+   * @param {number=} passwordLength
+   * @param {number=} id
+   * @return {chrome.passwordsPrivate.PasswordUiEntry}
    */
-  constructor(document) {
-    this.document = document;
-  }
+  function createPasswordEntry(url, username, passwordLength, id) {
+    // Generate fake data if param is undefined.
+    url = url || patternMaker_('www.xxxxxx.com', 16);
+    username = username || patternMaker_('user_xxxxx', 16);
+    passwordLength = passwordLength || Math.floor(Math.random() * 15) + 3;
+    id = id || 0;
 
-  /**
-   * Helper method used to create a password section for the given lists.
-   * @param {!PasswordManagerProxy} passwordManager
-   * @param {!Array<!chrome.passwordsPrivate.PasswordUiEntry>} passwordList
-   * @param {!Array<!chrome.passwordsPrivate.ExceptionEntry>} exceptionList
-   * @return {!Object}
-   */
-  createPasswordsSection(passwordManager, passwordList, exceptionList) {
-    // Override the PasswordManagerProxy data for testing.
-    passwordManager.data.passwords = passwordList;
-    passwordManager.data.exceptions = exceptionList;
-
-    // Create a passwords-section to use for testing.
-    const passwordsSection = this.document.createElement('passwords-section');
-    passwordsSection.prefs = {
-      credentials_enable_service: {},
-      profile: {
-        password_manager_leak_detection: {
-          value: true,
-        }
+    return {
+      urls: {
+        origin: 'http://' + url + '/login',
+        shown: url,
+        link: 'http://' + url + '/login',
       },
+      username: username,
+      numCharactersInPassword: passwordLength,
+      id: id,
     };
-    this.document.body.appendChild(passwordsSection);
-    Polymer.dom.flush();
-    return passwordsSection;
   }
 
   /**
-   * Helper method used to create a password list item.
-   * @param {!chrome.passwordsPrivate.PasswordUiEntry} passwordEntry
-   * @return {!Object}
+   * Creates a single item for the list of password exceptions.
+   * @param {string=} url
+   * @param {number=} id
+   * @return {chrome.passwordsPrivate.ExceptionEntry}
    */
-  createPasswordListItem(passwordEntry) {
-    const passwordListItem = this.document.createElement('password-list-item');
-    passwordListItem.item = {entry: passwordEntry, password: ''};
-    this.document.body.appendChild(passwordListItem);
-    Polymer.dom.flush();
-    return passwordListItem;
+  function createExceptionEntry(url, id) {
+    url = url || patternMaker_('www.xxxxxx.com', 16);
+    id = id || 0;
+    return {
+      urls: {
+        origin: 'http://' + url + '/login',
+        shown: url,
+        link: 'http://' + url + '/login',
+      },
+      id: id,
+    };
   }
 
   /**
-   * Helper method used to create a password editing dialog.
-   * @param {!chrome.passwordsPrivate.PasswordUiEntry} passwordEntry
-   * @return {!Object}
+   * Creates a new fake address entry for testing.
+   * @return {!chrome.autofillPrivate.AddressEntry}
    */
-  createPasswordEditDialog(passwordEntry) {
-    const passwordDialog = this.document.createElement('password-edit-dialog');
-    passwordDialog.item = {entry: passwordEntry, password: ''};
-    this.document.body.appendChild(passwordDialog);
-    Polymer.dom.flush();
-    return passwordDialog;
+  function createEmptyAddressEntry() {
+    return {};
   }
 
   /**
-   * Helper method used to create an export passwords dialog.
-   * @return {!Object}
+   * Creates a fake address entry for testing.
+   * @return {!chrome.autofillPrivate.AddressEntry}
    */
-  createExportPasswordsDialog(passwordManager) {
-    passwordManager.requestExportProgressStatus = callback => {
-      callback(chrome.passwordsPrivate.ExportProgressStatus.NOT_STARTED);
-    };
-    passwordManager.addPasswordsFileExportProgressListener = callback => {
-      passwordManager.progressCallback = callback;
-    };
-    passwordManager.removePasswordsFileExportProgressListener = () => {};
-    passwordManager.exportPasswords = (callback) => {
-      callback();
-    };
+  function createAddressEntry() {
+    const ret = {};
+    ret.guid = makeGuid_();
+    ret.fullNames = ['John Doe'];
+    ret.companyName = 'Google';
+    ret.addressLines = patternMaker_('xxxx Main St', 10);
+    ret.addressLevel1 = 'CA';
+    ret.addressLevel2 = 'Venice';
+    ret.postalCode = patternMaker_('xxxxx', 10);
+    ret.countryCode = 'US';
+    ret.phoneNumbers = [patternMaker_('(xxx) xxx-xxxx', 10)];
+    ret.emailAddresses = [patternMaker_('userxxxx@gmail.com', 16)];
+    ret.languageCode = 'EN-US';
+    ret.metadata = {isLocal: true};
+    ret.metadata.summaryLabel = ret.fullNames[0];
+    ret.metadata.summarySublabel = ', ' + ret.addressLines;
+    return ret;
+  }
 
-    const dialog = this.document.createElement('passwords-export-dialog');
-    this.document.body.appendChild(dialog);
-    Polymer.dom.flush();
+  /**
+   * Creates a new empty credit card entry for testing.
+   * @return {!chrome.autofillPrivate.CreditCardEntry}
+   */
+  function createEmptyCreditCardEntry() {
+    const now = new Date();
+    const expirationMonth = now.getMonth() + 1;
+    const ret = {};
+    ret.expirationMonth = expirationMonth.toString();
+    ret.expirationYear = now.getFullYear().toString();
+    return ret;
+  }
 
-    if (cr.isChromeOS) {
-      dialog.tokenRequestManager = new settings.BlockingRequestManager();
+  /**
+   * Creates a new random credit card entry for testing.
+   * @return {!chrome.autofillPrivate.CreditCardEntry}
+   */
+  function createCreditCardEntry() {
+    const ret = {};
+    ret.guid = makeGuid_();
+    ret.name = 'Jane Doe';
+    ret.cardNumber = patternMaker_('xxxx xxxx xxxx xxxx', 10);
+    ret.expirationMonth = Math.ceil(Math.random() * 11).toString();
+    ret.expirationYear = (2016 + Math.floor(Math.random() * 5)).toString();
+    ret.metadata = {isLocal: true};
+    const cards = ['Visa', 'Mastercard', 'Discover', 'Card'];
+    const card = cards[Math.floor(Math.random() * cards.length)];
+    ret.metadata.summaryLabel = card + ' ' +
+        '****' + ret.cardNumber.substr(-4);
+    return ret;
+  }
+
+  /**
+   * Creates a new compromised credential.
+   * @param {string=} url
+   * @param {string=} username
+   * @param {string=} type
+   * @return {chrome.passwordsPrivate.CompromisedCredential}
+   * @private
+   */
+  function makeCompromisedCredentials(url, username, type) {
+    return {
+      formattedOrigin: url,
+      changePasswordUrl: 'http://${url}/',
+      username: username,
+      elapsedTimeSinceCompromise:
+          (Math.floor(Math.random() * 60)).toString() + ' min ago',
+      compromiseType: type,
+    };
+  }
+
+  /**
+   * Creates a new compromised credential info.
+   * @param {!Array<!chrome.passwordsPrivate.CompromisedCredential>} list
+   * @param {string=} lastCheck
+   * @return {chrome.passwordsPrivate.CompromisedCredentialsInfo}
+   * @private
+   */
+  function makeCompromisedCredentialsInfo(list, lastCheck) {
+    return {
+      compromisedCredentials: list,
+      elapsedTimeSinceLastCheck: lastCheck,
+    };
+  }
+
+  /**
+   * Creates a new random GUID for testing.
+   * @return {string}
+   * @private
+   */
+  function makeGuid_() {
+    return patternMaker_('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', 16);
+  }
+
+  /**
+   * Replaces any 'x' in a string with a random number of the base.
+   * @param {string} pattern The pattern that should be used as an input.
+   * @param {number} base The number base. ie: 16 for hex or 10 for decimal.
+   * @return {string}
+   * @private
+   */
+  function patternMaker_(pattern, base) {
+    return pattern.replace(/x/g, function() {
+      return Math.floor(Math.random() * base).toString(base);
+    });
+  }
+
+  /**
+   * Helper class for creating password-section sub-element from fake data and
+   * appending them to the document.
+   */
+  class PasswordSectionElementFactory {
+    /**
+     * @param {HTMLDocument} document The test's |document| object.
+     */
+    constructor(document) {
+      this.document = document;
     }
 
-    return dialog;
+    /**
+     * Helper method used to create a password section for the given lists.
+     * @param {!PasswordManagerProxy} passwordManager
+     * @param {!Array<!chrome.passwordsPrivate.PasswordUiEntry>} passwordList
+     * @param {!Array<!chrome.passwordsPrivate.ExceptionEntry>} exceptionList
+     * @return {!Object}
+     */
+    createPasswordsSection(passwordManager, passwordList, exceptionList) {
+      // Override the PasswordManagerProxy data for testing.
+      passwordManager.data.passwords = passwordList;
+      passwordManager.data.exceptions = exceptionList;
+
+      // Create a passwords-section to use for testing.
+      const passwordsSection = this.document.createElement('passwords-section');
+      passwordsSection.prefs = {
+        credentials_enable_service: {},
+        profile: {
+          password_manager_leak_detection: {
+            value: true,
+          }
+        },
+      };
+      this.document.body.appendChild(passwordsSection);
+      Polymer.dom.flush();
+      return passwordsSection;
+    }
+
+    /**
+     * Helper method used to create a password list item.
+     * @param {!chrome.passwordsPrivate.PasswordUiEntry} passwordEntry
+     * @return {!Object}
+     */
+    createPasswordListItem(passwordEntry) {
+      const passwordListItem =
+          this.document.createElement('password-list-item');
+      passwordListItem.item = {entry: passwordEntry, password: ''};
+      this.document.body.appendChild(passwordListItem);
+      Polymer.dom.flush();
+      return passwordListItem;
+    }
+
+    /**
+     * Helper method used to create a password editing dialog.
+     * @param {!chrome.passwordsPrivate.PasswordUiEntry} passwordEntry
+     * @return {!Object}
+     */
+    createPasswordEditDialog(passwordEntry) {
+      const passwordDialog =
+          this.document.createElement('password-edit-dialog');
+      passwordDialog.item = {entry: passwordEntry, password: ''};
+      this.document.body.appendChild(passwordDialog);
+      Polymer.dom.flush();
+      return passwordDialog;
+    }
+
+    /**
+     * Helper method used to create an export passwords dialog.
+     * @return {!Object}
+     */
+    createExportPasswordsDialog(passwordManager) {
+      passwordManager.requestExportProgressStatus = callback => {
+        callback(chrome.passwordsPrivate.ExportProgressStatus.NOT_STARTED);
+      };
+      passwordManager.addPasswordsFileExportProgressListener = callback => {
+        passwordManager.progressCallback = callback;
+      };
+      passwordManager.removePasswordsFileExportProgressListener = () => {};
+      passwordManager.exportPasswords = (callback) => {
+        callback();
+      };
+
+      const dialog = this.document.createElement('passwords-export-dialog');
+      this.document.body.appendChild(dialog);
+      Polymer.dom.flush();
+
+      if (cr.isChromeOS) {
+        dialog.tokenRequestManager = new settings.BlockingRequestManager();
+      }
+
+      return dialog;
+    }
   }
-}
 
-/** @constructor */
-function PasswordManagerExpectations() {
-  this.requested = {
-    passwords: 0,
-    exceptions: 0,
-    plaintextPassword: 0,
-    accountStorageOptInState: 0,
-  };
+  class PasswordManagerExpectations {
+    constructor() {
+      this.requested = {
+        passwords: 0,
+        exceptions: 0,
+        plaintextPassword: 0,
+        accountStorageOptInState: 0,
+      };
 
-  this.removed = {
-    passwords: 0,
-    exceptions: 0,
-  };
+      this.removed = {
+        passwords: 0,
+        exceptions: 0,
+      };
 
-  this.listening = {
-    passwords: 0,
-    exceptions: 0,
-    accountStorageOptInState: 0,
-  };
-}
-
-/** Helper class to track AutofillManager expectations. */
-class AutofillManagerExpectations {
-  constructor() {
-    this.requestedAddresses = 0;
-    this.listeningAddresses = 0;
+      this.listening = {
+        passwords: 0,
+        exceptions: 0,
+        accountStorageOptInState: 0,
+      };
+    }
   }
-}
 
-/**
- * Test implementation
- * @implements {AutofillManager}
- * @constructor
- */
-function TestAutofillManager() {
-  this.actual_ = new AutofillManagerExpectations();
-
-  // Set these to have non-empty data.
-  this.data = {
-    addresses: [],
-  };
-
-  // Holds the last callbacks so they can be called when needed.
-  this.lastCallback = {
-    setPersonalDataManagerListener: null,
-  };
-}
-
-TestAutofillManager.prototype = {
-  /** @override */
-  setPersonalDataManagerListener: function(listener) {
-    this.actual_.listeningAddresses++;
-    this.lastCallback.setPersonalDataManagerListener = listener;
-  },
-
-  /** @override */
-  removePersonalDataManagerListener: function(listener) {
-    this.actual_.listeningAddresses--;
-  },
-
-  /** @override */
-  getAddressList: function(callback) {
-    this.actual_.requestedAddresses++;
-    callback(this.data.addresses);
-  },
+  /** Helper class to track AutofillManager expectations. */
+  class AutofillManagerExpectations {
+    constructor() {
+      this.requestedAddresses = 0;
+      this.listeningAddresses = 0;
+    }
+  }
 
   /**
-   * Verifies expectations.
-   * @param {!AutofillManagerExpectations} expected
+   * Test implementation
+   * @implements {AutofillManager}
    */
-  assertExpectations: function(expected) {
-    const actual = this.actual_;
-    assertEquals(expected.requestedAddresses, actual.requestedAddresses);
-    assertEquals(expected.listeningAddresses, actual.listeningAddresses);
-  },
-};
+  class TestAutofillManager {
+    constructor() {
+      this.actual_ = new AutofillManagerExpectations();
 
-/** Helper class to track PaymentsManager expectations. */
-class PaymentsManagerExpectations {
-  constructor() {
-    this.requestedCreditCards = 0;
-    this.listeningCreditCards = 0;
+      // Set these to have non-empty data.
+      this.data = {
+        addresses: [],
+      };
+
+      // Holds the last callbacks so they can be called when needed.
+      this.lastCallback = {
+        setPersonalDataManagerListener: null,
+      };
+    }
+
+    /** @override */
+    setPersonalDataManagerListener(listener) {
+      this.actual_.listeningAddresses++;
+      this.lastCallback.setPersonalDataManagerListener = listener;
+    }
+
+    /** @override */
+    removePersonalDataManagerListener(listener) {
+      this.actual_.listeningAddresses--;
+    }
+
+    /** @override */
+    getAddressList(callback) {
+      this.actual_.requestedAddresses++;
+      callback(this.data.addresses);
+    }
+
+    /**
+     * Verifies expectations.
+     * @param {!AutofillManagerExpectations} expected
+     */
+    assertExpectations(expected) {
+      const actual = this.actual_;
+      assertEquals(expected.requestedAddresses, actual.requestedAddresses);
+      assertEquals(expected.listeningAddresses, actual.listeningAddresses);
+    }
   }
-}
 
-/**
- * Test implementation
- * @implements {PaymentsManager}
- * @constructor
- */
-function TestPaymentsManager() {
-  this.actual_ = new PaymentsManagerExpectations();
-
-  // Set these to have non-empty data.
-  this.data = {
-    creditCards: [],
-    upiIds: [],
-  };
-
-  // Holds the last callbacks so they can be called when needed.
-  this.lastCallback = {
-    setPersonalDataManagerListener: null,
-  };
-}
-
-TestPaymentsManager.prototype = {
-  /** @override */
-  setPersonalDataManagerListener: function(listener) {
-    this.actual_.listeningCreditCards++;
-    this.lastCallback.setPersonalDataManagerListener = listener;
-  },
-
-  /** @override */
-  removePersonalDataManagerListener: function(listener) {
-    this.actual_.listeningCreditCards--;
-  },
-
-  /** @override */
-  getCreditCardList: function(callback) {
-    this.actual_.requestedCreditCards++;
-    callback(this.data.creditCards);
-  },
-
-  /** @override */
-  getUpiIdList: function(callback) {
-    this.actual_.requestedUpiIds++;
-    callback(this.data.upiIds);
-  },
+  /** Helper class to track PaymentsManager expectations. */
+  class PaymentsManagerExpectations {
+    constructor() {
+      this.requestedCreditCards = 0;
+      this.listeningCreditCards = 0;
+    }
+  }
 
   /**
-   * Verifies expectations.
-   * @param {!PaymentsManagerExpectations} expected
+   * Test implementation
+   * @implements {PaymentsManager}
    */
-  assertExpectations: function(expected) {
-    const actual = this.actual_;
-    assertEquals(expected.requestedCreditCards, actual.requestedCreditCards);
-    assertEquals(expected.listeningCreditCards, actual.listeningCreditCards);
-  },
-};
+  class TestPaymentsManager {
+    constructor() {
+      this.actual_ = new PaymentsManagerExpectations();
+
+      // Set these to have non-empty data.
+      this.data = {
+        creditCards: [],
+        upiIds: [],
+      };
+
+      // Holds the last callbacks so they can be called when needed.
+      this.lastCallback = {
+        setPersonalDataManagerListener: null,
+      };
+    }
+
+    /** @override */
+    setPersonalDataManagerListener(listener) {
+      this.actual_.listeningCreditCards++;
+      this.lastCallback.setPersonalDataManagerListener = listener;
+    }
+
+    /** @override */
+    removePersonalDataManagerListener(listener) {
+      this.actual_.listeningCreditCards--;
+    }
+
+    /** @override */
+    getCreditCardList(callback) {
+      this.actual_.requestedCreditCards++;
+      callback(this.data.creditCards);
+    }
+
+    /** @override */
+    getUpiIdList(callback) {
+      this.actual_.requestedUpiIds++;
+      callback(this.data.upiIds);
+    }
+
+    /**
+     * Verifies expectations.
+     * @param {!PaymentsManagerExpectations} expected
+     */
+    assertExpectations(expected) {
+      const actual = this.actual_;
+      assertEquals(expected.requestedCreditCards, actual.requestedCreditCards);
+      assertEquals(expected.listeningCreditCards, actual.listeningCreditCards);
+    }
+  }
+
+  // #cr_define_end
+  return {
+    createPasswordEntry: createPasswordEntry,
+    createExceptionEntry: createExceptionEntry,
+    createEmptyAddressEntry: createEmptyAddressEntry,
+    createAddressEntry: createAddressEntry,
+    createEmptyCreditCardEntry: createEmptyCreditCardEntry,
+    createCreditCardEntry: createCreditCardEntry,
+    makeCompromisedCredentials: makeCompromisedCredentials,
+    makeCompromisedCredentialsInfo: makeCompromisedCredentialsInfo,
+    TestPaymentsManager: TestPaymentsManager,
+    PaymentsManagerExpectations: PaymentsManagerExpectations,
+    TestAutofillManager: TestAutofillManager,
+    AutofillManagerExpectations: AutofillManagerExpectations,
+    PasswordSectionElementFactory: PasswordSectionElementFactory,
+    PasswordManagerExpectations: PasswordManagerExpectations,
+  };
+});
diff --git a/chrome/test/data/webui/settings/passwords_section_test.js b/chrome/test/data/webui/settings/passwords_section_test.js
index c1f65005..e26fb77 100644
--- a/chrome/test/data/webui/settings/passwords_section_test.js
+++ b/chrome/test/data/webui/settings/passwords_section_test.js
@@ -106,7 +106,7 @@
     /** @type {TestPasswordManagerProxy} */
     let passwordManager = null;
 
-    /** @type {PasswordSectionElementFactory} */
+    /** @type {autofill_test_util.PasswordSectionElementFactory} */
     let elementFactory = null;
 
     suiteSetup(function() {
@@ -118,7 +118,8 @@
       // Override the PasswordManagerImpl for testing.
       passwordManager = new TestPasswordManagerProxy();
       PasswordManagerImpl.instance_ = passwordManager;
-      elementFactory = new PasswordSectionElementFactory(document);
+      elementFactory =
+          new autofill_test_util.PasswordSectionElementFactory(document);
     });
 
     test('testPasswordsExtensionIndicator', function() {
@@ -148,12 +149,12 @@
 
     test('verifySavedPasswordLength', function() {
       const passwordList = [
-        FakeDataMaker.passwordEntry('site1.com', 'luigi', 1),
-        FakeDataMaker.passwordEntry('longwebsite.com', 'peach', 7),
-        FakeDataMaker.passwordEntry('site2.com', 'mario', 70),
-        FakeDataMaker.passwordEntry('site1.com', 'peach', 11),
-        FakeDataMaker.passwordEntry('google.com', 'mario', 7),
-        FakeDataMaker.passwordEntry('site2.com', 'luigi', 8),
+        autofill_test_util.createPasswordEntry('site1.com', 'luigi', 1),
+        autofill_test_util.createPasswordEntry('longwebsite.com', 'peach', 7),
+        autofill_test_util.createPasswordEntry('site2.com', 'mario', 70),
+        autofill_test_util.createPasswordEntry('site1.com', 'peach', 11),
+        autofill_test_util.createPasswordEntry('google.com', 'mario', 7),
+        autofill_test_util.createPasswordEntry('site2.com', 'luigi', 8),
       ];
 
       const passwordsSection = elementFactory.createPasswordsSection(
@@ -174,9 +175,11 @@
     // Test verifies that removing a password will update the elements.
     test('verifyPasswordListRemove', function() {
       const passwordList = [
-        FakeDataMaker.passwordEntry('anotherwebsite.com', 'luigi', 1, 0),
-        FakeDataMaker.passwordEntry('longwebsite.com', 'peach', 7, 1),
-        FakeDataMaker.passwordEntry('website.com', 'mario', 70, 2)
+        autofill_test_util.createPasswordEntry(
+            'anotherwebsite.com', 'luigi', 1, 0),
+        autofill_test_util.createPasswordEntry(
+            'longwebsite.com', 'peach', 7, 1),
+        autofill_test_util.createPasswordEntry('website.com', 'mario', 70, 2)
       ];
 
       const passwordsSection = elementFactory.createPasswordsSection(
@@ -200,8 +203,10 @@
     // Test verifies that adding a password will update the elements.
     test('verifyPasswordListAdd', function() {
       const passwordList = [
-        FakeDataMaker.passwordEntry('anotherwebsite.com', 'luigi', 1, 0),
-        FakeDataMaker.passwordEntry('longwebsite.com', 'peach', 7, 1),
+        autofill_test_util.createPasswordEntry(
+            'anotherwebsite.com', 'luigi', 1, 0),
+        autofill_test_util.createPasswordEntry(
+            'longwebsite.com', 'peach', 7, 1),
       ];
 
       const passwordsSection = elementFactory.createPasswordsSection(
@@ -209,8 +214,8 @@
 
       validatePasswordList(passwordsSection.$.passwordList, passwordList);
       // Simulate 'website.com' being added to the list.
-      passwordList.unshift(
-          FakeDataMaker.passwordEntry('website.com', 'mario', 70, 2));
+      passwordList.unshift(autofill_test_util.createPasswordEntry(
+          'website.com', 'mario', 70, 2));
       passwordManager.lastCallback.addSavedPasswordListChangedListener(
           passwordList);
       Polymer.dom.flush();
@@ -226,8 +231,8 @@
 
       // Set-up initial list.
       let passwordList = [
-        FakeDataMaker.passwordEntry('website.com', 'mario', 1, 0),
-        FakeDataMaker.passwordEntry('website.com', 'luigi', 7, 1)
+        autofill_test_util.createPasswordEntry('website.com', 'mario', 1, 0),
+        autofill_test_util.createPasswordEntry('website.com', 'luigi', 7, 1)
       ];
 
       passwordManager.lastCallback.addSavedPasswordListChangedListener(
@@ -254,12 +259,12 @@
     // event. Does not actually remove any passwords.
     test('verifyPasswordItemRemoveButton', function(done) {
       const passwordList = [
-        FakeDataMaker.passwordEntry('one', 'six', 5),
-        FakeDataMaker.passwordEntry('two', 'five', 3),
-        FakeDataMaker.passwordEntry('three', 'four', 1),
-        FakeDataMaker.passwordEntry('four', 'three', 2),
-        FakeDataMaker.passwordEntry('five', 'two', 4),
-        FakeDataMaker.passwordEntry('six', 'one', 6),
+        autofill_test_util.createPasswordEntry('one', 'six', 5),
+        autofill_test_util.createPasswordEntry('two', 'five', 3),
+        autofill_test_util.createPasswordEntry('three', 'four', 1),
+        autofill_test_util.createPasswordEntry('four', 'three', 2),
+        autofill_test_util.createPasswordEntry('five', 'two', 4),
+        autofill_test_util.createPasswordEntry('six', 'one', 6),
       ];
 
       const passwordsSection = elementFactory.createPasswordsSection(
@@ -288,7 +293,7 @@
     // (passwordless) credentials. Does not test Copy button.
     test('verifyCopyAbsentForFederatedPasswordInMenu', function() {
       const passwordList = [
-        FakeDataMaker.passwordEntry('one.com', 'hey', 0),
+        autofill_test_util.createPasswordEntry('one.com', 'hey', 0),
       ];
       passwordList[0].federationText = 'with chromium.org';
 
@@ -304,7 +309,7 @@
     // credentials. Does not test Copy button.
     test('verifyCopyPresentInMenu', function() {
       const passwordList = [
-        FakeDataMaker.passwordEntry('one.com', 'hey', 5),
+        autofill_test_util.createPasswordEntry('one.com', 'hey', 5),
       ];
       const passwordsSection = elementFactory.createPasswordsSection(
           passwordManager, passwordList, []);
@@ -316,12 +321,12 @@
 
     test('verifyFilterPasswords', function() {
       const passwordList = [
-        FakeDataMaker.passwordEntry('one.com', 'SHOW', 5),
-        FakeDataMaker.passwordEntry('two.com', 'shower', 3),
-        FakeDataMaker.passwordEntry('three.com/show', 'four', 1),
-        FakeDataMaker.passwordEntry('four.com', 'three', 2),
-        FakeDataMaker.passwordEntry('five.com', 'two', 4),
-        FakeDataMaker.passwordEntry('six-show.com', 'one', 6),
+        autofill_test_util.createPasswordEntry('one.com', 'SHOW', 5),
+        autofill_test_util.createPasswordEntry('two.com', 'shower', 3),
+        autofill_test_util.createPasswordEntry('three.com/show', 'four', 1),
+        autofill_test_util.createPasswordEntry('four.com', 'three', 2),
+        autofill_test_util.createPasswordEntry('five.com', 'two', 4),
+        autofill_test_util.createPasswordEntry('six-show.com', 'one', 6),
       ];
 
       const passwordsSection = elementFactory.createPasswordsSection(
@@ -330,10 +335,10 @@
       Polymer.dom.flush();
 
       const expectedList = [
-        FakeDataMaker.passwordEntry('one.com', 'SHOW', 5),
-        FakeDataMaker.passwordEntry('two.com', 'shower', 3),
-        FakeDataMaker.passwordEntry('three.com/show', 'four', 1),
-        FakeDataMaker.passwordEntry('six-show.com', 'one', 6),
+        autofill_test_util.createPasswordEntry('one.com', 'SHOW', 5),
+        autofill_test_util.createPasswordEntry('two.com', 'shower', 3),
+        autofill_test_util.createPasswordEntry('three.com/show', 'four', 1),
+        autofill_test_util.createPasswordEntry('six-show.com', 'one', 6),
       ];
 
       validatePasswordList(passwordsSection.$.passwordList, expectedList);
@@ -341,12 +346,12 @@
 
     test('verifyFilterPasswordsWithRemoval', function() {
       const passwordList = [
-        FakeDataMaker.passwordEntry('one.com', 'SHOW', 5, 0),
-        FakeDataMaker.passwordEntry('two.com', 'shower', 3, 1),
-        FakeDataMaker.passwordEntry('three.com/show', 'four', 1, 2),
-        FakeDataMaker.passwordEntry('four.com', 'three', 2, 3),
-        FakeDataMaker.passwordEntry('five.com', 'two', 4, 4),
-        FakeDataMaker.passwordEntry('six-show.com', 'one', 6, 5),
+        autofill_test_util.createPasswordEntry('one.com', 'SHOW', 5, 0),
+        autofill_test_util.createPasswordEntry('two.com', 'shower', 3, 1),
+        autofill_test_util.createPasswordEntry('three.com/show', 'four', 1, 2),
+        autofill_test_util.createPasswordEntry('four.com', 'three', 2, 3),
+        autofill_test_util.createPasswordEntry('five.com', 'two', 4, 4),
+        autofill_test_util.createPasswordEntry('six-show.com', 'one', 6, 5),
       ];
 
       const passwordsSection = elementFactory.createPasswordsSection(
@@ -355,10 +360,10 @@
       Polymer.dom.flush();
 
       let expectedList = [
-        FakeDataMaker.passwordEntry('one.com', 'SHOW', 5, 0),
-        FakeDataMaker.passwordEntry('two.com', 'shower', 3, 1),
-        FakeDataMaker.passwordEntry('three.com/show', 'four', 1, 2),
-        FakeDataMaker.passwordEntry('six-show.com', 'one', 6, 5),
+        autofill_test_util.createPasswordEntry('one.com', 'SHOW', 5, 0),
+        autofill_test_util.createPasswordEntry('two.com', 'shower', 3, 1),
+        autofill_test_util.createPasswordEntry('three.com/show', 'four', 1, 2),
+        autofill_test_util.createPasswordEntry('six-show.com', 'one', 6, 5),
       ];
 
       validatePasswordList(passwordsSection.$.passwordList, expectedList);
@@ -367,9 +372,9 @@
       passwordList.splice(2, 1);
 
       expectedList = [
-        FakeDataMaker.passwordEntry('one.com', 'SHOW', 5, 0),
-        FakeDataMaker.passwordEntry('two.com', 'shower', 3, 1),
-        FakeDataMaker.passwordEntry('six-show.com', 'one', 6, 5),
+        autofill_test_util.createPasswordEntry('one.com', 'SHOW', 5, 0),
+        autofill_test_util.createPasswordEntry('two.com', 'shower', 3, 1),
+        autofill_test_util.createPasswordEntry('six-show.com', 'one', 6, 5),
       ];
 
       passwordManager.lastCallback.addSavedPasswordListChangedListener(
@@ -380,12 +385,12 @@
 
     test('verifyFilterPasswordExceptions', function() {
       const exceptionList = [
-        FakeDataMaker.exceptionEntry('docsshoW.google.com'),
-        FakeDataMaker.exceptionEntry('showmail.com'),
-        FakeDataMaker.exceptionEntry('google.com'),
-        FakeDataMaker.exceptionEntry('inbox.google.com'),
-        FakeDataMaker.exceptionEntry('mapsshow.google.com'),
-        FakeDataMaker.exceptionEntry('plus.google.comshow'),
+        autofill_test_util.createExceptionEntry('docsshoW.google.com'),
+        autofill_test_util.createExceptionEntry('showmail.com'),
+        autofill_test_util.createExceptionEntry('google.com'),
+        autofill_test_util.createExceptionEntry('inbox.google.com'),
+        autofill_test_util.createExceptionEntry('mapsshow.google.com'),
+        autofill_test_util.createExceptionEntry('plus.google.comshow'),
       ];
 
       const passwordsSection = elementFactory.createPasswordsSection(
@@ -394,10 +399,10 @@
       Polymer.dom.flush();
 
       const expectedExceptionList = [
-        FakeDataMaker.exceptionEntry('docsshoW.google.com'),
-        FakeDataMaker.exceptionEntry('showmail.com'),
-        FakeDataMaker.exceptionEntry('mapsshow.google.com'),
-        FakeDataMaker.exceptionEntry('plus.google.comshow'),
+        autofill_test_util.createExceptionEntry('docsshoW.google.com'),
+        autofill_test_util.createExceptionEntry('showmail.com'),
+        autofill_test_util.createExceptionEntry('mapsshow.google.com'),
+        autofill_test_util.createExceptionEntry('plus.google.comshow'),
       ];
 
       validateExceptionList(
@@ -417,12 +422,12 @@
 
     test('verifyPasswordExceptions', function() {
       const exceptionList = [
-        FakeDataMaker.exceptionEntry('docs.google.com'),
-        FakeDataMaker.exceptionEntry('mail.com'),
-        FakeDataMaker.exceptionEntry('google.com'),
-        FakeDataMaker.exceptionEntry('inbox.google.com'),
-        FakeDataMaker.exceptionEntry('maps.google.com'),
-        FakeDataMaker.exceptionEntry('plus.google.com'),
+        autofill_test_util.createExceptionEntry('docs.google.com'),
+        autofill_test_util.createExceptionEntry('mail.com'),
+        autofill_test_util.createExceptionEntry('google.com'),
+        autofill_test_util.createExceptionEntry('inbox.google.com'),
+        autofill_test_util.createExceptionEntry('maps.google.com'),
+        autofill_test_util.createExceptionEntry('plus.google.com'),
       ];
 
       const passwordsSection = elementFactory.createPasswordsSection(
@@ -438,12 +443,12 @@
     // Test verifies that removing an exception will update the elements.
     test('verifyPasswordExceptionRemove', function() {
       const exceptionList = [
-        FakeDataMaker.exceptionEntry('docs.google.com'),
-        FakeDataMaker.exceptionEntry('mail.com'),
-        FakeDataMaker.exceptionEntry('google.com'),
-        FakeDataMaker.exceptionEntry('inbox.google.com'),
-        FakeDataMaker.exceptionEntry('maps.google.com'),
-        FakeDataMaker.exceptionEntry('plus.google.com'),
+        autofill_test_util.createExceptionEntry('docs.google.com'),
+        autofill_test_util.createExceptionEntry('mail.com'),
+        autofill_test_util.createExceptionEntry('google.com'),
+        autofill_test_util.createExceptionEntry('inbox.google.com'),
+        autofill_test_util.createExceptionEntry('maps.google.com'),
+        autofill_test_util.createExceptionEntry('plus.google.com'),
       ];
 
       const passwordsSection = elementFactory.createPasswordsSection(
@@ -469,12 +474,12 @@
     // event. Does not actually remove any exceptions.
     test('verifyPasswordExceptionRemoveButton', function(done) {
       const exceptionList = [
-        FakeDataMaker.exceptionEntry('docs.google.com'),
-        FakeDataMaker.exceptionEntry('mail.com'),
-        FakeDataMaker.exceptionEntry('google.com'),
-        FakeDataMaker.exceptionEntry('inbox.google.com'),
-        FakeDataMaker.exceptionEntry('maps.google.com'),
-        FakeDataMaker.exceptionEntry('plus.google.com'),
+        autofill_test_util.createExceptionEntry('docs.google.com'),
+        autofill_test_util.createExceptionEntry('mail.com'),
+        autofill_test_util.createExceptionEntry('google.com'),
+        autofill_test_util.createExceptionEntry('inbox.google.com'),
+        autofill_test_util.createExceptionEntry('maps.google.com'),
+        autofill_test_util.createExceptionEntry('plus.google.com'),
       ];
 
       const passwordsSection = elementFactory.createPasswordsSection(
@@ -510,7 +515,7 @@
     });
 
     test('verifyFederatedPassword', function() {
-      const item = FakeDataMaker.passwordEntry('goo.gl', 'bart', 0);
+      const item = autofill_test_util.createPasswordEntry('goo.gl', 'bart', 0);
       item.federationText = 'with chromium.org';
       const passwordDialog = elementFactory.createPasswordEditDialog(item);
 
@@ -524,8 +529,8 @@
 
     test('showSavedPasswordEditDialog', function() {
       const PASSWORD = 'bAn@n@5';
-      const item =
-          FakeDataMaker.passwordEntry('goo.gl', 'bart', PASSWORD.length);
+      const item = autofill_test_util.createPasswordEntry(
+          'goo.gl', 'bart', PASSWORD.length);
       const passwordDialog = elementFactory.createPasswordEditDialog(item);
 
       assertFalse(passwordDialog.$.showPasswordButton.hidden);
@@ -541,8 +546,8 @@
 
     test('showSavedPasswordListItem', function() {
       const PASSWORD = 'bAn@n@5';
-      const item =
-          FakeDataMaker.passwordEntry('goo.gl', 'bart', PASSWORD.length);
+      const item = autofill_test_util.createPasswordEntry(
+          'goo.gl', 'bart', PASSWORD.length);
       const passwordListItem = elementFactory.createPasswordListItem(item);
       // Hidden passwords should be disabled.
       assertTrue(passwordListItem.$$('#password').disabled);
@@ -564,7 +569,8 @@
     // Tests that invoking the plaintext password sets the corresponding
     // password.
     test('onShowSavedPasswordEditDialog', function() {
-      const expectedItem = FakeDataMaker.passwordEntry('goo.gl', 'bart', 8, 1);
+      const expectedItem =
+          autofill_test_util.createPasswordEntry('goo.gl', 'bart', 8, 1);
       const passwordDialog =
           elementFactory.createPasswordEditDialog(expectedItem);
       assertEquals('', passwordDialog.item.password);
@@ -580,7 +586,8 @@
     });
 
     test('onShowSavedPasswordListItem', function() {
-      const expectedItem = FakeDataMaker.passwordEntry('goo.gl', 'bart', 8, 1);
+      const expectedItem =
+          autofill_test_util.createPasswordEntry('goo.gl', 'bart', 8, 1);
       const passwordListItem =
           elementFactory.createPasswordListItem(expectedItem);
       assertEquals('', passwordListItem.item.password);
@@ -596,7 +603,8 @@
     });
 
     test('onCopyPasswordListItem', function() {
-      const expectedItem = FakeDataMaker.passwordEntry('goo.gl', 'bart', 8, 1);
+      const expectedItem =
+          autofill_test_util.createPasswordEntry('goo.gl', 'bart', 8, 1);
       const passwordsSection = elementFactory.createPasswordsSection(
           passwordManager, [expectedItem], []);
 
@@ -611,7 +619,8 @@
     });
 
     test('closingPasswordsSectionHidesUndoToast', function(done) {
-      const passwordEntry = FakeDataMaker.passwordEntry('goo.gl', 'bart', 1);
+      const passwordEntry =
+          autofill_test_util.createPasswordEntry('goo.gl', 'bart', 1);
       const passwordsSection = elementFactory.createPasswordsSection(
           passwordManager, [passwordEntry], []);
       const toastManager = cr.toastManager.getToastManager();
@@ -633,7 +642,7 @@
     // Chrome offers the export option when there are passwords.
     test('offerExportWhenPasswords', function(done) {
       const passwordList = [
-        FakeDataMaker.passwordEntry('googoo.com', 'Larry', 1),
+        autofill_test_util.createPasswordEntry('googoo.com', 'Larry', 1),
       ];
       const passwordsSection = elementFactory.createPasswordsSection(
           passwordManager, passwordList, []);
@@ -659,7 +668,7 @@
     // dialog.
     test('exportOpen', function(done) {
       const passwordList = [
-        FakeDataMaker.passwordEntry('googoo.com', 'Larry', 1),
+        autofill_test_util.createPasswordEntry('googoo.com', 'Larry', 1),
       ];
       const passwordsSection = elementFactory.createPasswordsSection(
           passwordManager, passwordList, []);
diff --git a/chrome/test/data/webui/settings/passwords_section_test_cros.js b/chrome/test/data/webui/settings/passwords_section_test_cros.js
index c90cdf2..5c1bdbd 100644
--- a/chrome/test/data/webui/settings/passwords_section_test_cros.js
+++ b/chrome/test/data/webui/settings/passwords_section_test_cros.js
@@ -28,7 +28,7 @@
      * tests to track auth token and saved password requests.
      */
     class CrosPasswordSectionElementFactory extends
-        PasswordSectionElementFactory {
+        autofill_test_util.PasswordSectionElementFactory {
       /**
        * @param {HTMLDocument} document The test's |document| object.
        * @param {request: Function} tokenRequestManager Fake for
@@ -119,7 +119,7 @@
       let passwordItem;
       passwordPromise = new Promise(resolve => {
         passwordItem = {
-          entry: FakeDataMaker.passwordEntry(),
+          entry: autofill_test_util.createPasswordEntry(),
           set password(newPassword) {
             if (newPassword && newPassword != this.password_) {
               resolve(newPassword);
diff --git a/chrome/test/data/webui/settings/payments_section_test.js b/chrome/test/data/webui/settings/payments_section_test.js
index 129c405d..ded8972 100644
--- a/chrome/test/data/webui/settings/payments_section_test.js
+++ b/chrome/test/data/webui/settings/payments_section_test.js
@@ -41,7 +41,7 @@
      */
     function createPaymentsSection(creditCards, upiIds, prefValues) {
       // Override the PaymentsManagerImpl for testing.
-      const paymentsManager = new TestPaymentsManager();
+      const paymentsManager = new autofill_test_util.TestPaymentsManager();
       paymentsManager.data.creditCards = creditCards;
       paymentsManager.data.upiIds = upiIds;
       settings.PaymentsManagerImpl.instance_ = paymentsManager;
@@ -142,12 +142,12 @@
 
     test('verifyCreditCardCount', function() {
       const creditCards = [
-        FakeDataMaker.creditCardEntry(),
-        FakeDataMaker.creditCardEntry(),
-        FakeDataMaker.creditCardEntry(),
-        FakeDataMaker.creditCardEntry(),
-        FakeDataMaker.creditCardEntry(),
-        FakeDataMaker.creditCardEntry(),
+        autofill_test_util.createCreditCardEntry(),
+        autofill_test_util.createCreditCardEntry(),
+        autofill_test_util.createCreditCardEntry(),
+        autofill_test_util.createCreditCardEntry(),
+        autofill_test_util.createCreditCardEntry(),
+        autofill_test_util.createCreditCardEntry(),
       ];
 
       const section = createPaymentsSection(
@@ -164,7 +164,7 @@
     });
 
     test('verifyCreditCardFields', function() {
-      const creditCard = FakeDataMaker.creditCardEntry();
+      const creditCard = autofill_test_util.createCreditCardEntry();
       const section = createPaymentsSection(
           [creditCard], /*upiIds=*/[], /*prefValues=*/ {});
       const rowShadowRoot = getCardRowShadowRoot(section.$$('#paymentsList'));
@@ -178,7 +178,7 @@
     });
 
     test('verifyCreditCardRowButtonIsDropdownWhenLocal', function() {
-      const creditCard = FakeDataMaker.creditCardEntry();
+      const creditCard = autofill_test_util.createCreditCardEntry();
       creditCard.metadata.isLocal = true;
       const section = createPaymentsSection(
           [creditCard], /*upiIds=*/[], /*prefValues=*/ {});
@@ -191,7 +191,7 @@
     });
 
     test('verifyCreditCardRowButtonIsOutlinkWhenRemote', function() {
-      const creditCard = FakeDataMaker.creditCardEntry();
+      const creditCard = autofill_test_util.createCreditCardEntry();
       creditCard.metadata.isLocal = false;
       const section = createPaymentsSection(
           [creditCard], /*upiIds=*/[], /*prefValues=*/ {});
@@ -204,9 +204,9 @@
     });
 
     test('verifyAddVsEditCreditCardTitle', function() {
-      const newCreditCard = FakeDataMaker.emptyCreditCardEntry();
+      const newCreditCard = autofill_test_util.createEmptyCreditCardEntry();
       const newCreditCardDialog = createCreditCardDialog(newCreditCard);
-      const oldCreditCard = FakeDataMaker.creditCardEntry();
+      const oldCreditCard = autofill_test_util.createCreditCardEntry();
       const oldCreditCardDialog = createCreditCardDialog(oldCreditCard);
 
       assertNotEquals(oldCreditCardDialog.title_, newCreditCardDialog.title_);
@@ -221,7 +221,7 @@
     });
 
     test('verifyExpiredCreditCardYear', function() {
-      const creditCard = FakeDataMaker.creditCardEntry();
+      const creditCard = autofill_test_util.createCreditCardEntry();
 
       // 2015 is over unless time goes wobbly.
       const twentyFifteen = 2015;
@@ -245,7 +245,7 @@
     });
 
     test('verifyVeryFutureCreditCardYear', function() {
-      const creditCard = FakeDataMaker.creditCardEntry();
+      const creditCard = autofill_test_util.createCreditCardEntry();
 
       // Expiring 25 years from now is unusual.
       const now = new Date();
@@ -270,7 +270,7 @@
     });
 
     test('verifyVeryNormalCreditCardYear', function() {
-      const creditCard = FakeDataMaker.creditCardEntry();
+      const creditCard = autofill_test_util.createCreditCardEntry();
 
       // Expiring 2 years from now is not unusual.
       const now = new Date();
@@ -296,7 +296,7 @@
     });
 
     test('verify save disabled for expired credit card', function() {
-      const creditCard = FakeDataMaker.emptyCreditCardEntry();
+      const creditCard = autofill_test_util.createEmptyCreditCardEntry();
 
       const now = new Date();
       creditCard.expirationYear = now.getFullYear() - 2;
@@ -312,7 +312,7 @@
     });
 
     test('verify save new credit card', function() {
-      const creditCard = FakeDataMaker.emptyCreditCardEntry();
+      const creditCard = autofill_test_util.createEmptyCreditCardEntry();
       const creditCardDialog = createCreditCardDialog(creditCard);
 
       return test_util.whenAttributeIs(creditCardDialog.$.dialog, 'open', '')
@@ -341,7 +341,7 @@
     });
 
     test('verifyCancelCreditCardEdit', function(done) {
-      const creditCard = FakeDataMaker.emptyCreditCardEntry();
+      const creditCard = autofill_test_util.createEmptyCreditCardEntry();
       const creditCardDialog = createCreditCardDialog(creditCard);
 
       test_util.whenAttributeIs(creditCardDialog.$.dialog, 'open', '')
@@ -366,7 +366,7 @@
     });
 
     test('verifyLocalCreditCardMenu', function() {
-      const creditCard = FakeDataMaker.creditCardEntry();
+      const creditCard = autofill_test_util.createCreditCardEntry();
 
       // When credit card is local, |isCached| will be undefined.
       creditCard.metadata.isLocal = true;
@@ -397,7 +397,7 @@
     });
 
     test('verifyCachedCreditCardMenu', function() {
-      const creditCard = FakeDataMaker.creditCardEntry();
+      const creditCard = autofill_test_util.createCreditCardEntry();
 
       creditCard.metadata.isLocal = false;
       creditCard.metadata.isCached = true;
@@ -427,7 +427,7 @@
     });
 
     test('verifyNotCachedCreditCardMenu', function() {
-      const creditCard = FakeDataMaker.creditCardEntry();
+      const creditCard = autofill_test_util.createCreditCardEntry();
 
       creditCard.metadata.isLocal = false;
       creditCard.metadata.isCached = false;
@@ -447,7 +447,7 @@
       loadTimeData.overrideValues({migrationEnabled: false});
 
       // Add one migratable credit card.
-      const creditCard = FakeDataMaker.creditCardEntry();
+      const creditCard = autofill_test_util.createCreditCardEntry();
       creditCard.metadata.isMigratable = true;
       const section = createPaymentsSection(
           [creditCard], /*upiIds=*/[], {credit_card_enabled: {value: true}});
@@ -457,7 +457,7 @@
 
     test('verifyMigrationButtonNotShownIfCreditCardDisabled', function() {
       // Add one migratable credit card.
-      const creditCard = FakeDataMaker.creditCardEntry();
+      const creditCard = autofill_test_util.createCreditCardEntry();
       creditCard.metadata.isMigratable = true;
       // Mock credit card save toggle is turned off by users.
       const section = createPaymentsSection(
@@ -468,7 +468,7 @@
 
     test('verifyMigrationButtonNotShownIfNoCardIsMigratable', function() {
       // Add one migratable credit card.
-      const creditCard = FakeDataMaker.creditCardEntry();
+      const creditCard = autofill_test_util.createCreditCardEntry();
       // Mock credit card is not valid.
       creditCard.metadata.isMigratable = false;
       const section = createPaymentsSection(
@@ -479,7 +479,7 @@
 
     test('verifyMigrationButtonShown', function() {
       // Add one migratable credit card.
-      const creditCard = FakeDataMaker.creditCardEntry();
+      const creditCard = autofill_test_util.createCreditCardEntry();
       creditCard.metadata.isMigratable = true;
       const section = createPaymentsSection(
           [creditCard], /*upiIds=*/[], {credit_card_enabled: {value: true}});
diff --git a/chrome/test/data/webui/settings/test_password_manager_proxy.js b/chrome/test/data/webui/settings/test_password_manager_proxy.js
index 56f7f8f..f2feb2e 100644
--- a/chrome/test/data/webui/settings/test_password_manager_proxy.js
+++ b/chrome/test/data/webui/settings/test_password_manager_proxy.js
@@ -17,13 +17,14 @@
       'getCompromisedCredentialsInfo',
     ]);
 
-    this.actual_ = new PasswordManagerExpectations();
+    this.actual_ = new autofill_test_util.PasswordManagerExpectations();
 
     // Set these to have non-empty data.
     this.data = {
       passwords: [],
       exceptions: [],
-      leakedCredentials: FakeDataMaker.makeCompromisedCredentialsInfo([], ''),
+      leakedCredentials:
+          autofill_test_util.makeCompromisedCredentialsInfo([], ''),
     };
 
     // Holds the last callbacks so they can be called when needed/
diff --git a/chrome/test/enterprise/e2e/.vpython b/chrome/test/enterprise/e2e/.vpython
index e91ff8ff..5949f55 100644
--- a/chrome/test/enterprise/e2e/.vpython
+++ b/chrome/test/enterprise/e2e/.vpython
@@ -11,8 +11,8 @@
 
 wheel: <
   name: "infra/celab/celab/windows-amd64"
-  # Source: https://ci.chromium.org/p/celab/builders/ci/Windows/b8889176836183963376
-  version: "ycS99QpsrTXuKI_OYOaa01_IX6jLWMhHDYGuLnAkR70C"
+  # Source: https://ci.chromium.org/p/celab/builders/ci/Windows/b8887343739468092128
+  version: "eZVniNpxV0CKdJ9K-_ooB5E4hvLmLlecU3erim2nPycC"
 >
 
 # googleapiclient
diff --git a/chrome/test/enterprise/e2e/infra/chrome_ent_test_case.py b/chrome/test/enterprise/e2e/infra/chrome_ent_test_case.py
index 67efce12..c94d85a3 100644
--- a/chrome/test/enterprise/e2e/infra/chrome_ent_test_case.py
+++ b/chrome/test/enterprise/e2e/infra/chrome_ent_test_case.py
@@ -133,7 +133,8 @@
 
     # run the test
     args = subprocess.list2cmdline(args)
-    cmd = r'c:\Python27\python.exe %s %s' % (file_name, args)
+    cmd = r'%s %s %s' % (self._pythonExecutablePath[instance_name], file_name,
+                         args)
     return self.RunCommand(instance_name, cmd)
 
   def RunUITest(self, instance_name, test_file, timeout=300, args=[]):
@@ -159,9 +160,10 @@
     # get any output from stdout because the output is buffered. When this
     # happens it makes debugging really hard.
     args = subprocess.list2cmdline(args)
-    ui_test_cmd = r'c:\Python27\python.exe -u %s %s' % (file_name, args)
-    cmd = (r'python c:\cel\supporting_files\run_ui_test.py --timeout %s -- %s'
-          ) % (timeout, ui_test_cmd)
+    ui_test_cmd = r'%s -u %s %s' % (self._pythonExecutablePath[instance_name],
+                                    file_name, args)
+    cmd = (r'%s c:\cel\supporting_files\run_ui_test.py --timeout %s -- %s') % (
+        self._pythonExecutablePath[instance_name], timeout, ui_test_cmd)
     return self.RunCommand(instance_name, cmd, timeout=timeout)
 
   def _generatePassword(self):
@@ -181,6 +183,8 @@
   def EnableUITest(self, instance_name):
     """Configures the instance so that UI tests can be run on it."""
     self.InstallWebDriver(instance_name)
+    self.InstallChocolateyPackage(instance_name, 'chocolatey_core_extension',
+                                  '1.3.3')
     self.InstallChocolateyPackageLatest(instance_name, 'sysinternals')
     self.InstallPipPackagesLatest(instance_name, ['pywinauto', 'requests'])
 
diff --git a/chrome/test/views/chrome_test_views_delegate.cc b/chrome/test/views/chrome_test_views_delegate.cc
index 22a9385..466068769c 100644
--- a/chrome/test/views/chrome_test_views_delegate.cc
+++ b/chrome/test/views/chrome_test_views_delegate.cc
@@ -6,10 +6,6 @@
 
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 
-ChromeTestViewsDelegate::ChromeTestViewsDelegate()
-    : views::TestViewsDelegate() {
-  // Overrides the LayoutProvider created by TestViewsDelegate.
+ChromeTestViewsDelegate::ChromeTestViewsDelegate() {
   set_layout_provider(ChromeLayoutProvider::CreateLayoutProvider());
 }
-
-ChromeTestViewsDelegate::~ChromeTestViewsDelegate() {}
diff --git a/chrome/test/views/chrome_test_views_delegate.h b/chrome/test/views/chrome_test_views_delegate.h
index fa5afe5..20a83f0 100644
--- a/chrome/test/views/chrome_test_views_delegate.h
+++ b/chrome/test/views/chrome_test_views_delegate.h
@@ -5,17 +5,14 @@
 #ifndef CHROME_TEST_VIEWS_CHROME_TEST_VIEWS_DELEGATE_H_
 #define CHROME_TEST_VIEWS_CHROME_TEST_VIEWS_DELEGATE_H_
 
-#include "base/macros.h"
+#include "build/build_config.h"
 #include "ui/views/test/test_views_delegate.h"
 
 // A TestViewsDelegate specific to Chrome tests.
 class ChromeTestViewsDelegate : public views::TestViewsDelegate {
  public:
   ChromeTestViewsDelegate();
-  ~ChromeTestViewsDelegate() override;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(ChromeTestViewsDelegate);
+  ~ChromeTestViewsDelegate() override = default;
 };
 
 #endif  // CHROME_TEST_VIEWS_CHROME_TEST_VIEWS_DELEGATE_H_
diff --git a/chrome/updater/updater.cc b/chrome/updater/updater.cc
index 51c20de2..f991ec7 100644
--- a/chrome/updater/updater.cc
+++ b/chrome/updater/updater.cc
@@ -77,7 +77,7 @@
     return ServiceMain::RunComService(command_line);
 
   if (command_line->HasSwitch(kInstallSwitch))
-    return InstallApp({kChromeAppId});
+    return MakeAppInstall({kChromeAppId})->Run();
 #endif
 
   if (command_line->HasSwitch(kUninstallSwitch))
diff --git a/chrome/updater/win/install_app.cc b/chrome/updater/win/install_app.cc
index a0bec25..0ffc50c 100644
--- a/chrome/updater/win/install_app.cc
+++ b/chrome/updater/win/install_app.cc
@@ -31,6 +31,7 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/version.h"
 #include "base/win/atl.h"
+#include "chrome/updater/app/app.h"
 #include "chrome/updater/configurator.h"
 #include "chrome/updater/constants.h"
 #include "chrome/updater/installer.h"
@@ -388,12 +389,13 @@
                              public WTL::CMessageFilter {
  public:
   explicit InstallAppController(
-      scoped_refptr<update_client::Configurator> configurator);
+      scoped_refptr<update_client::Configurator> configurator,
+      base::OnceCallback<void(int)> done);
   ~InstallAppController() override;
   InstallAppController(const InstallAppController&) = delete;
   InstallAppController& operator=(const InstallAppController&) = delete;
 
-  int InstallApp(const std::string& app_id);
+  void InstallApp(const std::string& app_id);
 
  private:
   // Overrides for update_client::UpdateClient::Observer. This function is
@@ -428,7 +430,6 @@
   void InstallComplete();
   void HandleInstallResult(Events event,
                            const update_client::CrxUpdateItem& update_item);
-  void QuitRunLoop();
   void FlushPrefs();
 
   // Returns the thread id of the thread which owns the progress window.
@@ -443,9 +444,6 @@
   // a single task which is the UI run loop.
   scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_;
 
-  // The run loop associated with the updater main thread.
-  base::RunLoop runloop_;
-
   // The application ID and the associated application name. The application
   // name is displayed by the UI and it must be i18n.
   std::string app_id_;
@@ -466,12 +464,16 @@
   // The adapter for the inter-thread calls between the updater main thread
   // and the UI thread.
   std::unique_ptr<InstallProgressObserverIPC> install_progress_observer_ipc_;
+
+  // Called when InstallApp is done.
+  base::OnceCallback<void(int)> completion_callback_;
 };
 
 // TODO(sorin): fix the hardcoding of the application name.
 // https:crbug.com/1014298
 InstallAppController::InstallAppController(
-    scoped_refptr<update_client::Configurator> configurator)
+    scoped_refptr<update_client::Configurator> configurator,
+    base::OnceCallback<void(int)> completion_callback)
     : main_task_runner_(base::SequencedTaskRunnerHandle::Get()),
       ui_task_runner_(base::ThreadPool::CreateSingleThreadTaskRunner(
           {base::TaskPriority::USER_BLOCKING,
@@ -480,14 +482,15 @@
       app_name_(kAppNameChrome),
       config_(configurator),
       persisted_data_(
-          base::MakeRefCounted<PersistedData>(config_->GetPrefService())) {}
+          base::MakeRefCounted<PersistedData>(config_->GetPrefService())),
+      completion_callback_(std::move(completion_callback)) {}
 
 InstallAppController::~InstallAppController() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   FlushPrefs();
 }
 
-int InstallAppController::InstallApp(const std::string& app_id) {
+void InstallAppController::InstallApp(const std::string& app_id) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(base::ThreadTaskRunnerHandle::IsSet());
 
@@ -499,8 +502,6 @@
                      base::Unretained(this)),
       base::BindOnce(&InstallAppController::DoInstallApp,
                      base::Unretained(this)));
-  runloop_.Run();
-  return 0;
 }
 
 void InstallAppController::DoInstallApp() {
@@ -671,9 +672,8 @@
   // This object is owned by the UI thread must be destroyed on this thread.
   progress_wnd_ = nullptr;
 
-  main_task_runner_->PostTask(FROM_HERE,
-                              base::BindOnce(&InstallAppController::QuitRunLoop,
-                                             base::Unretained(this)));
+  main_task_runner_->PostTask(
+      FROM_HERE, base::BindOnce(std::move(completion_callback_), 0));
 }
 
 void InstallAppController::DoExit() {
@@ -699,11 +699,6 @@
   runloop.Run();
 }
 
-void InstallAppController::QuitRunLoop() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  runloop_.QuitWhenIdleClosure().Run();
-}
-
 DWORD InstallAppController::GetUIThreadID() const {
   DCHECK(progress_wnd_);
   return ::GetWindowThreadProcessId(progress_wnd_->m_hWnd, nullptr);
@@ -711,52 +706,64 @@
 
 }  // namespace
 
-int SetupUpdater() {
+class AppInstall : public App {
+ public:
+  explicit AppInstall(const std::string& app_id);
+
+ private:
+  ~AppInstall() override = default;
+  void Initialize() override;
+  void FirstTaskRun() override;
+
+  void SetupDone(int result);
+
+  std::string app_id_;
+  scoped_refptr<Configurator> config_;
+  std::unique_ptr<InstallAppController> app_install_controller_;
+};
+
+AppInstall::AppInstall(const std::string& app_id) : app_id_(app_id) {}
+
+void AppInstall::Initialize() {
+  base::i18n::InitializeICU();
+  config_ = base::MakeRefCounted<Configurator>();
+}
+
+void AppInstall::FirstTaskRun() {
   DCHECK(base::ThreadTaskRunnerHandle::IsSet());
 
   ui::SplashScreen splash_screen(kAppNameChrome);
   splash_screen.Show();
 
-  base::RunLoop runloop;
-  int setup_result = 0;
   base::ThreadPool::PostTaskAndReplyWithResult(
       FROM_HERE,
       {base::MayBlock(), base::TaskPriority::USER_BLOCKING,
        base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN},
       base::BindOnce([]() { return Setup(false); }),
       base::BindOnce(
-          [](ui::SplashScreen* splash_screen, base::OnceClosure quit_closure,
-             int* result_out, int result) {
-            *result_out = result;
-            splash_screen->Dismiss(base::BindOnce(
-                [](base::OnceClosure quit_closure) {
-                  std::move(quit_closure).Run();
-                },
-                std::move(quit_closure)));
+          [](ui::SplashScreen* splash_screen,
+             base::OnceCallback<void(int)> done, int result) {
+            splash_screen->Dismiss(base::BindOnce(std::move(done), result));
           },
-          &splash_screen, runloop.QuitWhenIdleClosure(), &setup_result));
-  runloop.Run();
-  return setup_result;
+          &splash_screen, base::BindOnce(&AppInstall::SetupDone, this)));
 }
 
-int InstallApp(const std::string& app_id) {
-  base::i18n::InitializeICU();
-  auto config = base::MakeRefCounted<Configurator>();
+void AppInstall::SetupDone(int result) {
+  if (result != 0) {
+    Shutdown(result);
+    return;
+  }
 
-  // Use MessagePumpType::UI to handle native window messages on the main
-  // thread of the updater.
-  base::SingleThreadTaskExecutor main_task_executor(base::MessagePumpType::UI);
-  base::ScopedDisallowBlocking no_blocking_allowed_on_main_thread;
-
-  int result = SetupUpdater();
-  if (result != 0)
-    return result;
-
-  // Register the updater app id for updates.
-  base::MakeRefCounted<PersistedData>(config->GetPrefService())
+  base::MakeRefCounted<PersistedData>(config_->GetPrefService())
       ->SetProductVersion(kUpdaterAppId, base::Version(UPDATER_VERSION_STRING));
 
-  return InstallAppController(config).InstallApp(app_id);
+  app_install_controller_ = std::make_unique<InstallAppController>(
+      config_, base::BindOnce(&AppInstall::Shutdown, this));
+  app_install_controller_->InstallApp(app_id_);
+}
+
+scoped_refptr<App> MakeAppInstall(const std::string& app_id) {
+  return base::MakeRefCounted<AppInstall>(app_id);
 }
 
 }  // namespace updater
diff --git a/chrome/updater/win/install_app.h b/chrome/updater/win/install_app.h
index 1adc59d..fb9720fd 100644
--- a/chrome/updater/win/install_app.h
+++ b/chrome/updater/win/install_app.h
@@ -7,11 +7,15 @@
 
 #include <string>
 
+#include "base/memory/ref_counted.h"
+
 namespace updater {
 
+class App;
+
 // Sets the updater up, shows up a splash screen, then installs an application
 // while displaying the UI progress window.
-int InstallApp(const std::string& app_id);
+scoped_refptr<App> MakeAppInstall(const std::string& app_id);
 
 }  // namespace updater
 
diff --git a/chrome/utility/BUILD.gn b/chrome/utility/BUILD.gn
index 76bf112c..1baf6773 100644
--- a/chrome/utility/BUILD.gn
+++ b/chrome/utility/BUILD.gn
@@ -34,6 +34,7 @@
     "//chrome:strings",
     "//chrome/common",
     "//chrome/common:mojo_bindings",
+    "//chrome/services/qrcode_generator",
     "//components/mirroring/service:mirroring_service",
     "//components/paint_preview/buildflags",
     "//components/safe_browsing:buildflags",
diff --git a/chrome/utility/DEPS b/chrome/utility/DEPS
index 218eaf3..85b124f 100644
--- a/chrome/utility/DEPS
+++ b/chrome/utility/DEPS
@@ -12,6 +12,7 @@
   "+chrome/services/printing/pdf_to_emf_converter_factory.h",
   "+chrome/services/printing/printing_service.h",
   "+chrome/services/printing/public/mojom",
+  "+chrome/services/qrcode_generator",
   "+chrome/services/removable_storage_writer",
   "+chrome/services/sharing",
   "+chrome/services/util_win/util_win_impl.h",
diff --git a/chrome/utility/media_router/OWNERS b/chrome/utility/media_router/OWNERS
deleted file mode 100644
index 591521a9..0000000
--- a/chrome/utility/media_router/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-file://chrome/browser/media/router/OWNERS
-# COMPONENT: Internals>Cast>Providers
diff --git a/chrome/utility/services.cc b/chrome/utility/services.cc
index d983af8b..0015601 100644
--- a/chrome/utility/services.cc
+++ b/chrome/utility/services.cc
@@ -33,10 +33,11 @@
 
 #if !defined(OS_ANDROID)
 #include "chrome/common/importer/profile_import.mojom.h"
+#include "chrome/services/qrcode_generator/public/mojom/qrcode_generator.mojom.h"  // nogncheck
+#include "chrome/services/qrcode_generator/qrcode_generator_service_impl.h"  // nogncheck
 #include "chrome/services/sharing/public/mojom/sharing.mojom.h"
 #include "chrome/services/sharing/sharing_impl.h"
 #include "chrome/utility/importer/profile_import_impl.h"
-#include "components/mirroring/service/features.h"
 #include "components/mirroring/service/mirroring_service.h"
 #include "services/proxy_resolver/proxy_resolver_factory_impl.h"  // nogncheck
 #include "services/proxy_resolver/public/mojom/proxy_resolver.mojom.h"
@@ -125,9 +126,15 @@
   return std::make_unique<ProfileImportImpl>(std::move(receiver));
 }
 
+auto RunQRCodeGeneratorService(
+    mojo::PendingReceiver<qrcode_generator::mojom::QRCodeGeneratorService>
+        receiver) {
+  return std::make_unique<qrcode_generator::QRCodeGeneratorServiceImpl>(
+      std::move(receiver));
+}
+
 auto RunMirroringService(
     mojo::PendingReceiver<mirroring::mojom::MirroringService> receiver) {
-  DCHECK(base::FeatureList::IsEnabled(mirroring::features::kMirroringService));
   return std::make_unique<mirroring::MirroringService>(
       std::move(receiver), content::UtilityThread::Get()->GetIOTaskRunner());
 }
@@ -239,6 +246,7 @@
 
 #if !defined(OS_ANDROID)
     RunProfileImporter,
+    RunQRCodeGeneratorService,
     RunMirroringService,
     RunSharing,
 #endif
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index 4b7b07d..ac4bb0c3e 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-12952.0.0
\ No newline at end of file
+12953.0.0
\ No newline at end of file
diff --git a/chromeos/audio/cras_audio_handler.cc b/chromeos/audio/cras_audio_handler.cc
index 24f1117..debf0f3f 100644
--- a/chromeos/audio/cras_audio_handler.cc
+++ b/chromeos/audio/cras_audio_handler.cc
@@ -17,6 +17,7 @@
 #include "base/bind_helpers.h"
 #include "base/logging.h"
 #include "base/single_thread_task_runner.h"
+#include "base/strings/utf_string_conversions.h"
 #include "base/system/sys_info.h"
 #include "base/system/system_monitor.h"
 #include "base/threading/thread_task_runner_handle.h"
@@ -243,12 +244,13 @@
 
   switch (session_info->state) {
     case media_session::mojom::MediaSessionInfo::SessionState::kActive:
+    case media_session::mojom::MediaSessionInfo::SessionState::kDucking:
       state = "playing";
       break;
     case media_session::mojom::MediaSessionInfo::SessionState::kSuspended:
       state = "paused";
       break;
-    default:
+    case media_session::mojom::MediaSessionInfo::SessionState::kInactive:
       state = "stopped";
       break;
   }
@@ -256,6 +258,44 @@
   CrasAudioClient::Get()->SetPlayerPlaybackStatus(state);
 }
 
+void CrasAudioHandler::MediaSessionMetadataChanged(
+    const base::Optional<media_session::MediaMetadata>& metadata) {
+  if (!metadata || metadata->IsEmpty())
+    return;
+
+  const std::map<std::string, std::string> metadata_map = {
+      {"title", base::UTF16ToASCII(metadata->title)},
+      {"artist", base::UTF16ToASCII(metadata->artist)},
+      {"album", base::UTF16ToASCII(metadata->album)}};
+  const std::string source_title = base::UTF16ToASCII(metadata->source_title);
+
+  // Assume media duration/length should always change with new metadata.
+  fetch_media_session_duration_ = true;
+  CrasAudioClient::Get()->SetPlayerMetadata(metadata_map);
+  CrasAudioClient::Get()->SetPlayerIdentity(source_title);
+}
+
+void CrasAudioHandler::MediaSessionPositionChanged(
+    const base::Optional<media_session::MediaPosition>& position) {
+  if (!position)
+    return;
+
+  int64_t duration = 0;
+  if (fetch_media_session_duration_) {
+    duration = position->duration().InMicroseconds();
+    if (duration > 0) {
+      CrasAudioClient::Get()->SetPlayerDuration(duration);
+      fetch_media_session_duration_ = false;
+    }
+  }
+
+  int64_t current_position = position->GetPosition().InMicroseconds();
+  if (current_position < 0 || current_position > duration)
+    return;
+
+  CrasAudioClient::Get()->SetPlayerPosition(current_position);
+}
+
 void CrasAudioHandler::AddAudioObserver(AudioObserver* observer) {
   observers_.AddObserver(observer);
 }
diff --git a/chromeos/audio/cras_audio_handler.h b/chromeos/audio/cras_audio_handler.h
index d9725c9..ad71ab35 100644
--- a/chromeos/audio/cras_audio_handler.h
+++ b/chromeos/audio/cras_audio_handler.h
@@ -139,14 +139,14 @@
   void MediaSessionInfoChanged(
       media_session::mojom::MediaSessionInfoPtr session_info) override;
   void MediaSessionMetadataChanged(
-      const base::Optional<media_session::MediaMetadata>& metadata) override {}
+      const base::Optional<media_session::MediaMetadata>& metadata) override;
   void MediaSessionActionsChanged(
       const std::vector<media_session::mojom::MediaSessionAction>& actions)
       override {}
   void MediaSessionChanged(
       const base::Optional<base::UnguessableToken>& request_id) override {}
   void MediaSessionPositionChanged(
-      const base::Optional<media_session::MediaPosition>& position) override {}
+      const base::Optional<media_session::MediaPosition>& position) override;
 
   // Adds an audio observer.
   void AddAudioObserver(AudioObserver* observer);
@@ -612,6 +612,8 @@
 
   int num_active_output_streams_ = 0;
 
+  bool fetch_media_session_duration_ = false;
+
   // Task runner of browser main thread. All member variables should be accessed
   // on this thread.
   scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
diff --git a/chromeos/components/quick_answers/quick_answers_model.h b/chromeos/components/quick_answers/quick_answers_model.h
index d4e7553e..2855ace 100644
--- a/chromeos/components/quick_answers/quick_answers_model.h
+++ b/chromeos/components/quick_answers/quick_answers_model.h
@@ -68,7 +68,7 @@
 // class to describe an answer text.
 class QuickAnswerText : public QuickAnswerUiElement {
  public:
-  QuickAnswerText(const std::string& text, SkColor color = SK_ColorBLACK)
+  QuickAnswerText(const std::string& text, SkColor color = gfx::kGoogleGrey900)
       : QuickAnswerUiElement(QuickAnswerUiElementType::kText),
         text_(text),
         color_(color) {}
@@ -79,6 +79,13 @@
   SkColor color_ = SK_ColorBLACK;
 };
 
+class QuickAnswerResultText : public QuickAnswerText {
+ public:
+  QuickAnswerResultText(const std::string& text,
+                        SkColor color = gfx::kGoogleGrey700)
+      : QuickAnswerText(text, color) {}
+};
+
 class QuickAnswerImage : public QuickAnswerUiElement {
  public:
   explicit QuickAnswerImage(const gfx::Image& image)
diff --git a/chromeos/components/quick_answers/search_result_parsers/definition_result_parser.cc b/chromeos/components/quick_answers/search_result_parsers/definition_result_parser.cc
index 6cf8ce0..1ef4cc2 100644
--- a/chromeos/components/quick_answers/search_result_parsers/definition_result_parser.cc
+++ b/chromeos/components/quick_answers/search_result_parsers/definition_result_parser.cc
@@ -62,7 +62,7 @@
   quick_answer->title.push_back(
       std::make_unique<QuickAnswerText>(secondary_answer));
   quick_answer->first_answer_row.push_back(
-      std::make_unique<QuickAnswerText>(*definition));
+      std::make_unique<QuickAnswerResultText>(*definition));
   return true;
 }
 
diff --git a/chromeos/components/quick_answers/search_result_parsers/definition_result_parser_unittest.cc b/chromeos/components/quick_answers/search_result_parsers/definition_result_parser_unittest.cc
index 63cbace..d0683e6 100644
--- a/chromeos/components/quick_answers/search_result_parsers/definition_result_parser_unittest.cc
+++ b/chromeos/components/quick_answers/search_result_parsers/definition_result_parser_unittest.cc
@@ -82,14 +82,16 @@
   EXPECT_EQ("incapable of being fully explored or understood.",
             quick_answer.primary_answer);
   EXPECT_EQ("unfathomable · /ˌənˈfaTÍŸHÉ™mÉ™b(É™)/", quick_answer.secondary_answer);
-  EXPECT_EQ(
-      "incapable of being fully explored or understood.",
-      static_cast<QuickAnswerText*>(quick_answer.first_answer_row[0].get())
-          ->text_);
-  EXPECT_EQ("unfathomable · /ˌənˈfaTÍŸHÉ™mÉ™b(É™)/",
-            static_cast<QuickAnswerText*>(quick_answer.title[0].get())->text_);
-  EXPECT_TRUE(quick_answer.title.size() == 1);
-  EXPECT_TRUE(quick_answer.first_answer_row.size() == 1);
+
+  EXPECT_EQ(1u, quick_answer.title.size());
+  EXPECT_EQ(1u, quick_answer.first_answer_row.size());
+  auto* answer =
+      static_cast<QuickAnswerText*>(quick_answer.first_answer_row[0].get());
+  EXPECT_EQ("incapable of being fully explored or understood.", answer->text_);
+  EXPECT_EQ(gfx::kGoogleGrey700, answer->color_);
+  auto* title = static_cast<QuickAnswerText*>(quick_answer.title[0].get());
+  EXPECT_EQ("unfathomable · /ˌənˈfaTÍŸHÉ™mÉ™b(É™)/", title->text_);
+  EXPECT_EQ(gfx::kGoogleGrey900, title->color_);
 }
 
 TEST_F(DefinitionResultParserTest, EmptyValue) {
diff --git a/chromeos/components/quick_answers/search_result_parsers/kp_entity_result_parser.cc b/chromeos/components/quick_answers/search_result_parsers/kp_entity_result_parser.cc
index 985daf8..4b13b34 100644
--- a/chromeos/components/quick_answers/search_result_parsers/kp_entity_result_parser.cc
+++ b/chromeos/components/quick_answers/search_result_parsers/kp_entity_result_parser.cc
@@ -38,9 +38,12 @@
   const auto* aggregated_count = entity->FindStringPath(kRatingCountPath);
 
   if (average_score.has_value() && aggregated_count) {
-    quick_answer->primary_answer =
+    const auto& answer =
         base::StringPrintf(kRatingReviewTemplate, average_score.value(),
                            aggregated_count->c_str());
+    quick_answer->primary_answer = answer;
+    quick_answer->first_answer_row.push_back(
+        std::make_unique<QuickAnswerResultText>(answer));
   } else {
     const std::string* localized_known_for_reason =
         entity->FindStringPath(kKnownForReasonPath);
@@ -50,6 +53,8 @@
     }
 
     quick_answer->primary_answer = *localized_known_for_reason;
+    quick_answer->first_answer_row.push_back(
+        std::make_unique<QuickAnswerResultText>(*localized_known_for_reason));
   }
 
   quick_answer->result_type = ResultType::kKnowledgePanelEntityResult;
diff --git a/chromeos/components/quick_answers/search_result_parsers/kp_entity_result_parser_unittest.cc b/chromeos/components/quick_answers/search_result_parsers/kp_entity_result_parser_unittest.cc
index 24784c0..f78b954 100644
--- a/chromeos/components/quick_answers/search_result_parsers/kp_entity_result_parser_unittest.cc
+++ b/chromeos/components/quick_answers/search_result_parsers/kp_entity_result_parser_unittest.cc
@@ -47,6 +47,12 @@
   EXPECT_EQ(ResultType::kKnowledgePanelEntityResult, quick_answer.result_type);
   EXPECT_EQ("4.5 ★ (100 reviews)", quick_answer.primary_answer);
   EXPECT_TRUE(quick_answer.secondary_answer.empty());
+
+  EXPECT_EQ(0u, quick_answer.title.size());
+  EXPECT_EQ(1u, quick_answer.first_answer_row.size());
+  EXPECT_EQ("4.5 ★ (100 reviews)", static_cast<QuickAnswerText*>(
+                                       quick_answer.first_answer_row[0].get())
+                                       ->text_);
 }
 
 TEST_F(KpEntityResultParserTest, SuccessWithRatingScoreRound) {
@@ -67,13 +73,28 @@
   EXPECT_EQ("4.5 ★ (100 reviews)", quick_answer.primary_answer);
   EXPECT_TRUE(quick_answer.secondary_answer.empty());
 
+  EXPECT_EQ(0u, quick_answer.title.size());
+  EXPECT_EQ(1u, quick_answer.first_answer_row.size());
+  auto* answer =
+      static_cast<QuickAnswerText*>(quick_answer.first_answer_row[0].get());
+  EXPECT_EQ("4.5 ★ (100 reviews)", answer->text_);
+  EXPECT_EQ(gfx::kGoogleGrey700, answer->color_);
+
   result.SetDoublePath(
       "knowledgePanelEntityResult.entity.ratingsAndReviews.google."
       "aggregateRating.averageScore",
       4.56);
 
-  EXPECT_TRUE(parser_->Parse(&result, &quick_answer));
-  EXPECT_EQ("4.6 ★ (100 reviews)", quick_answer.primary_answer);
+  QuickAnswer quick_answer2;
+  EXPECT_TRUE(parser_->Parse(&result, &quick_answer2));
+  EXPECT_EQ("4.6 ★ (100 reviews)", quick_answer2.primary_answer);
+
+  EXPECT_EQ(0u, quick_answer2.title.size());
+  EXPECT_EQ(1u, quick_answer2.first_answer_row.size());
+  answer =
+      static_cast<QuickAnswerText*>(quick_answer2.first_answer_row[0].get());
+  EXPECT_EQ("4.6 ★ (100 reviews)", answer->text_);
+  EXPECT_EQ(gfx::kGoogleGrey700, answer->color_);
 }
 
 TEST_F(KpEntityResultParserTest, SuccessWithKnownForReason) {
@@ -88,6 +109,13 @@
   EXPECT_EQ(ResultType::kKnowledgePanelEntityResult, quick_answer.result_type);
   EXPECT_EQ("44th U.S. President", quick_answer.primary_answer);
   EXPECT_TRUE(quick_answer.secondary_answer.empty());
+
+  EXPECT_EQ(0u, quick_answer.title.size());
+  EXPECT_EQ(1u, quick_answer.first_answer_row.size());
+  auto* answer =
+      static_cast<QuickAnswerText*>(quick_answer.first_answer_row[0].get());
+  EXPECT_EQ("44th U.S. President", answer->text_);
+  EXPECT_EQ(gfx::kGoogleGrey700, answer->color_);
 }
 
 TEST_F(KpEntityResultParserTest, EmptyValue) {
diff --git a/chromeos/components/quick_answers/search_result_parsers/translation_result_parser.cc b/chromeos/components/quick_answers/search_result_parsers/translation_result_parser.cc
index 5aba075..2b4a1e5c 100644
--- a/chromeos/components/quick_answers/search_result_parsers/translation_result_parser.cc
+++ b/chromeos/components/quick_answers/search_result_parsers/translation_result_parser.cc
@@ -54,7 +54,7 @@
   quick_answer->title.push_back(
       std::make_unique<QuickAnswerText>(secondary_answer));
   quick_answer->first_answer_row.push_back(
-      std::make_unique<QuickAnswerText>(*translated_text));
+      std::make_unique<QuickAnswerResultText>(*translated_text));
   return true;
 }
 
diff --git a/chromeos/components/quick_answers/search_result_parsers/translation_result_parser_unittest.cc b/chromeos/components/quick_answers/search_result_parsers/translation_result_parser_unittest.cc
index b3a2976..38b48bbf 100644
--- a/chromeos/components/quick_answers/search_result_parsers/translation_result_parser_unittest.cc
+++ b/chromeos/components/quick_answers/search_result_parsers/translation_result_parser_unittest.cc
@@ -44,13 +44,16 @@
   EXPECT_EQ(ResultType::kTranslationResult, quick_answer.result_type);
   EXPECT_EQ("ox\\xC3\\xADgeno", quick_answer.primary_answer);
   EXPECT_EQ("oxygen · English", quick_answer.secondary_answer);
-  EXPECT_EQ("ox\\xC3\\xADgeno", static_cast<QuickAnswerText*>(
-                                    quick_answer.first_answer_row[0].get())
-                                    ->text_);
-  EXPECT_EQ("oxygen · English",
-            static_cast<QuickAnswerText*>(quick_answer.title[0].get())->text_);
-  EXPECT_TRUE(quick_answer.title.size() == 1);
-  EXPECT_TRUE(quick_answer.first_answer_row.size() == 1);
+
+  EXPECT_EQ(1u, quick_answer.title.size());
+  EXPECT_EQ(1u, quick_answer.first_answer_row.size());
+  auto* title = static_cast<QuickAnswerText*>(quick_answer.title[0].get());
+  EXPECT_EQ("oxygen · English", title->text_);
+  EXPECT_EQ(gfx::kGoogleGrey900, title->color_);
+  auto* answer =
+      static_cast<QuickAnswerText*>(quick_answer.first_answer_row[0].get());
+  EXPECT_EQ("ox\\xC3\\xADgeno", answer->text_);
+  EXPECT_EQ(gfx::kGoogleGrey700, answer->color_);
 }
 
 TEST_F(TranslationResultParserTest, MissingSourceText) {
diff --git a/chromeos/components/quick_answers/search_result_parsers/unit_conversion_result_parser.cc b/chromeos/components/quick_answers/search_result_parsers/unit_conversion_result_parser.cc
index 2d7f5638..945eb1b5 100644
--- a/chromeos/components/quick_answers/search_result_parsers/unit_conversion_result_parser.cc
+++ b/chromeos/components/quick_answers/search_result_parsers/unit_conversion_result_parser.cc
@@ -32,7 +32,7 @@
   quick_answer->result_type = ResultType::kUnitConversionResult;
   quick_answer->primary_answer = *dest;
   quick_answer->first_answer_row.push_back(
-      std::make_unique<QuickAnswerText>(*dest));
+      std::make_unique<QuickAnswerResultText>(*dest));
 
   return true;
 }
diff --git a/chromeos/components/quick_answers/search_result_parsers/unit_conversion_result_parser_unittest.cc b/chromeos/components/quick_answers/search_result_parsers/unit_conversion_result_parser_unittest.cc
index 785e373..d4ac20ad 100644
--- a/chromeos/components/quick_answers/search_result_parsers/unit_conversion_result_parser_unittest.cc
+++ b/chromeos/components/quick_answers/search_result_parsers/unit_conversion_result_parser_unittest.cc
@@ -43,11 +43,13 @@
   EXPECT_EQ(ResultType::kUnitConversionResult, quick_answer.result_type);
   EXPECT_EQ("9.84252 inch", quick_answer.primary_answer);
   EXPECT_TRUE(quick_answer.secondary_answer.empty());
-  EXPECT_EQ("9.84252 inch", static_cast<QuickAnswerText*>(
-                                quick_answer.first_answer_row[0].get())
-                                ->text_);
-  EXPECT_TRUE(quick_answer.first_answer_row.size() == 1);
-  EXPECT_TRUE(quick_answer.title.size() == 0);
+
+  EXPECT_EQ(1u, quick_answer.first_answer_row.size());
+  EXPECT_EQ(0u, quick_answer.title.size());
+  auto* answer =
+      static_cast<QuickAnswerText*>(quick_answer.first_answer_row[0].get());
+  EXPECT_EQ("9.84252 inch", answer->text_);
+  EXPECT_EQ(gfx::kGoogleGrey700, answer->color_);
 }
 
 TEST_F(UnitConversionResultParserTest, EmptyValue) {
diff --git a/chromeos/constants/chromeos_features.cc b/chromeos/constants/chromeos_features.cc
index ebaa8cf0..89efb70 100644
--- a/chromeos/constants/chromeos_features.cc
+++ b/chromeos/constants/chromeos_features.cc
@@ -144,7 +144,7 @@
                                     base::FEATURE_DISABLED_BY_DEFAULT};
 
 // Enables the next generation file manager.
-const base::Feature kFilesNG{"FilesNG", base::FEATURE_DISABLED_BY_DEFAULT};
+const base::Feature kFilesNG{"FilesNG", base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Enables the use of Mojo by Chrome-process code to communicate with Power
 // Manager. In order to use mojo, this feature must be turned on and a callsite
diff --git a/components/autofill/core/browser/autofill_merge_unittest.cc b/components/autofill/core/browser/autofill_merge_unittest.cc
index 39dbb96..3c66f20 100644
--- a/components/autofill/core/browser/autofill_merge_unittest.cc
+++ b/components/autofill/core/browser/autofill_merge_unittest.cc
@@ -139,11 +139,14 @@
 
 std::string PersonalDataManagerMock::SaveImportedProfile(
     const AutofillProfile& profile) {
-  std::vector<AutofillProfile> profiles;
+  std::vector<AutofillProfile> new_profiles;
   std::string merged_guid = AutofillProfileComparator::MergeProfile(
-      profile, &profiles_, "en-US", &profiles);
-  if (merged_guid == profile.guid())
-    profiles_.push_back(std::make_unique<AutofillProfile>(profile));
+      profile, profiles_, "en-US", &new_profiles);
+
+  profiles_.clear();
+  for (const AutofillProfile& it : new_profiles) {
+    profiles_.push_back(std::make_unique<AutofillProfile>(it));
+  }
   return merged_guid;
 }
 
diff --git a/components/autofill/core/browser/data_model/autofill_profile_comparator.cc b/components/autofill/core/browser/data_model/autofill_profile_comparator.cc
index ac578d3..4a880eb 100644
--- a/components/autofill/core/browser/data_model/autofill_profile_comparator.cc
+++ b/components/autofill/core/browser/data_model/autofill_profile_comparator.cc
@@ -833,26 +833,33 @@
 // static
 std::string AutofillProfileComparator::MergeProfile(
     const AutofillProfile& new_profile,
-    std::vector<std::unique_ptr<AutofillProfile>>* existing_profiles,
+    const std::vector<std::unique_ptr<AutofillProfile>>& existing_profiles,
     const std::string& app_locale,
     std::vector<AutofillProfile>* merged_profiles) {
   merged_profiles->clear();
 
+  // Create copies of |existing_profiles| that can be modified
+  std::vector<AutofillProfile> existing_profile_copies;
+  existing_profile_copies.reserve(existing_profiles.size());
+  for (const auto& profile : existing_profiles)
+    existing_profile_copies.push_back(*profile.get());
+
   // Sort the existing profiles in decreasing order of frecency, so the "best"
   // profiles are checked first. Put the verified profiles last so the non
   // verified profiles get deduped among themselves before reaching the verified
   // profiles.
   // TODO(crbug.com/620521): Remove the check for verified from the sort.
   base::Time comparison_time = AutofillClock::Now();
-  std::sort(existing_profiles->begin(), existing_profiles->end(),
-            [comparison_time](const std::unique_ptr<AutofillProfile>& a,
-                              const std::unique_ptr<AutofillProfile>& b) {
-              if (a->IsVerified() != b->IsVerified())
-                return !a->IsVerified();
-              return a->HasGreaterFrecencyThan(b.get(), comparison_time);
-            });
+  std::sort(
+      existing_profile_copies.begin(), existing_profile_copies.end(),
+      [comparison_time](const AutofillProfile& a, const AutofillProfile& b) {
+        if (a.IsVerified() != b.IsVerified())
+          return !a.IsVerified();
+        return a.HasGreaterFrecencyThan(&b, comparison_time);
+      });
 
-  // Set to true if |existing_profiles| already contains an equivalent profile.
+  // Set to true if |existing_profile_copies| already contains an equivalent
+  // profile.
   bool matching_profile_found = false;
   std::string guid = new_profile.guid();
 
@@ -860,25 +867,25 @@
   // Only merge with the first match. Merging the new profile into the existing
   // one preserves the validity of credit card's billing address reference.
   AutofillProfileComparator comparator(app_locale);
-  for (const auto& existing_profile : *existing_profiles) {
+  for (auto& existing_profile : existing_profile_copies) {
     if (!matching_profile_found &&
-        comparator.AreMergeable(new_profile, *existing_profile) &&
-        existing_profile->SaveAdditionalInfo(new_profile, app_locale)) {
+        comparator.AreMergeable(new_profile, existing_profile) &&
+        existing_profile.SaveAdditionalInfo(new_profile, app_locale)) {
       // Unverified profiles should always be updated with the newer data,
       // whereas verified profiles should only ever be overwritten by verified
       // data.  If an automatically aggregated profile would overwrite a
       // verified profile, just drop it.
       matching_profile_found = true;
-      guid = existing_profile->guid();
+      guid = existing_profile.guid();
 
       // We set the modification date so that immediate requests for profiles
       // will properly reflect the fact that this profile has been modified
       // recently. After writing to the database and refreshing the local copies
       // the profile will have a very slightly newer time reflecting what's
       // actually stored in the database.
-      existing_profile->set_modification_date(AutofillClock::Now());
+      existing_profile.set_modification_date(AutofillClock::Now());
     }
-    merged_profiles->push_back(*existing_profile);
+    merged_profiles->push_back(existing_profile);
   }
 
   // If the new profile was not merged with an existing one, add it to the list.
diff --git a/components/autofill/core/browser/data_model/autofill_profile_comparator.h b/components/autofill/core/browser/data_model/autofill_profile_comparator.h
index 525bf07..200da8e7 100644
--- a/components/autofill/core/browser/data_model/autofill_profile_comparator.h
+++ b/components/autofill/core/browser/data_model/autofill_profile_comparator.h
@@ -144,7 +144,7 @@
   // profile.
   static std::string MergeProfile(
       const AutofillProfile& new_profile,
-      std::vector<std::unique_ptr<AutofillProfile>>* existing_profiles,
+      const std::vector<std::unique_ptr<AutofillProfile>>& existing_profiles,
       const std::string& app_locale,
       std::vector<AutofillProfile>* merged_profiles);
 
diff --git a/components/autofill/core/browser/personal_data_manager.cc b/components/autofill/core/browser/personal_data_manager.cc
index 3e77a858..09a6531 100644
--- a/components/autofill/core/browser/personal_data_manager.cc
+++ b/components/autofill/core/browser/personal_data_manager.cc
@@ -1728,7 +1728,7 @@
 
   std::vector<AutofillProfile> profiles;
   std::string guid = AutofillProfileComparator::MergeProfile(
-      imported_profile, &web_profiles_, app_locale_, &profiles);
+      imported_profile, web_profiles_, app_locale_, &profiles);
   SetProfiles(&profiles);
   return guid;
 }
diff --git a/components/autofill/core/browser/personal_data_manager_unittest.cc b/components/autofill/core/browser/personal_data_manager_unittest.cc
index 462e3cc..bac147d 100644
--- a/components/autofill/core/browser/personal_data_manager_unittest.cc
+++ b/components/autofill/core/browser/personal_data_manager_unittest.cc
@@ -366,16 +366,21 @@
     personal_data_->is_autofill_profile_cleanup_pending_ = true;
   }
 
-  void SetUpReferenceProfile() {
+  void SetUpReferenceProfile(const AutofillProfile& profile) {
     ASSERT_EQ(0U, personal_data_->GetProfiles().size());
 
+    AddProfileToPersonalDataManager(profile);
+
+    ASSERT_EQ(1U, personal_data_->GetProfiles().size());
+  }
+
+  AutofillProfile GetDefaultProfile() {
     AutofillProfile profile(base::GenerateGUID(), test::kEmptyOrigin);
     test::SetProfileInfo(&profile, "Marion", "Mitchell", "Morrison",
                          "johnwayne@me.xyz", "Fox", "123 Zoo St", "unit 5",
                          "Hollywood", "CA", "91601", "US", "12345678910");
-    AddProfileToPersonalDataManager(profile);
 
-    ASSERT_EQ(1U, personal_data_->GetProfiles().size());
+    return profile;
   }
 
   // Adds three local cards to the |personal_data_|. The three cards are
@@ -4078,23 +4083,21 @@
   // Set the time to a specific value.
   test_clock.SetNow(kArbitraryTime);
 
-  SetUpReferenceProfile();
-  const std::vector<AutofillProfile*>& initial_profiles =
-      personal_data_->GetProfiles();
+  AutofillProfile original_profile = GetDefaultProfile();
 
   // Apply changes to the original profile (if applicable).
   for (ProfileField change : test_case.changes_to_original) {
-    initial_profiles.front()->SetRawInfo(change.field_type,
-                                         base::UTF8ToUTF16(change.field_value));
+    original_profile.SetRawInfo(change.field_type,
+                                base::UTF8ToUTF16(change.field_value));
   }
 
+  // Initialize PersonalDataManager with the original profile.
+  SetUpReferenceProfile(original_profile);
+
   // Set the time to a bigger value.
   test_clock.SetNow(kSomeLaterTime);
 
-  AutofillProfile profile2(base::GenerateGUID(), test::kEmptyOrigin);
-  test::SetProfileInfo(&profile2, "Marion", "Mitchell", "Morrison",
-                       "johnwayne@me.xyz", "Fox", "123 Zoo St", "unit 5",
-                       "Hollywood", "CA", "91601", "US", "12345678910");
+  AutofillProfile profile2(GetDefaultProfile());
 
   // Apply changes to the second profile (if applicable).
   for (ProfileField change : test_case.changes_to_new) {
@@ -4107,6 +4110,20 @@
   const std::vector<AutofillProfile*>& saved_profiles =
       personal_data_->GetProfiles();
 
+  // Get the set of profiles persisted in the db.
+  std::vector<std::unique_ptr<AutofillProfile>> db_profiles;
+  profile_autofill_table_->GetAutofillProfiles(&db_profiles);
+
+  // Expect the profiles held in-memory by PersonalDataManager and the db
+  // profiles to be the same.
+  EXPECT_EQ(db_profiles.size(), saved_profiles.size());
+  for (const auto& it : db_profiles) {
+    AutofillProfile* inmemory_profile =
+        personal_data_->GetProfileByGUID(it->guid());
+    ASSERT_TRUE(inmemory_profile != nullptr);
+    EXPECT_TRUE(it->EqualsIncludingUsageStatsForTesting(*inmemory_profile));
+  }
+
   // If there are no merge changes to verify, make sure that two profiles were
   // saved.
   if (test_case.changed_field_values.empty()) {
@@ -4433,7 +4450,7 @@
   // Merge the imported profile into the existing profiles.
   std::vector<AutofillProfile> profiles;
   std::string guid = AutofillProfileComparator::MergeProfile(
-      imported_profile, &existing_profiles, "US-EN", &profiles);
+      imported_profile, existing_profiles, "US-EN", &profiles);
 
   // The new profile should be merged into the "fox" profile.
   EXPECT_EQ(profile2->guid(), guid);
@@ -4482,18 +4499,19 @@
   // Merge the imported profile into the existing profiles.
   std::vector<AutofillProfile> profiles;
   std::string guid = AutofillProfileComparator::MergeProfile(
-      imported_profile, &existing_profiles, "US-EN", &profiles);
+      imported_profile, existing_profiles, "US-EN", &profiles);
 
   // The new profile should be merged into the existing profile.
   EXPECT_EQ(profile->guid(), guid);
+  EXPECT_EQ(1U, profiles.size());
   // The use count should have be max(4, 1) => 4.
-  EXPECT_EQ(4U, profile->use_count());
+  EXPECT_EQ(4U, profiles[0].use_count());
   // The use date should be the one of the most recent profile, which is
   // kSecondArbitraryTime.
-  EXPECT_EQ(kSomeLaterTime, profile->use_date());
+  EXPECT_EQ(kSomeLaterTime, profiles[0].use_date());
   // Since the merge is considered a modification, the modification_date should
   // be set to kMuchLaterTime.
-  EXPECT_EQ(kMuchLaterTime, profile->modification_date());
+  EXPECT_EQ(kMuchLaterTime, profiles[0].modification_date());
 }
 
 // Tests that DedupeProfiles sets the correct profile guids to
diff --git a/components/browser_ui/styles/android/java/src/org/chromium/components/browser_ui/styles/ChromeColors.java b/components/browser_ui/styles/android/java/src/org/chromium/components/browser_ui/styles/ChromeColors.java
index 799968f..f0ecd20 100644
--- a/components/browser_ui/styles/android/java/src/org/chromium/components/browser_ui/styles/ChromeColors.java
+++ b/components/browser_ui/styles/android/java/src/org/chromium/components/browser_ui/styles/ChromeColors.java
@@ -9,6 +9,7 @@
 import android.content.res.Resources;
 import android.support.v7.content.res.AppCompatResources;
 
+import androidx.annotation.ColorInt;
 import androidx.annotation.ColorRes;
 
 import org.chromium.base.ApiCompatibilityUtils;
@@ -25,7 +26,7 @@
      *        adaptive default color.
      * @return The default theme color.
      */
-    public static @ColorRes int getDefaultThemeColor(Resources res, boolean forceDarkBgColor) {
+    public static @ColorInt int getDefaultThemeColor(Resources res, boolean forceDarkBgColor) {
         return forceDarkBgColor
                 ? ApiCompatibilityUtils.getColor(res, R.color.toolbar_background_primary_dark)
                 : ApiCompatibilityUtils.getColor(res, R.color.toolbar_background_primary);
@@ -40,7 +41,7 @@
      *        returns adaptive primary background color.
      * @return The primary background color.
      */
-    public static @ColorRes int getPrimaryBackgroundColor(Resources res, boolean forceDarkBgColor) {
+    public static @ColorInt int getPrimaryBackgroundColor(Resources res, boolean forceDarkBgColor) {
         return forceDarkBgColor
                 ? ApiCompatibilityUtils.getColor(res, org.chromium.ui.R.color.dark_primary_color)
                 : ApiCompatibilityUtils.getColor(res, org.chromium.ui.R.color.modern_primary_color);
diff --git a/components/browser_ui/widget/android/java/res/layout/list_menu_item.xml b/components/browser_ui/widget/android/java/res/layout/list_menu_item.xml
index 5d1cb2e..8d16bff3 100644
--- a/components/browser_ui/widget/android/java/res/layout/list_menu_item.xml
+++ b/components/browser_ui/widget/android/java/res/layout/list_menu_item.xml
@@ -2,31 +2,16 @@
 <!-- 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. -->
-<!-- Do not replace this with TextViewWithCompoundDrawables
-     https://crbug.com/1053448
- -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+
+<org.chromium.components.browser_ui.widget.text.TextViewWithCompoundDrawables
+    xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/menu_item"
     android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:background="?attr/selectableItemBackground"
+    android:layout_height="?android:attr/listPreferredItemHeightSmall"
+    android:textAppearance="@style/TextAppearance.ListMenuItem"
+    android:drawablePadding="@dimen/menu_drawable_padding"
     android:gravity="center_vertical"
+    android:background="?attr/selectableItemBackground"
     style="@style/ListMenuItemStyle"
-    android:minHeight="?android:attr/listPreferredItemHeightSmall" >
-
-    <org.chromium.ui.widget.ChromeImageView
-        android:id="@+id/menu_item_icon"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        app:tint="@color/default_icon_color_secondary" />
-
-    <TextView
-        android:id="@+id/menu_item_text"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:gravity="center_vertical"
-        android:singleLine="false"
-        android:textAppearance="@style/TextAppearance.ListMenuItem" />
-
-</LinearLayout>
+    app:chromeDrawableTint="@color/default_icon_color_secondary" />
diff --git a/components/browser_ui/widget/android/java/res/values/dimens.xml b/components/browser_ui/widget/android/java/res/values/dimens.xml
index 19cfeaa..d2cd3afb 100644
--- a/components/browser_ui/widget/android/java/res/values/dimens.xml
+++ b/components/browser_ui/widget/android/java/res/values/dimens.xml
@@ -38,6 +38,7 @@
     <!-- Custom Menu dimensions -->
     <dimen name="menu_negative_software_vertical_offset">0dp</dimen>
     <dimen name="menu_divider_padding">8dp</dimen>
+    <dimen name="menu_drawable_padding">16dp</dimen>
     <dimen name="menu_padding_start">16dp</dimen>
 
     <!-- Drag-Reorderable List dimensions -->
diff --git a/components/browser_ui/widget/android/java/res/values/styles.xml b/components/browser_ui/widget/android/java/res/values/styles.xml
index c485bbd..228d959 100644
--- a/components/browser_ui/widget/android/java/res/values/styles.xml
+++ b/components/browser_ui/widget/android/java/res/values/styles.xml
@@ -25,8 +25,8 @@
 
     <!-- ListMenuButton -->
     <style name="ListMenuItemStyle">
-        <item name="android:paddingStart">@dimen/default_list_row_padding</item>
-        <item name="android:paddingEnd">@dimen/default_list_row_padding</item>
+        <item name="android:paddingStart">?android:attr/listPreferredItemPaddingStart</item>
+        <item name="android:paddingEnd">?android:attr/listPreferredItemPaddingEnd</item>
     </style>
 
     <style name="OverflowMenuAnim">
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/PromoDialogLayout.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/PromoDialogLayout.java
index 496511e..c635c530 100644
--- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/PromoDialogLayout.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/PromoDialogLayout.java
@@ -5,7 +5,6 @@
 package org.chromium.components.browser_ui.widget;
 
 import android.content.Context;
-import android.support.graphics.drawable.VectorDrawableCompat;
 import android.support.v4.view.ViewCompat;
 import android.text.method.LinkMovementMethod;
 import android.util.AttributeSet;
@@ -16,6 +15,8 @@
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
+import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
+
 import org.chromium.components.browser_ui.widget.PromoDialog.DialogParams;
 
 /**
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/TintedDrawable.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/TintedDrawable.java
index c497b1c3..870e84cf 100644
--- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/TintedDrawable.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/TintedDrawable.java
@@ -14,9 +14,10 @@
 import android.graphics.drawable.VectorDrawable;
 import android.os.Build;
 import android.support.annotation.DrawableRes;
-import android.support.graphics.drawable.VectorDrawableCompat;
 import android.support.v7.content.res.AppCompatResources;
 
+import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
+
 import org.chromium.base.annotations.RemovableInRelease;
 
 /**
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/listmenu/ListMenuItemProperties.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/listmenu/ListMenuItemProperties.java
index c2c98cb..97d4c1e0 100644
--- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/listmenu/ListMenuItemProperties.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/listmenu/ListMenuItemProperties.java
@@ -9,8 +9,7 @@
 import org.chromium.ui.modelutil.PropertyModel.WritableIntPropertyKey;
 
 /**
- * The properties controlling the state of the list menu items. Any given list item can have either
- * one start icon or one end icon but not both.
+ * The properties controlling the state of the list menu items.
  */
 public class ListMenuItemProperties {
     public static final WritableIntPropertyKey TITLE_ID = new WritableIntPropertyKey();
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/listmenu/ListMenuItemViewBinder.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/listmenu/ListMenuItemViewBinder.java
index 79c8008..825f63a5 100644
--- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/listmenu/ListMenuItemViewBinder.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/listmenu/ListMenuItemViewBinder.java
@@ -8,52 +8,43 @@
 import android.support.v4.content.ContextCompat;
 import android.support.v7.content.res.AppCompatResources;
 import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.TextView;
 
-import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.components.browser_ui.widget.R;
+import org.chromium.components.browser_ui.widget.text.TextViewWithCompoundDrawables;
 import org.chromium.ui.modelutil.PropertyKey;
 import org.chromium.ui.modelutil.PropertyModel;
-import org.chromium.ui.modelutil.PropertyModel.ReadableIntPropertyKey;
 
 /**
  * Class responsible for binding the model of the ListMenuItem and the view.
  */
 public class ListMenuItemViewBinder {
     public static void binder(PropertyModel model, View view, PropertyKey propertyKey) {
-        TextView textView = view.findViewById(R.id.menu_item_text);
-        ImageView imageView = view.findViewById(R.id.menu_item_icon);
+        TextViewWithCompoundDrawables textView = (TextViewWithCompoundDrawables) view;
         if (propertyKey == ListMenuItemProperties.TITLE_ID) {
             textView.setText(model.get(ListMenuItemProperties.TITLE_ID));
-        } else if (propertyKey == ListMenuItemProperties.START_ICON_ID
-                || propertyKey == ListMenuItemProperties.END_ICON_ID) {
-            int id = model.get((ReadableIntPropertyKey) propertyKey);
+        } else if (propertyKey == ListMenuItemProperties.START_ICON_ID) {
+            int id = model.get(ListMenuItemProperties.START_ICON_ID);
+            Drawable[] drawables = textView.getCompoundDrawablesRelative();
             Drawable drawable =
                     id == 0 ? null : AppCompatResources.getDrawable(view.getContext(), id);
-            imageView.setImageDrawable(drawable);
-            if (drawable != null) {
-                if (propertyKey == ListMenuItemProperties.START_ICON_ID) {
-                    // need more space between the start and the icon if icon is on the start.
-                    textView.setPaddingRelative(
-                            view.getResources().getDimensionPixelOffset(R.dimen.menu_padding_start),
-                            textView.getPaddingTop(), textView.getPaddingEnd(),
-                            textView.getPaddingBottom());
-                } else {
-                    // Move to the end.
-                    ViewGroup layout = (ViewGroup) view;
-                    layout.removeView(imageView);
-                    layout.addView(imageView);
-                }
+            textView.setCompoundDrawablesRelativeWithIntrinsicBounds(
+                    drawable, drawables[1], drawables[2], drawables[3]);
+            if (id != 0) {
+                // need more space between the start and the icon if icon is on the start.
+                textView.setPaddingRelative(
+                        view.getResources().getDimensionPixelOffset(R.dimen.menu_padding_start),
+                        view.getPaddingTop(), view.getPaddingEnd(), view.getPaddingBottom());
             }
+        } else if (propertyKey == ListMenuItemProperties.END_ICON_ID) {
+            int id = model.get(ListMenuItemProperties.END_ICON_ID);
+            Drawable[] drawables = textView.getCompoundDrawablesRelative();
+            Drawable drawable =
+                    id == 0 ? null : AppCompatResources.getDrawable(view.getContext(), id);
+            textView.setCompoundDrawablesRelativeWithIntrinsicBounds(
+                    drawables[0], drawables[1], drawable, drawables[3]);
         } else if (propertyKey == ListMenuItemProperties.TINT_COLOR_ID) {
-            ApiCompatibilityUtils.setImageTintList(imageView,
-                    ContextCompat.getColorStateList(
-                            view.getContext(), model.get(ListMenuItemProperties.TINT_COLOR_ID)));
-        } else if (propertyKey == ListMenuItemProperties.ENABLED) {
-            textView.setEnabled(model.get(ListMenuItemProperties.ENABLED));
-            imageView.setEnabled(model.get(ListMenuItemProperties.ENABLED));
+            textView.setDrawableTintColor(ContextCompat.getColorStateList(
+                    view.getContext(), model.get(ListMenuItemProperties.TINT_COLOR_ID)));
         }
     }
 }
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/SelectableItemView.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/SelectableItemView.java
index ff8b3465..804b7e4 100644
--- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/SelectableItemView.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/SelectableItemView.java
@@ -7,7 +7,6 @@
 import android.content.Context;
 import android.content.res.ColorStateList;
 import android.graphics.drawable.Drawable;
-import android.support.graphics.drawable.AnimatedVectorDrawableCompat;
 import android.support.v7.content.res.AppCompatResources;
 import android.support.v7.widget.AppCompatImageButton;
 import android.util.AttributeSet;
@@ -18,6 +17,7 @@
 
 import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
+import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat;
 
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.components.browser_ui.widget.R;
diff --git a/components/exo/client_controlled_shell_surface_unittest.cc b/components/exo/client_controlled_shell_surface_unittest.cc
index d3dc68f..98038467b2 100644
--- a/components/exo/client_controlled_shell_surface_unittest.cc
+++ b/components/exo/client_controlled_shell_surface_unittest.cc
@@ -842,7 +842,7 @@
   shell_surface->SetFullscreen(false);
   surface->Commit();
   EXPECT_FALSE(HasBackdrop());
-  EXPECT_NE(CurrentContext()->bounds().ToString(),
+  EXPECT_NE(GetContext()->bounds().ToString(),
             shell_surface->GetWidget()->GetWindowBoundsInScreen().ToString());
 }
 
diff --git a/components/exo/seat_unittest.cc b/components/exo/seat_unittest.cc
index 6c8422d..2218f1d 100644
--- a/components/exo/seat_unittest.cc
+++ b/components/exo/seat_unittest.cc
@@ -485,7 +485,7 @@
   Surface origin, icon;
 
   // Give origin a root window for DragDropOperation.
-  CurrentContext()->AddChild(origin.window());
+  GetContext()->AddChild(origin.window());
 
   seat.StartDrag(&source, &origin, &icon,
                  ui::DragDropTypes::DragEventSource::DRAG_EVENT_SOURCE_MOUSE);
diff --git a/components/exo/shell_surface_unittest.cc b/components/exo/shell_surface_unittest.cc
index d680326..57b2c57 100644
--- a/components/exo/shell_surface_unittest.cc
+++ b/components/exo/shell_surface_unittest.cc
@@ -103,9 +103,8 @@
   EXPECT_TRUE(compositor->IsLocked());
 
   shell_surface->AcknowledgeConfigure(kSerial);
-  std::unique_ptr<Buffer> fullscreen_buffer(
-      new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(
-          CurrentContext()->bounds().size())));
+  std::unique_ptr<Buffer> fullscreen_buffer(new Buffer(
+      exo_test_helper()->CreateGpuMemoryBuffer(GetContext()->bounds().size())));
   surface->Attach(fullscreen_buffer.get());
   surface->Commit();
 
@@ -162,7 +161,7 @@
   EXPECT_FALSE(HasBackdrop());
   surface->Commit();
   EXPECT_FALSE(HasBackdrop());
-  EXPECT_EQ(CurrentContext()->bounds().width(),
+  EXPECT_EQ(GetContext()->bounds().width(),
             shell_surface->GetWidget()->GetWindowBoundsInScreen().width());
   EXPECT_TRUE(shell_surface->GetWidget()->IsMaximized());
 
@@ -263,12 +262,12 @@
   surface->Attach(buffer.get());
   surface->Commit();
   EXPECT_FALSE(HasBackdrop());
-  EXPECT_EQ(CurrentContext()->bounds().ToString(),
+  EXPECT_EQ(GetContext()->bounds().ToString(),
             shell_surface->GetWidget()->GetWindowBoundsInScreen().ToString());
   shell_surface->SetFullscreen(false);
   surface->Commit();
   EXPECT_FALSE(HasBackdrop());
-  EXPECT_NE(CurrentContext()->bounds().ToString(),
+  EXPECT_NE(GetContext()->bounds().ToString(),
             shell_surface->GetWidget()->GetWindowBoundsInScreen().ToString());
 }
 
@@ -655,7 +654,7 @@
 
   shell_surface->SetFullscreen(true);
   shell_surface->AcknowledgeConfigure(0);
-  EXPECT_EQ(CurrentContext()->bounds().size().ToString(),
+  EXPECT_EQ(GetContext()->bounds().size().ToString(),
             suggested_size.ToString());
   EXPECT_EQ(ash::WindowStateType::kFullscreen, has_state_type);
   shell_surface->SetFullscreen(false);
@@ -690,7 +689,7 @@
       shell_surface->GetWidget()->GetWindowBoundsInScreen().size().ToString());
   shell_surface->Maximize();
   EXPECT_FALSE(HasBackdrop());
-  EXPECT_EQ(CurrentContext()->bounds().width(),
+  EXPECT_EQ(GetContext()->bounds().width(),
             shell_surface->GetWidget()->GetWindowBoundsInScreen().width());
 
   ash::WMEvent event(ash::WM_EVENT_TOGGLE_FULLSCREEN);
@@ -700,7 +699,7 @@
   ash::WindowState::Get(window)->OnWMEvent(&event);
 
   EXPECT_FALSE(HasBackdrop());
-  EXPECT_EQ(CurrentContext()->bounds().ToString(),
+  EXPECT_EQ(GetContext()->bounds().ToString(),
             shell_surface->GetWidget()->GetWindowBoundsInScreen().ToString());
 
   // Leave fullscreen mode.
@@ -708,7 +707,7 @@
   EXPECT_FALSE(HasBackdrop());
 
   // Check that shell surface is maximized.
-  EXPECT_EQ(CurrentContext()->bounds().width(),
+  EXPECT_EQ(GetContext()->bounds().width(),
             shell_surface->GetWidget()->GetWindowBoundsInScreen().width());
 }
 
@@ -754,14 +753,14 @@
   // Enter snapped mode.
   ash::WindowState::Get(window)->OnWMEvent(&event);
 
-  EXPECT_EQ(CurrentContext()->bounds().width() / 2,
+  EXPECT_EQ(GetContext()->bounds().width() / 2,
             shell_surface->GetWidget()->GetWindowBoundsInScreen().width());
 
   surface->Attach(buffer.get());
   surface->Commit();
 
   // Commit shouldn't change widget bounds when snapped.
-  EXPECT_EQ(CurrentContext()->bounds().width() / 2,
+  EXPECT_EQ(GetContext()->bounds().width() / 2,
             shell_surface->GetWidget()->GetWindowBoundsInScreen().width());
 }
 
diff --git a/components/exo/wayland/clients/test/wayland_client_test_helper.cc b/components/exo/wayland/clients/test/wayland_client_test_helper.cc
index ad65264c..e2f3148 100644
--- a/components/exo/wayland/clients/test/wayland_client_test_helper.cc
+++ b/components/exo/wayland/clients/test/wayland_client_test_helper.cc
@@ -107,8 +107,7 @@
   command_line->AppendSwitch(wm::switches::kWindowAnimationsDisabled);
 
   ash_test_helper_ = std::make_unique<ash::AshTestHelper>();
-  ash::AshTestHelper::InitParams init_params;
-  ash_test_helper_->SetUp(init_params);
+  ash_test_helper_->SetUp();
   ash::Shell::GetPrimaryRootWindow()->Show();
   ash::Shell::GetPrimaryRootWindow()->GetHost()->Show();
   ash::Shell::GetPrimaryRootWindow()->MoveCursorTo(gfx::Point(-1000, -1000));
diff --git a/components/exo/wayland/zaura_shell_unittest.cc b/components/exo/wayland/zaura_shell_unittest.cc
index 0ee896e..4a7218ca 100644
--- a/components/exo/wayland/zaura_shell_unittest.cc
+++ b/components/exo/wayland/zaura_shell_unittest.cc
@@ -202,7 +202,7 @@
   views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
   auto lock_widget = std::make_unique<views::Widget>();
   params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
-  params.context = CurrentContext();
+  params.context = GetContext();
   params.bounds = gfx::Rect(0, 0, 100, 100);
   lock_widget->Init(std::move(params));
   ash::Shell::GetContainer(ash::Shell::GetPrimaryRootWindow(),
diff --git a/components/media_message_center/media_notification_view_impl_unittest.cc b/components/media_message_center/media_notification_view_impl_unittest.cc
index fcb49db..28b7b897 100644
--- a/components/media_message_center/media_notification_view_impl_unittest.cc
+++ b/components/media_message_center/media_notification_view_impl_unittest.cc
@@ -1219,6 +1219,87 @@
   EXPECT_TRUE(GetArtworkImage().isNull());
 }
 
+TEST_F(MAYBE_MediaNotificationViewImplTest, UnfreezingWaitsForActions) {
+  EnableAction(MediaSessionAction::kPlay);
+  EnableAction(MediaSessionAction::kPause);
+  EnableAction(MediaSessionAction::kNextTrack);
+  EnableAction(MediaSessionAction::kPreviousTrack);
+
+  // Freeze the item and clear the metadata and actions.
+  base::MockOnceClosure unfrozen_callback;
+  EXPECT_CALL(unfrozen_callback, Run).Times(0);
+  GetItem()->Freeze(unfrozen_callback.Get());
+  GetItem()->MediaSessionInfoChanged(nullptr);
+  GetItem()->MediaSessionMetadataChanged(base::nullopt);
+  DisableAction(MediaSessionAction::kPlay);
+  DisableAction(MediaSessionAction::kPause);
+  DisableAction(MediaSessionAction::kNextTrack);
+  DisableAction(MediaSessionAction::kPreviousTrack);
+
+  // The item should be frozen and the view should contain the old data.
+  EXPECT_TRUE(GetItem()->frozen());
+  EXPECT_TRUE(GetButtonForAction(MediaSessionAction::kPlay));
+  EXPECT_FALSE(GetButtonForAction(MediaSessionAction::kPause));
+  EXPECT_TRUE(GetButtonForAction(MediaSessionAction::kNextTrack));
+  EXPECT_TRUE(GetButtonForAction(MediaSessionAction::kPreviousTrack));
+  EXPECT_EQ(base::ASCIIToUTF16("title"), title_label()->GetText());
+  EXPECT_EQ(base::ASCIIToUTF16("artist"), artist_label()->GetText());
+
+  // Bind the item to a new controller that's playing instead of paused.
+  auto new_media_controller = std::make_unique<TestMediaController>();
+  media_session::mojom::MediaSessionInfoPtr session_info(
+      media_session::mojom::MediaSessionInfo::New());
+  session_info->playback_state =
+      media_session::mojom::MediaPlaybackState::kPlaying;
+  session_info->is_controllable = true;
+  GetItem()->SetController(new_media_controller->CreateMediaControllerRemote(),
+                           session_info.Clone());
+
+  // The item will receive a MediaSessionInfoChanged.
+  GetItem()->MediaSessionInfoChanged(session_info.Clone());
+
+  // The item should still be frozen, and the view should contain the old data.
+  EXPECT_TRUE(GetItem()->frozen());
+  EXPECT_TRUE(GetButtonForAction(MediaSessionAction::kPlay));
+  EXPECT_FALSE(GetButtonForAction(MediaSessionAction::kPause));
+  EXPECT_TRUE(GetButtonForAction(MediaSessionAction::kNextTrack));
+  EXPECT_TRUE(GetButtonForAction(MediaSessionAction::kPreviousTrack));
+  EXPECT_EQ(base::ASCIIToUTF16("title"), title_label()->GetText());
+  EXPECT_EQ(base::ASCIIToUTF16("artist"), artist_label()->GetText());
+
+  // Update the metadata.
+  media_session::MediaMetadata metadata;
+  metadata.title = base::ASCIIToUTF16("title2");
+  metadata.artist = base::ASCIIToUTF16("artist2");
+  GetItem()->MediaSessionMetadataChanged(metadata);
+
+  // The item should still be frozen, and waiting for new actions.
+  EXPECT_TRUE(GetItem()->frozen());
+  testing::Mock::VerifyAndClearExpectations(&unfrozen_callback);
+  EXPECT_TRUE(GetButtonForAction(MediaSessionAction::kPlay));
+  EXPECT_FALSE(GetButtonForAction(MediaSessionAction::kPause));
+  EXPECT_TRUE(GetButtonForAction(MediaSessionAction::kNextTrack));
+  EXPECT_TRUE(GetButtonForAction(MediaSessionAction::kPreviousTrack));
+  EXPECT_EQ(base::ASCIIToUTF16("title"), title_label()->GetText());
+  EXPECT_EQ(base::ASCIIToUTF16("artist"), artist_label()->GetText());
+
+  // Once we receive actions, the item should unfreeze.
+  EXPECT_CALL(unfrozen_callback, Run);
+  EnableAction(MediaSessionAction::kPlay);
+  EnableAction(MediaSessionAction::kPause);
+  EnableAction(MediaSessionAction::kSeekForward);
+  EnableAction(MediaSessionAction::kSeekBackward);
+
+  EXPECT_FALSE(GetItem()->frozen());
+  testing::Mock::VerifyAndClearExpectations(&unfrozen_callback);
+  EXPECT_FALSE(GetButtonForAction(MediaSessionAction::kPlay));
+  EXPECT_TRUE(GetButtonForAction(MediaSessionAction::kPause));
+  EXPECT_TRUE(GetButtonForAction(MediaSessionAction::kSeekForward));
+  EXPECT_TRUE(GetButtonForAction(MediaSessionAction::kSeekBackward));
+  EXPECT_EQ(base::ASCIIToUTF16("title2"), title_label()->GetText());
+  EXPECT_EQ(base::ASCIIToUTF16("artist2"), artist_label()->GetText());
+}
+
 TEST_F(MAYBE_MediaNotificationViewImplTest,
        UnfreezingWaitsForArtwork_ReceiveArtwork) {
   EnableAction(MediaSessionAction::kPlay);
diff --git a/components/media_message_center/media_session_notification_item.cc b/components/media_message_center/media_session_notification_item.cc
index cc458ef..3cfe476 100644
--- a/components/media_message_center/media_session_notification_item.cc
+++ b/components/media_message_center/media_session_notification_item.cc
@@ -104,6 +104,8 @@
   if (view_ && !frozen_) {
     DCHECK(view_);
     view_->UpdateWithMediaActions(session_actions_);
+  } else if (waiting_for_actions_) {
+    MaybeUnfreeze();
   }
 }
 
@@ -204,6 +206,7 @@
     return;
 
   frozen_ = true;
+  frozen_with_actions_ = HasActions();
   frozen_with_artwork_ = HasArtwork();
 
   freeze_timer_.Start(
@@ -233,12 +236,23 @@
   if (!frozen_)
     return;
 
+  if (waiting_for_actions_ && !HasActions())
+    return;
+
   if (waiting_for_artwork_ && !HasArtwork())
     return;
 
   if (!ShouldShowNotification() || !is_bound_)
     return;
 
+  // If the currently frozen view has actions and the new session currently has
+  // no actions, then wait until either the freeze timer ends or the new actions
+  // are received.
+  if (frozen_with_actions_ && !HasActions()) {
+    waiting_for_actions_ = true;
+    return;
+  }
+
   // If the currently frozen view has artwork and the new session currently has
   // no artwork, then wait until either the freeze timer ends or the new artwork
   // is downloaded.
@@ -252,6 +266,8 @@
 
 void MediaSessionNotificationItem::Unfreeze() {
   frozen_ = false;
+  waiting_for_actions_ = false;
+  frozen_with_actions_ = false;
   waiting_for_artwork_ = false;
   frozen_with_artwork_ = false;
   freeze_timer_.Stop();
@@ -273,6 +289,10 @@
   std::move(unfrozen_callback_).Run();
 }
 
+bool MediaSessionNotificationItem::HasActions() const {
+  return !session_actions_.empty();
+}
+
 bool MediaSessionNotificationItem::HasArtwork() const {
   return session_artwork_.has_value() && !session_artwork_->isNull();
 }
@@ -280,9 +300,10 @@
 void MediaSessionNotificationItem::OnFreezeTimerFired() {
   DCHECK(frozen_);
 
-  // If we've just been waiting for artwork, stop waiting and just show what we
-  // have.
-  if (waiting_for_artwork_ && ShouldShowNotification() && is_bound_) {
+  // If we've just been waiting for actions or artwork, stop waiting and just
+  // show what we have.
+  if ((waiting_for_actions_ || waiting_for_artwork_) &&
+      ShouldShowNotification() && is_bound_) {
     Unfreeze();
     return;
   }
diff --git a/components/media_message_center/media_session_notification_item.h b/components/media_message_center/media_session_notification_item.h
index a85829a..e122a9f 100644
--- a/components/media_message_center/media_session_notification_item.h
+++ b/components/media_message_center/media_session_notification_item.h
@@ -99,6 +99,8 @@
 
   void Unfreeze();
 
+  bool HasActions() const;
+
   bool HasArtwork() const;
 
   void OnFreezeTimerFired();
@@ -139,6 +141,14 @@
   // data and no actions will be executed.
   bool frozen_ = false;
 
+  // True if we're currently frozen and the frozen view contains at least 1
+  // action.
+  bool frozen_with_actions_ = false;
+
+  // True if we have the necessary metadata to unfreeze, but we're waiting for
+  // new actions.
+  bool waiting_for_actions_ = false;
+
   // True if we're currently frozen and the frozen view contains non-null
   // artwork.
   bool frozen_with_artwork_ = false;
diff --git a/components/metrics/metrics_log.cc b/components/metrics/metrics_log.cc
index d76c5867..ab4e04f 100644
--- a/components/metrics/metrics_log.cc
+++ b/components/metrics/metrics_log.cc
@@ -112,6 +112,9 @@
     uma_proto_.set_product(product);
 
   SystemProfileProto* system_profile = uma_proto()->mutable_system_profile();
+  // Record the unhashed the client_id to system profile. This is used to
+  // simulate field trial assignments for the client.
+  system_profile->set_client_uuid(client_id);
   RecordCoreSystemProfile(client_, system_profile);
 }
 
diff --git a/components/metrics/metrics_log_unittest.cc b/components/metrics/metrics_log_unittest.cc
index 9d6d531..d408207 100644
--- a/components/metrics/metrics_log_unittest.cc
+++ b/components/metrics/metrics_log_unittest.cc
@@ -127,9 +127,9 @@
 TEST_F(MetricsLogTest, BasicRecord) {
   TestMetricsServiceClient client;
   client.set_version_string("bogus version");
+  const std::string kClientId = "totally bogus client ID";
   TestingPrefServiceSimple prefs;
-  MetricsLog log("totally bogus client ID", 137, MetricsLog::ONGOING_LOG,
-                 &client);
+  MetricsLog log(kClientId, 137, MetricsLog::ONGOING_LOG, &client);
   log.CloseLog();
 
   std::string encoded;
@@ -146,6 +146,9 @@
 
   SystemProfileProto* system_profile = expected.mutable_system_profile();
   system_profile->set_app_version("bogus version");
+  // Make sure |client_uuid| in the system profile is the unhashed client id
+  // and is the same as the client id in |local_prefs|.
+  system_profile->set_client_uuid(kClientId);
   system_profile->set_channel(client.GetChannel());
   system_profile->set_application_locale(client.GetApplicationLocale());
 
diff --git a/components/mirroring/service/BUILD.gn b/components/mirroring/service/BUILD.gn
index 7ecc422..1072338 100644
--- a/components/mirroring/service/BUILD.gn
+++ b/components/mirroring/service/BUILD.gn
@@ -8,8 +8,6 @@
   sources = [
     "captured_audio_input.cc",
     "captured_audio_input.h",
-    "features.cc",
-    "features.h",
     "media_remoter.cc",
     "media_remoter.h",
     "message_dispatcher.cc",
diff --git a/components/mirroring/service/features.cc b/components/mirroring/service/features.cc
deleted file mode 100644
index 3bcba448..0000000
--- a/components/mirroring/service/features.cc
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/mirroring/service/features.h"
-
-namespace mirroring {
-namespace features {
-
-// Enables or disables Mirroring Service.
-const base::Feature kMirroringService{"MirroringService",
-                                      base::FEATURE_ENABLED_BY_DEFAULT};
-
-}  // namespace features
-}  // namespace mirroring
diff --git a/components/mirroring/service/features.h b/components/mirroring/service/features.h
deleted file mode 100644
index bf4e153d..0000000
--- a/components/mirroring/service/features.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_MIRRORING_SERVICE_FEATURES_H_
-#define COMPONENTS_MIRRORING_SERVICE_FEATURES_H_
-
-#include "base/component_export.h"
-#include "base/feature_list.h"
-
-namespace mirroring {
-namespace features {
-
-COMPONENT_EXPORT(MIRRORING_SERVICE)
-extern const base::Feature kMirroringService;
-
-}  // namespace features
-}  // namespace mirroring
-
-#endif  // COMPONENTS_MIRRORING_SERVICE_FEATURES_H_
diff --git a/components/paint_preview/browser/BUILD.gn b/components/paint_preview/browser/BUILD.gn
index 5009a7f..90ebaf8 100644
--- a/components/paint_preview/browser/BUILD.gn
+++ b/components/paint_preview/browser/BUILD.gn
@@ -46,10 +46,6 @@
     "//url",
   ]
 
-  if (is_android) {
-    deps += [ ":jni_headers" ]
-  }
-
   public_deps = [
     "//components/paint_preview/common",
     "//components/paint_preview/common/mojom",
@@ -59,12 +55,6 @@
   ]
 }
 
-if (is_android) {
-  generate_jni("jni_headers") {
-    sources = [ "android/java/src/org/chromium/components/paintpreview/browser/PaintPreviewBaseService.java" ]
-  }
-}
-
 source_set("test_support") {
   testonly = true
   sources = [
diff --git a/components/paint_preview/browser/android/BUILD.gn b/components/paint_preview/browser/android/BUILD.gn
index 33f970a..5885b04 100644
--- a/components/paint_preview/browser/android/BUILD.gn
+++ b/components/paint_preview/browser/android/BUILD.gn
@@ -14,7 +14,7 @@
   annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
 
   sources = [
-    "java/src/org/chromium/components/paintpreview/browser/PaintPreviewBaseService.java",
+    "java/src/org/chromium/components/paintpreview/browser/NativePaintPreviewServiceProvider.java",
     "java/src/org/chromium/components/paintpreview/browser/PaintPreviewUtils.java",
   ]
 
diff --git a/components/paint_preview/browser/android/java/src/org/chromium/components/paintpreview/browser/NativePaintPreviewServiceProvider.java b/components/paint_preview/browser/android/java/src/org/chromium/components/paintpreview/browser/NativePaintPreviewServiceProvider.java
new file mode 100644
index 0000000..ffbf946d
--- /dev/null
+++ b/components/paint_preview/browser/android/java/src/org/chromium/components/paintpreview/browser/NativePaintPreviewServiceProvider.java
@@ -0,0 +1,11 @@
+// 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.components.paintpreview.browser;
+
+/**
+ * The Java-side implementations of paint_preview_base_service.cc should implement this interface.
+ * Provides a method for accessing the native PaintPreviewBaseService.
+ */
+public interface NativePaintPreviewServiceProvider { long getNativeService(); }
\ No newline at end of file
diff --git a/components/paint_preview/browser/android/java/src/org/chromium/components/paintpreview/browser/PaintPreviewBaseService.java b/components/paint_preview/browser/android/java/src/org/chromium/components/paintpreview/browser/PaintPreviewBaseService.java
deleted file mode 100644
index ec5d7cf..0000000
--- a/components/paint_preview/browser/android/java/src/org/chromium/components/paintpreview/browser/PaintPreviewBaseService.java
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.components.paintpreview.browser;
-
-import org.chromium.base.annotations.CalledByNative;
-
-/**
- * The Java-side implementation of paint_preview_base_service.cc. This class is owned and managed by
- * its C++ counterpart.
- */
-public class PaintPreviewBaseService {
-    private long mNativePaintPreviewBaseService;
-
-    @CalledByNative
-    public PaintPreviewBaseService(long nativePaintPreviewBaseService) {
-        mNativePaintPreviewBaseService = nativePaintPreviewBaseService;
-    }
-
-    @CalledByNative
-    public void onDestroy() {
-        mNativePaintPreviewBaseService = 0;
-    }
-
-    public long getNativePaintPreviewBaseService() {
-        return mNativePaintPreviewBaseService;
-    }
-}
\ No newline at end of file
diff --git a/components/paint_preview/browser/paint_preview_base_service.cc b/components/paint_preview/browser/paint_preview_base_service.cc
index 75a2fbc..ef468dc 100644
--- a/components/paint_preview/browser/paint_preview_base_service.cc
+++ b/components/paint_preview/browser/paint_preview_base_service.cc
@@ -24,12 +24,6 @@
 #include "content/public/browser/web_contents.h"
 #include "ui/gfx/geometry/rect.h"
 
-#if defined(OS_ANDROID)
-#include "base/android/jni_android.h"
-#include "base/android/scoped_java_ref.h"
-#include "components/paint_preview/browser/jni_headers/PaintPreviewBaseService_jni.h"
-#endif  // defined(OS_ANDROID)
-
 namespace paint_preview {
 
 namespace {
@@ -46,22 +40,9 @@
     : policy_(std::move(policy)),
       file_manager_(
           path.AppendASCII(kPaintPreviewDir).AppendASCII(ascii_feature_name)),
-      is_off_the_record_(is_off_the_record) {
-#if defined(OS_ANDROID)
-  JNIEnv* env = base::android::AttachCurrentThread();
-  base::android::ScopedJavaLocalRef<jobject> java_ref =
-      Java_PaintPreviewBaseService_Constructor(
-          env, reinterpret_cast<intptr_t>(this));
-  java_ref_.Reset(java_ref);
-#endif  // defined(OS_ANDROID)
-}
+      is_off_the_record_(is_off_the_record) {}
 
-PaintPreviewBaseService::~PaintPreviewBaseService() {
-#if defined(OS_ANDROID)
-  JNIEnv* env = base::android::AttachCurrentThread();
-  Java_PaintPreviewBaseService_onDestroy(env, java_ref_);
-#endif  // defined(OS_ANDROID)
-}
+PaintPreviewBaseService::~PaintPreviewBaseService() = default;
 
 void PaintPreviewBaseService::GetCapturedPaintPreviewProto(
     const DirectoryKey& key,
diff --git a/components/paint_preview/browser/paint_preview_base_service.h b/components/paint_preview/browser/paint_preview_base_service.h
index d831ba7..087dff07a 100644
--- a/components/paint_preview/browser/paint_preview_base_service.h
+++ b/components/paint_preview/browser/paint_preview_base_service.h
@@ -23,10 +23,6 @@
 #include "components/paint_preview/common/proto/paint_preview.pb.h"
 #include "components/paint_preview/public/paint_preview_compositor_service.h"
 #include "content/public/browser/web_contents.h"
-#if defined(OS_ANDROID)
-#include "base/android/jni_android.h"
-#include "base/android/scoped_java_ref.h"
-#endif  // defined(OS_ANDROID)
 
 namespace paint_preview {
 
@@ -119,12 +115,6 @@
   std::unique_ptr<PaintPreviewCompositorService> StartCompositorService(
       base::OnceClosure disconnect_handler);
 
-#if defined(OS_ANDROID)
-  base::android::ScopedJavaGlobalRef<jobject> GetJavaObject() {
-    return java_ref_;
-  }
-#endif  // defined(OS_ANDROID)
-
  private:
   void OnCaptured(base::TimeTicks start_time,
                   OnCapturedCallback callback,
@@ -136,11 +126,6 @@
   FileManager file_manager_;
   bool is_off_the_record_;
 
-#if defined(OS_ANDROID)
-  // Points to the Java reference.
-  base::android::ScopedJavaGlobalRef<jobject> java_ref_;
-#endif  // defined(OS_ANDROID)
-
   base::WeakPtrFactory<PaintPreviewBaseService> weak_ptr_factory_{this};
 
   PaintPreviewBaseService(const PaintPreviewBaseService&) = delete;
diff --git a/components/paint_preview/browser/paint_preview_client.cc b/components/paint_preview/browser/paint_preview_client.cc
index 9f157a2..5785d08 100644
--- a/components/paint_preview/browser/paint_preview_client.cc
+++ b/components/paint_preview/browser/paint_preview_client.cc
@@ -135,13 +135,8 @@
   document_data.root_url = render_frame_host->GetLastCommittedURL();
   document_data.source_id =
       ukm::GetSourceIdForWebContentsDocument(web_contents());
-  document_data.called_on_thread = base::SequencedTaskRunnerHandle::Get();
   all_document_data_.insert({params.document_guid, std::move(document_data)});
-  base::PostTask(
-      FROM_HERE, {content::BrowserThread::UI},
-      base::BindOnce(&PaintPreviewClient::CapturePaintPreviewInternal,
-                     weak_ptr_factory_.GetWeakPtr(), params,
-                     render_frame_host));
+  CapturePaintPreviewInternal(params, render_frame_host);
 }
 
 void PaintPreviewClient::CaptureSubframePaintPreview(
@@ -152,11 +147,7 @@
   params.document_guid = guid;
   params.clip_rect = rect;
   params.is_main_frame = false;
-  base::PostTask(
-      FROM_HERE, {content::BrowserThread::UI},
-      base::BindOnce(&PaintPreviewClient::CapturePaintPreviewInternal,
-                     weak_ptr_factory_.GetWeakPtr(), params,
-                     render_subframe_host));
+  CapturePaintPreviewInternal(params, render_subframe_host);
 }
 
 void PaintPreviewClient::RenderFrameDeleted(
@@ -224,7 +215,6 @@
 void PaintPreviewClient::CapturePaintPreviewInternal(
     const PaintPreviewParams& params,
     content::RenderFrameHost* render_frame_host) {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   // Use a frame's embedding token as its GUID. Note that we create a GUID for
   // the main frame so that we can treat it the same as other frames.
   auto token = render_frame_host->GetEmbeddingToken();
@@ -270,7 +260,9 @@
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   auto* document_data = &all_document_data_[params.document_guid];
   if (result.error != base::File::FILE_OK) {
-    document_data->called_on_thread->PostTask(
+    // Don't block up the UI thread and answer the callback on a different
+    // thread.
+    base::PostTask(
         FROM_HERE,
         base::BindOnce(std::move(document_data->callback), params.document_guid,
                        mojom::PaintPreviewStatus::kFileCreationError, nullptr));
@@ -393,7 +385,7 @@
     // At a minimum one frame was captured successfully, it is up to the
     // caller to decide if a partial success is acceptable based on what is
     // contained in the proto.
-    document_data->called_on_thread->PostTask(
+    base::PostTask(
         FROM_HERE,
         base::BindOnce(std::move(document_data->callback), guid,
                        document_data->had_error
@@ -402,8 +394,8 @@
                        std::move(document_data->proto)));
   } else {
     // A proto could not be created indicating all frames failed to capture.
-    document_data->called_on_thread->PostTask(
-        FROM_HERE, base::BindOnce(std::move(document_data->callback), guid,
+    base::PostTask(FROM_HERE,
+                   base::BindOnce(std::move(document_data->callback), guid,
                                   mojom::PaintPreviewStatus::kFailed, nullptr));
   }
   all_document_data_.erase(guid);
diff --git a/components/paint_preview/browser/paint_preview_client.h b/components/paint_preview/browser/paint_preview_client.h
index d9a5381..28b1d66 100644
--- a/components/paint_preview/browser/paint_preview_client.h
+++ b/components/paint_preview/browser/paint_preview_client.h
@@ -57,9 +57,6 @@
 
   ~PaintPreviewClient() override;
 
-  // These methods do not need to be run on the UI thread, but do need to be run
-  // from a SequencedTaskRunner.
-
   // Captures a paint preview corresponding to the content of
   // |render_frame_host|. This will work for capturing entire documents if
   // passed the main frame or for just a specific subframe depending on
@@ -107,7 +104,6 @@
 
     // Callback that is invoked on completion of data.
     PaintPreviewCallback callback;
-    scoped_refptr<base::SequencedTaskRunner> called_on_thread;
 
     // All the render frames that are still required.
     base::flat_set<base::UnguessableToken> awaiting_subframes;
@@ -152,7 +148,7 @@
       base::File file);
 
   // Sets up for a capture of a frame on |render_frame_host| according to
-  // |params|. This should be called from the UI thread.
+  // |params|.
   void CapturePaintPreviewInternal(const PaintPreviewParams& params,
                                    content::RenderFrameHost* render_frame_host);
 
diff --git a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerCompositorDelegateImpl.java b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerCompositorDelegateImpl.java
index 52f3ca43..00101fd6 100644
--- a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerCompositorDelegateImpl.java
+++ b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerCompositorDelegateImpl.java
@@ -13,7 +13,7 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.components.paintpreview.browser.PaintPreviewBaseService;
+import org.chromium.components.paintpreview.browser.NativePaintPreviewServiceProvider;
 
 import javax.annotation.Nonnull;
 
@@ -32,12 +32,12 @@
     private CompositorListener mCompositorListener;
     private long mNativePlayerCompositorDelegate;
 
-    PlayerCompositorDelegateImpl(PaintPreviewBaseService service, String directoryKey,
+    PlayerCompositorDelegateImpl(NativePaintPreviewServiceProvider service, String directoryKey,
             @Nonnull CompositorListener compositorListener) {
         mCompositorListener = compositorListener;
-        if (service != null && service.getNativePaintPreviewBaseService() != 0) {
+        if (service != null && service.getNativeService() != 0) {
             mNativePlayerCompositorDelegate = PlayerCompositorDelegateImplJni.get().initialize(
-                    this, service.getNativePaintPreviewBaseService(), directoryKey);
+                    this, service.getNativeService(), directoryKey);
         }
         // TODO(crbug.com/1021590): Handle initialization errors when
         // mNativePlayerCompositorDelegate == 0.
diff --git a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerManager.java b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerManager.java
index fe213c263..d3da8c8 100644
--- a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerManager.java
+++ b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerManager.java
@@ -13,7 +13,7 @@
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.UnguessableToken;
-import org.chromium.components.paintpreview.browser.PaintPreviewBaseService;
+import org.chromium.components.paintpreview.browser.NativePaintPreviewServiceProvider;
 import org.chromium.components.paintpreview.player.frame.PlayerFrameCoordinator;
 
 import java.util.HashMap;
@@ -29,7 +29,8 @@
     private PlayerFrameCoordinator mRootFrameCoordinator;
     private FrameLayout mHostView;
 
-    public PlayerManager(Context context, PaintPreviewBaseService service, String directoryKey) {
+    public PlayerManager(
+            Context context, NativePaintPreviewServiceProvider service, String directoryKey) {
         mContext = context;
         mDelegate =
                 new PlayerCompositorDelegateImpl(service, directoryKey, this::onCompositorReady);
diff --git a/components/paint_preview/player/android/javatests/src/org/chromium/components/paintpreview/player/TestImplementerService.java b/components/paint_preview/player/android/javatests/src/org/chromium/components/paintpreview/player/TestImplementerService.java
index ccfa1368..a9ab72c 100644
--- a/components/paint_preview/player/android/javatests/src/org/chromium/components/paintpreview/player/TestImplementerService.java
+++ b/components/paint_preview/player/android/javatests/src/org/chromium/components/paintpreview/player/TestImplementerService.java
@@ -6,15 +6,22 @@
 
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.components.paintpreview.browser.PaintPreviewBaseService;
+import org.chromium.components.paintpreview.browser.NativePaintPreviewServiceProvider;
 
 /**
- * A simple implementation of {@link PaintPreviewBaseService} used in tests.
+ * A simple implementation of {@link NativePaintPreviewServiceProvider} used in tests.
  */
 @JNINamespace("paint_preview")
-public class TestImplementerService extends PaintPreviewBaseService {
+public class TestImplementerService implements NativePaintPreviewServiceProvider {
+    private long mNativeTestImplementerService;
+
     public TestImplementerService(String storagePath) {
-        super(TestImplementerServiceJni.get().getInstance(storagePath));
+        mNativeTestImplementerService = TestImplementerServiceJni.get().getInstance(storagePath);
+    }
+
+    @Override
+    public long getNativeService() {
+        return mNativeTestImplementerService;
     }
 
     @NativeMethods
diff --git a/components/password_manager/core/browser/credential_manager_impl_unittest.cc b/components/password_manager/core/browser/credential_manager_impl_unittest.cc
index eec3656..9bef5f8 100644
--- a/components/password_manager/core/browser/credential_manager_impl_unittest.cc
+++ b/components/password_manager/core/browser/credential_manager_impl_unittest.cc
@@ -86,9 +86,11 @@
 #if !defined(OS_IOS)
     prefs_->registry()->RegisterBooleanPref(::prefs::kSafeBrowsingEnabled,
                                             true);
+    prefs_->registry()->RegisterBooleanPref(::prefs::kSafeBrowsingEnhanced,
+                                            false);
 #endif
   }
-  ~MockPasswordManagerClient() override {}
+  ~MockPasswordManagerClient() override = default;
 
   bool PromptUserToSaveOrUpdatePassword(
       std::unique_ptr<PasswordFormManagerForUI> manager,
diff --git a/components/password_manager/core/browser/leak_detection_delegate.cc b/components/password_manager/core/browser/leak_detection_delegate.cc
index a04e030..35061e84 100644
--- a/components/password_manager/core/browser/leak_detection_delegate.cc
+++ b/components/password_manager/core/browser/leak_detection_delegate.cc
@@ -47,17 +47,38 @@
   if (client_->IsIncognito())
     return;
 
-  if (!client_->GetPrefs()->GetBoolean(
-          password_manager::prefs::kPasswordLeakDetectionEnabled)) {
+  bool is_leak_protection_on = client_->GetPrefs()->GetBoolean(
+      password_manager::prefs::kPasswordLeakDetectionEnabled);
+
+  // Leak detection can only start if:
+  // 1. The user has not opted out and Safe Browsing is turned on, or
+  // 2. The user is an enhanced protection user
+  // Safe Browsing is only available on non-IOS.
+#if defined(OS_IOS)
+  if (!is_leak_protection_on) {
     LogString(client_, Logger::STRING_LEAK_DETECTION_DISABLED_FEATURE);
     return;
   }
-#if !defined(OS_IOS)
-  if (!client_->GetPrefs()->GetBoolean(::prefs::kSafeBrowsingEnabled)) {
-    LogString(client_, Logger::STRING_LEAK_DETECTION_DISABLED_SAFE_BROWSING);
-    return;
+#else
+  safe_browsing::SafeBrowsingState sb_state =
+      safe_browsing::GetSafeBrowsingState(*client_->GetPrefs());
+  switch (sb_state) {
+    case safe_browsing::NO_SAFE_BROWSING:
+      LogString(client_, Logger::STRING_LEAK_DETECTION_DISABLED_SAFE_BROWSING);
+      return;
+    case safe_browsing::STANDARD_PROTECTION:
+      if (!is_leak_protection_on) {
+        LogString(client_, Logger::STRING_LEAK_DETECTION_DISABLED_FEATURE);
+        return;
+      }
+      // feature is on.
+      break;
+    case safe_browsing::ENHANCED_PROTECTION:
+      // feature is on.
+      break;
   }
 #endif
+
   if (form.username_value.empty())
     return;
 
@@ -80,45 +101,31 @@
     logger.LogBoolean(Logger::STRING_LEAK_DETECTION_FINISHED, is_leaked);
   }
 
-  password_manager::PasswordStore* password_store =
-      client_->GetProfilePasswordStore();
-  if (base::FeatureList::IsEnabled(
-          password_manager::features::kPasswordCheck) &&
-      is_leaked) {
-    password_store->AddCompromisedCredentials({GetSignonRealm(url), username,
-                                               base::Time::Now(),
-                                               CompromiseType::kLeaked});
-  }
-
   if (is_leaked) {
-    if (!client_->GetPasswordFeatureManager()
-             ->ShouldCheckReuseOnLeakDetection()) {
-      // If leaked password reuse should not be checked, then the
-      // |CredentialLeakType| needed to show the correct notification is already
-      // determined.
-      OnShowLeakDetectionNotification(
-          CreateLeakType(IsSaved(false), IsReused(false), IsSyncing(false)),
-          std::move(url), std::move(username));
-    } else {
       // Otherwise query the helper to asynchronously determine the
       // |CredentialLeakType|.
-      helper_ = std::make_unique<LeakDetectionDelegateHelper>(base::BindOnce(
-          &LeakDetectionDelegate::OnShowLeakDetectionNotification,
-          base::Unretained(this)));
-      helper_->GetCredentialLeakType(password_store, std::move(url),
-                                     std::move(username), std::move(password));
-    }
+      helper_ = std::make_unique<LeakDetectionDelegateHelper>(
+          client_->GetProfilePasswordStore(),
+          base::BindOnce(
+              &LeakDetectionDelegate::OnShowLeakDetectionNotification,
+              base::Unretained(this)));
+      helper_->ProcessLeakedPassword(std::move(url), std::move(username),
+                                     std::move(password));
   }
 }
 
 void LeakDetectionDelegate::OnShowLeakDetectionNotification(
-    CredentialLeakType leak_type,
+    IsSaved is_saved,
+    IsReused is_reused,
     GURL url,
     base::string16 username) {
   DCHECK(is_leaked_timer_);
   base::UmaHistogramTimes("PasswordManager.LeakDetection.NotifyIsLeakedTime",
                           std::exchange(is_leaked_timer_, nullptr)->Elapsed());
   helper_.reset();
+  CredentialLeakType leak_type = CreateLeakType(
+      is_saved, is_reused,
+      IsSyncing(client_->GetPasswordSyncState() == SYNCING_NORMAL_ENCRYPTION));
   client_->NotifyUserCredentialsWereLeaked(leak_type, url);
 }
 
diff --git a/components/password_manager/core/browser/leak_detection_delegate.h b/components/password_manager/core/browser/leak_detection_delegate.h
index d05282537..3822690 100644
--- a/components/password_manager/core/browser/leak_detection_delegate.h
+++ b/components/password_manager/core/browser/leak_detection_delegate.h
@@ -52,10 +52,10 @@
                            base::string16 username,
                            base::string16 password) override;
 
-  // Initiates the showing of the leak detection notification. If the account is
-  // synced, it is called by |helper_| after the |leak_type| was asynchronously
-  // determined.
-  void OnShowLeakDetectionNotification(CredentialLeakType leak_type,
+  // Initiates the showing of the leak detection notification. It is called by
+  // |helper_| after |is_saved|/|is_reused| was asynchronously determined.
+  void OnShowLeakDetectionNotification(IsSaved is_saved,
+                                       IsReused is_reused,
                                        GURL url,
                                        base::string16 username);
 
diff --git a/components/password_manager/core/browser/leak_detection_delegate_helper.cc b/components/password_manager/core/browser/leak_detection_delegate_helper.cc
index 7f29fb7..17eae10 100644
--- a/components/password_manager/core/browser/leak_detection_delegate_helper.cc
+++ b/components/password_manager/core/browser/leak_detection_delegate_helper.cc
@@ -4,38 +4,53 @@
 
 #include "components/password_manager/core/browser/leak_detection_delegate_helper.h"
 
+#include "base/feature_list.h"
+#include "components/password_manager/core/browser/leak_detection/encryption_utils.h"
 #include "components/password_manager/core/browser/password_store.h"
+#include "components/password_manager/core/common/password_manager_features.h"
 
 namespace password_manager {
 
-LeakDetectionDelegateHelper::LeakDetectionDelegateHelper(LeakTypeReply callback)
-    : callback_(std::move(callback)) {}
+LeakDetectionDelegateHelper::LeakDetectionDelegateHelper(
+    scoped_refptr<PasswordStore> store,
+    LeakTypeReply callback)
+    : store_(std::move(store)), callback_(std::move(callback)) {
+  DCHECK(store_);
+}
 
 LeakDetectionDelegateHelper::~LeakDetectionDelegateHelper() = default;
 
-void LeakDetectionDelegateHelper::GetCredentialLeakType(
-    PasswordStore* store,
+void LeakDetectionDelegateHelper::ProcessLeakedPassword(
     GURL url,
     base::string16 username,
     base::string16 password) {
-  DCHECK(store);
   url_ = std::move(url);
   username_ = std::move(username);
   password_ = std::move(password);
-  store->GetLoginsByPassword(password_, this);
+  store_->GetLoginsByPassword(password_, this);
 }
 
 void LeakDetectionDelegateHelper::OnGetPasswordStoreResults(
     std::vector<std::unique_ptr<autofill::PasswordForm>> results) {
+  if (base::FeatureList::IsEnabled(features::kPasswordCheck)) {
+    base::string16 canonicalized_username = CanonicalizeUsername(username_);
+    for (const auto& form : results) {
+      if (CanonicalizeUsername(form->username_value) ==
+          canonicalized_username) {
+        store_->AddCompromisedCredentials(
+            {form->signon_realm, form->username_value, base::Time::Now(),
+             CompromiseType::kLeaked});
+      }
+    }
+  }
+
   IsSaved is_saved(
       std::any_of(results.begin(), results.end(), [this](const auto& form) {
         return form->origin == url_ && form->username_value == username_;
       }));
 
   IsReused is_reused(results.size() > (is_saved ? 1 : 0));
-  CredentialLeakType leak_type =
-      CreateLeakType(is_saved, is_reused, IsSyncing(true));
-  std::move(callback_).Run(std::move(leak_type), std::move(url_),
+  std::move(callback_).Run(is_saved, is_reused, std::move(url_),
                            std::move(username_));
 }
 
diff --git a/components/password_manager/core/browser/leak_detection_delegate_helper.h b/components/password_manager/core/browser/leak_detection_delegate_helper.h
index 4a800e8..c8ddc35 100644
--- a/components/password_manager/core/browser/leak_detection_delegate_helper.h
+++ b/components/password_manager/core/browser/leak_detection_delegate_helper.h
@@ -24,26 +24,29 @@
  public:
   // Type alias for |callback_|.
   using LeakTypeReply =
-      base::OnceCallback<void(CredentialLeakType, GURL, base::string16)>;
+      base::OnceCallback<void(IsSaved, IsReused, GURL, base::string16)>;
 
-  explicit LeakDetectionDelegateHelper(LeakTypeReply callback);
+  LeakDetectionDelegateHelper(scoped_refptr<PasswordStore> store,
+                              LeakTypeReply callback);
   ~LeakDetectionDelegateHelper() override;
 
-  // Request all credentials with |password| from |store|.
-  // Results are password to |OnGetPasswordStoreResults|.
-  void GetCredentialLeakType(PasswordStore* store,
-                             GURL url,
+  // Request all credentials with |password| from the store.
+  // Results are passed to |OnGetPasswordStoreResults|.
+  void ProcessLeakedPassword(GURL url,
                              base::string16 username,
                              base::string16 password);
 
  private:
   // PasswordStoreConsumer:
   // Is called by the |PasswordStore| once all credentials with the specific
-  // password are retrieved. Determine the |CredentialLeakType and invokes
+  // password are retrieved. Determine the credential type and invokes
   // |callback_| when done.
+  // All the saved credentials with the same username and password are stored to
+  // the database.
   void OnGetPasswordStoreResults(
       std::vector<std::unique_ptr<autofill::PasswordForm>> results) override;
 
+  scoped_refptr<password_manager::PasswordStore> store_;
   LeakTypeReply callback_;
   GURL url_;
   base::string16 username_;
diff --git a/components/password_manager/core/browser/leak_detection_delegate_helper_unittest.cc b/components/password_manager/core/browser/leak_detection_delegate_helper_unittest.cc
index de3ff6d..17b695ac 100644
--- a/components/password_manager/core/browser/leak_detection_delegate_helper_unittest.cc
+++ b/components/password_manager/core/browser/leak_detection_delegate_helper_unittest.cc
@@ -8,8 +8,12 @@
 
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/mock_callback.h"
+#include "base/test/scoped_feature_list.h"
+#include "base/test/task_environment.h"
+#include "components/password_manager/core/browser/form_parsing/form_parser.h"
 #include "components/password_manager/core/browser/leak_detection_dialog_utils.h"
 #include "components/password_manager/core/browser/mock_password_store.h"
+#include "components/password_manager/core/common/password_manager_features.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -27,17 +31,19 @@
 namespace {
 constexpr char kLeakedPassword[] = "leaked_password";
 constexpr char kLeakedUsername[] = "leaked_username";
+constexpr char kLeakedUsernameNonCanonicalized[] = "Leaked_Username@gmail.com";
 constexpr char kOtherUsername[] = "other_username";
 constexpr char kLeakedOrigin[] = "https://www.leaked_origin.de/login";
 constexpr char kOtherOrigin[] = "https://www.other_origin.de/login";
 
-// Creates a |PasswordForm| with the supplied |origin| and |username|. The
-// password is always set to |kLeakedPassword|.
-PasswordForm CreateForm(base::StringPiece origin, base::StringPiece username) {
+// Creates a |PasswordForm| with the supplied |origin|, |username|, |password|.
+PasswordForm CreateForm(base::StringPiece origin,
+                        base::StringPiece username,
+                        base::StringPiece password = kLeakedPassword) {
   PasswordForm form;
   form.origin = GURL(ASCIIToUTF16(origin));
   form.username_value = ASCIIToUTF16(username);
-  form.password_value = ASCIIToUTF16(kLeakedPassword);
+  form.password_value = ASCIIToUTF16(password);
   form.signon_realm = form.origin.GetOrigin().spec();
   return form;
 }
@@ -45,7 +51,7 @@
 // Used to mimic the callback of the |PasswordStore|.  Converts the vector of
 // |PasswordForm|s to a vector of unique pointers to |PasswordForm|s.
 ACTION_P(InvokeConsumerWithPasswordForms, forms) {
-  std::vector<std::unique_ptr<autofill::PasswordForm>> results;
+  std::vector<std::unique_ptr<PasswordForm>> results;
   for (const auto& form : forms) {
     results.push_back(std::make_unique<PasswordForm>(form));
   }
@@ -62,9 +68,10 @@
  protected:
   void SetUp() override {
     store_ = new testing::StrictMock<MockPasswordStore>;
+    CHECK(store_->Init(syncer::SyncableService::StartSyncFlare(), nullptr));
 
     delegate_helper_ =
-        std::make_unique<LeakDetectionDelegateHelper>(callback_.Get());
+        std::make_unique<LeakDetectionDelegateHelper>(store_, callback_.Get());
   }
 
   void TearDown() override {
@@ -74,7 +81,7 @@
 
   // Initiates determining the credential leak type.
   void InitiateGetCredentialLeakType() {
-    delegate_helper_->GetCredentialLeakType(store_.get(), GURL(kLeakedOrigin),
+    delegate_helper_->ProcessLeakedPassword(GURL(kLeakedOrigin),
                                             ASCIIToUTF16(kLeakedUsername),
                                             ASCIIToUTF16(kLeakedPassword));
   }
@@ -90,12 +97,13 @@
   // Set the expectation for the |CredentialLeakType| in the callback_.
   void SetOnShowLeakDetectionNotificationExpectation(IsSaved is_saved,
                                                      IsReused is_reused) {
-    EXPECT_CALL(callback_,
-                Run(CreateLeakType(is_saved, is_reused, IsSyncing(true)),
-                    GURL(kLeakedOrigin), ASCIIToUTF16(kLeakedUsername)))
+    EXPECT_CALL(callback_, Run(is_saved, is_reused, GURL(kLeakedOrigin),
+                               ASCIIToUTF16(kLeakedUsername)))
         .Times(1);
   }
 
+  base::test::TaskEnvironment task_environment_{
+      base::test::TaskEnvironment::TimeSource::MOCK_TIME};
   MockCallback<LeakDetectionDelegateHelper::LeakTypeReply> callback_;
   scoped_refptr<MockPasswordStore> store_;
   std::unique_ptr<LeakDetectionDelegateHelper> delegate_helper_;
@@ -177,4 +185,43 @@
   InitiateGetCredentialLeakType();
 }
 
+// All the credentials with the same username/password are marked as leaked.
+TEST_F(LeakDetectionDelegateHelperTest, SaveLeakedCredentials) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(features::kPasswordCheck);
+
+  SetGetLoginByPasswordConsumerInvocation(
+      {CreateForm(kLeakedOrigin, kLeakedUsername, kLeakedPassword),
+       CreateForm(kOtherOrigin, kLeakedUsername, kLeakedPassword),
+       CreateForm(kLeakedOrigin, kOtherUsername, kLeakedPassword)});
+  SetOnShowLeakDetectionNotificationExpectation(IsSaved(true), IsReused(true));
+  EXPECT_CALL(*store_, AddCompromisedCredentialsImpl(CompromisedCredentials{
+                           GetSignonRealm(GURL(kLeakedOrigin)),
+                           ASCIIToUTF16(kLeakedUsername), base::Time::Now(),
+                           CompromiseType::kLeaked}));
+  EXPECT_CALL(*store_, AddCompromisedCredentialsImpl(CompromisedCredentials{
+                           GetSignonRealm(GURL(kOtherOrigin)),
+                           ASCIIToUTF16(kLeakedUsername), base::Time::Now(),
+                           CompromiseType::kLeaked}));
+  InitiateGetCredentialLeakType();
+  task_environment_.RunUntilIdle();
+}
+
+// Credential with the same canonicalized username marked as leaked.
+TEST_F(LeakDetectionDelegateHelperTest, SaveLeakedCredentialsCanonicalized) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(features::kPasswordCheck);
+
+  SetGetLoginByPasswordConsumerInvocation({CreateForm(
+      kOtherOrigin, kLeakedUsernameNonCanonicalized, kLeakedPassword)});
+  SetOnShowLeakDetectionNotificationExpectation(IsSaved(false), IsReused(true));
+
+  EXPECT_CALL(*store_, AddCompromisedCredentialsImpl(CompromisedCredentials{
+                           GetSignonRealm(GURL(kOtherOrigin)),
+                           ASCIIToUTF16(kLeakedUsernameNonCanonicalized),
+                           base::Time::Now(), CompromiseType::kLeaked}));
+  InitiateGetCredentialLeakType();
+  task_environment_.RunUntilIdle();
+}
+
 }  // namespace password_manager
diff --git a/components/password_manager/core/browser/leak_detection_delegate_unittest.cc b/components/password_manager/core/browser/leak_detection_delegate_unittest.cc
index afed158..8c428fa 100644
--- a/components/password_manager/core/browser/leak_detection_delegate_unittest.cc
+++ b/components/password_manager/core/browser/leak_detection_delegate_unittest.cc
@@ -14,6 +14,7 @@
 #include "components/password_manager/core/browser/leak_detection/mock_leak_detection_check_factory.h"
 #include "components/password_manager/core/browser/leak_detection_delegate.h"
 #include "components/password_manager/core/browser/mock_password_store.h"
+#include "components/password_manager/core/browser/password_store_consumer.h"
 #include "components/password_manager/core/browser/stub_password_manager_client.h"
 #include "components/password_manager/core/common/password_manager_features.h"
 #include "components/password_manager/core/common/password_manager_pref_names.h"
@@ -21,6 +22,7 @@
 #include "components/prefs/pref_service.h"
 #include "components/prefs/testing_pref_service.h"
 #include "components/safe_browsing/core/common/safe_browsing_prefs.h"
+#include "components/safe_browsing/core/features.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -32,7 +34,17 @@
 using testing::_;
 using testing::ByMove;
 using testing::Eq;
+using testing::NiceMock;
 using testing::Return;
+using testing::WithArg;
+
+ACTION_P(InvokeConsumerWithPasswordForms, forms) {
+  std::vector<std::unique_ptr<autofill::PasswordForm>> results;
+  for (const auto& form : forms) {
+    results.push_back(std::make_unique<autofill::PasswordForm>(form));
+  }
+  arg0->OnGetPasswordStoreResults(std::move(results));
+}
 
 autofill::PasswordForm CreateTestForm() {
   autofill::PasswordForm form;
@@ -75,6 +87,8 @@
 #if !defined(OS_IOS)
     pref_service_->registry()->RegisterBooleanPref(
         ::prefs::kSafeBrowsingEnabled, true);
+    pref_service_->registry()->RegisterBooleanPref(
+        ::prefs::kSafeBrowsingEnhanced, false);
 #endif
     ON_CALL(client_, GetPrefs()).WillByDefault(Return(pref_service()));
   }
@@ -89,6 +103,29 @@
 
   void WaitForPasswordStore() { task_environment_.RunUntilIdle(); }
 
+  void SetSBState(safe_browsing::SafeBrowsingState state) {
+    switch (state) {
+      case safe_browsing::ENHANCED_PROTECTION:
+        pref_service_->SetBoolean(::prefs::kSafeBrowsingEnhanced, true);
+        pref_service_->SetBoolean(::prefs::kSafeBrowsingEnabled, true);
+        break;
+      case safe_browsing::STANDARD_PROTECTION:
+        pref_service_->SetBoolean(::prefs::kSafeBrowsingEnhanced, false);
+        pref_service_->SetBoolean(::prefs::kSafeBrowsingEnabled, true);
+        break;
+      case safe_browsing::NO_SAFE_BROWSING:
+      default:
+        pref_service_->SetBoolean(::prefs::kSafeBrowsingEnhanced, false);
+        pref_service_->SetBoolean(::prefs::kSafeBrowsingEnabled, false);
+        break;
+    }
+  }
+
+  void SetLeakDetectionEnabled(bool is_on) {
+    pref_service_->SetBoolean(
+        password_manager::prefs::kPasswordLeakDetectionEnabled, is_on);
+  }
+
  private:
   base::test::TaskEnvironment task_environment_{
       base::test::TaskEnvironment::TimeSource::MOCK_TIME};
@@ -110,17 +147,6 @@
   EXPECT_FALSE(delegate().leak_check());
 }
 
-TEST_F(LeakDetectionDelegateTest, PrefIsFalse) {
-  const autofill::PasswordForm form = CreateTestForm();
-  pref_service()->SetBoolean(
-      password_manager::prefs::kPasswordLeakDetectionEnabled, false);
-
-  EXPECT_CALL(factory(), TryCreateLeakCheck).Times(0);
-  delegate().StartLeakCheck(form);
-
-  EXPECT_FALSE(delegate().leak_check());
-}
-
 #if !defined(OS_IOS)
 TEST_F(LeakDetectionDelegateTest, SafeBrowsingOff) {
   pref_service()->SetBoolean(::prefs::kSafeBrowsingEnabled, false);
@@ -143,6 +169,7 @@
 }
 
 TEST_F(LeakDetectionDelegateTest, StartCheck) {
+  SetLeakDetectionEnabled(true);
   const autofill::PasswordForm form = CreateTestForm();
   EXPECT_CALL(client(), IsIncognito).WillOnce(Return(false));
   auto check_instance = std::make_unique<MockLeakDetectionCheck>();
@@ -155,13 +182,84 @@
   EXPECT_TRUE(delegate().leak_check());
 }
 
+TEST_F(LeakDetectionDelegateTest, DoNotStartCheck) {
+  SetLeakDetectionEnabled(false);
+  const autofill::PasswordForm form = CreateTestForm();
+  EXPECT_CALL(client(), IsIncognito).WillOnce(Return(false));
+  auto check_instance = std::make_unique<MockLeakDetectionCheck>();
+  EXPECT_CALL(factory(), TryCreateLeakCheck).Times(0);
+  delegate().StartLeakCheck(form);
+
+  EXPECT_FALSE(delegate().leak_check());
+}
+
+#if !defined(OS_IOS)
+TEST_F(LeakDetectionDelegateTest, StartCheckWithStandardProtection) {
+  SetSBState(safe_browsing::STANDARD_PROTECTION);
+  SetLeakDetectionEnabled(true);
+  const autofill::PasswordForm form = CreateTestForm();
+  EXPECT_CALL(client(), IsIncognito).WillOnce(Return(false));
+  auto check_instance = std::make_unique<MockLeakDetectionCheck>();
+  EXPECT_CALL(*check_instance,
+              Start(form.origin, form.username_value, form.password_value));
+  EXPECT_CALL(factory(), TryCreateLeakCheck(&delegate(), _, _))
+      .WillOnce(Return(ByMove(std::move(check_instance))));
+  delegate().StartLeakCheck(form);
+
+  EXPECT_TRUE(delegate().leak_check());
+}
+
+TEST_F(LeakDetectionDelegateTest, StartCheckWithEnhancedProtection) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeature(safe_browsing::kEnhancedProtection);
+
+  SetSBState(safe_browsing::ENHANCED_PROTECTION);
+  SetLeakDetectionEnabled(false);
+  const autofill::PasswordForm form = CreateTestForm();
+  EXPECT_CALL(client(), IsIncognito).WillOnce(Return(false));
+  auto check_instance = std::make_unique<MockLeakDetectionCheck>();
+  EXPECT_CALL(*check_instance,
+              Start(form.origin, form.username_value, form.password_value));
+  EXPECT_CALL(factory(), TryCreateLeakCheck(&delegate(), _, _))
+      .WillOnce(Return(ByMove(std::move(check_instance))));
+  delegate().StartLeakCheck(form);
+
+  EXPECT_TRUE(delegate().leak_check());
+}
+
+TEST_F(LeakDetectionDelegateTest, DoNotStartCheckWithoutSafeBrowsing) {
+  SetSBState(safe_browsing::NO_SAFE_BROWSING);
+  SetLeakDetectionEnabled(true);
+  const autofill::PasswordForm form = CreateTestForm();
+  EXPECT_CALL(client(), IsIncognito).WillOnce(Return(false));
+  auto check_instance = std::make_unique<MockLeakDetectionCheck>();
+  EXPECT_CALL(factory(), TryCreateLeakCheck).Times(0);
+  delegate().StartLeakCheck(form);
+
+  EXPECT_FALSE(delegate().leak_check());
+}
+
+TEST_F(LeakDetectionDelegateTest, DoNotStartLeakCheckIfLeakCheckIsOff) {
+  SetSBState(safe_browsing::STANDARD_PROTECTION);
+  SetLeakDetectionEnabled(false);
+  const autofill::PasswordForm form = CreateTestForm();
+  EXPECT_CALL(client(), IsIncognito).WillOnce(Return(false));
+  EXPECT_CALL(factory(), TryCreateLeakCheck).Times(0);
+  auto check_instance = std::make_unique<MockLeakDetectionCheck>();
+  delegate().StartLeakCheck(form);
+
+  EXPECT_FALSE(delegate().leak_check());
+}
+#endif
+
 TEST_F(LeakDetectionDelegateTest, LeakDetectionDoneWithFalseResult) {
   base::HistogramTester histogram_tester;
   LeakDetectionDelegateInterface* delegate_interface = &delegate();
   const autofill::PasswordForm form = CreateTestForm();
 
   EXPECT_CALL(factory(), TryCreateLeakCheck)
-      .WillOnce(Return(ByMove(std::make_unique<MockLeakDetectionCheck>())));
+      .WillOnce(
+          Return(ByMove(std::make_unique<NiceMock<MockLeakDetectionCheck>>())));
   delegate().StartLeakCheck(form);
 
   EXPECT_CALL(client(), NotifyUserCredentialsWereLeaked).Times(0);
@@ -177,8 +275,14 @@
   LeakDetectionDelegateInterface* delegate_interface = &delegate();
   const autofill::PasswordForm form = CreateTestForm();
 
+  EXPECT_CALL(client(), GetProfilePasswordStore())
+      .WillRepeatedly(testing::Return(store()));
+  EXPECT_CALL(*store(), GetLoginsByPassword)
+      .WillRepeatedly(WithArg<1>(InvokeConsumerWithPasswordForms(
+          std::vector<autofill::PasswordForm>())));
   EXPECT_CALL(factory(), TryCreateLeakCheck)
-      .WillOnce(Return(ByMove(std::make_unique<MockLeakDetectionCheck>())));
+      .WillOnce(
+          Return(ByMove(std::make_unique<NiceMock<MockLeakDetectionCheck>>())));
   delegate().StartLeakCheck(form);
 
   EXPECT_CALL(client(),
@@ -201,8 +305,12 @@
 
   EXPECT_CALL(client(), GetProfilePasswordStore())
       .WillRepeatedly(testing::Return(store()));
+  EXPECT_CALL(*store(), GetLoginsByPassword)
+      .WillRepeatedly(WithArg<1>(InvokeConsumerWithPasswordForms(
+          std::vector<autofill::PasswordForm>{form})));
   EXPECT_CALL(factory(), TryCreateLeakCheck)
-      .WillOnce(Return(ByMove(std::make_unique<MockLeakDetectionCheck>())));
+      .WillOnce(
+          Return(ByMove(std::make_unique<NiceMock<MockLeakDetectionCheck>>())));
   delegate().StartLeakCheck(form);
 
   EXPECT_CALL(client(), NotifyUserCredentialsWereLeaked(_, form.origin));
diff --git a/components/password_manager/core/browser/mock_password_feature_manager.h b/components/password_manager/core/browser/mock_password_feature_manager.h
index a666c2a3..0440d1f4 100644
--- a/components/password_manager/core/browser/mock_password_feature_manager.h
+++ b/components/password_manager/core/browser/mock_password_feature_manager.h
@@ -16,7 +16,6 @@
   ~MockPasswordFeatureManager() override;
 
   MOCK_CONST_METHOD0(IsGenerationEnabled, bool());
-  MOCK_CONST_METHOD0(ShouldCheckReuseOnLeakDetection, bool());
 
   MOCK_CONST_METHOD0(IsOptedInForAccountStorage, bool());
   MOCK_CONST_METHOD0(ShouldShowAccountStorageOptIn, bool());
diff --git a/components/password_manager/core/browser/password_feature_manager.h b/components/password_manager/core/browser/password_feature_manager.h
index e1c9ea9..5b48e96f 100644
--- a/components/password_manager/core/browser/password_feature_manager.h
+++ b/components/password_manager/core/browser/password_feature_manager.h
@@ -18,11 +18,6 @@
 
   virtual bool IsGenerationEnabled() const = 0;
 
-  // Whether we should, upon the detection of a leaked password, check if the
-  // same password is reused on other website. That's used only for the UI
-  // string.
-  virtual bool ShouldCheckReuseOnLeakDetection() const = 0;
-
   // Whether the current signed-in user (aka unconsented primary account) has
   // opted in to use the Google account storage for passwords (as opposed to
   // local/profile storage).
diff --git a/components/password_manager/core/browser/password_feature_manager_impl.cc b/components/password_manager/core/browser/password_feature_manager_impl.cc
index 1166c89..bfdcc5d 100644
--- a/components/password_manager/core/browser/password_feature_manager_impl.cc
+++ b/components/password_manager/core/browser/password_feature_manager_impl.cc
@@ -29,20 +29,6 @@
   }
 }
 
-bool PasswordFeatureManagerImpl::ShouldCheckReuseOnLeakDetection() const {
-  switch (password_manager_util::GetPasswordSyncState(sync_service_)) {
-    // We currently check the reuse of the leaked password only for users who
-    // can access passwords.google.com. Therefore, if the credentials are not
-    // synced, no need to check for password use.
-    case NOT_SYNCING:
-    case SYNCING_WITH_CUSTOM_PASSPHRASE:
-      return false;
-    case SYNCING_NORMAL_ENCRYPTION:
-    case ACCOUNT_PASSWORDS_ACTIVE_NORMAL_ENCRYPTION:
-      return true;
-  }
-}
-
 bool PasswordFeatureManagerImpl::IsOptedInForAccountStorage() const {
   return password_manager_util::IsOptedInForAccountStorage(pref_service_,
                                                            sync_service_);
diff --git a/components/password_manager/core/browser/password_feature_manager_impl.h b/components/password_manager/core/browser/password_feature_manager_impl.h
index 05541de..f3d3bf7c 100644
--- a/components/password_manager/core/browser/password_feature_manager_impl.h
+++ b/components/password_manager/core/browser/password_feature_manager_impl.h
@@ -26,8 +26,6 @@
 
   bool IsGenerationEnabled() const override;
 
-  bool ShouldCheckReuseOnLeakDetection() const override;
-
   bool IsOptedInForAccountStorage() const override;
   bool ShouldShowAccountStorageOptIn() const override;
   void SetAccountStorageOptIn(bool opt_in) override;
diff --git a/components/password_manager/core/browser/password_manager_unittest.cc b/components/password_manager/core/browser/password_manager_unittest.cc
index f4f3877..77284f1f 100644
--- a/components/password_manager/core/browser/password_manager_unittest.cc
+++ b/components/password_manager/core/browser/password_manager_unittest.cc
@@ -342,6 +342,8 @@
 #if !defined(OS_IOS)
     prefs_->registry()->RegisterBooleanPref(::prefs::kSafeBrowsingEnabled,
                                             true);
+    prefs_->registry()->RegisterBooleanPref(::prefs::kSafeBrowsingEnhanced,
+                                            true);
 #endif
     ON_CALL(client_, GetPrefs()).WillByDefault(Return(prefs_.get()));
 
diff --git a/components/password_manager/core/browser/ui/bulk_leak_check_service_adapter.cc b/components/password_manager/core/browser/ui/bulk_leak_check_service_adapter.cc
index 831ada7..3add05b3 100644
--- a/components/password_manager/core/browser/ui/bulk_leak_check_service_adapter.cc
+++ b/components/password_manager/core/browser/ui/bulk_leak_check_service_adapter.cc
@@ -7,6 +7,7 @@
 #include <memory>
 #include <tuple>
 
+#include "base/containers/flat_set.h"
 #include "base/logging.h"
 #include "components/autofill/core/common/password_form.h"
 #include "components/password_manager/core/browser/leak_detection/bulk_leak_check.h"
@@ -19,9 +20,10 @@
 
 using autofill::PasswordForm;
 
-// Simple struct that stores a canonicalized credential.
+// Simple struct that stores a canonicalized credential. Allows implicit
+// constructon from PasswordForm for convenience.
 struct CanonicalizedCredential {
-  explicit CanonicalizedCredential(const PasswordForm& form)
+  CanonicalizedCredential(const PasswordForm& form)
       : canonicalized_username(CanonicalizeUsername(form.username_value)),
         password(form.password_value) {}
 
@@ -37,16 +39,6 @@
 
 }  // namespace
 
-const char kBulkLeakCheckDataKey[] = "bulk-leak-check-data";
-
-BulkLeakCheckData::BulkLeakCheckData(const PasswordForm& leaked_form)
-    : leaked_forms({leaked_form}) {}
-
-BulkLeakCheckData::BulkLeakCheckData(std::vector<PasswordForm> leaked_forms)
-    : leaked_forms(std::move(leaked_forms)) {}
-
-BulkLeakCheckData::~BulkLeakCheckData() = default;
-
 BulkLeakCheckServiceAdapter::BulkLeakCheckServiceAdapter(
     SavedPasswordsPresenter* presenter,
     BulkLeakCheckService* service)
@@ -66,26 +58,19 @@
 
   // Even though the BulkLeakCheckService performs canonicalization eventually
   // we do it here to de-dupe credentials that have the same canonicalized form.
-  // Each canonicalized credential is mapped to a list of saved passwords that
-  // correspond to this credential.
-  std::map<CanonicalizedCredential, std::vector<PasswordForm>> canonicalized;
-  for (const PasswordForm& form : presenter_->GetSavedPasswords())
-    canonicalized[CanonicalizedCredential(form)].push_back(form);
+  SavedPasswordsPresenter::SavedPasswordsView saved_passwords =
+      presenter_->GetSavedPasswords();
+  base::flat_set<CanonicalizedCredential> canonicalized(saved_passwords.begin(),
+                                                        saved_passwords.end());
 
-  // Build the list of LeakCheckCredentials and attach the corresponding saved
-  // passwords as UserData. Lastly,forward them to the service to start the
-  // check.
+  // Build the list of LeakCheckCredentials and forward them to the service to
+  // start the check.
   std::vector<LeakCheckCredential> credentials;
   credentials.reserve(canonicalized.size());
 
-  for (auto& pair : canonicalized) {
-    const CanonicalizedCredential& credential = pair.first;
-    std::vector<PasswordForm>& forms = pair.second;
+  for (const auto& credential : canonicalized) {
     credentials.emplace_back(credential.canonicalized_username,
                              credential.password);
-    credentials.back().SetUserData(
-        kBulkLeakCheckDataKey,
-        std::make_unique<BulkLeakCheckData>(std::move(forms)));
   }
 
   service_->CheckUsernamePasswordPairs(std::move(credentials));
@@ -110,8 +95,6 @@
   // could de-dupe before we pass it on to the service.
   std::vector<LeakCheckCredential> credentials;
   credentials.emplace_back(form.username_value, form.password_value);
-  credentials.back().SetUserData(kBulkLeakCheckDataKey,
-                                 std::make_unique<BulkLeakCheckData>(form));
   service_->CheckUsernamePasswordPairs(std::move(credentials));
 }
 
diff --git a/components/password_manager/core/browser/ui/bulk_leak_check_service_adapter.h b/components/password_manager/core/browser/ui/bulk_leak_check_service_adapter.h
index 539f020..29923115 100644
--- a/components/password_manager/core/browser/ui/bulk_leak_check_service_adapter.h
+++ b/components/password_manager/core/browser/ui/bulk_leak_check_service_adapter.h
@@ -15,21 +15,6 @@
 
 namespace password_manager {
 
-// Key used to store an instance of BulkLeakCheckData in the user data map of a
-// LeakCheckCredential.
-extern const char kBulkLeakCheckDataKey[];
-
-// This struct bundles forms that correspond to the same LeakCheckCredential.
-// That is, all of the forms in |leaked_forms| correspond to the same pair of
-// canonicalized username and password.
-struct BulkLeakCheckData : LeakCheckCredential::Data {
-  explicit BulkLeakCheckData(const autofill::PasswordForm& leaked_form);
-  explicit BulkLeakCheckData(std::vector<autofill::PasswordForm> leaked_forms);
-  ~BulkLeakCheckData() override;
-
-  std::vector<autofill::PasswordForm> leaked_forms;
-};
-
 // This class serves as an apdater for the BulkLeakCheckService and exposes an
 // API that is intended to be consumed from the settings page.
 class BulkLeakCheckServiceAdapter : public SavedPasswordsPresenter::Observer {
diff --git a/components/password_manager/core/browser/ui/bulk_leak_check_service_adapter_unittest.cc b/components/password_manager/core/browser/ui/bulk_leak_check_service_adapter_unittest.cc
index b414d90..9015eda 100644
--- a/components/password_manager/core/browser/ui/bulk_leak_check_service_adapter_unittest.cc
+++ b/components/password_manager/core/browser/ui/bulk_leak_check_service_adapter_unittest.cc
@@ -153,16 +153,6 @@
   expected.push_back(MakeLeakCheckCredential(kUsername2, kPassword2));
 
   EXPECT_THAT(credentials, CredentialsAre(std::cref(expected)));
-
-  EXPECT_THAT(static_cast<BulkLeakCheckData*>(
-                  credentials[0].GetUserData(kBulkLeakCheckDataKey))
-                  ->leaked_forms,
-              SavedPasswordsAre(base::make_span(&passwords[0], 1)));
-
-  EXPECT_THAT(static_cast<BulkLeakCheckData*>(
-                  credentials[1].GetUserData(kBulkLeakCheckDataKey))
-                  ->leaked_forms,
-              SavedPasswordsAre(base::make_span(&passwords[1], 1)));
 }
 
 // Tests that multiple credentials with effectively the same username are
@@ -188,11 +178,6 @@
   std::vector<LeakCheckCredential> expected;
   expected.push_back(MakeLeakCheckCredential("alice", kPassword1));
   EXPECT_THAT(credentials, CredentialsAre(std::cref(expected)));
-
-  EXPECT_THAT(static_cast<BulkLeakCheckData*>(
-                  credentials[0].GetUserData(kBulkLeakCheckDataKey))
-                  ->leaked_forms,
-              SavedPasswordsAre(passwords));
 }
 
 // Checks that trying to start a leak check when another check is already
diff --git a/components/safe_browsing/core/features.cc b/components/safe_browsing/core/features.cc
index e669be0..4f0b5c97 100644
--- a/components/safe_browsing/core/features.cc
+++ b/components/safe_browsing/core/features.cc
@@ -36,7 +36,7 @@
                                         base::FEATURE_DISABLED_BY_DEFAULT};
 
 const base::Feature kCommittedSBInterstitials{
-    "SafeBrowsingCommittedInterstitials", base::FEATURE_DISABLED_BY_DEFAULT};
+    "SafeBrowsingCommittedInterstitials", base::FEATURE_ENABLED_BY_DEFAULT};
 
 const base::Feature kContentComplianceEnabled{
     "SafeBrowsingContentComplianceEnabled", base::FEATURE_DISABLED_BY_DEFAULT};
@@ -87,6 +87,9 @@
     "SafeBrowsingRealTimeUrlLookupEnabledWithToken",
     base::FEATURE_DISABLED_BY_DEFAULT};
 
+const base::Feature kSafeBrowsingSeparateNetworkContexts{
+    "SafeBrowsingSeparateNetworkContexts", base::FEATURE_DISABLED_BY_DEFAULT};
+
 const base::Feature kSendOnFocusPing {
   "SafeBrowsingSendOnFocusPing",
       base::FEATURE_ENABLED_BY_DEFAULT
@@ -135,6 +138,7 @@
     {&kPromptAppForDeepScanning, true},
     {&kRealTimeUrlLookupEnabled, true},
     {&kRealTimeUrlLookupEnabledWithToken, true},
+    {&kSafeBrowsingSeparateNetworkContexts, true},
     {&kSendOnFocusPing, true},
     {&kSendPasswordReusePing, true},
     {&kSuspiciousSiteTriggerQuotaFeature, true},
diff --git a/components/safe_browsing/core/features.h b/components/safe_browsing/core/features.h
index fad4cad..07996af 100644
--- a/components/safe_browsing/core/features.h
+++ b/components/safe_browsing/core/features.h
@@ -69,6 +69,10 @@
 // Controls whether Chrome prompts Advanced Protection users for deep scanning.
 extern const base::Feature kPromptAppForDeepScanning;
 
+// Controls whether Safe Browsing uses separate NetworkContexts for each
+// profile.
+extern const base::Feature kSafeBrowsingSeparateNetworkContexts;
+
 // Controls whether Chrome sends on focus ping.
 extern const base::Feature kSendOnFocusPing;
 
diff --git a/components/safe_browsing/core/realtime/BUILD.gn b/components/safe_browsing/core/realtime/BUILD.gn
index 29b916c..6faee2a8 100644
--- a/components/safe_browsing/core/realtime/BUILD.gn
+++ b/components/safe_browsing/core/realtime/BUILD.gn
@@ -15,6 +15,7 @@
     "//components/safe_browsing/core:realtimeapi_proto",
     "//components/safe_browsing/core:verdict_cache_manager",
     "//components/safe_browsing/core/browser:token_fetcher",
+    "//components/safe_browsing/core/common:safe_browsing_prefs",
     "//components/safe_browsing/core/common:thread_utils",
     "//components/safe_browsing/core/db:v4_protocol_manager_util",
     "//components/signin/public/identity_manager",
diff --git a/components/safe_browsing/core/realtime/url_lookup_service.cc b/components/safe_browsing/core/realtime/url_lookup_service.cc
index 92916014..9373959 100644
--- a/components/safe_browsing/core/realtime/url_lookup_service.cc
+++ b/components/safe_browsing/core/realtime/url_lookup_service.cc
@@ -13,6 +13,7 @@
 #include "base/time/time.h"
 #include "components/prefs/pref_service.h"
 #include "components/safe_browsing/core/browser/safe_browsing_token_fetcher.h"
+#include "components/safe_browsing/core/common/safe_browsing_prefs.h"
 #include "components/safe_browsing/core/common/thread_utils.h"
 #include "components/safe_browsing/core/db/v4_protocol_manager_util.h"
 #include "components/safe_browsing/core/realtime/policy_engine.h"
@@ -315,7 +316,14 @@
   auto request = std::make_unique<RTLookupRequest>();
   request->set_url(SanitizeURL(url).spec());
   request->set_lookup_type(RTLookupRequest::NAVIGATION);
-  // TODO(crbug.com/1017499): Set ChromeUserPopulation.
+
+  ChromeUserPopulation* user_population = request->mutable_population();
+  user_population->set_user_population(
+      IsEnhancedProtectionEnabled(*pref_service_)
+          ? ChromeUserPopulation::ENHANCED_PROTECTION
+          : IsExtendedReportingEnabled(*pref_service_)
+                ? ChromeUserPopulation::EXTENDED_REPORTING
+                : ChromeUserPopulation::SAFE_BROWSING);
   return request;
 }
 
diff --git a/components/safe_browsing/core/realtime/url_lookup_service_unittest.cc b/components/safe_browsing/core/realtime/url_lookup_service_unittest.cc
index eefaf5f..26b8817f 100644
--- a/components/safe_browsing/core/realtime/url_lookup_service_unittest.cc
+++ b/components/safe_browsing/core/realtime/url_lookup_service_unittest.cc
@@ -22,6 +22,7 @@
  public:
   void SetUp() override {
     HostContentSettingsMap::RegisterProfilePrefs(test_pref_service_.registry());
+    safe_browsing::RegisterProfilePrefs(test_pref_service_.registry());
     task_environment_ = CreateTestTaskEnvironment(
         base::test::TaskEnvironment::TimeSource::MOCK_TIME);
     PlatformTest::SetUp();
@@ -104,6 +105,8 @@
     auto result = FillRequestProto(url);
     EXPECT_EQ(sanitize_url_cases[i].expected_url, result->url());
     EXPECT_EQ(RTLookupRequest::NAVIGATION, result->lookup_type());
+    EXPECT_EQ(ChromeUserPopulation::SAFE_BROWSING,
+              result->population().user_population());
   }
 }
 
diff --git a/components/services/storage/BUILD.gn b/components/services/storage/BUILD.gn
index 7b55a6e..43dd34f 100644
--- a/components/services/storage/BUILD.gn
+++ b/components/services/storage/BUILD.gn
@@ -140,7 +140,10 @@
     "//base",
     "//base/test:test_support",
     "//components/services/storage/public/cpp",
+    "//components/services/storage/public/cpp/filesystem:tests",
+    "//components/services/storage/public/mojom",
     "//mojo/core/embedder",
+    "//mojo/public/cpp/bindings",
     "//sql:test_support",
     "//testing/gmock",
     "//testing/gtest",
diff --git a/components/services/storage/public/cpp/BUILD.gn b/components/services/storage/public/cpp/BUILD.gn
index b076288ec..f8875bc 100644
--- a/components/services/storage/public/cpp/BUILD.gn
+++ b/components/services/storage/public/cpp/BUILD.gn
@@ -9,7 +9,10 @@
 
   sources = [ "constants.cc" ]
 
-  public_deps = [ "//base" ]
+  public_deps = [
+    "//base",
+    "//components/services/storage/public/cpp/filesystem",
+  ]
 
   defines = [ "IS_STORAGE_SERVICE_PUBLIC_IMPL" ]
 }
diff --git a/components/services/storage/public/cpp/filesystem/BUILD.gn b/components/services/storage/public/cpp/filesystem/BUILD.gn
new file mode 100644
index 0000000..c40b88e
--- /dev/null
+++ b/components/services/storage/public/cpp/filesystem/BUILD.gn
@@ -0,0 +1,54 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+component("filesystem") {
+  output_name = "storage_service_filesystem_support"
+
+  public = [
+    "file_error_or.h",
+    "filesystem_impl.h",
+    "filesystem_proxy.h",
+  ]
+
+  sources = [
+    "filesystem_impl.cc",
+    "filesystem_proxy.cc",
+  ]
+
+  public_deps = [
+    "//base",
+    "//components/services/storage/public/mojom/filesystem",
+    "//mojo/public/cpp/bindings",
+  ]
+
+  defines = [ "IS_STORAGE_SERVICE_FILESYSTEM_SUPPORT_IMPL" ]
+}
+
+component("typemap_traits") {
+  output_name = "storage_service_typemap_traits"
+  defines = [ "IS_STORAGE_SERVICE_FILESYSTEM_TYPEMAP_TRAITS_IMPL" ]
+  sources = [
+    "strict_relative_path_mojom_traits.cc",
+    "strict_relative_path_mojom_traits.h",
+  ]
+  public_deps = [
+    "//base",
+    "//components/services/storage/public/mojom/filesystem:filesystem_shared",
+    "//mojo/public/cpp/base:shared_typemap_traits",
+    "//mojo/public/cpp/bindings",
+  ]
+}
+
+source_set("tests") {
+  testonly = true
+  sources = [ "filesystem_proxy_unittest.cc" ]
+  deps = [
+    ":filesystem",
+    "//base",
+    "//base/test:test_support",
+    "//components/services/storage/public/mojom/filesystem",
+    "//testing/gmock",
+    "//testing/gtest",
+  ]
+}
diff --git a/components/services/storage/public/cpp/filesystem/OWNERS b/components/services/storage/public/cpp/filesystem/OWNERS
new file mode 100644
index 0000000..7aebc8abb
--- /dev/null
+++ b/components/services/storage/public/cpp/filesystem/OWNERS
@@ -0,0 +1,4 @@
+per-file *_mojom_traits*.*=set noparent
+per-file *_mojom_traits*.*=file://ipc/SECURITY_OWNERS
+per-file *.typemap=set noparent
+per-file *.typemap=file://ipc/SECURITY_OWNERS
diff --git a/components/services/storage/public/cpp/filesystem/file_error_or.h b/components/services/storage/public/cpp/filesystem/file_error_or.h
new file mode 100644
index 0000000..087df89
--- /dev/null
+++ b/components/services/storage/public/cpp/filesystem/file_error_or.h
@@ -0,0 +1,47 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_SERVICES_STORAGE_PUBLIC_CPP_FILESYSTEM_FILE_ERROR_OR_H_
+#define COMPONENTS_SERVICES_STORAGE_PUBLIC_CPP_FILESYSTEM_FILE_ERROR_OR_H_
+
+#include <utility>
+
+#include "base/files/file.h"
+#include "base/optional.h"
+
+namespace storage {
+
+// Helper for methods which perform file system operations and which may fail.
+// Objects of this type can take on EITHER a base::File::Error value OR a result
+// value of arbitrary type.
+template <typename ValueType>
+class FileErrorOr {
+ public:
+  explicit FileErrorOr() = default;
+  FileErrorOr(base::File::Error error) : error_(error) {}
+  FileErrorOr(ValueType&& value)
+      : maybe_value_(base::in_place, std::move(value)) {}
+  FileErrorOr(const FileErrorOr&) = delete;
+  FileErrorOr(FileErrorOr&&) = default;
+  FileErrorOr& operator=(const FileErrorOr&) = delete;
+  FileErrorOr& operator=(FileErrorOr&&) = default;
+  ~FileErrorOr() = default;
+
+  bool is_error() const { return !maybe_value_.has_value(); }
+  base::File::Error error() const { return error_; }
+
+  ValueType& value() { return maybe_value_.value(); }
+  const ValueType& value() const { return maybe_value_.value(); }
+
+  ValueType* operator->() { return &maybe_value_.value(); }
+  const ValueType* operator->() const { return &maybe_value_.value(); }
+
+ private:
+  base::File::Error error_ = base::File::FILE_ERROR_FAILED;
+  base::Optional<ValueType> maybe_value_;
+};
+
+}  // namespace storage
+
+#endif  // COMPONENTS_SERVICES_STORAGE_PUBLIC_CPP_FILESYSTEM_FILE_ERROR_OR_H_
diff --git a/components/services/storage/public/cpp/filesystem/filesystem_impl.cc b/components/services/storage/public/cpp/filesystem/filesystem_impl.cc
new file mode 100644
index 0000000..b499905
--- /dev/null
+++ b/components/services/storage/public/cpp/filesystem/filesystem_impl.cc
@@ -0,0 +1,305 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/services/storage/public/cpp/filesystem/filesystem_impl.h"
+
+#include <set>
+#include <vector>
+
+#include "base/files/file.h"
+#include "base/files/file_enumerator.h"
+#include "base/files/file_util.h"
+#include "base/logging.h"
+#include "base/no_destructor.h"
+#include "base/stl_util.h"
+#include "base/synchronization/lock.h"
+#include "build/build_config.h"
+#include "mojo/public/cpp/bindings/self_owned_receiver.h"
+
+namespace storage {
+
+namespace {
+
+// Retains a mapping of lock file paths which have been locked by
+// |FilesystemImpl::LockFile| and not yet released.
+class LockTable {
+ public:
+  LockTable() = default;
+  LockTable(const LockTable&) = delete;
+  LockTable& operator=(const LockTable&) = delete;
+  ~LockTable() = default;
+
+  bool AddLock(const base::FilePath& path) {
+    DCHECK(path.IsAbsolute());
+    base::AutoLock lock(lock_);
+    auto result = lock_paths_.insert(path.NormalizePathSeparators());
+    return result.second;
+  }
+
+  void RemoveLock(const base::FilePath& path) {
+    const base::FilePath normalized_path = path.NormalizePathSeparators();
+    base::AutoLock lock(lock_);
+    DCHECK(base::Contains(lock_paths_, normalized_path));
+    lock_paths_.erase(normalized_path);
+  }
+
+ private:
+  base::Lock lock_;
+  std::set<base::FilePath> lock_paths_ GUARDED_BY(lock_);
+};
+
+// Get the global singleton instance of LockTable. This returned object is
+// thread-safe.
+LockTable& GetLockTable() {
+  static base::NoDestructor<LockTable> table;
+  return *table;
+}
+
+class FileLockImpl : public mojom::FileLock {
+ public:
+  FileLockImpl(const base::FilePath& path, base::File file)
+      : path_(path), file_(std::move(file)) {
+    DCHECK(file_.IsValid());
+  }
+
+  ~FileLockImpl() override {
+    if (file_.IsValid())
+      GetLockTable().RemoveLock(path_);
+  }
+
+  // mojom::FileLock implementation:
+  void Release(ReleaseCallback callback) override {
+    if (!file_.IsValid()) {
+      std::move(callback).Run(base::File::FILE_ERROR_INVALID_OPERATION);
+      return;
+    }
+
+#if defined(OS_FUCHSIA)
+    std::move(callback).Run(base::File::FILE_OK);
+#else
+    std::move(callback).Run(file_.Unlock());
+#endif
+    GetLockTable().RemoveLock(path_);
+    file_.Close();
+  }
+
+ private:
+  const base::FilePath path_;
+  base::File file_;
+};
+
+}  // namespace
+
+FilesystemImpl::FilesystemImpl(const base::FilePath& root) : root_(root) {}
+
+FilesystemImpl::~FilesystemImpl() = default;
+
+void FilesystemImpl::PathExists(const base::FilePath& path,
+                                PathExistsCallback callback) {
+  std::move(callback).Run(base::PathExists(MakeAbsolute(path)));
+}
+
+void FilesystemImpl::GetEntries(const base::FilePath& path,
+                                mojom::GetEntriesMode mode,
+                                GetEntriesCallback callback) {
+  const base::FilePath full_path = MakeAbsolute(path);
+  FileErrorOr<std::vector<base::FilePath>> result =
+      GetDirectoryEntries(full_path, mode);
+  if (result.is_error()) {
+    std::move(callback).Run(result.error(), std::vector<base::FilePath>());
+    return;
+  }
+
+  // Fix up the absolute paths to be relative to |path|.
+  std::vector<base::FilePath> entries;
+  std::vector<base::FilePath::StringType> root_components;
+  full_path.GetComponents(&root_components);
+  const size_t num_components_to_strip = root_components.size();
+  for (const auto& entry : result.value()) {
+    std::vector<base::FilePath::StringType> components;
+    entry.GetComponents(&components);
+    base::FilePath relative_path;
+    for (size_t i = num_components_to_strip; i < components.size(); ++i)
+      relative_path = relative_path.Append(components[i]);
+    entries.push_back(std::move(relative_path));
+  }
+  std::move(callback).Run(base::File::FILE_OK, entries);
+}
+
+void FilesystemImpl::OpenFile(const base::FilePath& path,
+                              mojom::FileOpenMode mode,
+                              mojom::FileReadAccess read_access,
+                              mojom::FileWriteAccess write_access,
+                              OpenFileCallback callback) {
+  uint32_t flags = 0;
+  switch (mode) {
+    case mojom::FileOpenMode::kOpenIfExists:
+      flags |= base::File::FLAG_OPEN;
+      break;
+    case mojom::FileOpenMode::kCreateAndOpenOnlyIfNotExists:
+      flags |= base::File::FLAG_CREATE;
+      break;
+    case mojom::FileOpenMode::kAlwaysOpen:
+      flags |= base::File::FLAG_OPEN_ALWAYS;
+      break;
+    case mojom::FileOpenMode::kAlwaysCreate:
+      flags |= base::File::FLAG_CREATE_ALWAYS;
+      break;
+    case mojom::FileOpenMode::kOpenIfExistsAndTruncate:
+      flags |= base::File::FLAG_OPEN_TRUNCATED;
+      break;
+    default:
+      NOTREACHED();
+      return;
+  }
+
+  switch (read_access) {
+    case mojom::FileReadAccess::kReadNotAllowed:
+      break;
+    case mojom::FileReadAccess::kReadAllowed:
+      flags |= base::File::FLAG_READ;
+      break;
+    default:
+      NOTREACHED();
+      break;
+  }
+
+  switch (write_access) {
+    case mojom::FileWriteAccess::kWriteNotAllowed:
+      break;
+    case mojom::FileWriteAccess::kWriteAllowed:
+      flags |= base::File::FLAG_WRITE;
+      break;
+    case mojom::FileWriteAccess::kAppendOnly:
+      flags |= base::File::FLAG_APPEND;
+      break;
+    default:
+      NOTREACHED();
+      break;
+  }
+
+  const base::FilePath full_path = MakeAbsolute(path);
+  base::File file(full_path, flags);
+  base::File::Error error = base::File::FILE_OK;
+  if (!file.IsValid())
+    error = file.error_details();
+  std::move(callback).Run(error, std::move(file));
+}
+
+void FilesystemImpl::RemoveFile(const base::FilePath& path,
+                                RemoveFileCallback callback) {
+  std::move(callback).Run(
+      base::DeleteFile(MakeAbsolute(path), /*recursive=*/false));
+}
+
+void FilesystemImpl::CreateDirectory(const base::FilePath& path,
+                                     CreateDirectoryCallback callback) {
+  base::File::Error error = base::File::FILE_OK;
+  base::CreateDirectoryAndGetError(MakeAbsolute(path), &error);
+  std::move(callback).Run(error);
+}
+
+void FilesystemImpl::RemoveDirectory(const base::FilePath& path,
+                                     RemoveDirectoryCallback callback) {
+  const base::FilePath full_path = MakeAbsolute(path);
+  if (!base::DirectoryExists(full_path)) {
+    std::move(callback).Run(false);
+    return;
+  }
+
+  std::move(callback).Run(base::DeleteFile(full_path, /*recursive=*/false));
+}
+
+void FilesystemImpl::GetFileInfo(const base::FilePath& path,
+                                 GetFileInfoCallback callback) {
+  base::File::Info info;
+  if (base::GetFileInfo(MakeAbsolute(path), &info))
+    std::move(callback).Run(std::move(info));
+  else
+    std::move(callback).Run(base::nullopt);
+}
+
+void FilesystemImpl::RenameFile(const base::FilePath& old_path,
+                                const base::FilePath& new_path,
+                                RenameFileCallback callback) {
+  base::File::Error error = base::File::FILE_OK;
+  base::ReplaceFile(MakeAbsolute(old_path), MakeAbsolute(new_path), &error);
+  std::move(callback).Run(error);
+}
+
+void FilesystemImpl::LockFile(const base::FilePath& path,
+                              LockFileCallback callback) {
+  FileErrorOr<base::File> result = LockFileLocal(MakeAbsolute(path));
+  if (result.is_error()) {
+    std::move(callback).Run(result.error(), mojo::NullRemote());
+    return;
+  }
+
+  mojo::PendingRemote<mojom::FileLock> lock;
+  mojo::MakeSelfOwnedReceiver(
+      std::make_unique<FileLockImpl>(MakeAbsolute(path),
+                                     std::move(result.value())),
+      lock.InitWithNewPipeAndPassReceiver());
+  std::move(callback).Run(base::File::FILE_OK, std::move(lock));
+}
+
+// static
+FileErrorOr<base::File> FilesystemImpl::LockFileLocal(
+    const base::FilePath& path) {
+  DCHECK(path.IsAbsolute());
+  base::File file(path, base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_READ |
+                            base::File::FLAG_WRITE);
+  if (!file.IsValid())
+    return file.error_details();
+
+  if (!GetLockTable().AddLock(path))
+    return base::File::FILE_ERROR_IN_USE;
+
+#if !defined(OS_FUCHSIA)
+  base::File::Error error = file.Lock();
+  if (error != base::File::FILE_OK)
+    return error;
+#endif
+
+  return file;
+}
+
+// static
+void FilesystemImpl::UnlockFileLocal(const base::FilePath& path) {
+  GetLockTable().RemoveLock(path);
+}
+
+// static
+FileErrorOr<std::vector<base::FilePath>> FilesystemImpl::GetDirectoryEntries(
+    const base::FilePath& path,
+    mojom::GetEntriesMode mode) {
+  DCHECK(path.IsAbsolute());
+  int file_types = base::FileEnumerator::FILES;
+  if (mode == mojom::GetEntriesMode::kFilesAndDirectories)
+    file_types |= base::FileEnumerator::DIRECTORIES;
+  base::FileEnumerator enumerator(
+      path, /*recursive=*/false, file_types,
+      /*pattern=*/base::FilePath::StringType(),
+      base::FileEnumerator::FolderSearchPolicy::ALL,
+      base::FileEnumerator::ErrorPolicy::STOP_ENUMERATION);
+  std::vector<base::FilePath> entries;
+  for (base::FilePath path = enumerator.Next(); !path.empty();
+       path = enumerator.Next()) {
+    entries.push_back(path);
+  }
+  if (enumerator.GetError() != base::File::FILE_OK)
+    return enumerator.GetError();
+  return entries;
+}
+
+base::FilePath FilesystemImpl::MakeAbsolute(const base::FilePath& path) const {
+  // The DCHECK is a reasonable assertion: this object is only called into via
+  // Mojo, and type-map traits for |storage.mojom.StrictRelativePath| ensure
+  // that messages can only reach this object if they carry strictly relative
+  // paths.
+  DCHECK(!path.IsAbsolute());
+  return root_.Append(path);
+}
+
+}  // namespace storage
diff --git a/components/services/storage/public/cpp/filesystem/filesystem_impl.h b/components/services/storage/public/cpp/filesystem/filesystem_impl.h
new file mode 100644
index 0000000..552be203
--- /dev/null
+++ b/components/services/storage/public/cpp/filesystem/filesystem_impl.h
@@ -0,0 +1,83 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_SERVICES_STORAGE_PUBLIC_CPP_FILESYSTEM_FILESYSTEM_IMPL_H_
+#define COMPONENTS_SERVICES_STORAGE_PUBLIC_CPP_FILESYSTEM_FILESYSTEM_IMPL_H_
+
+#include <vector>
+
+#include "base/component_export.h"
+#include "base/files/file_path.h"
+#include "base/util/type_safety/pass_key.h"
+#include "components/services/storage/public/cpp/filesystem/file_error_or.h"
+#include "components/services/storage/public/mojom/filesystem/directory.mojom.h"
+
+namespace storage {
+
+class FilesystemProxy;
+
+// This is a concrete implementation of the |storage.mojom.Directory| interface
+// consumed via FilesystemProxy. If running the Storage Service in a restricted
+// sandbox environment, a privileged client (i.e. the browser) must provide a
+// working remote Directory implementation. This implementation can generally be
+// used as-is in such cases.
+//
+// Note that this must be constructed on a thread that allows blocking file I/O
+// operations.
+class COMPONENT_EXPORT(STORAGE_SERVICE_FILESYSTEM_SUPPORT) FilesystemImpl
+    : public mojom::Directory {
+ public:
+  // |root| must be an absolute path. Operations performed by this object
+  // will be contained within |root| or a transitive subdirectory thereof. All
+  // relative paths given to methods of this object are interpreted as relative
+  // to |root|.
+  explicit FilesystemImpl(const base::FilePath& root);
+
+  FilesystemImpl(const FilesystemImpl&) = delete;
+  FilesystemImpl& operator=(const FilesystemImpl) = delete;
+  ~FilesystemImpl() override;
+
+  // mojom::Directory:
+  void PathExists(const base::FilePath& path,
+                  PathExistsCallback callback) override;
+  void GetEntries(const base::FilePath& path,
+                  mojom::GetEntriesMode mode,
+                  GetEntriesCallback callback) override;
+  void OpenFile(const base::FilePath& path,
+                mojom::FileOpenMode mode,
+                mojom::FileReadAccess read_access,
+                mojom::FileWriteAccess write_access,
+                OpenFileCallback callback) override;
+  void RemoveFile(const base::FilePath& path,
+                  RemoveFileCallback callback) override;
+  void CreateDirectory(const base::FilePath& path,
+                       CreateDirectoryCallback callback) override;
+  void RemoveDirectory(const base::FilePath& path,
+                       RemoveDirectoryCallback callback) override;
+  void GetFileInfo(const base::FilePath& path,
+                   GetFileInfoCallback callback) override;
+  void RenameFile(const base::FilePath& old_path,
+                  const base::FilePath& new_path,
+                  RenameFileCallback callback) override;
+  void LockFile(const base::FilePath& path, LockFileCallback callback) override;
+
+  // Helper used by LockFile() and FilesystemProxy::LockFile() for in
+  // unrestricted mode.
+  static FileErrorOr<base::File> LockFileLocal(const base::FilePath& path);
+  static void UnlockFileLocal(const base::FilePath& path);
+
+  // Helper used by GetEntries() and FilesystemProxy::GetDirectoryEntries.
+  static FileErrorOr<std::vector<base::FilePath>> GetDirectoryEntries(
+      const base::FilePath& path,
+      mojom::GetEntriesMode mode);
+
+ private:
+  base::FilePath MakeAbsolute(const base::FilePath& path) const;
+
+  const base::FilePath root_;
+};
+
+}  // namespace storage
+
+#endif  // COMPONENTS_SERVICES_STORAGE_PUBLIC_CPP_FILESYSTEM_FILESYSTEM_IMPL_H_
diff --git a/components/services/storage/public/cpp/filesystem/filesystem_proxy.cc b/components/services/storage/public/cpp/filesystem/filesystem_proxy.cc
new file mode 100644
index 0000000..bd30606
--- /dev/null
+++ b/components/services/storage/public/cpp/filesystem/filesystem_proxy.cc
@@ -0,0 +1,320 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/services/storage/public/cpp/filesystem/filesystem_proxy.h"
+
+#include <memory>
+#include <utility>
+#include <vector>
+
+#include "base/bind.h"
+#include "base/files/file.h"
+#include "base/files/file_util.h"
+#include "base/task/post_task.h"
+#include "base/util/type_safety/pass_key.h"
+#include "build/build_config.h"
+#include "components/services/storage/public/cpp/filesystem/filesystem_impl.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/self_owned_receiver.h"
+
+namespace storage {
+
+namespace {
+
+size_t GetNumPathComponents(const base::FilePath& path) {
+  std::vector<base::FilePath::StringType> components;
+  path.GetComponents(&components);
+  return components.size();
+}
+
+class LocalFileLockImpl : public FilesystemProxy::FileLock {
+ public:
+  LocalFileLockImpl(base::FilePath path, base::File lock)
+      : path_(std::move(path)), lock_(std::move(lock)) {}
+  ~LocalFileLockImpl() override {
+    if (lock_.IsValid())
+      Release();
+  }
+
+  // FilesystemProxy::FileLock implementation:
+  base::File::Error Release() override {
+    base::File::Error error = base::File::FILE_OK;
+#if !defined(OS_FUCHSIA)
+    error = lock_.Unlock();
+#endif
+    lock_.Close();
+    FilesystemImpl::UnlockFileLocal(path_);
+    return error;
+  }
+
+ private:
+  const base::FilePath path_;
+  base::File lock_;
+};
+
+class RemoteFileLockImpl : public FilesystemProxy::FileLock {
+ public:
+  explicit RemoteFileLockImpl(mojo::PendingRemote<mojom::FileLock> remote_lock)
+      : remote_lock_(std::move(remote_lock)) {}
+  ~RemoteFileLockImpl() override {
+    if (remote_lock_)
+      Release();
+  }
+
+  // FilesystemProxy::FileLock implementation:
+  base::File::Error Release() override {
+    DCHECK(remote_lock_);
+    base::File::Error error = base::File::FILE_ERROR_IO;
+    mojo::Remote<mojom::FileLock>(std::move(remote_lock_))->Release(&error);
+    return error;
+  }
+
+ private:
+  mojo::PendingRemote<mojom::FileLock> remote_lock_;
+};
+
+}  // namespace
+
+FilesystemProxy::FilesystemProxy(decltype(UNRESTRICTED),
+                                 const base::FilePath& root)
+    : root_(root) {
+  DCHECK(root_.IsAbsolute() || root_.empty());
+}
+
+FilesystemProxy::FilesystemProxy(
+    decltype(RESTRICTED),
+    const base::FilePath& root,
+    mojo::PendingRemote<mojom::Directory> directory,
+    scoped_refptr<base::SequencedTaskRunner> ipc_task_runner)
+    : root_(root),
+      num_root_components_(GetNumPathComponents(root_)),
+      remote_directory_(std::move(directory)) {
+  DCHECK(root_.IsAbsolute());
+}
+
+FilesystemProxy::~FilesystemProxy() = default;
+
+bool FilesystemProxy::PathExists(const base::FilePath& path) {
+  if (!remote_directory_)
+    return base::PathExists(MakeAbsolute(path));
+
+  bool exists = false;
+  remote_directory_->PathExists(MakeRelative(path), &exists);
+  return exists;
+}
+
+FileErrorOr<std::vector<base::FilePath>> FilesystemProxy::GetDirectoryEntries(
+    const base::FilePath& path,
+    DirectoryEntryType type) {
+  const mojom::GetEntriesMode mode =
+      type == DirectoryEntryType::kFilesOnly
+          ? mojom::GetEntriesMode::kFilesOnly
+          : mojom::GetEntriesMode::kFilesAndDirectories;
+  if (!remote_directory_)
+    return FilesystemImpl::GetDirectoryEntries(MakeAbsolute(path), mode);
+
+  base::File::Error error = base::File::FILE_ERROR_IO;
+  std::vector<base::FilePath> entries;
+  remote_directory_->GetEntries(MakeRelative(path), mode, &error, &entries);
+  if (error != base::File::FILE_OK)
+    return error;
+
+  // Fix up all the relative paths to be absolute.
+  const base::FilePath root = path.IsAbsolute() ? path : root_.Append(path);
+  for (auto& entry : entries)
+    entry = root.Append(entry);
+  return entries;
+}
+
+FileErrorOr<base::File> FilesystemProxy::OpenFile(const base::FilePath& path,
+                                                  int flags) {
+  if (!remote_directory_) {
+    base::File file(MakeAbsolute(path), flags);
+    if (!file.IsValid())
+      return file.error_details();
+    return file;
+  }
+
+  // NOTE: Remote directories only support a subset of |flags| values.
+  const int kModeMask = base::File::FLAG_OPEN | base::File::FLAG_CREATE |
+                        base::File::FLAG_OPEN_ALWAYS |
+                        base::File::FLAG_CREATE_ALWAYS |
+                        base::File::FLAG_OPEN_TRUNCATED;
+  const int kWriteMask = base::File::FLAG_WRITE | base::File::FLAG_APPEND;
+  const int kSupportedFlagsMask =
+      kModeMask | kWriteMask | base::File::FLAG_READ;
+  DCHECK((flags & ~kSupportedFlagsMask) == 0) << "Unsupported flags: " << flags;
+
+  const int mode_flags = flags & kModeMask;
+  mojom::FileOpenMode mode;
+  switch (mode_flags) {
+    case base::File::FLAG_OPEN:
+      mode = mojom::FileOpenMode::kOpenIfExists;
+      break;
+    case base::File::FLAG_CREATE:
+      mode = mojom::FileOpenMode::kCreateAndOpenOnlyIfNotExists;
+      break;
+    case base::File::FLAG_OPEN_ALWAYS:
+      mode = mojom::FileOpenMode::kAlwaysOpen;
+      break;
+    case base::File::FLAG_CREATE_ALWAYS:
+      mode = mojom::FileOpenMode::kAlwaysCreate;
+      break;
+    case base::File::FLAG_OPEN_TRUNCATED:
+      mode = mojom::FileOpenMode::kOpenIfExistsAndTruncate;
+      break;
+    default:
+      NOTREACHED() << "Invalid open mode flags: " << mode_flags;
+      return base::File::FILE_ERROR_FAILED;
+  }
+
+  mojom::FileReadAccess read_access =
+      (flags & base::File::FLAG_READ) != 0
+          ? mojom::FileReadAccess::kReadAllowed
+          : mojom::FileReadAccess::kReadNotAllowed;
+
+  const int write_flags = flags & kWriteMask;
+  mojom::FileWriteAccess write_access;
+  switch (write_flags) {
+    case 0:
+      write_access = mojom::FileWriteAccess::kWriteNotAllowed;
+      break;
+    case base::File::FLAG_WRITE:
+      write_access = mojom::FileWriteAccess::kWriteAllowed;
+      break;
+    case base::File::FLAG_APPEND:
+      write_access = mojom::FileWriteAccess::kAppendOnly;
+      break;
+    default:
+      NOTREACHED() << "Invalid write access flags: " << write_flags;
+      return base::File::FILE_ERROR_FAILED;
+  }
+
+  base::File::Error error = base::File::FILE_ERROR_IO;
+  base::File file;
+  remote_directory_->OpenFile(MakeRelative(path), mode, read_access,
+                              write_access, &error, &file);
+  if (error != base::File::FILE_OK)
+    return error;
+  return file;
+}
+
+bool FilesystemProxy::RemoveFile(const base::FilePath& path) {
+  if (!remote_directory_)
+    return base::DeleteFile(MakeAbsolute(path), /*recursive=*/false);
+
+  bool success = false;
+  remote_directory_->RemoveFile(MakeRelative(path), &success);
+  return success;
+}
+
+base::File::Error FilesystemProxy::CreateDirectory(const base::FilePath& path) {
+  base::File::Error error = base::File::FILE_ERROR_IO;
+  if (!remote_directory_) {
+    if (!base::CreateDirectoryAndGetError(MakeAbsolute(path), &error))
+      return error;
+    return base::File::FILE_OK;
+  }
+
+  remote_directory_->CreateDirectory(MakeRelative(path), &error);
+  return error;
+}
+
+bool FilesystemProxy::RemoveDirectory(const base::FilePath& path) {
+  if (!remote_directory_) {
+    const base::FilePath full_path = MakeAbsolute(path);
+    if (!base::DirectoryExists(full_path))
+      return false;
+    return base::DeleteFile(full_path, /*recursive=*/false);
+  }
+
+  bool success = false;
+  remote_directory_->RemoveDirectory(MakeRelative(path), &success);
+  return success;
+}
+
+base::Optional<base::File::Info> FilesystemProxy::GetFileInfo(
+    const base::FilePath& path) {
+  if (!remote_directory_) {
+    base::File::Info info;
+    if (base::GetFileInfo(MakeAbsolute(path), &info))
+      return info;
+    return base::nullopt;
+  }
+
+  base::Optional<base::File::Info> info;
+  remote_directory_->GetFileInfo(MakeRelative(path), &info);
+  return info;
+}
+
+base::File::Error FilesystemProxy::RenameFile(const base::FilePath& old_path,
+                                              const base::FilePath& new_path) {
+  base::File::Error error = base::File::FILE_ERROR_IO;
+  if (!remote_directory_) {
+    if (!base::ReplaceFile(MakeAbsolute(old_path), MakeAbsolute(new_path),
+                           &error)) {
+      return error;
+    }
+    return base::File::FILE_OK;
+  }
+
+  remote_directory_->RenameFile(MakeRelative(old_path), MakeRelative(new_path),
+                                &error);
+  return error;
+}
+
+FileErrorOr<std::unique_ptr<FilesystemProxy::FileLock>>
+FilesystemProxy::LockFile(const base::FilePath& path) {
+  if (!remote_directory_) {
+    base::FilePath full_path = MakeAbsolute(path);
+    FileErrorOr<base::File> result = FilesystemImpl::LockFileLocal(full_path);
+    if (result.is_error())
+      return result.error();
+    std::unique_ptr<FileLock> lock = std::make_unique<LocalFileLockImpl>(
+        std::move(full_path), std::move(result.value()));
+    return lock;
+  }
+
+  mojo::PendingRemote<mojom::FileLock> remote_lock;
+  base::File::Error error = base::File::FILE_ERROR_IO;
+  if (!remote_directory_->LockFile(MakeRelative(path), &error, &remote_lock))
+    return error;
+  if (error != base::File::FILE_OK)
+    return error;
+
+  std::unique_ptr<FileLock> lock =
+      std::make_unique<RemoteFileLockImpl>(std::move(remote_lock));
+  return lock;
+}
+
+base::FilePath FilesystemProxy::MakeRelative(const base::FilePath& path) const {
+  DCHECK(remote_directory_);
+  DCHECK(!path.ReferencesParent());
+
+  // For a remote Directory, returned paths must always be relative to |root|.
+  if (!path.IsAbsolute() || path.empty())
+    return path;
+
+  if (path == root_)
+    return base::FilePath();
+
+  // Absolute paths need to be rebased onto |root_|.
+  std::vector<base::FilePath::StringType> components;
+  path.GetComponents(&components);
+  base::FilePath relative_path;
+  for (size_t i = num_root_components_; i < components.size(); ++i)
+    relative_path = relative_path.Append(components[i]);
+  return relative_path;
+}
+
+base::FilePath FilesystemProxy::MakeAbsolute(const base::FilePath& path) const {
+  DCHECK(!remote_directory_);
+  if (path.IsAbsolute())
+    return path;
+
+  DCHECK(!root_.empty());
+  return root_.Append(path);
+}
+
+}  // namespace storage
diff --git a/components/services/storage/public/cpp/filesystem/filesystem_proxy.h b/components/services/storage/public/cpp/filesystem/filesystem_proxy.h
new file mode 100644
index 0000000..d4ac4df
--- /dev/null
+++ b/components/services/storage/public/cpp/filesystem/filesystem_proxy.h
@@ -0,0 +1,147 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_SERVICES_STORAGE_PUBLIC_CPP_FILESYSTEM_FILESYSTEM_PROXY_H_
+#define COMPONENTS_SERVICES_STORAGE_PUBLIC_CPP_FILESYSTEM_FILESYSTEM_PROXY_H_
+
+#include <memory>
+#include <vector>
+
+#include "base/component_export.h"
+#include "base/files/file_path.h"
+#include "base/memory/scoped_refptr.h"
+#include "base/sequenced_task_runner.h"
+#include "base/util/type_safety/pass_key.h"
+#include "components/services/storage/public/cpp/filesystem/file_error_or.h"
+#include "components/services/storage/public/mojom/filesystem/directory.mojom.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/shared_remote.h"
+
+namespace storage {
+
+// A FilesystemProxy performs common filesystem operations on the caller's
+// behalf, either directly (if the calling process environment permits) or via a
+// remote storage.mojom.Directory implementation if one is provided.
+//
+// This class is thread-safe, but must only be called from threads that allow
+// blocking operations.
+class COMPONENT_EXPORT(STORAGE_SERVICE_FILESYSTEM_SUPPORT) FilesystemProxy {
+ public:
+  // Tags used to clarify the meaning of each constructor so that call sites can
+  // be more easily evaluated.
+  enum { UNRESTRICTED };
+  enum { RESTRICTED };
+
+  // Constructs a new FilesystemProxy which performs privileged, in-process
+  // file system operations. Not suitable for use within a restricted sandbox
+  // environment, as it may ultimately attempt to work that will be blocked by
+  // the sandbox boundary.
+  //
+  // If relative paths are given to methods on this object, they are interpreted
+  // relative to |root|. Objects constructed in this way can process paths
+  // outside of |root| and in general suffer no restrictions on what paths are
+  // allowed.
+  //
+  // If |root| is empty, this object's methods will only accept absolute paths.
+  explicit FilesystemProxy(decltype(UNRESTRICTED), const base::FilePath& root);
+
+  // Constructs a new FilesystemProxy for |root|, using |directory| to invoke
+  // privileged operations. Suitable for use within a sandboxed/ environment,
+  // assuming |directory| is connected to a remote implementation in a more
+  // privileged process.
+  //
+  // Objects constructed in this way can ONLY access contents within |root|;
+  // relative paths are interpreted as relative to |root|, and absolute paths
+  // must fall within |root|.
+  //
+  // |ipc_task_runner| is a task runner suitable for internally binding the
+  // Directory IPC endpoint; this is the task runner used to bind the internal
+  // SharedRemote, and so this is where all outgoing IPCs will hop before being
+  // transmitted. As such it must be a thread which is never blocked. Typically
+  // in a Content process environment, this should be the "IO thread".
+  FilesystemProxy(decltype(RESTRICTED),
+                  const base::FilePath& root,
+                  mojo::PendingRemote<mojom::Directory> directory,
+                  scoped_refptr<base::SequencedTaskRunner> ipc_task_runner);
+
+  FilesystemProxy(const FilesystemProxy&) = delete;
+  FilesystemProxy& operator=(const FilesystemProxy&) = delete;
+  ~FilesystemProxy();
+
+  // Returns true iff |path| refers to an existing file or directory.
+  bool PathExists(const base::FilePath& path);
+
+  // Enumerates all files and/or directories within |path|, a directory. Not
+  // recursive.
+  enum class DirectoryEntryType {
+    kFilesOnly,
+    kFilesAndDirectories,
+  };
+  FileErrorOr<std::vector<base::FilePath>> GetDirectoryEntries(
+      const base::FilePath& path,
+      DirectoryEntryType type);
+
+  // Opens a file at |path| with the given |flags|. If successful, the newly
+  // opened file is returned. |flags| may be any bitwise union of
+  // base::File::Flags values.
+  FileErrorOr<base::File> OpenFile(const base::FilePath& path, int flags);
+
+  // Deletes the file at |path| if it exists and returns true iff successful.
+  bool RemoveFile(const base::FilePath& path);
+
+  // Creates a new directory at |path|. Any needed parent directories above
+  // |path| are also created if they don't already exist.
+  base::File::Error CreateDirectory(const base::FilePath& path);
+
+  // Deletes the directory at |path| if it exists and returns true iff
+  // successful.
+  bool RemoveDirectory(const base::FilePath& path);
+
+  // Retrieves information about a file or directory at |path|. Returns a valid
+  // base::File::Info value on success, or null on failure.
+  base::Optional<base::File::Info> GetFileInfo(const base::FilePath& path);
+
+  // Renames a file from |old_path| to |new_path|. Must be atomic.
+  base::File::Error RenameFile(const base::FilePath& old_path,
+                               const base::FilePath& new_path);
+
+  // Acquires an exclusive lock on the file at |path| if possible, returning a
+  // FileLock object to hold the lock if successful. The lock remains held as
+  // long as the returned FileLock object remains alive. Destroying the FileLock
+  // releases the lock.
+  class FileLock {
+   public:
+    virtual ~FileLock() = default;
+
+    // Explicitly releases the lock. This only has side effects the first time
+    // it's called, and once this is called, FileLock destruction also will be a
+    // no-op.
+    virtual base::File::Error Release() = 0;
+  };
+  FileErrorOr<std::unique_ptr<FileLock>> LockFile(const base::FilePath& path);
+
+ private:
+  // For restricted FilesystemProxy instances, this returns a FilePath
+  // equivalent to |path| which is strictly relative to |root_|. It is an error
+  // to call with a |path| for which this is impossible.
+  //
+  // Not called by unrestricted FilesystemProxy instances.
+  base::FilePath MakeRelative(const base::FilePath& path) const;
+
+  // For unrestricted FilesystemProxy instances, this returns a FilePath that is
+  // always absolute. If |path| is absolute, it is returned unmodified. If
+  // relative, it is resolved against |root_|.
+  base::FilePath MakeAbsolute(const base::FilePath& path) const;
+
+  const base::FilePath root_;
+  const size_t num_root_components_ = 0;
+
+  // If |remote_directory_| is set this is a restricted proxy, otherwise
+  // it is unrestricted and will perform filesystem operations directly.
+  const mojo::SharedRemote<mojom::Directory> remote_directory_;
+};
+
+}  // namespace storage
+
+#endif  // COMPONENTS_SERVICES_STORAGE_PUBLIC_CPP_FILESYSTEM_FILESYSTEM_PROXY_H_
diff --git a/components/services/storage/public/cpp/filesystem/filesystem_proxy_unittest.cc b/components/services/storage/public/cpp/filesystem/filesystem_proxy_unittest.cc
new file mode 100644
index 0000000..5278743
--- /dev/null
+++ b/components/services/storage/public/cpp/filesystem/filesystem_proxy_unittest.cc
@@ -0,0 +1,433 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/services/storage/public/cpp/filesystem/filesystem_proxy.h"
+
+#include <memory>
+
+#include "base/files/file_util.h"
+#include "base/files/scoped_temp_dir.h"
+#include "base/logging.h"
+#include "base/run_loop.h"
+#include "base/stl_util.h"
+#include "base/task/post_task.h"
+#include "base/task/thread_pool.h"
+#include "base/test/task_environment.h"
+#include "components/services/storage/public/cpp/filesystem/file_error_or.h"
+#include "components/services/storage/public/cpp/filesystem/filesystem_impl.h"
+#include "components/services/storage/public/mojom/filesystem/directory.mojom.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/remote.h"
+#include "mojo/public/cpp/bindings/self_owned_receiver.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace storage {
+
+namespace {
+
+constexpr char kFile1Contents[] = "Hello, world!";
+
+using ::testing::UnorderedElementsAre;
+
+std::string ReadFileContents(base::File* file) {
+  std::vector<uint8_t> buffer(file->GetLength());
+  CHECK(file->ReadAndCheck(0, buffer));
+  return std::string(buffer.begin(), buffer.end());
+}
+
+}  // namespace
+
+class FilesystemProxyTest : public testing::TestWithParam<bool> {
+ public:
+  const base::FilePath kFile1{FILE_PATH_LITERAL("file1")};
+  const base::FilePath kFile2{FILE_PATH_LITERAL("file2")};
+  const base::FilePath kDir1{FILE_PATH_LITERAL("dir1")};
+  const base::FilePath kDir1File1{FILE_PATH_LITERAL("dir1file1")};
+  const base::FilePath kDir1File2{FILE_PATH_LITERAL("dir1file2")};
+  const base::FilePath kDir1Dir1{FILE_PATH_LITERAL("dir1dir1")};
+  const base::FilePath kDir2{FILE_PATH_LITERAL("dir2")};
+  const base::FilePath kDir2File1{FILE_PATH_LITERAL("dir2file1")};
+
+  FilesystemProxyTest() = default;
+
+  void SetUp() override {
+    CHECK(temp_dir_.CreateUniqueTempDir());
+    const base::FilePath root = temp_dir_.GetPath();
+
+    // Populate the temporary root with some files and subdirectories.
+    CHECK(base::CreateDirectory(root.Append(kDir1)));
+    CHECK(base::CreateDirectory(root.Append(kDir1).Append(kDir1Dir1)));
+    CHECK(base::CreateDirectory(root.Append(kDir2)));
+    CHECK(base::WriteFile(root.Append(kFile1), kFile1Contents,
+                          base::size(kFile1Contents) - 1));
+    CHECK(base::WriteFile(root.Append(kFile2), " ", 1));
+    CHECK(base::WriteFile(root.Append(kDir1).Append(kDir1File1), " ", 1));
+    CHECK(base::WriteFile(root.Append(kDir1).Append(kDir1File2), " ", 1));
+    CHECK(base::WriteFile(root.Append(kDir2).Append(kDir1File2), " ", 1));
+
+    if (UseRestrictedFilesystem()) {
+      // Run a remote FilesystemImpl on a background thread to exercise
+      // restricted FilesystemProxy behavior.
+      mojo::PendingRemote<mojom::Directory> remote;
+      base::ThreadPool::CreateSequencedTaskRunner({base::MayBlock()})
+          ->PostTask(FROM_HERE,
+                     base::BindOnce(
+                         [](const base::FilePath& root,
+                            mojo::PendingReceiver<mojom::Directory> receiver) {
+                           mojo::MakeSelfOwnedReceiver(
+                               std::make_unique<FilesystemImpl>(root),
+                               std::move(receiver));
+                         },
+                         root, remote.InitWithNewPipeAndPassReceiver()));
+      proxy_ = std::make_unique<FilesystemProxy>(
+          FilesystemProxy::RESTRICTED, root, std::move(remote),
+          base::ThreadPool::CreateSequencedTaskRunner({}));
+    } else {
+      proxy_ = std::make_unique<FilesystemProxy>(FilesystemProxy::UNRESTRICTED,
+                                                 root);
+    }
+  }
+
+  void TearDown() override {
+    proxy_.reset();
+    CHECK(temp_dir_.Delete());
+  }
+
+  base::FilePath GetTestRoot() { return temp_dir_.GetPath(); }
+
+  FilesystemProxy& proxy() { return *proxy_; }
+
+  base::FilePath MakeAbsolute(const base::FilePath& path) {
+    DCHECK(!path.IsAbsolute());
+    return GetTestRoot().Append(path);
+  }
+
+  std::string ReadFileContentsAtPath(const base::FilePath& path) {
+    FileErrorOr<base::File> result =
+        proxy().OpenFile(path, base::File::FLAG_OPEN | base::File::FLAG_READ);
+    return ReadFileContents(&result.value());
+  }
+
+ private:
+  bool UseRestrictedFilesystem() { return GetParam(); }
+
+  base::test::TaskEnvironment task_environment_;
+  base::ScopedTempDir temp_dir_;
+  std::unique_ptr<FilesystemProxy> proxy_;
+};
+
+TEST_P(FilesystemProxyTest, PathExists) {
+  EXPECT_TRUE(proxy().PathExists(kFile1));
+  EXPECT_TRUE(proxy().PathExists(kDir1));
+  EXPECT_TRUE(proxy().PathExists(kDir1.Append(kDir1File1)));
+  EXPECT_FALSE(proxy().PathExists(kDir2.Append(kFile2)));
+}
+
+TEST_P(FilesystemProxyTest, GetDirectoryEntries) {
+  FileErrorOr<std::vector<base::FilePath>> result = proxy().GetDirectoryEntries(
+      base::FilePath(), FilesystemProxy::DirectoryEntryType::kFilesOnly);
+  ASSERT_FALSE(result.is_error());
+  EXPECT_THAT(result.value(),
+              UnorderedElementsAre(MakeAbsolute(kFile1), MakeAbsolute(kFile2)));
+
+  result = proxy().GetDirectoryEntries(
+      base::FilePath(),
+      FilesystemProxy::DirectoryEntryType::kFilesAndDirectories);
+  ASSERT_FALSE(result.is_error());
+  EXPECT_THAT(result.value(),
+              UnorderedElementsAre(MakeAbsolute(kFile1), MakeAbsolute(kFile2),
+                                   MakeAbsolute(kDir1), MakeAbsolute(kDir2)));
+
+  result = proxy().GetDirectoryEntries(
+      kDir1, FilesystemProxy::DirectoryEntryType::kFilesOnly);
+  ASSERT_FALSE(result.is_error());
+  EXPECT_THAT(result.value(),
+              UnorderedElementsAre(MakeAbsolute(kDir1.Append(kDir1File1)),
+                                   MakeAbsolute(kDir1.Append(kDir1File2))));
+
+  result = proxy().GetDirectoryEntries(
+      kDir1, FilesystemProxy::DirectoryEntryType::kFilesAndDirectories);
+  ASSERT_FALSE(result.is_error());
+  EXPECT_THAT(result.value(),
+              UnorderedElementsAre(MakeAbsolute(kDir1.Append(kDir1File1)),
+                                   MakeAbsolute(kDir1.Append(kDir1File2)),
+                                   MakeAbsolute(kDir1.Append(kDir1Dir1))));
+
+  EXPECT_EQ(
+      base::File::FILE_ERROR_NOT_FOUND,
+      proxy()
+          .GetDirectoryEntries(base::FilePath(FILE_PATH_LITERAL("nope")),
+                               FilesystemProxy::DirectoryEntryType::kFilesOnly)
+          .error());
+}
+
+TEST_P(FilesystemProxyTest, OpenFileOpenIfExists) {
+  const base::FilePath kNewFilename{FILE_PATH_LITERAL("new_file")};
+  EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND,
+            proxy()
+                .OpenFile(kNewFilename, base::File::FLAG_OPEN |
+                                            base::File::FLAG_READ |
+                                            base::File::FLAG_WRITE)
+                .error());
+
+  FileErrorOr<base::File> file1 =
+      proxy().OpenFile(kFile1, base::File::FLAG_OPEN | base::File::FLAG_READ |
+                                   base::File::FLAG_WRITE);
+  EXPECT_FALSE(file1.is_error());
+  EXPECT_EQ(kFile1Contents, ReadFileContents(&file1.value()));
+}
+
+TEST_P(FilesystemProxyTest, OpenFileCreateAndOpenOnlyIfNotExists) {
+  EXPECT_EQ(
+      base::File::FILE_ERROR_EXISTS,
+      proxy()
+          .OpenFile(kFile1, base::File::FLAG_CREATE | base::File::FLAG_READ |
+                                base::File::FLAG_WRITE)
+          .error());
+
+  const base::FilePath kNewFilename{FILE_PATH_LITERAL("new_file")};
+  FileErrorOr<base::File> new_file = proxy().OpenFile(
+      kNewFilename,
+      base::File::FLAG_CREATE | base::File::FLAG_READ | base::File::FLAG_WRITE);
+  ASSERT_FALSE(new_file.is_error());
+  EXPECT_EQ("", ReadFileContents(&new_file.value()));
+
+  const std::string kData = "yeet";
+  EXPECT_TRUE(
+      new_file->WriteAndCheck(0, base::as_bytes(base::make_span(kData))));
+  EXPECT_EQ(kData, ReadFileContents(&new_file.value()));
+}
+
+TEST_P(FilesystemProxyTest, OpenFileAlwaysOpen) {
+  FileErrorOr<base::File> file1 = proxy().OpenFile(
+      kFile1, base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_READ |
+                  base::File::FLAG_WRITE);
+  ASSERT_FALSE(file1.is_error());
+  EXPECT_TRUE(file1->IsValid());
+  EXPECT_EQ(kFile1Contents, ReadFileContents(&file1.value()));
+
+  const base::FilePath kNewFilename{FILE_PATH_LITERAL("new_file")};
+  FileErrorOr<base::File> new_file = proxy().OpenFile(
+      kNewFilename, base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_READ |
+                        base::File::FLAG_WRITE);
+  ASSERT_FALSE(new_file.is_error());
+  EXPECT_TRUE(new_file->IsValid());
+  EXPECT_EQ("", ReadFileContents(&new_file.value()));
+}
+
+TEST_P(FilesystemProxyTest, OpenFileAlwaysCreate) {
+  FileErrorOr<base::File> file1 = proxy().OpenFile(
+      kFile1, base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_READ |
+                  base::File::FLAG_WRITE);
+  ASSERT_FALSE(file1.is_error());
+  EXPECT_TRUE(file1->IsValid());
+  EXPECT_EQ("", ReadFileContents(&file1.value()));
+
+  const base::FilePath kNewFilename{FILE_PATH_LITERAL("new_file")};
+  FileErrorOr<base::File> new_file = proxy().OpenFile(
+      kNewFilename, base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_READ |
+                        base::File::FLAG_WRITE);
+  ASSERT_FALSE(new_file.is_error());
+  EXPECT_TRUE(new_file->IsValid());
+  EXPECT_EQ("", ReadFileContents(&new_file.value()));
+}
+
+TEST_P(FilesystemProxyTest, OpenFileOpenIfExistsAndTruncate) {
+  const base::FilePath kNewFilename{FILE_PATH_LITERAL("new_file")};
+  EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND,
+            proxy()
+                .OpenFile(kNewFilename, base::File::FLAG_OPEN_TRUNCATED |
+                                            base::File::FLAG_READ |
+                                            base::File::FLAG_WRITE)
+                .error());
+
+  FileErrorOr<base::File> file1 = proxy().OpenFile(
+      kFile1, base::File::FLAG_OPEN_TRUNCATED | base::File::FLAG_READ |
+                  base::File::FLAG_WRITE);
+  ASSERT_FALSE(file1.is_error());
+  EXPECT_TRUE(file1->IsValid());
+  EXPECT_EQ("", ReadFileContents(&file1.value()));
+}
+
+TEST_P(FilesystemProxyTest, OpenFileReadOnly) {
+  FileErrorOr<base::File> file =
+      proxy().OpenFile(kFile1, base::File::FLAG_OPEN | base::File::FLAG_READ);
+  ASSERT_FALSE(file.is_error());
+  EXPECT_TRUE(file->IsValid());
+
+  // Writes should fail.
+  EXPECT_FALSE(file->WriteAtCurrentPosAndCheck(
+      base::as_bytes(base::make_span("doesn't matter"))));
+  EXPECT_EQ(kFile1Contents, ReadFileContents(&file.value()));
+}
+
+TEST_P(FilesystemProxyTest, OpenFileWriteOnly) {
+  FileErrorOr<base::File> file = proxy().OpenFile(
+      kFile2, base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE);
+  ASSERT_FALSE(file.is_error());
+  EXPECT_TRUE(file->IsValid());
+
+  const std::string kData{"files can have a little data, as a treat"};
+  EXPECT_TRUE(file->WriteAndCheck(0, base::as_bytes(base::make_span(kData))));
+
+  // Reading from this handle should fail.
+  std::vector<uint8_t> data;
+  EXPECT_FALSE(file->ReadAndCheck(0, data));
+  file->Close();
+
+  // But the file contents should still have been written.
+  EXPECT_EQ(kData, ReadFileContentsAtPath(kFile2));
+}
+
+TEST_P(FilesystemProxyTest, OpenFileAppendOnly) {
+  const base::FilePath kFile3{FILE_PATH_LITERAL("file3")};
+  FileErrorOr<base::File> file = proxy().OpenFile(
+      kFile3, base::File::FLAG_CREATE | base::File::FLAG_APPEND);
+  ASSERT_FALSE(file.is_error());
+  EXPECT_TRUE(file->IsValid());
+
+  const std::string kData{"files can have a little data, as a treat"};
+  EXPECT_TRUE(
+      file->WriteAtCurrentPosAndCheck(base::as_bytes(base::make_span(kData))));
+
+  // Attempt to write somewhere other than the end of the file. The offset
+  // should be ignored and the data should be appended instead.
+  const std::string kMoreData{"!"};
+  EXPECT_TRUE(
+      file->WriteAndCheck(0, base::as_bytes(base::make_span(kMoreData))));
+
+  // Reading should still fail.
+  std::vector<uint8_t> data;
+  EXPECT_FALSE(file->ReadAndCheck(0, data));
+  file->Close();
+
+  // But we should have all the appended data in the file.
+  EXPECT_EQ(kData + kMoreData, ReadFileContentsAtPath(kFile3));
+}
+
+TEST_P(FilesystemProxyTest, RemoveFile) {
+  FileErrorOr<base::File> file =
+      proxy().OpenFile(kFile1, base::File::FLAG_OPEN | base ::File::FLAG_READ);
+  ASSERT_FALSE(file.is_error());
+  EXPECT_TRUE(file->IsValid());
+  file->Close();
+
+  EXPECT_TRUE(proxy().RemoveFile(kFile1));
+  file =
+      proxy().OpenFile(kFile1, base::File::FLAG_OPEN | base ::File::FLAG_READ);
+  EXPECT_TRUE(file.is_error());
+  EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, file.error());
+}
+
+TEST_P(FilesystemProxyTest, CreateAndRemoveDirectory) {
+  const base::FilePath kNewDirectoryName{FILE_PATH_LITERAL("new_dir")};
+  EXPECT_EQ(base::File::FILE_OK, proxy().CreateDirectory(kNewDirectoryName));
+  EXPECT_TRUE(proxy().RemoveDirectory(kNewDirectoryName));
+  EXPECT_FALSE(proxy().RemoveDirectory(kNewDirectoryName));
+}
+
+TEST_P(FilesystemProxyTest, GetFileInfo) {
+  base::Optional<base::File::Info> file1_info = proxy().GetFileInfo(kFile1);
+  ASSERT_TRUE(file1_info.has_value());
+  EXPECT_FALSE(file1_info->is_directory);
+  EXPECT_EQ(static_cast<int>(base::size(kFile1Contents) - 1), file1_info->size);
+
+  base::Optional<base::File::Info> dir1_info = proxy().GetFileInfo(kDir1);
+  ASSERT_TRUE(dir1_info.has_value());
+  EXPECT_TRUE(dir1_info->is_directory);
+
+  base::Optional<base::File::Info> dir1_file1_info =
+      proxy().GetFileInfo(kDir1.Append(kDir1File1));
+  ASSERT_TRUE(dir1_file1_info.has_value());
+  EXPECT_FALSE(dir1_file1_info->is_directory);
+  EXPECT_EQ(1, dir1_file1_info->size);
+
+  const base::FilePath kBadFilename{FILE_PATH_LITERAL("bad_file")};
+  EXPECT_FALSE(proxy().GetFileInfo(kBadFilename).has_value());
+}
+
+TEST_P(FilesystemProxyTest, RenameFile) {
+  const base::FilePath kNewFilename{FILE_PATH_LITERAL("new_file")};
+  EXPECT_EQ(base::File::FILE_OK, proxy().RenameFile(kFile1, kNewFilename));
+
+  EXPECT_EQ(
+      base::File::FILE_ERROR_NOT_FOUND,
+      proxy()
+          .OpenFile(kFile1, base::File::FLAG_OPEN | base::File::FLAG_READ |
+                                base::File::FLAG_WRITE)
+          .error());
+
+  FileErrorOr<base::File> new_file = proxy().OpenFile(
+      kNewFilename,
+      base::File::FLAG_OPEN | base::File::FLAG_READ | base::File::FLAG_WRITE);
+  ASSERT_FALSE(new_file.is_error());
+  EXPECT_TRUE(new_file->IsValid());
+  EXPECT_EQ(kFile1Contents, ReadFileContents(&new_file.value()));
+}
+
+TEST_P(FilesystemProxyTest, RenameNonExistentFile) {
+  const base::FilePath kBadFilename{FILE_PATH_LITERAL("bad_file")};
+  const base::FilePath kNewFilename{FILE_PATH_LITERAL("new_file")};
+  EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND,
+            proxy().RenameFile(kBadFilename, kNewFilename));
+}
+
+TEST_P(FilesystemProxyTest, LockFile) {
+  const base::FilePath kLockFilename{FILE_PATH_LITERAL("lox")};
+  FileErrorOr<std::unique_ptr<FilesystemProxy::FileLock>> result =
+      proxy().LockFile(kLockFilename);
+  ASSERT_FALSE(result.is_error());
+  EXPECT_NE(nullptr, result.value());
+
+  FileErrorOr<std::unique_ptr<FilesystemProxy::FileLock>> result2 =
+      proxy().LockFile(kLockFilename);
+  EXPECT_TRUE(result2.is_error());
+  EXPECT_EQ(base::File::FILE_ERROR_IN_USE, result2.error());
+
+  // Synchronously release so we can re-acquire the lock.
+  EXPECT_EQ(base::File::Error::FILE_OK, result.value()->Release());
+
+  result2 = proxy().LockFile(kLockFilename);
+  ASSERT_FALSE(result2.is_error());
+  EXPECT_NE(nullptr, result2.value());
+
+  // Test that destruction also implicitly releases the lock.
+  result2 = base::File::FILE_ERROR_FAILED;
+
+  // And once again we should be able to reacquire the lock.
+  result = proxy().LockFile(kLockFilename);
+  ASSERT_FALSE(result.is_error());
+  EXPECT_NE(nullptr, result.value());
+}
+
+TEST_P(FilesystemProxyTest, AbsolutePathEqualToRoot) {
+  // Verifies that if a delegate is given an absolute path identical to its
+  // root path, it is correctly resolved to an empty relative path and can
+  // operate correctly.
+  FileErrorOr<std::vector<base::FilePath>> result = proxy().GetDirectoryEntries(
+      GetTestRoot(), FilesystemProxy::DirectoryEntryType::kFilesAndDirectories);
+  ASSERT_FALSE(result.is_error());
+  EXPECT_THAT(result.value(),
+              UnorderedElementsAre(MakeAbsolute(kFile1), MakeAbsolute(kFile2),
+                                   MakeAbsolute(kDir1), MakeAbsolute(kDir2)));
+}
+
+TEST_P(FilesystemProxyTest, AbsolutePathWithinRoot) {
+  // Verifies that if a delegate is given an absolute path which falls within
+  // its root path, it is correctly resolved to a relative path suitable for use
+  // with the Directory IPC interface.
+  FileErrorOr<std::vector<base::FilePath>> result = proxy().GetDirectoryEntries(
+      GetTestRoot().Append(kDir1),
+      FilesystemProxy::DirectoryEntryType::kFilesAndDirectories);
+  ASSERT_FALSE(result.is_error());
+  EXPECT_THAT(result.value(),
+              UnorderedElementsAre(MakeAbsolute(kDir1.Append(kDir1File1)),
+                                   MakeAbsolute(kDir1.Append(kDir1File2)),
+                                   MakeAbsolute(kDir1.Append(kDir1Dir1))));
+}
+
+INSTANTIATE_TEST_SUITE_P(, FilesystemProxyTest, testing::Bool());
+
+}  // namespace storage
diff --git a/components/services/storage/public/cpp/filesystem/strict_relative_path.typemap b/components/services/storage/public/cpp/filesystem/strict_relative_path.typemap
new file mode 100644
index 0000000..cfe8636
--- /dev/null
+++ b/components/services/storage/public/cpp/filesystem/strict_relative_path.typemap
@@ -0,0 +1,10 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+mojom = "//components/services/storage/public/mojom/filesystem/directory.mojom"
+public_headers = [ "//base/files/file_path.h" ]
+traits_headers = [ "//components/services/storage/public/cpp/filesystem/strict_relative_path_mojom_traits.h" ]
+public_deps =
+    [ "//components/services/storage/public/cpp/filesystem:typemap_traits" ]
+type_mappings = [ "storage.mojom.StrictRelativePath=::base::FilePath" ]
diff --git a/components/services/storage/public/cpp/filesystem/strict_relative_path_mojom_traits.cc b/components/services/storage/public/cpp/filesystem/strict_relative_path_mojom_traits.cc
new file mode 100644
index 0000000..317425d
--- /dev/null
+++ b/components/services/storage/public/cpp/filesystem/strict_relative_path_mojom_traits.cc
@@ -0,0 +1,29 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/services/storage/public/cpp/filesystem/strict_relative_path_mojom_traits.h"
+
+#include <utility>
+
+#include "base/logging.h"
+#include "mojo/public/cpp/base/file_path_mojom_traits.h"
+
+namespace mojo {
+
+bool StructTraits<storage::mojom::StrictRelativePathDataView, base::FilePath>::
+    Read(storage::mojom::StrictRelativePathDataView data, base::FilePath* out) {
+  base::FilePath path;
+  if (!data.ReadPath(&path))
+    return false;
+  if (path.IsAbsolute() || path.ReferencesParent()) {
+    DLOG(ERROR) << "Rejecting non-relative or non-descending path: "
+                << path.value();
+    return false;
+  }
+
+  *out = std::move(path);
+  return true;
+}
+
+}  // namespace mojo
diff --git a/components/services/storage/public/cpp/filesystem/strict_relative_path_mojom_traits.h b/components/services/storage/public/cpp/filesystem/strict_relative_path_mojom_traits.h
new file mode 100644
index 0000000..451b2b0
--- /dev/null
+++ b/components/services/storage/public/cpp/filesystem/strict_relative_path_mojom_traits.h
@@ -0,0 +1,26 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_SERVICES_STORAGE_PUBLIC_CPP_FILESYSTEM_STRICT_RELATIVE_PATH_MOJOM_TRAITS_H_
+#define COMPONENTS_SERVICES_STORAGE_PUBLIC_CPP_FILESYSTEM_STRICT_RELATIVE_PATH_MOJOM_TRAITS_H_
+
+#include "base/component_export.h"
+#include "base/files/file_path.h"
+#include "components/services/storage/public/mojom/filesystem/directory.mojom-shared.h"
+#include "mojo/public/cpp/bindings/struct_traits.h"
+
+namespace mojo {
+
+template <>
+struct COMPONENT_EXPORT(STORAGE_SERVICE_FILESYSTEM_TYPEMAP_TRAITS)
+    StructTraits<storage::mojom::StrictRelativePathDataView, base::FilePath> {
+ public:
+  static const base::FilePath& path(const base::FilePath& path) { return path; }
+  static bool Read(storage::mojom::StrictRelativePathDataView data,
+                   base::FilePath* out);
+};
+
+}  // namespace mojo
+
+#endif  // COMPONENTS_SERVICES_STORAGE_PUBLIC_CPP_FILESYSTEM_STRICT_RELATIVE_PATH_MOJOM_TRAITS_H_
diff --git a/components/services/storage/public/cpp/filesystem/typemaps.gni b/components/services/storage/public/cpp/filesystem/typemaps.gni
new file mode 100644
index 0000000..3ea0b2c
--- /dev/null
+++ b/components/services/storage/public/cpp/filesystem/typemaps.gni
@@ -0,0 +1,5 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+typemaps = [ "//components/services/storage/public/cpp/filesystem/strict_relative_path.typemap" ]
diff --git a/components/services/storage/public/mojom/BUILD.gn b/components/services/storage/public/mojom/BUILD.gn
index 0f58a25..f1943227 100644
--- a/components/services/storage/public/mojom/BUILD.gn
+++ b/components/services/storage/public/mojom/BUILD.gn
@@ -18,6 +18,7 @@
   ]
 
   public_deps = [
+    "//components/services/storage/public/mojom/filesystem",
     "//mojo/public/mojom/base",
     "//third_party/blink/public/mojom:mojom_platform",
     "//url/mojom:url_mojom_origin",
diff --git a/components/services/storage/public/mojom/filesystem/BUILD.gn b/components/services/storage/public/mojom/filesystem/BUILD.gn
new file mode 100644
index 0000000..63105ae
--- /dev/null
+++ b/components/services/storage/public/mojom/filesystem/BUILD.gn
@@ -0,0 +1,14 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//mojo/public/tools/bindings/mojom.gni")
+
+mojom_component("filesystem") {
+  output_prefix = "storage_service_filesystem_mojom"
+  macro_prefix = "STORAGE_SERVICE_FILESYSTEM_MOJOM"
+
+  sources = [ "directory.mojom" ]
+
+  public_deps = [ "//mojo/public/mojom/base" ]
+}
diff --git a/components/services/storage/public/mojom/filesystem/OWNERS b/components/services/storage/public/mojom/filesystem/OWNERS
new file mode 100644
index 0000000..08850f4
--- /dev/null
+++ b/components/services/storage/public/mojom/filesystem/OWNERS
@@ -0,0 +1,2 @@
+per-file *.mojom=set noparent
+per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/components/services/storage/public/mojom/filesystem/directory.mojom b/components/services/storage/public/mojom/filesystem/directory.mojom
new file mode 100644
index 0000000..f633020
--- /dev/null
+++ b/components/services/storage/public/mojom/filesystem/directory.mojom
@@ -0,0 +1,142 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module storage.mojom;
+
+import "mojo/public/mojom/base/file.mojom";
+import "mojo/public/mojom/base/file_error.mojom";
+import "mojo/public/mojom/base/file_info.mojom";
+import "mojo/public/mojom/base/file_path.mojom";
+
+// Determines how |Directory.GetEntries()| operates.
+enum GetEntriesMode {
+  // Only regular files will be enumerated.
+  kFilesOnly,
+
+  // Both files and directories will be enumerated.
+  kFilesAndDirectories,
+};
+
+// A special type of file path which, unlike mojo_base.mojom.FilePath, is
+// restricted to descending (i.e. no references to parent directories via "..")
+// relative (i.e. non-absolute) paths only. For C++ bindings, this is enforced
+// by type-mapping traits.
+struct StrictRelativePath {
+  // The actual path data.
+  mojo_base.mojom.FilePath path;
+};
+
+// Indicates how a file should be opened and/or created by
+// |Directory.OpenFile()|.
+enum FileOpenMode {
+  // Only opens the file if it already exists.
+  kOpenIfExists,
+
+  // Only creates and opens the file if it did not already exist.
+  kCreateAndOpenOnlyIfNotExists,
+
+  // Always opens the file, creating a new one only if it didn't already exist.
+  kAlwaysOpen,
+
+  // Always creates a new file, overwriting any old file that may exist.
+  kAlwaysCreate,
+
+  // Only opens the file if it already exists, truncating the file on open.
+  kOpenIfExistsAndTruncate,
+};
+
+// Indicates the type of read access a file should have when opened by
+// |Directory.OpenFile()|.
+enum FileReadAccess {
+  // No read access.
+  kReadNotAllowed,
+
+  // Read access allowed.
+  kReadAllowed,
+};
+
+// Indicates the type of write access a file should have when opened by
+// |Directory.OpenFile()|.
+enum FileWriteAccess {
+  // No write access.
+  kWriteNotAllowed,
+
+  // Full write access allowed.
+  kWriteAllowed,
+
+  // Append-only write access allowed.
+  kAppendOnly,
+};
+
+// An empty interface used to hold remote ownership of a lock acquired via
+// |Directory.LockFile()| below. Closing the remote endpoint of this interface
+// effectively releases the corresponding lock even if |Release()| is not
+// called.
+interface FileLock {
+  // Immediately releases the lock. After this is called once, the FileLock is
+  // permanently released. Subsequent disconnection or calls to |Release()| will
+  // have no interesting side-effects.
+  [Sync] Release() => (mojo_base.mojom.FileError error);
+};
+
+// A client interface consumed by the Storage Service in order to access
+// directory contents from within a sandboxed process. Must be implemented by
+// a more privileged process like the browser.
+//
+// Each bound Directory interface corresponds to a fixed directory in the
+// filesystem, and all StrictRelatvePath references must be interpreted as
+// relative to that directory.
+interface Directory {
+  // Indicates whether |path| exists.
+  [Sync]
+  PathExists(StrictRelativePath path) => (bool exists);
+
+  // Enumerates all files and/or subdirectories within |path|. Not recursive.
+  // All returned paths are relative to |path|.
+  [Sync]
+  GetEntries(StrictRelativePath path, GetEntriesMode mode)
+      => (mojo_base.mojom.FileError error,
+          array<mojo_base.mojom.FilePath> entries);
+
+  // Opens a file at |path|.
+  [Sync]
+  OpenFile(StrictRelativePath path,
+           FileOpenMode mode,
+           FileReadAccess read_access,
+           FileWriteAccess write_access)
+      => (mojo_base.mojom.FileError error, mojo_base.mojom.File? file);
+
+  // Deletes a regular file at |path|.
+  [Sync]
+  RemoveFile(StrictRelativePath path) => (bool success);
+
+  // Creates a new directory at |path|.
+  [Sync]
+  CreateDirectory(StrictRelativePath path) => (mojo_base.mojom.FileError error);
+
+  // Deletes a directory at |path|. Not recursive. If the directory at |path|
+  // contains only files (i.e. no subdirectories), all contents are deleted.
+  [Sync]
+  RemoveDirectory(StrictRelativePath path) => (bool success);
+
+  // Retrieves information about a specific filesystem entry at |path|. Returns
+  // null on failure, or a populated |info| struct on success.
+  [Sync]
+  GetFileInfo(StrictRelativePath path) => (mojo_base.mojom.FileInfo? info);
+
+  // Renames a file from |old_path| to |new_path|. Note that if |new_path|
+  // already exists, it will be overwritten by this call.
+  [Sync]
+  RenameFile(StrictRelativePath old_path, StrictRelativePath new_path)
+      => (mojo_base.mojom.FileError error);
+
+  // Attempts to acquire an exclusive lock on the lock file identified by
+  // |path|, creating a new file if it didn't already exist. Upon success,
+  // |error| will be FILE_OK, and |lock| will be valid. As long as the caller
+  // retains |lock|, the acquired lock will be held. Destroying |lock| or
+  // explicitly calling |Release()| on it releases the lock.
+  [Sync]
+  LockFile(StrictRelativePath path) => (mojo_base.mojom.FileError error,
+                                        pending_remote<FileLock>? lock);
+};
diff --git a/components/viz/service/display/surface_aggregator.cc b/components/viz/service/display/surface_aggregator.cc
index feca534f..3c3f87d 100644
--- a/components/viz/service/display/surface_aggregator.cc
+++ b/components/viz/service/display/surface_aggregator.cc
@@ -864,15 +864,21 @@
     display_transform_render_pass_id_ = next_render_pass_id_++;
 
   auto display_transform_pass = RenderPass::Create(1, 1);
-  display_transform_pass->SetNew(
+  display_transform_pass->SetAll(
       display_transform_render_pass_id_,
       cc::MathUtil::MapEnclosedRectWith2dAxisAlignedTransform(
           root_surface_transform_, root_render_pass->output_rect),
       cc::MathUtil::MapEnclosedRectWith2dAxisAlignedTransform(
           root_surface_transform_, root_render_pass->damage_rect),
-      gfx::Transform());
-  display_transform_pass->content_color_usage =
-      root_render_pass->content_color_usage;
+      gfx::Transform(),
+      /*filters=*/cc::FilterOperations(),
+      /*backdrop_filters=*/cc::FilterOperations(),
+      /*backdrop_filter_bounds=*/gfx::RRectF(),
+      root_render_pass->content_color_usage,
+      root_render_pass->has_transparent_background,
+      /*cache_render_pass=*/false,
+      /*has_damage_from_contributing_content=*/false,
+      /*generate_mipmap=*/false);
 
   bool are_contents_opaque = true;
   for (const auto* sqs : root_render_pass->shared_quad_state_list) {
diff --git a/components/viz/service/display_embedder/gl_output_surface.cc b/components/viz/service/display_embedder/gl_output_surface.cc
index b6ed444..9591030 100644
--- a/components/viz/service/display_embedder/gl_output_surface.cc
+++ b/components/viz/service/display_embedder/gl_output_surface.cc
@@ -36,9 +36,7 @@
           context_provider->ContextCapabilities()
               .use_gpu_fences_for_overlay_planes) {
   const auto& context_capabilities = context_provider->ContextCapabilities();
-  capabilities_.output_surface_origin = context_capabilities.flips_vertically
-                                            ? gfx::SurfaceOrigin::kTopLeft
-                                            : gfx::SurfaceOrigin::kBottomLeft;
+  capabilities_.output_surface_origin = context_capabilities.surface_origin;
   capabilities_.supports_stencil = context_capabilities.num_stencil_bits > 0;
   // Since one of the buffers is used by the surface for presentation, there can
   // be at most |num_surface_buffers - 1| pending buffers that the compositor
diff --git a/content/browser/net/reporting_service_proxy.cc b/content/browser/net/reporting_service_proxy.cc
index 8175d2d..24c4c40 100644
--- a/content/browser/net/reporting_service_proxy.cc
+++ b/content/browser/net/reporting_service_proxy.cc
@@ -131,6 +131,29 @@
     QueueReport(url, "default", "feature-policy-violation", std::move(body));
   }
 
+  void QueueDocumentPolicyViolationReport(
+      const GURL& url,
+      const std::string& group,
+      const std::string& policy_id,
+      const std::string& disposition,
+      const base::Optional<std::string>& message,
+      const base::Optional<std::string>& source_file,
+      int line_number,
+      int column_number) override {
+    auto body = std::make_unique<base::DictionaryValue>();
+    body->SetString("policyId", policy_id);
+    body->SetString("disposition", disposition);
+    if (message)
+      body->SetString("message", *message);
+    if (source_file)
+      body->SetString("sourceFile", *source_file);
+    if (line_number)
+      body->SetInteger("lineNumber", line_number);
+    if (column_number)
+      body->SetInteger("columnNumber", column_number);
+    QueueReport(url, group, "document-policy-violation", std::move(body));
+  }
+
  private:
   void QueueReport(const GURL& url,
                    const std::string& group,
diff --git a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
index 7c259c07..310df90 100644
--- a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
@@ -34,9 +34,6 @@
 [ android android-webview-instrumentation ] Pixel_Canvas2DTabSwitch [ Skip ]
 [ android android-webview-instrumentation ] Pixel_WebGLReadPixelsTabSwitch [ Skip ]
 
-# Failing on Android Pixel 2 with SkiaRenderer Vulkan
-crbug.com/1049864 [ android android-not-webview qualcomm-adreno-(tm)-540 skia-renderer use-vulkan ] Pixel_WebGLReadPixelsTabSwitch [ Failure ]
-
 # Tests running with SwiftShader are skipped on platforms where SwiftShader
 # isn't supported.
 [ mac ] Pixel_Canvas2DRedBox_SwiftShader [ Skip ]
@@ -56,22 +53,6 @@
 [ android ] Pixel_CSS3DBlueBox_NoGpuProcess [ Skip ]
 [ chromeos ] Pixel_CSS3DBlueBox_NoGpuProcess [ Skip ]
 
-# Skip tests on Android WebView that requires embedding viz clients. This
-# includes offscreen canvas and other features. crbug.com/805739 tracks
-# making this work.
-crbug.com/805739 [ android android-webview-instrumentation ] Pixel_OffscreenCanvas2DResizeOnWorker [ Skip ]
-crbug.com/805739 [ android-webview-instrumentation ] Pixel_OffscreenCanvasAccelerated2D [ Skip ]
-crbug.com/805739 [ android-webview-instrumentation ] Pixel_OffscreenCanvasAccelerated2DWorker [ Skip ]
-crbug.com/805739 [ android-webview-instrumentation ] Pixel_OffscreenCanvasTransferAfterStyleResize [ Skip ]
-crbug.com/805739 [ android android-webview-instrumentation ] Pixel_OffscreenCanvasTransferBeforeStyleResize [ Skip ]
-crbug.com/805739 [ android-webview-instrumentation ] Pixel_OffscreenCanvasWebGLDefault [ Skip ]
-crbug.com/805739 [ android-webview-instrumentation ] Pixel_OffscreenCanvasWebGLDefaultWorker [ Skip ]
-crbug.com/805739 [ android-webview-instrumentation ] Pixel_OffscreenCanvasWebGLPaintAfterResize [ Skip ]
-crbug.com/805739 [ android android-webview-instrumentation ] Pixel_OffscreenCanvasWebglResizeOnWorker [ Skip ]
-crbug.com/805739 [ android android-webview-instrumentation ] Pixel_CanvasLowLatencyWebGL [ Skip ]
-crbug.com/992599 [ android android-webview-instrumentation ] Pixel_OffscreenCanvasTransferToImageBitmapWorker [ Skip ]
-crbug.com/992599 [ android android-webview-instrumentation ] Pixel_OffscreenCanvasTransferToImageBitmap [ Skip ]
-
 # Fails on Android WebView due to requiring embedding viz clients. crbug.com/805739
 # Produces black images on Nexus 5Xs in Android Webview (qualcomm-adreno-(tm)-418) crbug.com/984352
 # Fails on Pixel 2 (qualcomm-adreno-(tm)-540) crbug.com/966069
diff --git a/gpu/command_buffer/common/capabilities.h b/gpu/command_buffer/common/capabilities.h
index 577e3bdf..80f2a3b 100644
--- a/gpu/command_buffer/common/capabilities.h
+++ b/gpu/command_buffer/common/capabilities.h
@@ -11,6 +11,7 @@
 #include "gpu/command_buffer/common/gpu_memory_buffer_support.h"
 #include "gpu/gpu_export.h"
 #include "ui/gfx/buffer_types.h"
+#include "ui/gfx/surface_origin.h"
 
 // From gl2.h. We want to avoid including gl headers because client-side and
 // service-side headers conflict.
@@ -163,7 +164,7 @@
   bool occlusion_query_boolean = false;
   bool timer_queries = false;
   bool surfaceless = false;
-  bool flips_vertically = false;
+  gfx::SurfaceOrigin surface_origin = gfx::SurfaceOrigin::kBottomLeft;
   bool msaa_is_slow = false;
   bool disable_one_component_textures = false;
   bool gpu_rasterization = false;
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 5b94de5..15bbc88 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -4293,8 +4293,8 @@
   caps.commit_overlay_planes = supports_commit_overlay_planes_;
   caps.surfaceless = surfaceless_;
   bool is_offscreen = !!offscreen_target_frame_buffer_.get();
-  caps.flips_vertically =
-      !is_offscreen && (surface_->GetOrigin() == gfx::SurfaceOrigin::kTopLeft);
+  caps.surface_origin =
+      !is_offscreen ? surface_->GetOrigin() : gfx::SurfaceOrigin::kBottomLeft;
   caps.msaa_is_slow = workarounds().msaa_is_slow;
   caps.avoid_stencil_buffers = workarounds().avoid_stencil_buffers;
   caps.multisample_compatibility =
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc
index f29f98fd..0194453 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc
@@ -1589,8 +1589,8 @@
   caps.post_sub_buffer = surface_->SupportsPostSubBuffer();
   caps.swap_buffers_with_bounds = surface_->SupportsSwapBuffersWithBounds();
   caps.surfaceless = !offscreen_ && surface_->IsSurfaceless();
-  caps.flips_vertically =
-      !offscreen_ && (surface_->GetOrigin() == gfx::SurfaceOrigin::kTopLeft);
+  caps.surface_origin =
+      !offscreen_ ? surface_->GetOrigin() : gfx::SurfaceOrigin::kBottomLeft;
   caps.msaa_is_slow = feature_info_->workarounds().msaa_is_slow;
   caps.avoid_stencil_buffers =
       feature_info_->workarounds().avoid_stencil_buffers;
diff --git a/gpu/config/gpu_driver_bug_list.json b/gpu/config/gpu_driver_bug_list.json
index 8fb4bce..797f3c8 100644
--- a/gpu/config/gpu_driver_bug_list.json
+++ b/gpu/config/gpu_driver_bug_list.json
@@ -3567,6 +3567,22 @@
       "features": [
         "dont_delete_source_texture_for_egl_image"
       ]
+    },
+    {
+      "id":335,
+      "cr_bugs": [1051705],
+      "description": "Disable AImageReader on ARM GPUs",
+      "os": {
+        "type": "android",
+        "version": {
+          "op": "<",
+          "value": "10"
+        }
+      },
+      "gl_vendor": "ARM.*",
+      "features": [
+        "disable_aimagereader"
+      ]
     }
   ]
 }
diff --git a/gpu/config/gpu_finch_features.cc b/gpu/config/gpu_finch_features.cc
index 624905b..a4e6473 100644
--- a/gpu/config/gpu_finch_features.cc
+++ b/gpu/config/gpu_finch_features.cc
@@ -64,7 +64,7 @@
 
 // Gpu watchdog V2 to simplify the logic and reduce GPU hangs
 const base::Feature kGpuWatchdogV2{"GpuWatchdogV2",
-                                   base::FEATURE_DISABLED_BY_DEFAULT};
+                                   base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Use a different set of watchdog timeouts on V1
 const base::Feature kGpuWatchdogV1NewTimeout{"GpuWatchdogV1NewTimeout",
diff --git a/gpu/config/gpu_workaround_list.txt b/gpu/config/gpu_workaround_list.txt
index 2898f28..c3b96b8e 100644
--- a/gpu/config/gpu_workaround_list.txt
+++ b/gpu/config/gpu_workaround_list.txt
@@ -13,6 +13,7 @@
 depth_stencil_renderbuffer_resize_emulation
 disable_2d_canvas_auto_flush
 disable_accelerated_vpx_decode
+disable_aimagereader
 disable_async_readpixels
 disable_av_sample_buffer_display_layer
 disable_blend_equation_advanced
diff --git a/gpu/ipc/common/gpu_command_buffer_traits_multi.h b/gpu/ipc/common/gpu_command_buffer_traits_multi.h
index bd65b37e..054b3e56 100644
--- a/gpu/ipc/common/gpu_command_buffer_traits_multi.h
+++ b/gpu/ipc/common/gpu_command_buffer_traits_multi.h
@@ -29,6 +29,7 @@
 IPC_ENUM_TRAITS_MAX_VALUE(gl::GpuPreference, gl::GpuPreference::kMaxValue)
 IPC_ENUM_TRAITS_MAX_VALUE(gpu::ContextType, gpu::CONTEXT_TYPE_LAST)
 IPC_ENUM_TRAITS_MAX_VALUE(gpu::ColorSpace, gpu::COLOR_SPACE_LAST)
+IPC_ENUM_TRAITS_MAX_VALUE(gfx::SurfaceOrigin, gfx::SurfaceOrigin::kBottomLeft)
 
 IPC_STRUCT_TRAITS_BEGIN(gpu::Capabilities::ShaderPrecision)
   IPC_STRUCT_TRAITS_MEMBER(min_range)
@@ -131,7 +132,7 @@
   IPC_STRUCT_TRAITS_MEMBER(occlusion_query_boolean)
   IPC_STRUCT_TRAITS_MEMBER(timer_queries)
   IPC_STRUCT_TRAITS_MEMBER(surfaceless)
-  IPC_STRUCT_TRAITS_MEMBER(flips_vertically)
+  IPC_STRUCT_TRAITS_MEMBER(surface_origin)
   IPC_STRUCT_TRAITS_MEMBER(msaa_is_slow)
   IPC_STRUCT_TRAITS_MEMBER(disable_one_component_textures)
   IPC_STRUCT_TRAITS_MEMBER(gpu_rasterization)
diff --git a/gpu/ipc/service/gpu_init.cc b/gpu/ipc/service/gpu_init.cc
index 37a7f67..f89a00a 100644
--- a/gpu/ipc/service/gpu_init.cc
+++ b/gpu/ipc/service/gpu_init.cc
@@ -506,6 +506,12 @@
   ui::OzonePlatform::GetInstance()->AfterSandboxEntry();
 #endif
 
+#if defined(OS_ANDROID)
+  // Disable AImageReader if the workaround is enabled.
+  if (gpu_feature_info_.IsWorkaroundEnabled(DISABLE_AIMAGEREADER)) {
+    base::android::AndroidImageReader::DisableSupport();
+  }
+#endif
 #if defined(USE_OZONE)
   gpu_feature_info_.supported_buffer_formats_for_allocation_and_texturing =
       std::move(supported_buffer_formats_for_texturing);
@@ -532,6 +538,11 @@
 
   default_offscreen_surface_ = gl::init::CreateOffscreenGLSurface(gfx::Size());
 
+  // Disable AImageReader if the workaround is enabled.
+  if (gpu_feature_info_.IsWorkaroundEnabled(DISABLE_AIMAGEREADER)) {
+    base::android::AndroidImageReader::DisableSupport();
+  }
+
   UMA_HISTOGRAM_ENUMERATION("GPU.GLImplementation", gl::GetGLImplementation());
 }
 #else
diff --git a/gpu/ipc/service/gpu_watchdog_thread_unittest.cc b/gpu/ipc/service/gpu_watchdog_thread_unittest.cc
index 925457e..614d87e 100644
--- a/gpu/ipc/service/gpu_watchdog_thread_unittest.cc
+++ b/gpu/ipc/service/gpu_watchdog_thread_unittest.cc
@@ -20,9 +20,6 @@
 constexpr auto kGpuWatchdogTimeoutForTesting =
     base::TimeDelta::FromMilliseconds(1000);
 
-constexpr base::TimeDelta kMaxWaitTimeForTesting =
-    base::TimeDelta::FromMilliseconds(4000);
-
 // This task will run for duration_ms milliseconds.
 void SimpleTask(base::TimeDelta duration) {
   base::PlatformThread::Sleep(duration);
@@ -74,7 +71,6 @@
   watchdog_thread_ = gpu::GpuWatchdogThreadImplV2::Create(
       /*start_backgrounded*/ false,
       /*timeout*/ kGpuWatchdogTimeoutForTesting,
-      /*max_wait_time*/ kMaxWaitTimeForTesting,
       /*test_mode*/ true);
 }
 
@@ -146,10 +142,10 @@
   SimpleTask(kGpuWatchdogTimeoutForTesting * kInitFactor +
              kGpuWatchdogTimeoutForTesting *
                  kMaxCountOfMoreGpuThreadTimeAllowed +
-             kMaxWaitTimeForTesting + base::TimeDelta::FromMilliseconds(3000));
+             base::TimeDelta::FromMilliseconds(3000));
 #else
   SimpleTask(kGpuWatchdogTimeoutForTesting * kInitFactor +
-             kMaxWaitTimeForTesting + base::TimeDelta::FromMilliseconds(3000));
+             base::TimeDelta::FromMilliseconds(3000));
 #endif
 
   // Gpu hangs. OnInitComplete() is not called
@@ -203,13 +199,13 @@
       base::BindOnce(&SimpleTask, kGpuWatchdogTimeoutForTesting * 2 +
                                       kGpuWatchdogTimeoutForTesting *
                                           kMaxCountOfMoreGpuThreadTimeAllowed +
-                                      kMaxWaitTimeForTesting +
+
                                       base::TimeDelta::FromMilliseconds(4000)));
 #else
   task_environment_.GetMainThreadTaskRunner()->PostTask(
       FROM_HERE,
       base::BindOnce(&SimpleTask, kGpuWatchdogTimeoutForTesting * 2 +
-                                      kMaxWaitTimeForTesting +
+
                                       base::TimeDelta::FromMilliseconds(4000)));
 #endif
 
@@ -262,7 +258,7 @@
                      /*duration*/ kGpuWatchdogTimeoutForTesting * 2 +
                          kGpuWatchdogTimeoutForTesting *
                              kMaxCountOfMoreGpuThreadTimeAllowed +
-                         kMaxWaitTimeForTesting +
+
                          base::TimeDelta::FromMilliseconds(4200),
                      /*time_to_switch_to_foreground*/
                      base::TimeDelta::FromMilliseconds(200)));
@@ -272,7 +268,7 @@
       base::BindOnce(&GpuWatchdogTest::LongTaskFromBackgroundToForeground,
                      base::Unretained(this),
                      /*duration*/ kGpuWatchdogTimeoutForTesting * 2 +
-                         kMaxWaitTimeForTesting +
+
                          base::TimeDelta::FromMilliseconds(4200),
                      /*time_to_switch_to_foreground*/
                      base::TimeDelta::FromMilliseconds(200)));
@@ -308,10 +304,10 @@
   SimpleTask(kGpuWatchdogTimeoutForTesting * kInitFactor +
              kGpuWatchdogTimeoutForTesting *
                  kMaxCountOfMoreGpuThreadTimeAllowed +
-             kMaxWaitTimeForTesting + base::TimeDelta::FromMilliseconds(4000));
+             base::TimeDelta::FromMilliseconds(4000));
 #else
   SimpleTask(kGpuWatchdogTimeoutForTesting * kInitFactor +
-             kMaxWaitTimeForTesting + base::TimeDelta::FromMilliseconds(4000));
+             base::TimeDelta::FromMilliseconds(4000));
 #endif
 
   // A GPU hang should be detected.
@@ -354,7 +350,7 @@
           /*duration*/ kGpuWatchdogTimeoutForTesting * kRestartFactor +
               kGpuWatchdogTimeoutForTesting *
                   kMaxCountOfMoreGpuThreadTimeAllowed +
-              kMaxWaitTimeForTesting + base::TimeDelta::FromMilliseconds(4200),
+              base::TimeDelta::FromMilliseconds(4200),
           /*time_to_power_resume*/
           base::TimeDelta::FromMilliseconds(200)));
 #else
@@ -363,7 +359,7 @@
       base::BindOnce(
           &GpuWatchdogPowerTest::LongTaskOnResume, base::Unretained(this),
           /*duration*/ kGpuWatchdogTimeoutForTesting * kRestartFactor +
-              kMaxWaitTimeForTesting + base::TimeDelta::FromMilliseconds(4200),
+              base::TimeDelta::FromMilliseconds(4200),
           /*time_to_power_resume*/
           base::TimeDelta::FromMilliseconds(200)));
 #endif
diff --git a/gpu/ipc/service/gpu_watchdog_thread_v2.cc b/gpu/ipc/service/gpu_watchdog_thread_v2.cc
index bd567ec7..300eebdd 100644
--- a/gpu/ipc/service/gpu_watchdog_thread_v2.cc
+++ b/gpu/ipc/service/gpu_watchdog_thread_v2.cc
@@ -26,11 +26,9 @@
 namespace gpu {
 
 GpuWatchdogThreadImplV2::GpuWatchdogThreadImplV2(base::TimeDelta timeout,
-                                                 base::TimeDelta max_wait_time,
                                                  bool is_test_mode)
     : watchdog_timeout_(timeout),
       in_gpu_initialization_(true),
-      max_wait_time_(max_wait_time),
       is_test_mode_(is_test_mode),
       watched_gpu_task_runner_(base::ThreadTaskRunnerHandle::Get()) {
   base::MessageLoopCurrent::Get()->AddTaskObserver(this);
@@ -83,10 +81,9 @@
 std::unique_ptr<GpuWatchdogThreadImplV2> GpuWatchdogThreadImplV2::Create(
     bool start_backgrounded,
     base::TimeDelta timeout,
-    base::TimeDelta max_wait_time,
     bool is_test_mode) {
-  auto watchdog_thread = base::WrapUnique(
-      new GpuWatchdogThreadImplV2(timeout, max_wait_time, is_test_mode));
+  auto watchdog_thread =
+      base::WrapUnique(new GpuWatchdogThreadImplV2(timeout, is_test_mode));
   base::Thread::Options options;
   options.timer_slack = base::TIMER_SLACK_MAXIMUM;
   watchdog_thread->StartWithOptions(options);
@@ -98,7 +95,7 @@
 // static
 std::unique_ptr<GpuWatchdogThreadImplV2> GpuWatchdogThreadImplV2::Create(
     bool start_backgrounded) {
-  return Create(start_backgrounded, kGpuWatchdogTimeout, kMaxWaitTime, false);
+  return Create(start_backgrounded, kGpuWatchdogTimeout, false);
 }
 
 // Do not add power observer during watchdog init, PowerMonitor might not be up
@@ -386,8 +383,6 @@
   DCHECK(!in_power_suspension_);
   DCHECK(!is_paused_);
 
-  base::TimeTicks on_watchdog_timeout_start = base::TimeTicks::Now();
-
   // If this metric is added too early (eg. watchdog creation time), it cannot
   // be persistent. The histogram data will be lost after crash or browser exit.
   // Delay the recording of kGpuWatchdogStart until the firs
@@ -430,34 +425,11 @@
     return;
   }
 
-  // An experiment for all platforms: Wait for max_wait_time_ and see if GPU
-  // will response.
-  GpuWatchdogTimeoutHistogram(GpuWatchdogTimeoutEvent::kTimeoutWait);
-  if (GpuRespondsAfterWaiting(on_watchdog_timeout_start)) {
-    last_on_watchdog_timeout_timeticks_ = base::TimeTicks::Now();
-    last_arm_disarm_counter_ =
-        base::subtle::NoBarrier_Load(&arm_disarm_counter_);
-
-    task_runner()->PostDelayedTask(
-        FROM_HERE,
-        base::BindOnce(&GpuWatchdogThreadImplV2::OnWatchdogTimeout, weak_ptr_),
-        watchdog_timeout_);
-    return;
-  }
-
   // Still armed without any progress. GPU possibly hangs.
   GpuWatchdogTimeoutHistogram(GpuWatchdogTimeoutEvent::kKill);
   DeliberatelyTerminateToRecoverFromHang();
 }
 
-bool GpuWatchdogThreadImplV2::GpuIsAlive() {
-  base::subtle::Atomic32 arm_disarm_counter =
-      base::subtle::NoBarrier_Load(&arm_disarm_counter_);
-  bool gpu_makes_progress = arm_disarm_counter != last_arm_disarm_counter_;
-
-  return (gpu_makes_progress);
-}
-
 bool GpuWatchdogThreadImplV2::WatchedThreadNeedsMoreTime(
     bool no_gpu_hang_detected) {
 #if defined(OS_WIN)
@@ -480,10 +452,6 @@
         count_of_more_gpu_thread_time_allowed_);
   }
 
-  // For metrics only - The extra time was give in timeouts.
-  time_in_extra_timeouts_ =
-      count_of_more_gpu_thread_time_allowed_ * watchdog_timeout_;
-
   // Calculate how many thread ticks the watched thread spent doing the work.
   base::ThreadTicks now = GetWatchedThreadTime();
   base::TimeDelta thread_time_elapsed =
@@ -546,31 +514,6 @@
 }
 #endif
 
-// This is an experiment on all platforms to see whether GPU will response
-// after waiting longer.
-bool GpuWatchdogThreadImplV2::GpuRespondsAfterWaiting(
-    base::TimeTicks on_watchdog_timeout_start) {
-  base::TimeDelta duration;
-  int count = 0;
-  NumOfUsersWaitHistogram(count++, false /*gpu_is_active*/);
-
-  while (duration < max_wait_time_) {
-    // Sleep for 1 seconds each time and check if the GPU makes a progress.
-    base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(1));
-    duration = base::TimeTicks::Now() - on_watchdog_timeout_start;
-    NumOfUsersWaitHistogram(count++, false /*gpu_is_active*/);
-
-    if (GpuIsAlive()) {
-      GpuWatchdogTimeoutHistogram(GpuWatchdogTimeoutEvent::kProgressAfterWait);
-      GpuWatchdogWaitTimeHistogram(duration);
-      NumOfUsersWaitHistogram(count++, true /*gpu_is_active*/);
-      return true;
-    }
-  }
-
-  return false;
-}
-
 void GpuWatchdogThreadImplV2::DeliberatelyTerminateToRecoverFromHang() {
   DCHECK(watchdog_thread_task_runner_->BelongsToCurrentThread());
   // If this is for gpu testing, do not terminate the gpu process.
@@ -620,7 +563,7 @@
       WithinOneMinFromPowerResumed() ? "1" : "0");
 
   // Deliberately crash the process to create a crash dump.
-  *((volatile int*)0) = 0xdeadface;
+  *static_cast<volatile int*>(nullptr) = 0x1337;
 }
 
 void GpuWatchdogThreadImplV2::GpuWatchdogHistogram(
@@ -707,58 +650,6 @@
 }
 #endif
 
-void GpuWatchdogThreadImplV2::GpuWatchdogWaitTimeHistogram(
-    base::TimeDelta wait_time) {
-#if defined(OS_WIN)
-  // Add the time the GPU thread was given for full thread time.
-  wait_time += time_in_extra_timeouts_;
-#endif
-
-  // Record the wait time in OnWatchdogTimeout() for the GPU main thread to
-  // make a progress. The maximum recodrding time is 150 seconds because
-  // Windows need to add the time spent before reaching here (max 60 sec).
-  constexpr base::TimeDelta kMin = base::TimeDelta::FromSeconds(1);
-  constexpr base::TimeDelta kMax = base::TimeDelta::FromSeconds(150);
-  constexpr int kBuckets = 50;
-  bool recorded = false;
-
-  base::UmaHistogramCustomTimes("GPU.WatchdogThread.WaitTime", wait_time, kMin,
-                                kMax, kBuckets);
-
-  if (in_gpu_initialization_) {
-    base::UmaHistogramCustomTimes("GPU.WatchdogThread.WaitTime.Init", wait_time,
-                                  kMin, kMax, kBuckets);
-    recorded = true;
-  }
-
-  if (WithinOneMinFromPowerResumed()) {
-    base::UmaHistogramCustomTimes("GPU.WatchdogThread.WaitTime.PowerResume",
-                                  wait_time, kMin, kMax, kBuckets);
-    recorded = true;
-  }
-
-  if (WithinOneMinFromForegrounded()) {
-    base::UmaHistogramCustomTimes("GPU.WatchdogThread.WaitTime.Foregrounded",
-                                  wait_time, kMin, kMax, kBuckets);
-    recorded = true;
-  }
-
-  if (!recorded) {
-    base::UmaHistogramCustomTimes("GPU.WatchdogThread.WaitTime.Normal",
-                                  wait_time, kMin, kMax, kBuckets);
-  }
-}
-
-void GpuWatchdogThreadImplV2::NumOfUsersWaitHistogram(int count,
-                                                      bool gpu_is_active) {
-  constexpr int kMax = 60;  // == kMaxWaitTime.InSeconds();
-
-  base::UmaHistogramExactLinear(
-      gpu_is_active ? "GPU.WatchdogThread.WaitTime.ProgressAfterWait"
-                    : "GPU.WatchdogThread.WaitTime.NumOfUsers",
-      count, kMax);
-}
-
 bool GpuWatchdogThreadImplV2::WithinOneMinFromPowerResumed() {
   size_t count = base::TimeDelta::FromSeconds(60) / watchdog_timeout_;
   return power_resumed_event_ && num_of_timeout_after_power_resume_ <= count;
diff --git a/gpu/ipc/service/gpu_watchdog_thread_v2.h b/gpu/ipc/service/gpu_watchdog_thread_v2.h
index 8e76057..dd00b6b 100644
--- a/gpu/ipc/service/gpu_watchdog_thread_v2.h
+++ b/gpu/ipc/service/gpu_watchdog_thread_v2.h
@@ -14,7 +14,6 @@
 // OnGPUWatchdogTimeout for at most 4 times before the gpu thread is killed.
 constexpr int kMaxCountOfMoreGpuThreadTimeAllowed = 4;
 #endif
-constexpr base::TimeDelta kMaxWaitTime = base::TimeDelta::FromSeconds(60);
 
 class GPU_IPC_SERVICE_EXPORT GpuWatchdogThreadImplV2
     : public GpuWatchdogThread,
@@ -26,7 +25,6 @@
   static std::unique_ptr<GpuWatchdogThreadImplV2> Create(
       bool start_backgrounded,
       base::TimeDelta timeout,
-      base::TimeDelta max_wait_time,
       bool test_mode);
 
   ~GpuWatchdogThreadImplV2() override;
@@ -67,7 +65,6 @@
   };
 
   GpuWatchdogThreadImplV2(base::TimeDelta timeout,
-                          base::TimeDelta max_wait_time,
                           bool test_mode);
   void OnAddPowerObserver();
   void RestartWatchdogTimeoutTask(PauseResumeSource source_of_request);
@@ -78,12 +75,10 @@
   void InProgress();
   bool IsArmed();
   void OnWatchdogTimeout();
-  bool GpuIsAlive();
   bool WatchedThreadNeedsMoreTime(bool no_gpu_hang_detected);
 #if defined(OS_WIN)
   base::ThreadTicks GetWatchedThreadTime();
 #endif
-  bool GpuRespondsAfterWaiting(base::TimeTicks on_watchdog_timeout_start);
 
   // Do not change the function name. It is used for [GPU HANG] carsh reports.
   void DeliberatelyTerminateToRecoverFromHang();
@@ -99,14 +94,6 @@
   void NumOfUsersWaitingWithExtraThreadTimeHistogram(int count);
 #endif
 
-  // The wait time in OnWatchdogTimeout() for the GPU main thread to make a
-  // progress.
-  void GpuWatchdogWaitTimeHistogram(base::TimeDelta wait_time);
-
-  // The number of users per second stay in Chrome after entering the 60-second
-  // wait time.
-  void NumOfUsersWaitHistogram(int count, bool gpu_is_active);
-
   // Used for metrics. It's 1 minute after the event.
   bool WithinOneMinFromPowerResumed();
   bool WithinOneMinFromForegrounded();
@@ -161,9 +148,6 @@
   // After GPU hang detected, how many times has the GPU thread been allowed to
   // continue due to not enough thread time.
   int count_of_more_gpu_thread_time_allowed_ = 0;
-
-  // The accumulated timeout time the GPU main thread was given.
-  base::TimeDelta time_in_extra_timeouts_;
 #endif
 
 #if defined(USE_X11)
@@ -203,7 +187,6 @@
   size_t num_of_timeout_after_foregrounded_ = 0;
   bool foregrounded_event_ = false;
   bool power_resumed_event_ = false;
-  base::TimeDelta max_wait_time_;
 
   // For gpu testing only.
   const bool is_test_mode_;
diff --git a/ios/build/bots/scripts/PRESUBMIT.py b/ios/build/bots/scripts/PRESUBMIT.py
deleted file mode 100644
index 395a79c..0000000
--- a/ios/build/bots/scripts/PRESUBMIT.py
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 2020 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Presubmit script for ios test runner scripts.
-
-See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
-for more details about the presubmit API built into depot_tools.
-"""
-
-
-def _RunTestRunnerUnitTests(input_api, output_api):
-  """ Runs iOS test runner unit tests """
-  # TODO(crbug.com/1056457): Replace whitelist with regex ".*_test.py" once
-  # all test files are fixed.
-  files = [
-      'coverage_util_test.py',
-      # 'iossim_util_test.py',
-      'run_test.py',
-      'shard_util_test.py',
-      'test_apps_test.py',
-      # 'test_runner_test.py',
-      'wpr_runner_test.py',
-      # 'xcode_log_parser_test.py',
-      # 'xcodebuild_runner_test.py',
-  ]
-
-  return input_api.canned_checks.RunUnitTestsInDirectory(
-      input_api, output_api, '.', whitelist=files)
-
-
-def CheckChange(input_api, output_api):
-  results = []
-  results.extend(_RunTestRunnerUnitTests(input_api, output_api))
-  return results
-
-
-def CheckChangeOnCommit(input_api, output_api):
-  return CheckChange(input_api, output_api)
-
-
-def CheckChangeOnUpload(input_api, output_api):
-  return CheckChange(input_api, output_api)
diff --git a/ios/build/bots/scripts/run.py b/ios/build/bots/scripts/run.py
index 260c5887..555a54cd 100755
--- a/ios/build/bots/scripts/run.py
+++ b/ios/build/bots/scripts/run.py
@@ -436,8 +436,8 @@
                      'both -p/--platform and -v/--version')
 
     args, test_args = parser.parse_known_args(args)
-    load_from_json(args)
     validate(args)
+    load_from_json(args)
     self.args = args
     self.test_args = test_args
 
diff --git a/ios/build/bots/scripts/test_apps_test.py b/ios/build/bots/scripts/test_apps_test.py
index 7a90156..bd1acfa6 100644
--- a/ios/build/bots/scripts/test_apps_test.py
+++ b/ios/build/bots/scripts/test_apps_test.py
@@ -3,8 +3,6 @@
 # found in the LICENSE file.
 """Unittests for test_apps.py."""
 
-import unittest
-
 import test_apps
 import test_runner_test
 
@@ -56,7 +54,3 @@
     expected = '-test.1:test.2'
 
     self.assertEqual(test_apps.get_gtest_filter(tests, invert=True), expected)
-
-
-if __name__ == '__main__':
-  unittest.main()
\ No newline at end of file
diff --git a/ios/build/bots/scripts/wpr_runner_test.py b/ios/build/bots/scripts/wpr_runner_test.py
index 729a1213..2284b1a 100644
--- a/ios/build/bots/scripts/wpr_runner_test.py
+++ b/ios/build/bots/scripts/wpr_runner_test.py
@@ -21,8 +21,12 @@
   def setUp(self):
     super(WprProxySimulatorTestRunnerTest, self).setUp()
 
+    def install_xcode(build, mac_toolchain_cmd, xcode_app_path):
+      return True
+
     self.mock(test_runner, 'get_current_xcode_info', lambda: {
         'version': 'test version', 'build': 'test build', 'path': 'test/path'})
+    self.mock(test_runner, 'install_xcode', install_xcode)
     self.mock(test_runner.subprocess, 'check_output',
               lambda _: 'fake-bundle-id')
     self.mock(os.path, 'abspath', lambda path: '/abs/path/to/%s' % path)
@@ -52,6 +56,8 @@
           'platform',
           'os',
           'wpr-tools-path',
+          'xcode-version',
+          'xcode-build',
           'out-dir',
       )
 
@@ -69,6 +75,8 @@
           'platform',
           'os',
           'wpr-tools-path',
+          'xcode-version',
+          'xcode-build',
           'out-dir',
       )
 
@@ -86,6 +94,8 @@
           'platform',
           'os',
           'bad-tools-path',
+          'xcode-version',
+          'xcode-build',
           'out-dir',
       )
 
@@ -99,6 +109,8 @@
         'platform',
         'os',
         'wpr-tools-path',
+        'xcode-version',
+        'xcode-build',
         'out-dir',
     )
 
@@ -153,6 +165,8 @@
         'platform',
         'os',
         'wpr-tools-path',
+        'xcode-version',
+        'xcode-build',
         'out-dir',
     )
     self.mock(wpr_runner.WprProxySimulatorTestRunner, 'wprgo_start',
diff --git a/ios/build/bots/scripts/xcode_log_parser_test.py b/ios/build/bots/scripts/xcode_log_parser_test.py
index 0d24e897..22c3472 100644
--- a/ios/build/bots/scripts/xcode_log_parser_test.py
+++ b/ios/build/bots/scripts/xcode_log_parser_test.py
@@ -7,7 +7,6 @@
 import json
 import mock
 import os
-import unittest
 
 import test_runner
 import test_runner_test
@@ -270,7 +269,3 @@
                      res['failed']['BUILD_INTERRUPTED'])
     self.assertEqual(['TestCase1/method1', 'TestCase2/method1'],
                      res['passed'])
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/ios/chrome/app/application_delegate/app_state.mm b/ios/chrome/app/application_delegate/app_state.mm
index e008395..5ddfce6 100644
--- a/ios/chrome/app/application_delegate/app_state.mm
+++ b/ios/chrome/app/application_delegate/app_state.mm
@@ -344,6 +344,8 @@
     feature_engagement::TrackerFactory::GetForBrowserState(currentBrowserState)
         ->NotifyEvent(feature_engagement::events::kChromeOpened);
   }
+
+  base::RecordAction(base::UserMetricsAction("MobileWillEnterForeground"));
 }
 
 - (void)resumeSessionWithTabOpener:(id<TabOpening>)tabOpener
diff --git a/ios/chrome/browser/autofill/automation/automation_egtest.mm b/ios/chrome/browser/autofill/automation/automation_egtest.mm
index fbab9d2c..aa6d16d8 100644
--- a/ios/chrome/browser/autofill/automation/automation_egtest.mm
+++ b/ios/chrome/browser/autofill/automation/automation_egtest.mm
@@ -15,7 +15,7 @@
 #import "ios/chrome/browser/autofill/automation/automation_app_interface.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
-#import "ios/testing/earl_grey/app_launch_manager.h"
+#import "ios/testing/earl_grey/app_launch_configuration.h"
 #import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -92,12 +92,11 @@
   return path;
 }
 
-- (void)launchAppForTestMethod {
-  [[AppLaunchManager sharedManager]
-      ensureAppLaunchedWithFeaturesEnabled:
-          {autofill::features::kAutofillShowTypePredictions}
-                                  disabled:{}
-                            relaunchPolicy:NoForceRelaunchAndResetState];
+- (AppLaunchConfiguration)appConfigurationForTestCase {
+  AppLaunchConfiguration config;
+  config.features_enabled.push_back(
+      autofill::features::kAutofillShowTypePredictions);
+  return config;
 }
 
 - (void)setUp {
diff --git a/ios/chrome/browser/main/BUILD.gn b/ios/chrome/browser/main/BUILD.gn
index a97707c..b44f7b3 100644
--- a/ios/chrome/browser/main/BUILD.gn
+++ b/ios/chrome/browser/main/BUILD.gn
@@ -4,6 +4,7 @@
 
 source_set("public") {
   sources = [
+    "all_web_state_list_observation_registrar.h",
     "browser.h",
     "browser_list.h",
     "browser_list_factory.h",
@@ -16,12 +17,14 @@
     "//components/keyed_service/core",
     "//components/keyed_service/ios",
     "//ios/chrome/browser/browser_state",
+    "//ios/chrome/browser/web_state_list",
   ]
   configs += [ "//build/config/compiler:enable_arc" ]
 }
 
 source_set("main") {
   sources = [
+    "all_web_state_list_observation_registrar.mm",
     "browser_agent_util.h",
     "browser_agent_util.mm",
     "browser_impl.h",
@@ -50,6 +53,7 @@
     "//ios/chrome/browser/tabs",
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/web_state_list",
+    "//ios/chrome/browser/web_state_list:agents",
     "//ios/chrome/browser/web_state_list/web_usage_enabler",
     "//ios/public/provider/chrome/browser",
   ]
@@ -82,6 +86,7 @@
 source_set("unit_tests") {
   testonly = true
   sources = [
+    "all_web_state_list_observation_registrar_unittest.mm",
     "browser_impl_unittest.mm",
     "browser_list_impl_unittest.mm",
   ]
diff --git a/ios/chrome/browser/main/all_web_state_list_observation_registrar.h b/ios/chrome/browser/main/all_web_state_list_observation_registrar.h
new file mode 100644
index 0000000..d858664
--- /dev/null
+++ b/ios/chrome/browser/main/all_web_state_list_observation_registrar.h
@@ -0,0 +1,73 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_MAIN_ALL_WEB_STATE_LIST_OBSERVATION_REGISTRAR_H_
+#define IOS_CHROME_BROWSER_MAIN_ALL_WEB_STATE_LIST_OBSERVATION_REGISTRAR_H_
+
+#include <memory>
+
+#include "base/scoped_observer.h"
+#include "ios/chrome/browser/main/browser_list_observer.h"
+#include "ios/chrome/browser/web_state_list/web_state_list.h"
+#include "ios/chrome/browser/web_state_list/web_state_list_observer.h"
+
+class BrowserList;
+class ChromeBrowserState;
+
+// AllWebStateListObservationRegistrar tracks when Browsers are created and
+// destroyed for a given ChromeBrowserState. Whenever the BrowserList changes,
+// AllWebStateListObservationRegistrar registers (or unregisters) a provided
+// observer as a WebStateListObserver.
+class AllWebStateListObservationRegistrar : public BrowserListObserver {
+ public:
+  // Observation mode optionally used for constructors.
+  enum Mode {
+    REGULAR = 1 << 0,          // Only register regular web states.
+    INCOGNITO = 1 << 1,        // Only register incognito web states.
+    ALL = REGULAR | INCOGNITO  // Register all web states.
+  };
+  // Constructs an object that registers the given |web_state_list_observer| as
+  // a WebStateListObserver for any Browsers associated with |browser_state| or
+  // |browser_state|'s OTR browser state, according to the value of |mode|.
+  // Keeps observer registration up to date as Browsers are added and
+  // removed from |browser_state|'s BrowserList.
+  AllWebStateListObservationRegistrar(
+      ChromeBrowserState* browser_state,
+      std::unique_ptr<WebStateListObserver> web_state_list_observer,
+      Mode mode);
+
+  // Convenience constructor; creates a registrar as described above, with a
+  // |mode| of ALL.
+  AllWebStateListObservationRegistrar(
+      ChromeBrowserState* browser_state,
+      std::unique_ptr<WebStateListObserver> web_state_list_observer);
+
+  // Not copyable or moveable
+  AllWebStateListObservationRegistrar(
+      const AllWebStateListObservationRegistrar&) = delete;
+  AllWebStateListObservationRegistrar& operator=(
+      const AllWebStateListObservationRegistrar&) = delete;
+
+  ~AllWebStateListObservationRegistrar() override;
+
+  // BrowserListObserver
+  void OnBrowserAdded(const BrowserList* browser_list,
+                      Browser* browser) override;
+  void OnIncognitoBrowserAdded(const BrowserList* browser_list,
+                               Browser* browser) override;
+  void OnBrowserRemoved(const BrowserList* browser_list,
+                        Browser* browser) override;
+  void OnIncognitoBrowserRemoved(const BrowserList* browser_list,
+                                 Browser* browser) override;
+  void OnBrowserListShutdown(BrowserList* browser_list) override;
+
+ private:
+  BrowserList* browser_list_;
+  std::unique_ptr<WebStateListObserver> web_state_list_observer_;
+  std::unique_ptr<ScopedObserver<WebStateList, WebStateListObserver>>
+      scoped_observer_;
+  Mode mode_;
+};
+
+#endif  // IOS_CHROME_BROWSER_MAIN_ALL_WEB_STATE_LIST_OBSERVATION_REGISTRAR_H_
diff --git a/ios/chrome/browser/main/all_web_state_list_observation_registrar.mm b/ios/chrome/browser/main/all_web_state_list_observation_registrar.mm
new file mode 100644
index 0000000..9d8b2cc
--- /dev/null
+++ b/ios/chrome/browser/main/all_web_state_list_observation_registrar.mm
@@ -0,0 +1,104 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/main/all_web_state_list_observation_registrar.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#include "ios/chrome/browser/main/browser.h"
+#include "ios/chrome/browser/main/browser_list.h"
+#include "ios/chrome/browser/main/browser_list_factory.h"
+
+AllWebStateListObservationRegistrar::AllWebStateListObservationRegistrar(
+    ChromeBrowserState* browser_state,
+    std::unique_ptr<WebStateListObserver> web_state_list_observer,
+    Mode mode)
+    : browser_list_(BrowserListFactory::GetForBrowserState(browser_state)),
+      web_state_list_observer_(std::move(web_state_list_observer)),
+      scoped_observer_(
+          std::make_unique<ScopedObserver<WebStateList, WebStateListObserver>>(
+              web_state_list_observer_.get())),
+      mode_(mode) {
+  browser_list_->AddObserver(this);
+
+  // There may already be browsers in |browser_list| when this object is
+  // created. Register as an observer for (mode permitting) both the regular and
+  // incognito browsers' WebStateLists.
+  if (mode_ & Mode::REGULAR) {
+    for (Browser* browser : browser_list_->AllRegularBrowsers()) {
+      scoped_observer_->Add(browser->GetWebStateList());
+    }
+  }
+
+  if (mode_ & Mode::INCOGNITO) {
+    for (Browser* browser : browser_list_->AllIncognitoBrowsers()) {
+      scoped_observer_->Add(browser->GetWebStateList());
+    }
+  }
+}
+
+AllWebStateListObservationRegistrar::AllWebStateListObservationRegistrar(
+    ChromeBrowserState* browser_state,
+    std::unique_ptr<WebStateListObserver> web_state_list_observer)
+    : AllWebStateListObservationRegistrar(browser_state,
+                                          std::move(web_state_list_observer),
+                                          Mode::ALL) {}
+
+AllWebStateListObservationRegistrar::~AllWebStateListObservationRegistrar() {
+  // If the browser state has already shut down, |browser_list_| should be
+  // nullptr; otherwise, stop observing it.
+  if (browser_list_)
+    browser_list_->RemoveObserver(this);
+}
+
+void AllWebStateListObservationRegistrar::OnBrowserAdded(
+    const BrowserList* browser_list,
+    Browser* browser) {
+  if (mode_ & Mode::REGULAR)
+    scoped_observer_->Add(browser->GetWebStateList());
+}
+
+void AllWebStateListObservationRegistrar::OnIncognitoBrowserAdded(
+    const BrowserList* browser_list,
+    Browser* browser) {
+  if (mode_ & Mode::INCOGNITO)
+    scoped_observer_->Add(browser->GetWebStateList());
+}
+
+void AllWebStateListObservationRegistrar::OnBrowserRemoved(
+    const BrowserList* browser_list,
+    Browser* browser) {
+  if (mode_ & Mode::REGULAR)
+    scoped_observer_->Remove(browser->GetWebStateList());
+}
+
+void AllWebStateListObservationRegistrar::OnIncognitoBrowserRemoved(
+    const BrowserList* browser_list,
+    Browser* browser) {
+  if (mode_ & Mode::INCOGNITO)
+    scoped_observer_->Remove(browser->GetWebStateList());
+}
+
+void AllWebStateListObservationRegistrar::OnBrowserListShutdown(
+    BrowserList* browser_list) {
+  DCHECK_EQ(browser_list, browser_list_);
+  // Stop observing all observed web state lists.
+  if (mode_ & Mode::REGULAR) {
+    for (Browser* browser : browser_list_->AllRegularBrowsers()) {
+      scoped_observer_->Remove(browser->GetWebStateList());
+    }
+  }
+
+  if (mode_ & Mode::INCOGNITO) {
+    for (Browser* browser : browser_list_->AllIncognitoBrowsers()) {
+      scoped_observer_->Remove(browser->GetWebStateList());
+    }
+  }
+  // Stop observimg the browser list, and clear |browser_list_|.
+  browser_list_->RemoveObserver(this);
+  browser_list_ = nullptr;
+}
diff --git a/ios/chrome/browser/main/all_web_state_list_observation_registrar_unittest.mm b/ios/chrome/browser/main/all_web_state_list_observation_registrar_unittest.mm
new file mode 100644
index 0000000..bd4acd5
--- /dev/null
+++ b/ios/chrome/browser/main/all_web_state_list_observation_registrar_unittest.mm
@@ -0,0 +1,199 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/main/all_web_state_list_observation_registrar.h"
+
+#include "base/test/task_environment.h"
+#include "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
+#import "ios/chrome/browser/main/browser_list.h"
+#import "ios/chrome/browser/main/browser_list_factory.h"
+#import "ios/chrome/browser/main/test_browser.h"
+#import "ios/chrome/browser/web_state_list/web_state_list.h"
+#import "ios/chrome/browser/web_state_list/web_state_opener.h"
+#import "ios/web/public/test/fakes/test_web_state.h"
+#include "ios/web/public/test/web_task_environment.h"
+#include "testing/platform_test.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+class TestRegisteredWebStateListObserver : public WebStateListObserver {
+ public:
+  void WebStateInsertedAt(WebStateList* web_state_list,
+                          web::WebState* web_state,
+                          int index,
+                          bool activating) override {
+    insertion_count_++;
+  }
+  int insertion_count_;
+};
+
+class AllWebStateListObservationRegistrarTest : public PlatformTest {
+ protected:
+  AllWebStateListObservationRegistrarTest()
+      : owned_observer_(std::make_unique<TestRegisteredWebStateListObserver>()),
+        observer_(owned_observer_.get()) {
+    TestChromeBrowserState::Builder test_cbs_builder;
+    chrome_browser_state_ = test_cbs_builder.Build();
+
+    browser_list_ =
+        BrowserListFactory::GetForBrowserState(chrome_browser_state_.get());
+  }
+
+  void AppendNewWebState(Browser* browser) {
+    auto test_web_state = std::make_unique<web::TestWebState>();
+    browser->GetWebStateList()->InsertWebState(
+        WebStateList::kInvalidIndex, std::move(test_web_state),
+        WebStateList::INSERT_NO_FLAGS, WebStateOpener());
+  }
+
+  base::test::TaskEnvironment task_environment_;
+  // Unique pointer to an observer moved into the registrar under test.
+  std::unique_ptr<TestRegisteredWebStateListObserver> owned_observer_;
+  // Weak pointer to the the moved observer
+  TestRegisteredWebStateListObserver* observer_;
+  std::unique_ptr<TestChromeBrowserState> chrome_browser_state_;
+  BrowserList* browser_list_;
+};
+
+// Test
+TEST_F(AllWebStateListObservationRegistrarTest, RegisterAllLists) {
+  TestBrowser regular_browser_0(chrome_browser_state_.get());
+  browser_list_->AddBrowser(&regular_browser_0);
+  TestBrowser incognito_browser_0(
+      chrome_browser_state_->GetOffTheRecordChromeBrowserState());
+  browser_list_->AddIncognitoBrowser(&incognito_browser_0);
+
+  AllWebStateListObservationRegistrar registrar(chrome_browser_state_.get(),
+                                                std::move(owned_observer_));
+  // Should observe both insertions.
+  AppendNewWebState(&regular_browser_0);
+  EXPECT_EQ(1, observer_->insertion_count_);
+  AppendNewWebState(&incognito_browser_0);
+  EXPECT_EQ(2, observer_->insertion_count_);
+
+  // Create a second regular browser and add it.
+  TestBrowser regular_browser_1(chrome_browser_state_.get());
+  browser_list_->AddBrowser(&regular_browser_1);
+  AppendNewWebState(&regular_browser_1);
+  // Expect observed insertion.
+  EXPECT_EQ(3, observer_->insertion_count_);
+
+  // Create a second incognito  browser and add it.
+  TestBrowser incognito_browser_1(
+      chrome_browser_state_->GetOffTheRecordChromeBrowserState());
+  browser_list_->AddIncognitoBrowser(&incognito_browser_1);
+  AppendNewWebState(&incognito_browser_1);
+  // Expect observed insertion.
+  EXPECT_EQ(4, observer_->insertion_count_);
+
+  // Remove a regular browser
+  browser_list_->RemoveBrowser(&regular_browser_1);
+  AppendNewWebState(&regular_browser_1);
+  // Expect no observed insertion.
+  EXPECT_EQ(4, observer_->insertion_count_);
+
+  // Remove an incognito browser
+  browser_list_->RemoveIncognitoBrowser(&incognito_browser_1);
+  AppendNewWebState(&incognito_browser_1);
+  // Expect no observed insertion.
+  EXPECT_EQ(4, observer_->insertion_count_);
+}
+
+TEST_F(AllWebStateListObservationRegistrarTest, RegisterRegularLists) {
+  TestBrowser regular_browser_0(chrome_browser_state_.get());
+  browser_list_->AddBrowser(&regular_browser_0);
+  TestBrowser incognito_browser_0(
+      chrome_browser_state_->GetOffTheRecordChromeBrowserState());
+  browser_list_->AddIncognitoBrowser(&incognito_browser_0);
+
+  AllWebStateListObservationRegistrar registrar(
+      chrome_browser_state_.get(), std::move(owned_observer_),
+      AllWebStateListObservationRegistrar::Mode::REGULAR);
+  // Should observe only the reugular insertions.
+  AppendNewWebState(&regular_browser_0);
+  EXPECT_EQ(1, observer_->insertion_count_);
+  AppendNewWebState(&incognito_browser_0);
+  EXPECT_EQ(1, observer_->insertion_count_);
+
+  // Create a second regular browser and add it.
+  TestBrowser regular_browser_1(chrome_browser_state_.get());
+  browser_list_->AddBrowser(&regular_browser_1);
+  AppendNewWebState(&regular_browser_1);
+  // Expect observed insertion.
+  EXPECT_EQ(2, observer_->insertion_count_);
+
+  // Create a second incognito  browser and add it.
+  TestBrowser incognito_browser_1(
+      chrome_browser_state_->GetOffTheRecordChromeBrowserState());
+  browser_list_->AddIncognitoBrowser(&incognito_browser_1);
+  AppendNewWebState(&incognito_browser_0);
+  // Expect no observed insertion.
+  EXPECT_EQ(2, observer_->insertion_count_);
+}
+
+TEST_F(AllWebStateListObservationRegistrarTest, RegisterIncognitoLists) {
+  TestBrowser regular_browser_0(chrome_browser_state_.get());
+  browser_list_->AddBrowser(&regular_browser_0);
+  TestBrowser incognito_browser_0(
+      chrome_browser_state_->GetOffTheRecordChromeBrowserState());
+  browser_list_->AddIncognitoBrowser(&incognito_browser_0);
+
+  AllWebStateListObservationRegistrar registrar(
+      chrome_browser_state_.get(), std::move(owned_observer_),
+      AllWebStateListObservationRegistrar::Mode::INCOGNITO);
+  // Should observe only the incognito insertions.
+  AppendNewWebState(&regular_browser_0);
+  EXPECT_EQ(0, observer_->insertion_count_);
+  AppendNewWebState(&incognito_browser_0);
+  EXPECT_EQ(1, observer_->insertion_count_);
+
+  // Create a second regular browser and add it.
+  TestBrowser regular_browser_1(chrome_browser_state_.get());
+  browser_list_->AddBrowser(&regular_browser_1);
+  AppendNewWebState(&regular_browser_1);
+  // Expect no observed insertion.
+  EXPECT_EQ(1, observer_->insertion_count_);
+
+  // Create a second incognito  browser and add it.
+  TestBrowser incognito_browser_1(
+      chrome_browser_state_->GetOffTheRecordChromeBrowserState());
+  browser_list_->AddIncognitoBrowser(&incognito_browser_1);
+  AppendNewWebState(&incognito_browser_0);
+  // Expect observed insertion.
+  EXPECT_EQ(2, observer_->insertion_count_);
+}
+
+TEST_F(AllWebStateListObservationRegistrarTest, DeleteWithObservers) {
+  // Test that deleting a registrar with active observers is safe.
+  TestBrowser regular_browser_0(chrome_browser_state_.get());
+  browser_list_->AddBrowser(&regular_browser_0);
+
+  {
+    AllWebStateListObservationRegistrar registrar(chrome_browser_state_.get(),
+                                                  std::move(owned_observer_));
+  }
+}
+
+// Tests that deleting the browser state is safe.
+TEST_F(AllWebStateListObservationRegistrarTest, DeleteBrowserState) {
+  // Create some browsers and a registrar, as above.
+  TestBrowser regular_browser_0(chrome_browser_state_.get());
+  browser_list_->AddBrowser(&regular_browser_0);
+  TestBrowser incognito_browser_0(
+      chrome_browser_state_->GetOffTheRecordChromeBrowserState());
+  browser_list_->AddIncognitoBrowser(&incognito_browser_0);
+
+  AllWebStateListObservationRegistrar registrar(chrome_browser_state_.get(),
+                                                std::move(owned_observer_));
+  AppendNewWebState(&regular_browser_0);
+  AppendNewWebState(&incognito_browser_0);
+  TestBrowser regular_browser_1(chrome_browser_state_.get());
+  browser_list_->AddBrowser(&regular_browser_1);
+  AppendNewWebState(&regular_browser_1);
+
+  // Now delete the browser state. Nothing should explode.
+  chrome_browser_state_.reset();
+}
diff --git a/ios/chrome/browser/main/browser_list_factory.h b/ios/chrome/browser/main/browser_list_factory.h
index 1c99af4..cc5a31c 100644
--- a/ios/chrome/browser/main/browser_list_factory.h
+++ b/ios/chrome/browser/main/browser_list_factory.h
@@ -5,7 +5,7 @@
 #ifndef IOS_CHROME_BROWSER_MAIN_BROWSER_LIST_FACTORY_H_
 #define IOS_CHROME_BROWSER_MAIN_BROWSER_LIST_FACTORY_H_
 
-#include "base/macros.h"
+#include "base/gtest_prod_util.h"
 #include "base/no_destructor.h"
 #include "components/keyed_service/ios/browser_state_keyed_service_factory.h"
 
@@ -22,8 +22,14 @@
   // Getter for singleton instance.
   static BrowserListFactory* GetInstance();
 
+  // Not copyable or moveable.
+  BrowserListFactory(const BrowserListFactory&) = delete;
+  BrowserListFactory& operator=(const BrowserListFactory&) = delete;
+
  private:
   friend class base::NoDestructor<BrowserListFactory>;
+  // Allow tests to call BrowserStateShutdown().
+  FRIEND_TEST_ALL_PREFIXES(BrowserListImplTest, ShutdownOTRBrowserState);
 
   BrowserListFactory();
 
@@ -33,7 +39,7 @@
   web::BrowserState* GetBrowserStateToUse(
       web::BrowserState* context) const override;
 
-  DISALLOW_COPY_AND_ASSIGN(BrowserListFactory);
+  void BrowserStateShutdown(web::BrowserState* context) override;
 };
 
 #endif  // IOS_CHROME_BROWSER_MAIN_BROWSER_LIST_FACTORY_H_
diff --git a/ios/chrome/browser/main/browser_list_factory.mm b/ios/chrome/browser/main/browser_list_factory.mm
index 29e592e..b448535 100644
--- a/ios/chrome/browser/main/browser_list_factory.mm
+++ b/ios/chrome/browser/main/browser_list_factory.mm
@@ -43,3 +43,19 @@
   // Incognito browser states use same service as regular browser states.
   return GetBrowserStateRedirectedInIncognito(context);
 }
+
+void BrowserListFactory::BrowserStateShutdown(web::BrowserState* context) {
+  ChromeBrowserState* browser_state =
+      ChromeBrowserState::FromBrowserState(context);
+  // Because there's a single service instance of the BrowserList for both
+  // regular and OTR browser states, |BrowserStateShutdown| will be called when
+  // OTR browser states are destroyed. Since this happens each time the last
+  // incognito tab is closed, avoid a shutdown of the browser list when an OTR
+  // browser state shuts down. Removing this early return will cause all browser
+  // list observers to stop working the first time the last incognito tab is
+  // closed.
+  if (browser_state->IsOffTheRecord()) {
+    return;
+  }
+  GetForBrowserState(browser_state)->Shutdown();
+}
diff --git a/ios/chrome/browser/main/browser_list_impl.h b/ios/chrome/browser/main/browser_list_impl.h
index 41d0fd49..f61c8ed 100644
--- a/ios/chrome/browser/main/browser_list_impl.h
+++ b/ios/chrome/browser/main/browser_list_impl.h
@@ -5,18 +5,26 @@
 #ifndef IOS_CHROME_BROWSER_MAIN_BROWSER_LIST_IMPL_H_
 #define IOS_CHROME_BROWSER_MAIN_BROWSER_LIST_IMPL_H_
 
-#include "base/macros.h"
 #import "ios/chrome/browser/main/browser_list.h"
 #include "ios/chrome/browser/main/browser_list_observer.h"
+#import "ios/chrome/browser/main/browser_observer.h"
 
 // The concrete implementation of BrowserList returned by the
 // BrowserListFactory.
-class BrowserListImpl : public BrowserList {
+class BrowserListImpl : public BrowserList, public BrowserObserver {
  public:
   BrowserListImpl();
+
+  // Not copyable or moveable.
+  BrowserListImpl(const BrowserListImpl&) = delete;
+  BrowserListImpl& operator=(const BrowserListImpl&) = delete;
+
   ~BrowserListImpl() override;
 
-  // BrowserList:
+  // KeyedService
+  void Shutdown() override;
+
+  // BrowserList
   void AddBrowser(Browser* browser) override;
   void AddIncognitoBrowser(Browser* browser) override;
   void RemoveBrowser(Browser* browser) override;
@@ -26,12 +34,13 @@
   void AddObserver(BrowserListObserver* observer) override;
   void RemoveObserver(BrowserListObserver* observer) override;
 
+  // BrowserObserver:
+  void BrowserDestroyed(Browser* browser) override;
+
  private:
   std::set<Browser*> browsers_;
   std::set<Browser*> incognito_browsers_;
   base::ObserverList<BrowserListObserver, true>::Unchecked observers_;
-
-  DISALLOW_COPY_AND_ASSIGN(BrowserListImpl);
 };
 
 #endif  // IOS_CHROME_BROWSER_MAIN_BROWSER_LIST_IMPL_H_
diff --git a/ios/chrome/browser/main/browser_list_impl.mm b/ios/chrome/browser/main/browser_list_impl.mm
index af203007..68e49e71 100644
--- a/ios/chrome/browser/main/browser_list_impl.mm
+++ b/ios/chrome/browser/main/browser_list_impl.mm
@@ -12,12 +12,28 @@
 #endif
 
 BrowserListImpl::BrowserListImpl() {}
-BrowserListImpl::~BrowserListImpl() {}
+BrowserListImpl::~BrowserListImpl() {
+  observers_.Clear();
+}
+
+// KeyedService:
+void BrowserListImpl::Shutdown() {
+  for (auto& observer : observers_)
+    observer.OnBrowserListShutdown(this);
+  observers_.Clear();
+  for (Browser* browser : browsers_) {
+    browser->RemoveObserver(this);
+  }
+  for (Browser* browser : incognito_browsers_) {
+    browser->RemoveObserver(this);
+  }
+}
 
 // BrowserList:
 void BrowserListImpl::AddBrowser(Browser* browser) {
   DCHECK(!browser->GetBrowserState()->IsOffTheRecord());
   browsers_.insert(browser);
+  browser->AddObserver(this);
   for (auto& observer : observers_)
     observer.OnBrowserAdded(this, browser);
 }
@@ -25,12 +41,14 @@
 void BrowserListImpl::AddIncognitoBrowser(Browser* browser) {
   DCHECK(browser->GetBrowserState()->IsOffTheRecord());
   incognito_browsers_.insert(browser);
+  browser->AddObserver(this);
   for (auto& observer : observers_)
     observer.OnIncognitoBrowserAdded(this, browser);
 }
 
 void BrowserListImpl::RemoveBrowser(Browser* browser) {
   if (browsers_.erase(browser) > 0) {
+    browser->RemoveObserver(this);
     for (auto& observer : observers_)
       observer.OnBrowserRemoved(this, browser);
   }
@@ -38,6 +56,7 @@
 
 void BrowserListImpl::RemoveIncognitoBrowser(Browser* browser) {
   if (incognito_browsers_.erase(browser) > 0) {
+    browser->RemoveObserver(this);
     for (auto& observer : observers_)
       observer.OnIncognitoBrowserRemoved(this, browser);
   }
@@ -60,3 +79,13 @@
 void BrowserListImpl::RemoveObserver(BrowserListObserver* observer) {
   observers_.RemoveObserver(observer);
 }
+
+// BrowserObserver
+void BrowserListImpl::BrowserDestroyed(Browser* browser) {
+  if (browser->GetBrowserState()->IsOffTheRecord()) {
+    RemoveIncognitoBrowser(browser);
+  } else {
+    RemoveBrowser(browser);
+  }
+  browser->RemoveObserver(this);
+}
diff --git a/ios/chrome/browser/main/browser_list_impl_unittest.mm b/ios/chrome/browser/main/browser_list_impl_unittest.mm
index 9aead39..1c25bbc 100644
--- a/ios/chrome/browser/main/browser_list_impl_unittest.mm
+++ b/ios/chrome/browser/main/browser_list_impl_unittest.mm
@@ -76,6 +76,11 @@
 
 // Test regular/incognito interactions
 TEST_F(BrowserListImplTest, AddRemoveIncognitoBrowsers) {
+  // Verify that the "OTR browser list" is the same as the regular one.
+  BrowserList* otr_browser_list = BrowserListFactory::GetForBrowserState(
+      chrome_browser_state_->GetOffTheRecordChromeBrowserState());
+  EXPECT_EQ(otr_browser_list, browser_list_);
+
   // Incognito browser list starts empty.
   EXPECT_EQ(0UL, browser_list_->AllRegularBrowsers().size());
   EXPECT_EQ(0UL, browser_list_->AllIncognitoBrowsers().size());
@@ -114,6 +119,26 @@
   EXPECT_EQ(0UL, browser_list_->AllRegularBrowsers().size());
 }
 
+// Test that destroyed browsers are auto-removed.
+TEST_F(BrowserListImplTest, AutoRemoveBrowsers) {
+  {
+    // Create and add scoped browsers
+    TestBrowser browser_1(chrome_browser_state_.get());
+    browser_list_->AddBrowser(&browser_1);
+    EXPECT_EQ(1UL, browser_list_->AllRegularBrowsers().size());
+
+    ChromeBrowserState* incognito_browser_state =
+        chrome_browser_state_->GetOffTheRecordChromeBrowserState();
+    TestBrowser incognito_browser_1(incognito_browser_state);
+    browser_list_->AddIncognitoBrowser(&incognito_browser_1);
+    EXPECT_EQ(1UL, browser_list_->AllIncognitoBrowsers().size());
+  }
+
+  // Expect that the browsers going out of scope will have triggered removal.
+  EXPECT_EQ(0UL, browser_list_->AllRegularBrowsers().size());
+  EXPECT_EQ(0UL, browser_list_->AllIncognitoBrowsers().size());
+}
+
 // Test that values returned from AllRegularBrowsers and AllIncognitoBrowsers
 // aren't affected by subsequent changes to the browser list.
 TEST_F(BrowserListImplTest, AllBrowserValuesDontChange) {
@@ -146,29 +171,79 @@
       chrome_browser_state_->GetOffTheRecordChromeBrowserState();
   Browser* incognito_browser_1 = new TestBrowser(incognito_browser_state);
 
-  // Check that a regular addition is observerd.
+  // Check that a regular addition is observed.
   browser_list_->AddBrowser(browser_1);
   EXPECT_EQ(browser_1, observer->GetLastAddedBrowser());
   EXPECT_EQ(1UL, observer->GetLastBrowsers().size());
 
-  // Check that a no-op  removal is *not* observerd.
+  // Check that a no-op  removal is *not* observed.
   browser_list_->RemoveBrowser(incognito_browser_1);
   EXPECT_EQ(nullptr, observer->GetLastRemovedBrowser());
 
-  // Check that a regular removal is observerd.
+  // Check that a regular removal is observed.
   browser_list_->RemoveBrowser(browser_1);
   EXPECT_EQ(browser_1, observer->GetLastRemovedBrowser());
   EXPECT_EQ(0UL, observer->GetLastBrowsers().size());
 
-  // Check that an incognito addition is observerd.
+  // Check that an incognito addition is observed.
   browser_list_->AddIncognitoBrowser(incognito_browser_1);
   EXPECT_EQ(incognito_browser_1, observer->GetLastAddedIncognitoBrowser());
   EXPECT_EQ(1UL, observer->GetLastIncognitoBrowsers().size());
 
-  // Check that an incognito removal is observerd.
+  // Check that an incognito removal is observed.
   browser_list_->RemoveIncognitoBrowser(incognito_browser_1);
   EXPECT_EQ(incognito_browser_1, observer->GetLastRemovedIncognitoBrowser());
   EXPECT_EQ(0UL, observer->GetLastIncognitoBrowsers().size());
 
   browser_list_->RemoveObserver(observer);
 }
+
+TEST_F(BrowserListImplTest, DeleteBrowserState) {
+  TestBrowserListObserver* observer = new TestBrowserListObserver;
+  browser_list_->AddObserver(observer);
+  Browser* browser_1 = new TestBrowser(chrome_browser_state_.get());
+  browser_list_->AddBrowser(browser_1);
+
+  // Now delete the browser state. Nothing should explode.
+  chrome_browser_state_.reset();
+}
+
+TEST_F(BrowserListImplTest, ShutdownOTRBrowserState) {
+  TestBrowserListObserver* observer = new TestBrowserListObserver;
+
+  browser_list_->AddObserver(observer);
+
+  ChromeBrowserState* incognito_browser_state =
+      chrome_browser_state_->GetOffTheRecordChromeBrowserState();
+  Browser* incognito_browser_1 = new TestBrowser(incognito_browser_state);
+  browser_list_->AddIncognitoBrowser(incognito_browser_1);
+
+  // Check that adding/removing incognito is observed.
+  EXPECT_EQ(incognito_browser_1, observer->GetLastAddedIncognitoBrowser());
+  EXPECT_EQ(1UL, observer->GetLastIncognitoBrowsers().size());
+
+  Browser* browser_1 = new TestBrowser(chrome_browser_state_.get());
+  browser_list_->AddBrowser(browser_1);
+  // Check that a regular addition is observed.
+  EXPECT_EQ(browser_1, observer->GetLastAddedBrowser());
+  EXPECT_EQ(1UL, observer->GetLastBrowsers().size());
+
+  // Simulate shutdown -- this isn't called on test browser states when the OTR
+  // browser state is destroyed, so in order to test that shutdown of the
+  // OTR state doesn't break anything, it's called directly for this test.
+  BrowserListFactory::GetInstance()->BrowserStateShutdown(
+      incognito_browser_state);
+
+  Browser* browser_2 = new TestBrowser(chrome_browser_state_.get());
+  browser_list_->AddBrowser(browser_2);
+  // Check that another regular addition is observed.
+  EXPECT_EQ(browser_2, observer->GetLastAddedBrowser());
+  EXPECT_EQ(2UL, observer->GetLastBrowsers().size());
+
+  // Check that a regular removal is observed.
+  browser_list_->RemoveBrowser(browser_1);
+  EXPECT_EQ(browser_1, observer->GetLastRemovedBrowser());
+  EXPECT_EQ(1UL, observer->GetLastBrowsers().size());
+
+  browser_list_->RemoveObserver(observer);
+}
diff --git a/ios/chrome/browser/main/browser_list_observer.h b/ios/chrome/browser/main/browser_list_observer.h
index caf4132..699fa6f 100644
--- a/ios/chrome/browser/main/browser_list_observer.h
+++ b/ios/chrome/browser/main/browser_list_observer.h
@@ -31,6 +31,11 @@
   virtual void OnIncognitoBrowserRemoved(const BrowserList* browser_list,
                                          Browser* browser) {}
 
+  // Called before the browserlist is destroyed, in case the observer needs to
+  // do any cleanup. After this method is called, all observers will be removed
+  // from |browser_list|, and no firther obeserver methods will be called.
+  virtual void OnBrowserListShutdown(BrowserList* browser_list) {}
+
  private:
   DISALLOW_COPY_AND_ASSIGN(BrowserListObserver);
 };
diff --git a/ios/chrome/browser/metrics/BUILD.gn b/ios/chrome/browser/metrics/BUILD.gn
index 2b3595a..1d875cf 100644
--- a/ios/chrome/browser/metrics/BUILD.gn
+++ b/ios/chrome/browser/metrics/BUILD.gn
@@ -37,6 +37,8 @@
     "ios_profile_session_durations_service_factory.mm",
     "mobile_session_shutdown_metrics_provider.h",
     "mobile_session_shutdown_metrics_provider.mm",
+    "pageload_foreground_duration_tab_helper.h",
+    "pageload_foreground_duration_tab_helper.mm",
     "previous_session_info.h",
     "previous_session_info.mm",
     "previous_session_info_private.h",
@@ -95,6 +97,7 @@
     "ios_chrome_metrics_service_client_unittest.mm",
     "ios_chrome_stability_metrics_provider_unittest.mm",
     "mobile_session_shutdown_metrics_provider_unittest.mm",
+    "pageload_foreground_duration_tab_helper_unittest.mm",
     "previous_session_info_unittest.mm",
   ]
   deps = [
@@ -109,6 +112,7 @@
     "//components/prefs",
     "//components/prefs:test_support",
     "//components/ukm",
+    "//components/ukm:test_support",
     "//components/version_info",
     "//ios/chrome/browser",
     "//ios/chrome/browser/browser_state:test_support",
diff --git a/ios/chrome/browser/metrics/pageload_foreground_duration_tab_helper.h b/ios/chrome/browser/metrics/pageload_foreground_duration_tab_helper.h
new file mode 100644
index 0000000..dbe75be
--- /dev/null
+++ b/ios/chrome/browser/metrics/pageload_foreground_duration_tab_helper.h
@@ -0,0 +1,61 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_METRICS_PAGELOAD_FOREGROUND_DURATION_TAB_HELPER_H_
+#define IOS_CHROME_BROWSER_METRICS_PAGELOAD_FOREGROUND_DURATION_TAB_HELPER_H_
+
+#include <memory>
+#include <unordered_map>
+
+#include "base/scoped_observer.h"
+#include "base/time/time.h"
+#import "ios/web/public/web_state.h"
+#import "ios/web/public/web_state_observer.h"
+#import "ios/web/public/web_state_user_data.h"
+
+// Tracks the time spent on pages visible on the screen and logs them as UKMs.
+class PageloadForegroundDurationTabHelper
+    : public web::WebStateUserData<PageloadForegroundDurationTabHelper>,
+      web::WebStateObserver {
+ public:
+  ~PageloadForegroundDurationTabHelper() override;
+
+ private:
+  WEB_STATE_USER_DATA_KEY_DECL();
+  friend class web::WebStateUserData<PageloadForegroundDurationTabHelper>;
+  explicit PageloadForegroundDurationTabHelper(web::WebState* web_state);
+
+  // web::WebStateObserver override.
+  void WasShown(web::WebState* web_state) override;
+  void WasHidden(web::WebState* web_state) override;
+  void DidStartNavigation(web::WebState* web_state,
+                          web::NavigationContext* navigation_context) override;
+  void DidFinishNavigation(web::WebState* web_state,
+                           web::NavigationContext* navigation_context) override;
+  void RenderProcessGone(web::WebState* web_state) override;
+  void WebStateDestroyed(web::WebState* web_state) override;
+
+  // Indicates to this tab helper that the app has entered a foreground state.
+  void UpdateForAppWillForeground();
+  // Indicates to this tab helper that the app has entered a background state.
+  void UpdateForAppDidBackground();
+
+  // End recording and log a UKM if necessary.
+  void RecordUkmIfInForeground();
+
+  // Whether recording is happening for time spent on the current page.
+  bool currently_recording_ = false;
+  // Last time when recording started.
+  base::TimeTicks last_time_shown_;
+  // WebState reference.
+  web::WebState* web_state_ = nullptr;
+  // Scoped observer that facilitates observing the WebState.
+  ScopedObserver<web::WebState, WebStateObserver> scoped_observer_;
+  // Holds references to background NSNotification callback observer.
+  id foreground_notification_observer_;
+  // Holds references to foreground NSNotification callback observer.
+  id background_notification_observer_;
+};
+
+#endif  // IOS_CHROME_BROWSER_METRICS_PAGELOAD_FOREGROUND_DURATION_TAB_HELPER_H_
diff --git a/ios/chrome/browser/metrics/pageload_foreground_duration_tab_helper.mm b/ios/chrome/browser/metrics/pageload_foreground_duration_tab_helper.mm
new file mode 100644
index 0000000..6a9490b
--- /dev/null
+++ b/ios/chrome/browser/metrics/pageload_foreground_duration_tab_helper.mm
@@ -0,0 +1,134 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/metrics/pageload_foreground_duration_tab_helper.h"
+
+#import <UIKit/UIKit.h>
+
+#include "components/ukm/ios/ukm_url_recorder.h"
+#import "ios/web/public/navigation/navigation_context.h"
+#include "services/metrics/public/cpp/ukm_builders.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+WEB_STATE_USER_DATA_KEY_IMPL(PageloadForegroundDurationTabHelper)
+
+PageloadForegroundDurationTabHelper::PageloadForegroundDurationTabHelper(
+    web::WebState* web_state)
+    : web_state_(web_state), scoped_observer_(this) {
+  DCHECK(web_state);
+  scoped_observer_.Add(web_state);
+  background_notification_observer_ = [[NSNotificationCenter defaultCenter]
+      addObserverForName:UIApplicationDidEnterBackgroundNotification
+                  object:nil
+                   queue:nil
+              usingBlock:^(NSNotification* notification) {
+                this->UpdateForAppDidBackground();
+              }];
+  foreground_notification_observer_ = [[NSNotificationCenter defaultCenter]
+      addObserverForName:UIApplicationWillEnterForegroundNotification
+                  object:nil
+                   queue:nil
+              usingBlock:^(NSNotification* notification) {
+                this->UpdateForAppWillForeground();
+              }];
+}
+
+PageloadForegroundDurationTabHelper::~PageloadForegroundDurationTabHelper() {
+  NSNotificationCenter* default_center = [NSNotificationCenter defaultCenter];
+  [default_center removeObserver:foreground_notification_observer_];
+  [default_center removeObserver:background_notification_observer_];
+}
+
+void PageloadForegroundDurationTabHelper::UpdateForAppWillForeground() {
+  // Return early if not currently active WebState.
+  if (!web_state_->IsVisible())
+    return;
+  last_time_shown_ = base::TimeTicks::Now();
+  currently_recording_ = true;
+}
+
+void PageloadForegroundDurationTabHelper::UpdateForAppDidBackground() {
+  // Return early if not currently active WebState.
+  if (!web_state_->IsVisible())
+    return;
+  RecordUkmIfInForeground();
+}
+
+void PageloadForegroundDurationTabHelper::WasShown(web::WebState* web_state) {
+  if (!currently_recording_) {
+    last_time_shown_ = base::TimeTicks::Now();
+    currently_recording_ = true;
+  }
+}
+
+void PageloadForegroundDurationTabHelper::WasHidden(web::WebState* web_state) {
+  RecordUkmIfInForeground();
+}
+
+void PageloadForegroundDurationTabHelper::DidStartNavigation(
+    web::WebState* web_state,
+    web::NavigationContext* navigation_context) {
+  DCHECK_EQ(web_state_, web_state);
+  // Do not start recording if the WebState is not visible. This is important to
+  // not record for pre-rendering in the omnibox.
+  // Do not log as end of recording for the current page session if the
+  // navigation is same-document.
+  if (!web_state_->IsVisible() || navigation_context->IsSameDocument())
+    return;
+  if (currently_recording_)
+    RecordUkmIfInForeground();
+  currently_recording_ = true;
+  last_time_shown_ = base::TimeTicks::Now();
+}
+
+void PageloadForegroundDurationTabHelper::DidFinishNavigation(
+    web::WebState* web_state,
+    web::NavigationContext* navigation_context) {
+  DCHECK_EQ(web_state_, web_state);
+  if (!web_state_->IsVisible() || navigation_context->IsSameDocument()) {
+    // Do not start recording if the WebState is not visible. This is important
+    // to not record for pre-rendering in the omnibox. Do not log successful
+    // navigation if it is same-document.
+    return;
+  }
+  int has_committed = navigation_context->HasCommitted() ? 1 : 0;
+  ukm::SourceId source_id = ukm::GetSourceIdForWebStateDocument(web_state_);
+  if (source_id != ukm::kInvalidSourceId) {
+    ukm::builders::PageLoad(source_id)
+        .SetDidCommit(has_committed)
+        .Record(ukm::UkmRecorder::Get());
+  }
+}
+
+void PageloadForegroundDurationTabHelper::RenderProcessGone(
+    web::WebState* web_state) {
+  DCHECK_EQ(web_state_, web_state);
+  if (!web_state_->IsVisible())
+    return;
+  RecordUkmIfInForeground();
+}
+void PageloadForegroundDurationTabHelper::WebStateDestroyed(
+    web::WebState* web_state) {
+  DCHECK_EQ(web_state_, web_state);
+  RecordUkmIfInForeground();
+  scoped_observer_.Remove(web_state);
+  web_state_ = nullptr;
+}
+
+void PageloadForegroundDurationTabHelper::RecordUkmIfInForeground() {
+  if (!currently_recording_)
+    return;
+  currently_recording_ = false;
+  base::TimeDelta foreground_duration =
+      base::TimeTicks::Now() - last_time_shown_;
+  ukm::SourceId source_id = ukm::GetSourceIdForWebStateDocument(web_state_);
+  if (source_id != ukm::kInvalidSourceId) {
+    ukm::builders::PageForegroundSession(source_id)
+        .SetForegroundDuration(foreground_duration.InMilliseconds())
+        .Record(ukm::UkmRecorder::Get());
+  }
+}
diff --git a/ios/chrome/browser/metrics/pageload_foreground_duration_tab_helper_unittest.mm b/ios/chrome/browser/metrics/pageload_foreground_duration_tab_helper_unittest.mm
new file mode 100644
index 0000000..b489d25
--- /dev/null
+++ b/ios/chrome/browser/metrics/pageload_foreground_duration_tab_helper_unittest.mm
@@ -0,0 +1,220 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/metrics/pageload_foreground_duration_tab_helper.h"
+
+#include "components/ukm/ios/ukm_url_recorder.h"
+#include "components/ukm/test_ukm_recorder.h"
+#import "ios/web/public/test/fakes/fake_navigation_context.h"
+#import "ios/web/public/test/fakes/test_web_state.h"
+#include "ios/web/public/test/web_task_environment.h"
+#import "testing/gtest_mac.h"
+#include "testing/platform_test.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace {
+const char kPageNavigationUkmEvent[] = "PageLoad";
+const char kPageNavigationUkmMetric[] = "DidCommit";
+const char kPageForegroundSessionUkmSearchMatchesEvent[] =
+    "PageForegroundSession";
+}
+
+class PageloadForegroundDurationTabHelperTest : public PlatformTest {
+ protected:
+  PageloadForegroundDurationTabHelperTest() {
+    // This must be initialized first so that it is the first receiver of
+    // WebStateObserver calls to set the navigation id.
+    ukm::InitializeSourceUrlRecorderForWebState(&web_state_);
+    PageloadForegroundDurationTabHelper::CreateForWebState(&web_state_);
+  }
+
+  base::test::TaskEnvironment environment_;
+  web::TestWebState web_state_;
+  ukm::TestAutoSetUkmRecorder test_ukm_recorder_;
+};
+
+// Tests that a navigation UKM is logged as true after a successful navigation.
+TEST_F(PageloadForegroundDurationTabHelperTest,
+       VerifyUKMLoggedAfterNavigation) {
+  test_ukm_recorder_.Purge();
+  web::FakeNavigationContext context_with_zero_nav_id;
+
+  web_state_.WasShown();
+  // No entry should be recorded for the interaction above.
+  const auto& navigation_entries =
+      test_ukm_recorder_.GetEntriesByName(kPageNavigationUkmEvent);
+  ASSERT_EQ(0u, navigation_entries.size());
+
+  web::FakeNavigationContext context;
+  context.SetIsSameDocument(false);
+  context.SetHasCommitted(true);
+  web_state_.OnNavigationStarted(&context);
+  // No navigation logging have occurred yet.
+  const auto& navigation_start_navigation_entries =
+      test_ukm_recorder_.GetEntriesByName(kPageNavigationUkmEvent);
+  ASSERT_EQ(0u, navigation_start_navigation_entries.size());
+
+  web_state_.OnNavigationFinished(&context);
+  // A successful navigation should be recorded
+  const auto& post_navigation_entry =
+      test_ukm_recorder_.GetEntriesByName(kPageNavigationUkmEvent);
+  EXPECT_EQ(1u, post_navigation_entry.size());
+  const ukm::mojom::UkmEntry* entry = post_navigation_entry[0];
+  ASSERT_TRUE(entry);
+  EXPECT_NE(ukm::kInvalidSourceId, entry->source_id);
+  test_ukm_recorder_.ExpectEntryMetric(entry, kPageNavigationUkmMetric, true);
+}
+
+// Tests that a navigation UKM is not logged if the navigation is within the
+// same document.
+TEST_F(PageloadForegroundDurationTabHelperTest,
+       VerifyUKMNotLoggedAfterSameDocumentNavigation) {
+  test_ukm_recorder_.Purge();
+  web::FakeNavigationContext context_with_zero_nav_id;
+
+  web_state_.WasShown();
+  // No entry should be recorded for the interaction above.
+  const auto& navigation_entries =
+      test_ukm_recorder_.GetEntriesByName(kPageNavigationUkmEvent);
+  ASSERT_EQ(0u, navigation_entries.size());
+
+  web::FakeNavigationContext context;
+  context.SetIsSameDocument(true);
+  context.SetHasCommitted(true);
+  web_state_.OnNavigationStarted(&context);
+  // No navigation logging have occurred yet.
+  const auto& navigation_start_navigation_entries =
+      test_ukm_recorder_.GetEntriesByName(kPageNavigationUkmEvent);
+  ASSERT_EQ(0u, navigation_start_navigation_entries.size());
+
+  web_state_.OnNavigationFinished(&context);
+  // A same-document navigation should result in no logging.
+  const auto& post_navigation_entry =
+      test_ukm_recorder_.GetEntriesByName(kPageNavigationUkmEvent);
+  EXPECT_EQ(0u, post_navigation_entry.size());
+}
+
+// Tests that a UKM is logged after a page that is being shown is hidden.
+TEST_F(PageloadForegroundDurationTabHelperTest,
+       VerifyUKMLoggedAfterShowAndHide) {
+  web::FakeNavigationContext context;
+  context.SetIsSameDocument(false);
+  context.SetHasCommitted(true);
+  web_state_.OnNavigationStarted(&context);
+  // Mark WebState as visible without logging a page session.
+  web_state_.WasShown();
+  web_state_.OnNavigationFinished(&context);
+  // There should be no entries yet.
+  const auto& page_session_entries = test_ukm_recorder_.GetEntriesByName(
+      kPageForegroundSessionUkmSearchMatchesEvent);
+  ASSERT_EQ(0u, page_session_entries.size());
+
+  web_state_.WasHidden();
+  const auto& after_hidden_page_session_entries =
+      test_ukm_recorder_.GetEntriesByName(
+          kPageForegroundSessionUkmSearchMatchesEvent);
+  EXPECT_EQ(1u, after_hidden_page_session_entries.size());
+}
+
+// Tests that a UKM is logged after OnRenderProcessGone is called for a page
+// that is being shown.
+TEST_F(PageloadForegroundDurationTabHelperTest,
+       VerifyUKMLoggedAfterRenderProcessGone) {
+  web::FakeNavigationContext context;
+  context.SetIsSameDocument(false);
+  context.SetHasCommitted(true);
+  web_state_.OnNavigationStarted(&context);
+  // Mark WebState as visible without logging a page session.
+  web_state_.WasShown();
+  web_state_.OnNavigationFinished(&context);
+  // There should be no entries yet.
+  const auto& page_session_entries = test_ukm_recorder_.GetEntriesByName(
+      kPageForegroundSessionUkmSearchMatchesEvent);
+  ASSERT_EQ(0u, page_session_entries.size());
+
+  web_state_.OnRenderProcessGone();
+  const auto& after_render_gone_entries = test_ukm_recorder_.GetEntriesByName(
+      kPageForegroundSessionUkmSearchMatchesEvent);
+  EXPECT_EQ(1u, after_render_gone_entries.size());
+}
+
+// Tests that a UKM is logged after a
+// UIApplicationDidEnterBackgroundNotification notification and after a
+// successive UIApplicationWillEnterForegroundNotification notification that is
+// followed by the Webstate being hidden.
+TEST_F(PageloadForegroundDurationTabHelperTest,
+       VerifyUKMLoggedAfterBackgroundingAndForegrounding) {
+  web::FakeNavigationContext context;
+  context.SetIsSameDocument(false);
+  context.SetHasCommitted(true);
+  web_state_.OnNavigationStarted(&context);
+  // Mark WebState as visible without logging a page session.
+  web_state_.WasShown();
+  web_state_.OnNavigationFinished(&context);
+
+  [[NSNotificationCenter defaultCenter]
+      postNotificationName:UIApplicationDidEnterBackgroundNotification
+                    object:nil];
+  const auto& after_background_entries = test_ukm_recorder_.GetEntriesByName(
+      kPageForegroundSessionUkmSearchMatchesEvent);
+  ASSERT_EQ(1u, after_background_entries.size());
+
+  [[NSNotificationCenter defaultCenter]
+      postNotificationName:UIApplicationWillEnterForegroundNotification
+                    object:nil];
+  const auto& after_foreground_entries = test_ukm_recorder_.GetEntriesByName(
+      kPageForegroundSessionUkmSearchMatchesEvent);
+  ASSERT_EQ(1u, after_foreground_entries.size());
+
+  web_state_.WasHidden();
+  const auto& after_hidden_page_session_entries =
+      test_ukm_recorder_.GetEntriesByName(
+          kPageForegroundSessionUkmSearchMatchesEvent);
+  EXPECT_EQ(2u, after_hidden_page_session_entries.size());
+}
+
+// Tests that no UKMs are logged as long as the WebState is not visible.
+TEST_F(PageloadForegroundDurationTabHelperTest,
+       VerifyNoUKMLoggedIfWebStateNotVisible) {
+  // Mark WebState as not visible.
+  web_state_.WasHidden();
+
+  web::FakeNavigationContext context;
+  context.SetIsSameDocument(false);
+  context.SetHasCommitted(true);
+  web_state_.OnNavigationStarted(&context);
+  web_state_.OnNavigationFinished(&context);
+  const auto& post_navigation_entries =
+      test_ukm_recorder_.GetEntriesByName(kPageNavigationUkmEvent);
+  EXPECT_EQ(0u, post_navigation_entries.size());
+
+  web_state_.OnNavigationStarted(&context);
+  web_state_.OnNavigationFinished(&context);
+  const auto& second_post_navigation_entries =
+      test_ukm_recorder_.GetEntriesByName(kPageNavigationUkmEvent);
+  EXPECT_EQ(0u, second_post_navigation_entries.size());
+
+  [[NSNotificationCenter defaultCenter]
+      postNotificationName:UIApplicationDidEnterBackgroundNotification
+                    object:nil];
+  const auto& after_background_entries = test_ukm_recorder_.GetEntriesByName(
+      kPageForegroundSessionUkmSearchMatchesEvent);
+  ASSERT_EQ(0u, after_background_entries.size());
+
+  [[NSNotificationCenter defaultCenter]
+      postNotificationName:UIApplicationWillEnterForegroundNotification
+                    object:nil];
+  const auto& after_foreground_entries = test_ukm_recorder_.GetEntriesByName(
+      kPageForegroundSessionUkmSearchMatchesEvent);
+  ASSERT_EQ(0u, after_foreground_entries.size());
+
+  web_state_.WasHidden();
+  const auto& after_hidden_page_session_entries =
+      test_ukm_recorder_.GetEntriesByName(
+          kPageForegroundSessionUkmSearchMatchesEvent);
+  EXPECT_EQ(0u, after_hidden_page_session_entries.size());
+}
diff --git a/ios/chrome/browser/passwords/credential_manager_egtest.mm b/ios/chrome/browser/passwords/credential_manager_egtest.mm
index 3e6ac203..067529c 100644
--- a/ios/chrome/browser/passwords/credential_manager_egtest.mm
+++ b/ios/chrome/browser/passwords/credential_manager_egtest.mm
@@ -20,7 +20,7 @@
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
-#import "ios/testing/earl_grey/app_launch_manager.h"
+#import "ios/testing/earl_grey/app_launch_configuration.h"
 #import "ios/testing/earl_grey/disabled_test_macros.h"
 #import "ios/testing/earl_grey/earl_grey_test.h"
 #import "ios/web/public/test/http_server/http_server.h"
@@ -85,11 +85,10 @@
   [super tearDown];
 }
 
-- (void)launchAppForTestMethod {
-  [[AppLaunchManager sharedManager]
-      ensureAppLaunchedWithFeaturesEnabled:{features::kCredentialManager}
-                                  disabled:{}
-                            relaunchPolicy:NoForceRelaunchAndResetState];
+- (AppLaunchConfiguration)appConfigurationForTestCase {
+  AppLaunchConfiguration config;
+  config.features_enabled.push_back(features::kCredentialManager);
+  return config;
 }
 
 #pragma mark - Utils
diff --git a/ios/chrome/browser/snapshots/BUILD.gn b/ios/chrome/browser/snapshots/BUILD.gn
index 16d2014f..7d5e3dd 100644
--- a/ios/chrome/browser/snapshots/BUILD.gn
+++ b/ios/chrome/browser/snapshots/BUILD.gn
@@ -8,7 +8,6 @@
     "snapshot_cache_factory.h",
     "snapshot_cache_internal.h",
     "snapshot_cache_observer.h",
-    "snapshot_cache_tab_model_list_observer.h",
     "snapshot_cache_web_state_list_observer.h",
     "snapshot_generator_delegate.h",
     "snapshot_lru_cache.h",
@@ -18,7 +17,6 @@
   sources = [
     "snapshot_cache.mm",
     "snapshot_cache_factory.mm",
-    "snapshot_cache_tab_model_list_observer.mm",
     "snapshot_cache_web_state_list_observer.mm",
     "snapshot_generator.h",
     "snapshot_generator.mm",
@@ -33,7 +31,7 @@
     "//components/keyed_service/ios",
     "//ios/chrome/browser/browser_state",
     "//ios/chrome/browser/infobars",
-    "//ios/chrome/browser/tabs",
+    "//ios/chrome/browser/main:public",
     "//ios/chrome/browser/ui:feature_flags",
     "//ios/chrome/browser/ui/infobars:feature_flags",
     "//ios/chrome/browser/ui/util",
diff --git a/ios/chrome/browser/snapshots/snapshot_cache_factory.mm b/ios/chrome/browser/snapshots/snapshot_cache_factory.mm
index cfa0f63..a057d1a 100644
--- a/ios/chrome/browser/snapshots/snapshot_cache_factory.mm
+++ b/ios/chrome/browser/snapshots/snapshot_cache_factory.mm
@@ -12,8 +12,8 @@
 #include "components/keyed_service/ios/browser_state_dependency_manager.h"
 #include "ios/chrome/browser/browser_state/browser_state_otr_helper.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#import "ios/chrome/browser/main/all_web_state_list_observation_registrar.h"
 #import "ios/chrome/browser/snapshots/snapshot_cache.h"
-#import "ios/chrome/browser/snapshots/snapshot_cache_tab_model_list_observer.h"
 #import "ios/chrome/browser/snapshots/snapshot_cache_web_state_list_observer.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -36,7 +36,7 @@
 
  private:
   __strong SnapshotCache* snapshot_cache_;
-  std::unique_ptr<SnapshotCacheTabModelListObserver> tab_model_list_observer_;
+  std::unique_ptr<AllWebStateListObservationRegistrar> registrar_;
 
   DISALLOW_COPY_AND_ASSIGN(SnapshotCacheWrapper);
 };
@@ -45,10 +45,9 @@
                                            SnapshotCache* snapshot_cache)
     : snapshot_cache_(snapshot_cache) {
   DCHECK(snapshot_cache);
-  tab_model_list_observer_ =
-      std::make_unique<SnapshotCacheTabModelListObserver>(
-          browser_state,
-          std::make_unique<SnapshotCacheWebStateListObserver>(snapshot_cache));
+  registrar_ = std::make_unique<AllWebStateListObservationRegistrar>(
+      browser_state,
+      std::make_unique<SnapshotCacheWebStateListObserver>(snapshot_cache));
 }
 
 SnapshotCacheWrapper::~SnapshotCacheWrapper() {
@@ -56,7 +55,7 @@
 }
 
 void SnapshotCacheWrapper::Shutdown() {
-  tab_model_list_observer_.reset();
+  registrar_.reset();
   [snapshot_cache_ shutdown];
   snapshot_cache_ = nil;
 }
diff --git a/ios/chrome/browser/snapshots/snapshot_cache_tab_model_list_observer.h b/ios/chrome/browser/snapshots/snapshot_cache_tab_model_list_observer.h
deleted file mode 100644
index 0b2076b9..0000000
--- a/ios/chrome/browser/snapshots/snapshot_cache_tab_model_list_observer.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_SNAPSHOTS_SNAPSHOT_CACHE_TAB_MODEL_LIST_OBSERVER_H_
-#define IOS_CHROME_BROWSER_SNAPSHOTS_SNAPSHOT_CACHE_TAB_MODEL_LIST_OBSERVER_H_
-
-#include <memory>
-
-#include "base/macros.h"
-#include "base/scoped_observer.h"
-#import "ios/chrome/browser/tabs/tab_model_list_observer.h"
-#include "ios/chrome/browser/web_state_list/web_state_list.h"
-#include "ios/chrome/browser/web_state_list/web_state_list_observer.h"
-
-class ChromeBrowserState;
-@class TabModel;
-
-// SnapshotCacheTabModelListObserver tracks when TabModels are created and
-// destroyed for a given ChromeBrowserState.  Whenever the TabModelList changes,
-// SnapshotCacheTabModelListObserver registers a provided observer as a
-// WebStateListObserver.
-class SnapshotCacheTabModelListObserver : public TabModelListObserver {
- public:
-  // Constructs an object that registers the given |web_state_list_observer| as
-  // a WebStateListObserver for any TabModels associated with |browser_state| or
-  // |browser_state|'s OTR browser state.  Keeps observer registration up to
-  // date as TabModels are created and destroyed. |browser_state| must be a
-  // normal (non-OTR) browser state.
-  SnapshotCacheTabModelListObserver(
-      ChromeBrowserState* browser_state,
-      std::unique_ptr<WebStateListObserver> web_state_list_observer);
-
-  ~SnapshotCacheTabModelListObserver() override;
-
-  // TabModelListObserver.
-  void TabModelRegisteredWithBrowserState(
-      TabModel* tab_model,
-      ChromeBrowserState* browser_state) override;
-  void TabModelUnregisteredFromBrowserState(
-      TabModel* tab_model,
-      ChromeBrowserState* browser_state) override;
-
- private:
-  ChromeBrowserState* browser_state_;
-  std::unique_ptr<WebStateListObserver> web_state_list_observer_;
-  std::unique_ptr<ScopedObserver<WebStateList, WebStateListObserver>>
-      scoped_observer_;
-
-  DISALLOW_COPY_AND_ASSIGN(SnapshotCacheTabModelListObserver);
-};
-
-#endif  // IOS_CHROME_BROWSER_SNAPSHOTS_SNAPSHOT_CACHE_TAB_MODEL_LIST_OBSERVER_H_
diff --git a/ios/chrome/browser/snapshots/snapshot_cache_tab_model_list_observer.mm b/ios/chrome/browser/snapshots/snapshot_cache_tab_model_list_observer.mm
deleted file mode 100644
index ec48aed8..0000000
--- a/ios/chrome/browser/snapshots/snapshot_cache_tab_model_list_observer.mm
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "ios/chrome/browser/snapshots/snapshot_cache_tab_model_list_observer.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
-#import "ios/chrome/browser/tabs/tab_model.h"
-#import "ios/chrome/browser/tabs/tab_model_list.h"
-#import "ios/chrome/browser/tabs/tab_model_list_observer.h"
-
-SnapshotCacheTabModelListObserver::SnapshotCacheTabModelListObserver(
-    ChromeBrowserState* browser_state,
-    std::unique_ptr<WebStateListObserver> web_state_list_observer)
-    : browser_state_(browser_state),
-      web_state_list_observer_(std::move(web_state_list_observer)),
-      scoped_observer_(
-          std::make_unique<ScopedObserver<WebStateList, WebStateListObserver>>(
-              web_state_list_observer_.get())) {
-  TabModelList::AddObserver(this);
-
-  // Register as an observer for all TabModels for both the normal and otr
-  // browser states.
-  DCHECK(!browser_state_->IsOffTheRecord());
-  for (TabModel* model :
-       TabModelList::GetTabModelsForChromeBrowserState(browser_state_)) {
-    scoped_observer_->Add(model.webStateList);
-  }
-
-  if (browser_state_->HasOffTheRecordChromeBrowserState()) {
-    ChromeBrowserState* otr_state =
-        browser_state->GetOffTheRecordChromeBrowserState();
-    for (TabModel* model :
-         TabModelList::GetTabModelsForChromeBrowserState(otr_state)) {
-      scoped_observer_->Add(model.webStateList);
-    }
-  }
-}
-
-SnapshotCacheTabModelListObserver::~SnapshotCacheTabModelListObserver() {
-  TabModelList::RemoveObserver(this);
-}
-
-void SnapshotCacheTabModelListObserver::TabModelRegisteredWithBrowserState(
-    TabModel* tab_model,
-    ChromeBrowserState* browser_state) {
-  // Normal and Incognito browser states share a SnapshotCache.
-  if (browser_state_ == browser_state->GetOriginalChromeBrowserState()) {
-    scoped_observer_->Add(tab_model.webStateList);
-  }
-}
-
-void SnapshotCacheTabModelListObserver::TabModelUnregisteredFromBrowserState(
-    TabModel* tab_model,
-    ChromeBrowserState* browser_state) {
-  // Normal and Incognito browser states share a SnapshotCache.
-  if (browser_state_ == browser_state->GetOriginalChromeBrowserState()) {
-    scoped_observer_->Remove(tab_model.webStateList);
-  }
-}
diff --git a/ios/chrome/browser/tabs/BUILD.gn b/ios/chrome/browser/tabs/BUILD.gn
index 368b049..e58eef1 100644
--- a/ios/chrome/browser/tabs/BUILD.gn
+++ b/ios/chrome/browser/tabs/BUILD.gn
@@ -155,6 +155,7 @@
     "//ios/chrome/browser/web",
     "//ios/chrome/browser/web:web_internal",
     "//ios/chrome/browser/web_state_list",
+    "//ios/chrome/browser/web_state_list:agents",
     "//ios/chrome/browser/web_state_list:test_support",
     "//ios/chrome/browser/web_state_list/web_usage_enabler",
     "//ios/chrome/test:test_support",
diff --git a/ios/chrome/browser/tabs/tab_helper_util.mm b/ios/chrome/browser/tabs/tab_helper_util.mm
index 1af29b2..0be9165 100644
--- a/ios/chrome/browser/tabs/tab_helper_util.mm
+++ b/ios/chrome/browser/tabs/tab_helper_util.mm
@@ -34,6 +34,7 @@
 #import "ios/chrome/browser/infobars/overlays/infobar_overlay_request_inserter.h"
 #import "ios/chrome/browser/infobars/overlays/infobar_overlay_tab_helper.h"
 #import "ios/chrome/browser/itunes_urls/itunes_urls_handler_tab_helper.h"
+#import "ios/chrome/browser/metrics/pageload_foreground_duration_tab_helper.h"
 #import "ios/chrome/browser/network_activity/network_activity_indicator_tab_helper.h"
 #import "ios/chrome/browser/open_in/open_in_tab_helper.h"
 #import "ios/chrome/browser/overscroll_actions/overscroll_actions_tab_helper.h"
@@ -145,6 +146,8 @@
 
   ARQuickLookTabHelper::CreateForWebState(web_state);
 
+  PageloadForegroundDurationTabHelper::CreateForWebState(web_state);
+
   // TODO(crbug.com/794115): pre-rendered WebState have lots of unnecessary
   // tab helpers for historical reasons. For the moment, AttachTabHelpers
   // allows to inhibit the creation of some of them. Once PreloadController
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/card_view_controller_egtest.mm b/ios/chrome/browser/ui/autofill/manual_fill/card_view_controller_egtest.mm
index 70d5171..b949c6d 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/card_view_controller_egtest.mm
+++ b/ios/chrome/browser/ui/autofill/manual_fill/card_view_controller_egtest.mm
@@ -12,7 +12,7 @@
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
-#import "ios/testing/earl_grey/app_launch_manager.h"
+#import "ios/testing/earl_grey/app_launch_configuration.h"
 #import "ios/testing/earl_grey/earl_grey_test.h"
 #import "ios/testing/earl_grey/keyboard_app_interface.h"
 #include "ios/web/public/test/element_selector.h"
@@ -105,11 +105,10 @@
 
 @implementation CreditCardViewControllerTestCase
 
-- (void)launchAppForTestMethod {
-  [[AppLaunchManager sharedManager]
-      ensureAppLaunchedWithFeaturesEnabled:{kCreditCardScanner}
-                                  disabled:{}
-                            relaunchPolicy:NoForceRelaunchAndResetState];
+- (AppLaunchConfiguration)appConfigurationForTestCase {
+  AppLaunchConfiguration config;
+  config.features_enabled.push_back(kCreditCardScanner);
+  return config;
 }
 
 - (void)setUp {
diff --git a/ios/chrome/browser/ui/bookmarks/BUILD.gn b/ios/chrome/browser/ui/bookmarks/BUILD.gn
index 936c304..90b600ce 100644
--- a/ios/chrome/browser/ui/bookmarks/BUILD.gn
+++ b/ios/chrome/browser/ui/bookmarks/BUILD.gn
@@ -74,6 +74,7 @@
     "//ios/chrome/browser/bookmarks:bookmarks_utils",
     "//ios/chrome/browser/browser_state",
     "//ios/chrome/browser/favicon",
+    "//ios/chrome/browser/main:public",
     "//ios/chrome/browser/metrics:metrics_internal",
     "//ios/chrome/browser/signin",
     "//ios/chrome/browser/sync",
@@ -146,6 +147,7 @@
     "//ios/chrome/browser",
     "//ios/chrome/browser/bookmarks",
     "//ios/chrome/browser/browser_state:test_support",
+    "//ios/chrome/browser/main:test_support",
     "//ios/web/public/test",
     "//testing/gtest",
   ]
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h
index 2901126..965332d 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h
@@ -12,15 +12,12 @@
 
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_controller.h"
 
-@protocol ApplicationCommands;
-@protocol BrowserCommands;
 @class BookmarkHomeViewController;
+class Browser;
 namespace bookmarks {
 class BookmarkNode;
 }  // namespace bookmarks
-class ChromeBrowserState;
 class GURL;
-class WebStateList;
 
 @protocol BookmarkHomeViewControllerDelegate
 // The view controller wants to be dismissed. If |urls| is not empty, then
@@ -49,10 +46,7 @@
 @property(nonatomic, weak) id<BookmarkHomeViewControllerDelegate> homeDelegate;
 
 // Initializers.
-- (instancetype)
-    initWithBrowserState:(ChromeBrowserState*)browserState
-              dispatcher:(id<ApplicationCommands, BrowserCommands>)dispatcher
-            webStateList:(WebStateList*)webStateList NS_DESIGNATED_INITIALIZER;
+- (instancetype)initWithBrowser:(Browser*)browser NS_DESIGNATED_INITIALIZER;
 - (instancetype)initWithStyle:(UITableViewStyle)tableViewStyle NS_UNAVAILABLE;
 
 // Setter to set _rootNode value.
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm
index 600d6310..4f3e2f5 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm
@@ -14,6 +14,7 @@
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #import "ios/chrome/browser/favicon/favicon_loader.h"
 #include "ios/chrome/browser/favicon/ios_chrome_favicon_loader_factory.h"
+#import "ios/chrome/browser/main/browser.h"
 #import "ios/chrome/browser/metrics/new_tab_page_uma.h"
 #import "ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.h"
 #import "ios/chrome/browser/ui/alert_coordinator/alert_coordinator.h"
@@ -133,6 +134,9 @@
 // The bookmark model used.
 @property(nonatomic, assign) bookmarks::BookmarkModel* bookmarks;
 
+// The Browser in which bookmarks are presented
+@property(nonatomic, assign) Browser* browser;
+
 // The user's browser state model used.
 @property(nonatomic, assign) ChromeBrowserState* browserState;
 
@@ -160,9 +164,9 @@
 // This is so that the cache code is called only once in loadBookmarkViews.
 @property(nonatomic, assign) BOOL isReconstructingFromCache;
 
-// Dispatcher for sending commands.
+// Handler for commands.
 @property(nonatomic, readonly, weak) id<ApplicationCommands, BrowserCommands>
-    dispatcher;
+    handler;
 
 // The current search term.  Set to the empty string when no search is active.
 @property(nonatomic, copy) NSString* searchTerm;
@@ -205,21 +209,23 @@
 
 #pragma mark - Initializer
 
-- (instancetype)
-    initWithBrowserState:(ChromeBrowserState*)browserState
-              dispatcher:(id<ApplicationCommands, BrowserCommands>)dispatcher
-            webStateList:(WebStateList*)webStateList {
-  DCHECK(browserState);
+- (instancetype)initWithBrowser:(Browser*)browser {
+  DCHECK(browser);
   self = [super initWithStyle:UITableViewStylePlain];
   if (self) {
-    _browserState = browserState->GetOriginalChromeBrowserState();
-    _dispatcher = dispatcher;
-    _webStateList = webStateList;
+    _browser = browser;
+    _browserState =
+        _browser->GetBrowserState()->GetOriginalChromeBrowserState();
+    // TODO(crbug.com/1045047): Use HandlerForProtocol after commands protocol
+    // clean up.
+    _handler = static_cast<id<ApplicationCommands, BrowserCommands>>(
+        _browser->GetCommandDispatcher());
+    _webStateList = _browser->GetWebStateList();
 
     _faviconLoader =
         IOSChromeFaviconLoaderFactory::GetForBrowserState(_browserState);
 
-    _bookmarks = ios::BookmarkModelFactory::GetForBrowserState(browserState);
+    _bookmarks = ios::BookmarkModelFactory::GetForBrowserState(_browserState);
 
     _bridge.reset(new bookmarks::BookmarkModelBridge(self, _bookmarks));
   }
@@ -578,8 +584,8 @@
 }
 
 - (void)showSignin:(ShowSigninCommand*)command {
-  [self.dispatcher showSignin:command
-           baseViewController:self.navigationController];
+  [self.handler showSignin:command
+        baseViewController:self.navigationController];
 }
 
 - (void)configureSigninPromoWithConfigurator:
@@ -611,13 +617,13 @@
   DCHECK(nodes.size() > 0);
   const BookmarkNode* editedNode = *(nodes.begin());
   const BookmarkNode* selectedFolder = editedNode->parent();
-  self.folderSelector = [[BookmarkFolderViewController alloc]
-      initWithBookmarkModel:self.bookmarks
-           allowsNewFolders:YES
-                editedNodes:nodes
-               allowsCancel:YES
-             selectedFolder:selectedFolder
-                 dispatcher:self.dispatcher];
+  self.folderSelector =
+      [[BookmarkFolderViewController alloc] initWithBookmarkModel:self.bookmarks
+                                                 allowsNewFolders:YES
+                                                      editedNodes:nodes
+                                                     allowsCancel:YES
+                                                   selectedFolder:selectedFolder
+                                                       dispatcher:self.handler];
   self.folderSelector.delegate = self;
   UINavigationController* navController = [[BookmarkNavigationController alloc]
       initWithRootViewController:self.folderSelector];
@@ -628,7 +634,7 @@
 // Deletes the current node.
 - (void)deleteNodes:(const std::set<const BookmarkNode*>&)nodes {
   DCHECK_GE(nodes.size(), 1u);
-  [self.dispatcher
+  [self.handler
       showSnackbarMessage:bookmark_utils_ios::DeleteBookmarksWithUndoToast(
                               nodes, self.bookmarks, self.browserState)];
   [self setTableViewEditing:NO];
@@ -637,11 +643,9 @@
 // Opens the editor on the given node.
 - (void)editNode:(const BookmarkNode*)node {
   if (!self.bookmarkInteractionController) {
-    self.bookmarkInteractionController = [[BookmarkInteractionController alloc]
-        initWithBrowserState:self.browserState
-            parentController:self
-                  dispatcher:self.dispatcher
-                webStateList:self.webStateList];
+    self.bookmarkInteractionController =
+        [[BookmarkInteractionController alloc] initWithBrowser:self.browser
+                                              parentController:self];
     self.bookmarkInteractionController.delegate = self;
   }
 
@@ -809,7 +813,7 @@
 
 - (void)handleMoveNode:(const bookmarks::BookmarkNode*)node
             toPosition:(int)position {
-  [self.dispatcher
+  [self.handler
       showSnackbarMessage:
           bookmark_utils_ios::UpdateBookmarkPositionWithUndoToast(
               node, _rootNode, position, self.bookmarks, self.browserState)];
@@ -849,7 +853,7 @@
   DCHECK(!folder->is_url());
   DCHECK_GE(folderPicker.editedNodes.size(), 1u);
 
-  [self.dispatcher
+  [self.handler
       showSnackbarMessage:bookmark_utils_ios::MoveBookmarksWithUndoToast(
                               folderPicker.editedNodes, self.bookmarks, folder,
                               self.browserState)];
@@ -1110,10 +1114,8 @@
 
 - (BookmarkHomeViewController*)createControllerWithRootFolder:
     (const bookmarks::BookmarkNode*)folder {
-  BookmarkHomeViewController* controller = [[BookmarkHomeViewController alloc]
-      initWithBrowserState:self.browserState
-                dispatcher:self.dispatcher
-              webStateList:self.webStateList];
+  BookmarkHomeViewController* controller =
+      [[BookmarkHomeViewController alloc] initWithBrowser:self.browser];
   [controller setRootNode:folder];
   controller.homeDelegate = self.homeDelegate;
   return controller;
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller_unittest.mm b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller_unittest.mm
index 91bd98b..b6a5febd 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller_unittest.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller_unittest.mm
@@ -20,12 +20,10 @@
 TEST_F(BookmarkHomeViewControllerTest,
        TableViewPopulatedAfterBookmarkModelLoaded) {
   @autoreleasepool {
-    BookmarkHomeViewController* controller = [[BookmarkHomeViewController alloc]
-        initWithBrowserState:chrome_browser_state_.get()
-                  dispatcher:nil
-                webStateList:nullptr];
+    BookmarkHomeViewController* controller =
+        [[BookmarkHomeViewController alloc] initWithBrowser:browser_.get()];
 
-    [controller setRootNode:_bookmarkModel->mobile_node()];
+    [controller setRootNode:bookmark_model_->mobile_node()];
     // Two sections: Messages and Bookmarks.
     EXPECT_EQ(2, [controller numberOfSectionsInTableView:controller.tableView]);
   }
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_interaction_controller.h b/ios/chrome/browser/ui/bookmarks/bookmark_interaction_controller.h
index f4d8b73b1..4bb573f 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_interaction_controller.h
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_interaction_controller.h
@@ -6,13 +6,11 @@
 
 #import <UIKit/UIKit.h>
 
-
 @protocol ApplicationCommands;
+class Browser;
 @protocol BrowserCommands;
 @protocol BookmarkInteractionControllerDelegate;
 
-class ChromeBrowserState;
-
 namespace bookmarks {
 class BookmarkNode;
 }
@@ -21,8 +19,6 @@
 class WebState;
 }
 
-class WebStateList;
-
 // The BookmarkInteractionController abstracts the management of the various
 // UIViewControllers used to create, remove and edit a bookmark.
 @interface BookmarkInteractionController : NSObject
@@ -30,11 +26,9 @@
 // This object's delegate.
 @property(nonatomic, weak) id<BookmarkInteractionControllerDelegate> delegate;
 
-- (instancetype)
-    initWithBrowserState:(ChromeBrowserState*)browserState
-        parentController:(UIViewController*)parentController
-              dispatcher:(id<ApplicationCommands, BrowserCommands>)dispatcher
-            webStateList:(WebStateList*)webStateList NS_DESIGNATED_INITIALIZER;
+- (instancetype)initWithBrowser:(Browser*)browser
+               parentController:(UIViewController*)parentController
+    NS_DESIGNATED_INITIALIZER;
 - (instancetype)init NS_UNAVAILABLE;
 
 // Presents the bookmark UI for a single bookmark.
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_interaction_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_interaction_controller.mm
index a93a2b9..3bf28a2 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_interaction_controller.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_interaction_controller.mm
@@ -16,6 +16,7 @@
 #include "components/bookmarks/browser/bookmark_utils.h"
 #include "ios/chrome/browser/bookmarks/bookmark_model_factory.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#import "ios/chrome/browser/main/browser.h"
 #import "ios/chrome/browser/metrics/new_tab_page_uma.h"
 #import "ios/chrome/browser/tabs/tab_title_util.h"
 #import "ios/chrome/browser/ui/bookmarks/bookmark_edit_view_controller.h"
@@ -71,6 +72,9 @@
     BookmarkFolderEditorViewControllerDelegate,
     BookmarkHomeViewControllerDelegate,
     TableViewPresentationControllerDelegate> {
+  // The browser bookmarks are presented in.
+  Browser* _browser;  // weak
+
   // The browser state of the current user.
   ChromeBrowserState* _currentBrowserState;  // weak
 
@@ -116,7 +120,7 @@
 @property(nonatomic, strong) BookmarkMediator* mediator;
 
 @property(nonatomic, readonly, weak) id<ApplicationCommands, BrowserCommands>
-    dispatcher;
+    handler;
 
 // The transitioning delegate that is used when presenting
 // |self.bookmarkBrowser|.
@@ -151,24 +155,25 @@
 @synthesize bookmarkTransitioningDelegate = _bookmarkTransitioningDelegate;
 @synthesize currentPresentedState = _currentPresentedState;
 @synthesize delegate = _delegate;
-@synthesize dispatcher = _dispatcher;
+@synthesize handler = _handler;
 @synthesize folderEditor = _folderEditor;
 @synthesize mediator = _mediator;
 
-- (instancetype)
-    initWithBrowserState:(ChromeBrowserState*)browserState
-        parentController:(UIViewController*)parentController
-              dispatcher:(id<ApplicationCommands, BrowserCommands>)dispatcher
-            webStateList:(WebStateList*)webStateList {
+- (instancetype)initWithBrowser:(Browser*)browser
+               parentController:(UIViewController*)parentController {
   self = [super init];
   if (self) {
+    _browser = browser;
     // Bookmarks are always opened with the main browser state, even in
     // incognito mode.
-    _currentBrowserState = browserState;
-    _browserState = browserState->GetOriginalChromeBrowserState();
+    _currentBrowserState = browser->GetBrowserState();
+    _browserState = _currentBrowserState->GetOriginalChromeBrowserState();
     _parentController = parentController;
-    _dispatcher = dispatcher;
-    _webStateList = webStateList;
+    // TODO(crbug.com/1045047): Use HandlerForProtocol after commands protocol
+    // clean up.
+    _handler = static_cast<id<ApplicationCommands, BrowserCommands>>(
+        browser->GetCommandDispatcher());
+    _webStateList = browser->GetWebStateList();
     _bookmarkModel =
         ios::BookmarkModelFactory::GetForBrowserState(_browserState);
     _mediator = [[BookmarkMediator alloc] initWithBrowserState:_browserState];
@@ -208,7 +213,7 @@
     void (^editAction)() = ^{
       [weakSelf presentBookmarkEditorForBookmarkedURL:bookmarkedURL];
     };
-    [self.dispatcher
+    [self.handler
         showSnackbarMessage:[self.mediator
                                 addBookmarkWithTitle:tab_util::GetTabTitle(
                                                          webState)
@@ -221,10 +226,8 @@
   DCHECK_EQ(PresentedState::NONE, self.currentPresentedState);
   DCHECK(!self.bookmarkNavigationController);
 
-  self.bookmarkBrowser = [[BookmarkHomeViewController alloc]
-      initWithBrowserState:_currentBrowserState
-                dispatcher:self.dispatcher
-              webStateList:_webStateList];
+  self.bookmarkBrowser =
+      [[BookmarkHomeViewController alloc] initWithBrowser:_browser];
   self.bookmarkBrowser.homeDelegate = self;
 
   NSArray<BookmarkHomeViewController*>* replacementViewControllers = nil;
@@ -263,7 +266,7 @@
     BookmarkEditViewController* bookmarkEditor =
         [[BookmarkEditViewController alloc] initWithBookmark:node
                                                 browserState:_browserState
-                                                  dispatcher:self.dispatcher];
+                                                  dispatcher:self.handler];
     self.bookmarkEditor = bookmarkEditor;
     self.bookmarkEditor.delegate = self;
     editorController = bookmarkEditor;
@@ -274,7 +277,7 @@
             folderEditorWithBookmarkModel:self.bookmarkModel
                                    folder:node
                              browserState:_browserState
-                               dispatcher:self.dispatcher];
+                               dispatcher:self.handler];
     folderEditor.delegate = self;
     self.folderEditor = folderEditor;
     editorController = folderEditor;
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_ios_unittest.h b/ios/chrome/browser/ui/bookmarks/bookmark_ios_unittest.h
index 9955265..2a874c65 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_ios_unittest.h
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_ios_unittest.h
@@ -16,11 +16,10 @@
 class BookmarkNode;
 class ManagedBookmarkService;
 }  // namespace bookmarks
-
+class Browser;
 namespace base {
 class ScopedTempDir;
 }  // namespace base
-
 class TestChromeBrowserState;
 
 // Provides common bookmark testing infrastructure.
@@ -45,9 +44,10 @@
   std::unique_ptr<base::ScopedTempDir> state_dir_;
 
   web::WebTaskEnvironment task_environment_;
+  std::unique_ptr<Browser> browser_;
   std::unique_ptr<TestChromeBrowserState> chrome_browser_state_;
-  bookmarks::BookmarkModel* _bookmarkModel;
-  bookmarks::ManagedBookmarkService* _managedBookmarkService;
+  bookmarks::BookmarkModel* bookmark_model_;
+  bookmarks::ManagedBookmarkService* managed_bookmark_service_;
 };
 
 #endif  // IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_IOS_UNITTEST_H_
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_ios_unittest.mm b/ios/chrome/browser/ui/bookmarks/bookmark_ios_unittest.mm
index 746a55d..ddede789 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_ios_unittest.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_ios_unittest.mm
@@ -11,6 +11,7 @@
 #include "components/bookmarks/test/bookmark_test_helpers.h"
 #include "ios/chrome/browser/bookmarks/bookmark_model_factory.h"
 #import "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
+#import "ios/chrome/browser/main/test_browser.h"
 #include "ios/web/public/test/test_web_thread.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -33,27 +34,28 @@
   chrome_browser_state_ = test_cbs_builder.Build();
   chrome_browser_state_->CreateBookmarkModel(true);
 
-  _bookmarkModel = ios::BookmarkModelFactory::GetForBrowserState(
+  bookmark_model_ = ios::BookmarkModelFactory::GetForBrowserState(
       chrome_browser_state_.get());
-  bookmarks::test::WaitForBookmarkModelToLoad(_bookmarkModel);
+  bookmarks::test::WaitForBookmarkModelToLoad(bookmark_model_);
+  browser_ = std::make_unique<TestBrowser>(chrome_browser_state_.get());
 }
 
 const BookmarkNode* BookmarkIOSUnitTest::AddBookmark(const BookmarkNode* parent,
                                                      NSString* title) {
   base::string16 c_title = base::SysNSStringToUTF16(title);
   GURL url(base::SysNSStringToUTF16(@"http://example.com/bookmark") + c_title);
-  return _bookmarkModel->AddURL(parent, parent->children().size(), c_title,
-                                url);
+  return bookmark_model_->AddURL(parent, parent->children().size(), c_title,
+                                 url);
 }
 
 const BookmarkNode* BookmarkIOSUnitTest::AddFolder(const BookmarkNode* parent,
                                                    NSString* title) {
   base::string16 c_title = base::SysNSStringToUTF16(title);
-  return _bookmarkModel->AddFolder(parent, parent->children().size(), c_title);
+  return bookmark_model_->AddFolder(parent, parent->children().size(), c_title);
 }
 
 void BookmarkIOSUnitTest::ChangeTitle(NSString* title,
                                       const BookmarkNode* node) {
   base::string16 c_title = base::SysNSStringToUTF16(title);
-  _bookmarkModel->SetTitle(node, c_title);
+  bookmark_model_->SetTitle(node, c_title);
 }
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_path_cache_unittest.mm b/ios/chrome/browser/ui/bookmarks/bookmark_path_cache_unittest.mm
index 32ad654..b8674b7 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_path_cache_unittest.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_path_cache_unittest.mm
@@ -31,45 +31,45 @@
 
 TEST_F(BookmarkPathCacheTest, TestPathCache) {
   // Try to store and retrieve a cache.
-  const BookmarkNode* mobileNode = _bookmarkModel->mobile_node();
-  const BookmarkNode* f1 = AddFolder(mobileNode, @"f1");
-  int64_t folderId = f1->id();
-  int topMostRow = 23;
+  const BookmarkNode* mobile_node = bookmark_model_->mobile_node();
+  const BookmarkNode* f1 = AddFolder(mobile_node, @"f1");
+  int64_t folder_id = f1->id();
+  int topmost_row = 23;
   [BookmarkPathCache cacheBookmarkTopMostRowWithPrefService:&prefs_
-                                                   folderId:folderId
-                                                 topMostRow:topMostRow];
+                                                   folderId:folder_id
+                                                 topMostRow:topmost_row];
 
-  int64_t resultFolderId;
-  int resultTopMostRow;
+  int64_t result_folder_id;
+  int result_topmost_row;
   [BookmarkPathCache
       getBookmarkTopMostRowCacheWithPrefService:&prefs_
-                                          model:_bookmarkModel
-                                       folderId:&resultFolderId
-                                     topMostRow:&resultTopMostRow];
-  EXPECT_EQ(folderId, resultFolderId);
-  EXPECT_EQ(topMostRow, resultTopMostRow);
+                                          model:bookmark_model_
+                                       folderId:&result_folder_id
+                                     topMostRow:&result_topmost_row];
+  EXPECT_EQ(folder_id, result_folder_id);
+  EXPECT_EQ(topmost_row, result_topmost_row);
 }
 
 TEST_F(BookmarkPathCacheTest, TestPathCacheWhenFolderDeleted) {
   // Try to store and retrieve a cache after the cached path is deleted.
-  const BookmarkNode* mobileNode = _bookmarkModel->mobile_node();
-  const BookmarkNode* f1 = AddFolder(mobileNode, @"f1");
-  int64_t folderId = f1->id();
-  int topMostRow = 23;
+  const BookmarkNode* mobile_node = bookmark_model_->mobile_node();
+  const BookmarkNode* f1 = AddFolder(mobile_node, @"f1");
+  int64_t folder_id = f1->id();
+  int topmost_row = 23;
   [BookmarkPathCache cacheBookmarkTopMostRowWithPrefService:&prefs_
-                                                   folderId:folderId
-                                                 topMostRow:topMostRow];
+                                                   folderId:folder_id
+                                                 topMostRow:topmost_row];
 
   // Delete the folder.
-  _bookmarkModel->Remove(f1);
+  bookmark_model_->Remove(f1);
 
-  int64_t unusedFolderId;
-  int unusedTopMostRow;
+  int64_t unused_folder_id;
+  int unused_topmost_row;
   BOOL result = [BookmarkPathCache
       getBookmarkTopMostRowCacheWithPrefService:&prefs_
-                                          model:_bookmarkModel
-                                       folderId:&unusedFolderId
-                                     topMostRow:&unusedTopMostRow];
+                                          model:bookmark_model_
+                                       folderId:&unused_folder_id
+                                     topMostRow:&unused_topmost_row];
   ASSERT_FALSE(result);
 }
 
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios_unittest.mm b/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios_unittest.mm
index a2c15ab..fcccdde 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios_unittest.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios_unittest.mm
@@ -34,22 +34,22 @@
 };
 
 TEST_F(BookmarkIOSUtilsUnitTest, segregateNodesByCreationDate) {
-  const BookmarkNode* mobileNode = _bookmarkModel->mobile_node();
+  const BookmarkNode* mobileNode = bookmark_model_->mobile_node();
   const BookmarkNode* f1 = AddFolder(mobileNode, @"f1");
   const BookmarkNode* a = AddBookmark(mobileNode, @"a");
-  _bookmarkModel->SetDateAdded(a, timeFromEpoch(169, 5));
+  bookmark_model_->SetDateAdded(a, timeFromEpoch(169, 5));
   const BookmarkNode* b = AddBookmark(mobileNode, @"b");
-  _bookmarkModel->SetDateAdded(b, timeFromEpoch(170, 6));
+  bookmark_model_->SetDateAdded(b, timeFromEpoch(170, 6));
   const BookmarkNode* f2 = AddFolder(mobileNode, @"f2");
 
   const BookmarkNode* f1a = AddBookmark(f1, @"f1a");
-  _bookmarkModel->SetDateAdded(f1a, timeFromEpoch(129, 5));
+  bookmark_model_->SetDateAdded(f1a, timeFromEpoch(129, 5));
   const BookmarkNode* f1b = AddBookmark(f1, @"f1b");
-  _bookmarkModel->SetDateAdded(f1b, timeFromEpoch(130, 6));
+  bookmark_model_->SetDateAdded(f1b, timeFromEpoch(130, 6));
   const BookmarkNode* f2a = AddBookmark(f2, @"f2a");
-  _bookmarkModel->SetDateAdded(f2a, timeFromEpoch(201, 5));
+  bookmark_model_->SetDateAdded(f2a, timeFromEpoch(201, 5));
   const BookmarkNode* f2b = AddBookmark(f2, @"f2b");
-  _bookmarkModel->SetDateAdded(f2b, timeFromEpoch(10, 5));
+  bookmark_model_->SetDateAdded(f2b, timeFromEpoch(10, 5));
 
   std::vector<const BookmarkNode*> toSort;
   toSort.push_back(a);
@@ -85,7 +85,7 @@
 }
 
 TEST_F(BookmarkIOSUtilsUnitTest, DeleteNodes) {
-  const BookmarkNode* mobileNode = _bookmarkModel->mobile_node();
+  const BookmarkNode* mobileNode = bookmark_model_->mobile_node();
   const BookmarkNode* f1 = AddFolder(mobileNode, @"f1");
   const BookmarkNode* a = AddBookmark(mobileNode, @"a");
   const BookmarkNode* b = AddBookmark(mobileNode, @"b");
@@ -102,7 +102,7 @@
   toDelete.insert(f2b);
   toDelete.insert(f2);
 
-  bookmark_utils_ios::DeleteBookmarks(toDelete, _bookmarkModel);
+  bookmark_utils_ios::DeleteBookmarks(toDelete, bookmark_model_);
 
   EXPECT_EQ(2u, mobileNode->children().size());
   const BookmarkNode* child0 = mobileNode->children()[0].get();
@@ -114,7 +114,7 @@
 }
 
 TEST_F(BookmarkIOSUtilsUnitTest, MoveNodes) {
-  const BookmarkNode* mobileNode = _bookmarkModel->mobile_node();
+  const BookmarkNode* mobileNode = bookmark_model_->mobile_node();
   const BookmarkNode* f1 = AddFolder(mobileNode, @"f1");
   const BookmarkNode* a = AddBookmark(mobileNode, @"a");
   const BookmarkNode* b = AddBookmark(mobileNode, @"b");
@@ -131,7 +131,7 @@
   toMove.insert(f2b);
   toMove.insert(f2);
 
-  bookmark_utils_ios::MoveBookmarks(toMove, _bookmarkModel, f1);
+  bookmark_utils_ios::MoveBookmarks(toMove, bookmark_model_, f1);
 
   EXPECT_EQ(2u, mobileNode->children().size());
   const BookmarkNode* child0 = mobileNode->children()[0].get();
@@ -143,7 +143,7 @@
 }
 
 TEST_F(BookmarkIOSUtilsUnitTest, TestDefaultMoveFolder) {
-  const BookmarkNode* mobileNode = _bookmarkModel->mobile_node();
+  const BookmarkNode* mobileNode = bookmark_model_->mobile_node();
   const BookmarkNode* f1 = AddFolder(mobileNode, @"f1");
   const BookmarkNode* a = AddBookmark(mobileNode, @"a");
   AddBookmark(mobileNode, @"b");
@@ -161,21 +161,21 @@
   toMove.insert(f2);
 
   const BookmarkNode* folder =
-      bookmark_utils_ios::defaultMoveFolder(toMove, _bookmarkModel);
+      bookmark_utils_ios::defaultMoveFolder(toMove, bookmark_model_);
   EXPECT_EQ(folder, mobileNode);
 
   toMove.clear();
   toMove.insert(f2a);
   toMove.insert(f2b);
-  folder = bookmark_utils_ios::defaultMoveFolder(toMove, _bookmarkModel);
+  folder = bookmark_utils_ios::defaultMoveFolder(toMove, bookmark_model_);
   EXPECT_EQ(folder, f2);
 }
 
 TEST_F(BookmarkIOSUtilsUnitTest, TestCreateBookmarkPath) {
-  const BookmarkNode* mobileNode = _bookmarkModel->mobile_node();
+  const BookmarkNode* mobileNode = bookmark_model_->mobile_node();
   const BookmarkNode* f1 = AddFolder(mobileNode, @"f1");
   NSArray* path =
-      bookmark_utils_ios::CreateBookmarkPath(_bookmarkModel, f1->id());
+      bookmark_utils_ios::CreateBookmarkPath(bookmark_model_, f1->id());
   NSMutableArray* expectedPath = [NSMutableArray array];
   [expectedPath addObject:@0];
   [expectedPath addObject:[NSNumber numberWithLongLong:mobileNode->id()]];
@@ -184,12 +184,12 @@
 }
 
 TEST_F(BookmarkIOSUtilsUnitTest, TestCreateNilBookmarkPath) {
-  NSArray* path = bookmark_utils_ios::CreateBookmarkPath(_bookmarkModel, 999);
+  NSArray* path = bookmark_utils_ios::CreateBookmarkPath(bookmark_model_, 999);
   EXPECT_TRUE(path == nil);
 }
 
 TEST_F(BookmarkIOSUtilsUnitTest, TestVisibleNonDescendantNodes) {
-  const BookmarkNode* mobileNode = _bookmarkModel->mobile_node();
+  const BookmarkNode* mobileNode = bookmark_model_->mobile_node();
   const BookmarkNode* music = AddFolder(mobileNode, @"music");
 
   const BookmarkNode* pop = AddFolder(music, @"pop");
@@ -209,7 +209,7 @@
   const BookmarkNode* camel = AddFolder(animals, @"camel");
   AddFolder(camel, @"al paca");
 
-  AddFolder(_bookmarkModel->other_node(), @"buildings");
+  AddFolder(bookmark_model_->other_node(), @"buildings");
 
   std::set<const BookmarkNode*> obstructions;
   // Editing a folder and a bookmark.
@@ -218,7 +218,7 @@
 
   bookmark_utils_ios::NodeVector result =
       bookmark_utils_ios::VisibleNonDescendantNodes(obstructions,
-                                                    _bookmarkModel);
+                                                    bookmark_model_);
   ASSERT_EQ(13u, result.size());
 
   EXPECT_NSEQ(base::SysUTF16ToNSString(result[0]->GetTitle()),
@@ -246,7 +246,7 @@
   EXPECT_TRUE(bookmark_utils_ios::IsSubvectorOfNodes(vector2, vector1));
 
   // Empty vs vector with one element: [] - [1].
-  const BookmarkNode* mobileNode = _bookmarkModel->mobile_node();
+  const BookmarkNode* mobileNode = bookmark_model_->mobile_node();
   const BookmarkNode* bookmark1 = AddBookmark(mobileNode, @"1");
   vector2.push_back(bookmark1);
   EXPECT_TRUE(bookmark_utils_ios::IsSubvectorOfNodes(vector1, vector2));
@@ -314,7 +314,7 @@
             bookmark_utils_ios::MissingNodesIndices(vector1, vector2).size());
 
   // [] - [1].
-  const BookmarkNode* mobileNode = _bookmarkModel->mobile_node();
+  const BookmarkNode* mobileNode = bookmark_model_->mobile_node();
   const BookmarkNode* bookmark1 = AddBookmark(mobileNode, @"1");
   vector2.push_back(bookmark1);
   std::vector<bookmark_utils_ios::NodeVector::size_type> missingNodesIndices =
diff --git a/ios/chrome/browser/ui/browser_view/BUILD.gn b/ios/chrome/browser/ui/browser_view/BUILD.gn
index 298022a..4395033 100644
--- a/ios/chrome/browser/ui/browser_view/BUILD.gn
+++ b/ios/chrome/browser/ui/browser_view/BUILD.gn
@@ -163,6 +163,7 @@
     "//ios/chrome/browser/web:tab_helper_delegates",
     "//ios/chrome/browser/web:web_internal",
     "//ios/chrome/browser/web_state_list",
+    "//ios/chrome/browser/web_state_list:agents",
     "//ios/chrome/browser/web_state_list/web_usage_enabler",
     "//ios/chrome/browser/webui",
     "//ios/chrome/common",
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
index 307bcc6..2527059 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -2402,11 +2402,9 @@
 - (void)initializeBookmarkInteractionController {
   if (_bookmarkInteractionController)
     return;
-  _bookmarkInteractionController = [[BookmarkInteractionController alloc]
-      initWithBrowserState:self.browserState
-          parentController:self
-                dispatcher:self.dispatcher
-              webStateList:self.browser->GetWebStateList()];
+  _bookmarkInteractionController =
+      [[BookmarkInteractionController alloc] initWithBrowser:self.browser
+                                            parentController:self];
 }
 
 - (void)updateOverlayContainerOrder {
diff --git a/ios/chrome/browser/ui/download/download_manager_egtest.mm b/ios/chrome/browser/ui/download/download_manager_egtest.mm
index e7944a4d..25cf2f4 100644
--- a/ios/chrome/browser/ui/download/download_manager_egtest.mm
+++ b/ios/chrome/browser/ui/download/download_manager_egtest.mm
@@ -12,7 +12,7 @@
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/chrome/test/scoped_eg_synchronization_disabler.h"
-#import "ios/testing/earl_grey/app_launch_manager.h"
+#import "ios/testing/earl_grey/app_launch_configuration.h"
 #import "ios/testing/earl_grey/earl_grey_test.h"
 #include "ios/testing/embedded_test_server_handlers.h"
 #include "ios/web/common/features.h"
@@ -96,12 +96,10 @@
 
 @implementation DownloadManagerTestCase
 
-- (void)launchAppForTestMethod {
-  [[AppLaunchManager sharedManager]
-      ensureAppLaunchedWithFeaturesEnabled:
-          {web::features::kEnablePersistentDownloads}
-                                  disabled:{}
-                            relaunchPolicy:NoForceRelaunchAndResetState];
+- (AppLaunchConfiguration)appConfigurationForTestCase {
+  AppLaunchConfiguration config;
+  config.features_enabled.push_back(web::features::kEnablePersistentDownloads);
+  return config;
 }
 
 - (void)setUp {
diff --git a/ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_egtest.mm b/ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_egtest.mm
index 5f8b051..17a3b1b 100644
--- a/ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_egtest.mm
+++ b/ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_egtest.mm
@@ -10,7 +10,7 @@
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
-#import "ios/testing/earl_grey/app_launch_manager.h"
+#import "ios/testing/earl_grey/app_launch_configuration.h"
 #import "ios/testing/earl_grey/earl_grey_test.h"
 #include "ui/base/l10n/l10n_util_mac.h"
 
@@ -90,11 +90,10 @@
 
 @implementation AutofillAddCreditCardTestCase
 
-- (void)launchAppForTestMethod {
-  [[AppLaunchManager sharedManager]
-      ensureAppLaunchedWithFeaturesEnabled:{kCreditCardScanner}
-                                  disabled:{}
-                            relaunchPolicy:NoForceRelaunchAndResetState];
+- (AppLaunchConfiguration)appConfigurationForTestCase {
+  AppLaunchConfiguration config;
+  config.features_enabled.push_back(kCreditCardScanner);
+  return config;
 }
 
 - (void)setUp {
diff --git a/ios/chrome/browser/ui/settings/google_services/accounts_table_egtest.mm b/ios/chrome/browser/ui/settings/google_services/accounts_table_egtest.mm
index 6bd35e9..6b7a5268 100644
--- a/ios/chrome/browser/ui/settings/google_services/accounts_table_egtest.mm
+++ b/ios/chrome/browser/ui/settings/google_services/accounts_table_egtest.mm
@@ -15,7 +15,7 @@
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/public/provider/chrome/browser/signin/fake_chrome_identity.h"
-#import "ios/testing/earl_grey/app_launch_manager.h"
+#import "ios/testing/earl_grey/app_launch_configuration.h"
 #import "ios/testing/earl_grey/earl_grey_test.h"
 #include "ui/base/l10n/l10n_util.h"
 
@@ -60,11 +60,10 @@
   [super tearDown];
 }
 
-- (void)launchAppForTestMethod {
-  [[AppLaunchManager sharedManager]
-      ensureAppLaunchedWithFeaturesEnabled:{kClearSyncedData}
-                                  disabled:{}
-                            relaunchPolicy:NoForceRelaunchAndResetState];
+- (AppLaunchConfiguration)appConfigurationForTestCase {
+  AppLaunchConfiguration config;
+  config.features_enabled.push_back(kClearSyncedData);
+  return config;
 }
 
 - (void)setUp {
diff --git a/ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.mm b/ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.mm
index 7362c7a..c4751ed 100644
--- a/ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.mm
+++ b/ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.mm
@@ -269,7 +269,7 @@
 
 #pragma mark - ManageSyncSettingsCoordinatorDelegate
 
-- (void)manageSyncSettingsCoordinatorWasPopped:
+- (void)manageSyncSettingsCoordinatorWasRemoved:
     (ManageSyncSettingsCoordinator*)coordinator {
   DCHECK_EQ(self.manageSyncSettingsCoordinator, coordinator);
   [self.manageSyncSettingsCoordinator stop];
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.h b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.h
index 9626bf8..f92e756 100644
--- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.h
+++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.h
@@ -12,8 +12,8 @@
 // Delegate for ManageSyncSettingsCoordinator.
 @protocol ManageSyncSettingsCoordinatorDelegate <NSObject>
 
-// Called when the view controller is popped out from navigation controller.
-- (void)manageSyncSettingsCoordinatorWasPopped:
+// Called when the view controller is removed from its parent.
+- (void)manageSyncSettingsCoordinatorWasRemoved:
     (ManageSyncSettingsCoordinator*)coordinator;
 
 @end
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm
index ec742f8a..e5aac7b 100644
--- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm
+++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm
@@ -103,10 +103,10 @@
 
 #pragma mark - ManageSyncSettingsTableViewControllerPresentationDelegate
 
-- (void)manageSyncSettingsTableViewControllerWasPopped:
+- (void)manageSyncSettingsTableViewControllerWasRemoved:
     (ManageSyncSettingsTableViewController*)controller {
   DCHECK_EQ(self.viewController, controller);
-  [self.delegate manageSyncSettingsCoordinatorWasPopped:self];
+  [self.delegate manageSyncSettingsCoordinatorWasRemoved:self];
 }
 
 #pragma mark - ChromeIdentityBrowserOpener
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_table_view_controller.h b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_table_view_controller.h
index 0004a3b..345963ee 100644
--- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_table_view_controller.h
+++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_table_view_controller.h
@@ -19,7 +19,7 @@
 @protocol ManageSyncSettingsTableViewControllerPresentationDelegate <NSObject>
 
 // Called when the view controller is removed from its parent.
-- (void)manageSyncSettingsTableViewControllerWasPopped:
+- (void)manageSyncSettingsTableViewControllerWasRemoved:
     (ManageSyncSettingsTableViewController*)controller;
 
 @end
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_table_view_controller.mm b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_table_view_controller.mm
index 34e0aab..cbc07bc3 100644
--- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_table_view_controller.mm
@@ -33,6 +33,14 @@
   [self reloadData];
 }
 
+- (void)didMoveToParentViewController:(UIViewController*)parent {
+  [super didMoveToParentViewController:parent];
+  if (!parent) {
+    [self.presentationDelegate
+        manageSyncSettingsTableViewControllerWasRemoved:self];
+  }
+}
+
 #pragma mark - Private
 
 - (void)switchAction:(UISwitch*)sender {
@@ -63,13 +71,6 @@
   return cell;
 }
 
-#pragma mark - SettingsControllerProtocol
-
-- (void)viewControllerWasPopped {
-  [self.presentationDelegate
-      manageSyncSettingsTableViewControllerWasPopped:self];
-}
-
 #pragma mark - ChromeTableViewController
 
 - (void)loadModel {
diff --git a/ios/chrome/browser/ui/tab_grid/BUILD.gn b/ios/chrome/browser/ui/tab_grid/BUILD.gn
index 19e371a..747da879 100644
--- a/ios/chrome/browser/ui/tab_grid/BUILD.gn
+++ b/ios/chrome/browser/ui/tab_grid/BUILD.gn
@@ -43,6 +43,7 @@
     "//ios/chrome/browser/url_loading",
     "//ios/chrome/browser/web",
     "//ios/chrome/browser/web_state_list",
+    "//ios/chrome/browser/web_state_list:agents",
     "//ios/chrome/browser/web_state_list/web_usage_enabler",
     "//ios/web",
     "//ui/base",
diff --git a/ios/chrome/browser/url_loading/BUILD.gn b/ios/chrome/browser/url_loading/BUILD.gn
index abfc2bf..4f5a6df 100644
--- a/ios/chrome/browser/url_loading/BUILD.gn
+++ b/ios/chrome/browser/url_loading/BUILD.gn
@@ -46,6 +46,7 @@
     "//ios/chrome/browser/ui/ntp:util",
     "//ios/chrome/browser/web",
     "//ios/chrome/browser/web_state_list",
+    "//ios/chrome/browser/web_state_list:agents",
     "//ios/web/public",
     "//ui/base",
     "//url",
@@ -72,6 +73,7 @@
     "//ios/chrome/browser/web",
     "//ios/chrome/browser/web:web_internal",
     "//ios/chrome/browser/web_state_list",
+    "//ios/chrome/browser/web_state_list:agents",
     "//ios/chrome/browser/web_state_list:test_support",
     "//ios/chrome/browser/web_state_list/web_usage_enabler",
     "//ios/chrome/test:test_support",
diff --git a/ios/chrome/browser/web_state_list/BUILD.gn b/ios/chrome/browser/web_state_list/BUILD.gn
index d4c66b1..a698a19 100644
--- a/ios/chrome/browser/web_state_list/BUILD.gn
+++ b/ios/chrome/browser/web_state_list/BUILD.gn
@@ -8,8 +8,6 @@
     "active_web_state_observation_forwarder.mm",
     "all_web_state_observation_forwarder.h",
     "all_web_state_observation_forwarder.mm",
-    "tab_insertion_browser_agent.h",
-    "tab_insertion_browser_agent.mm",
     "web_state_list.h",
     "web_state_list.mm",
     "web_state_list_delegate.h",
@@ -33,7 +31,6 @@
     "//components/favicon/core",
     "//components/favicon/ios",
     "//ios/chrome/browser/browser_state",
-    "//ios/chrome/browser/main:public",
     "//ios/chrome/browser/sessions:restoration_observer",
     "//ios/chrome/browser/sessions:serialisation",
     "//ios/web",
@@ -43,6 +40,21 @@
   configs += [ "//build/config/compiler:enable_arc" ]
 }
 
+source_set("agents") {
+  sources = [
+    "tab_insertion_browser_agent.h",
+    "tab_insertion_browser_agent.mm",
+  ]
+  deps = [
+    ":web_state_list",
+    "//ios/chrome/browser/browser_state",
+    "//ios/chrome/browser/main:public",
+    "//ios/web/public",
+  ]
+  libs = [ "Foundation.framework" ]
+  configs += [ "//build/config/compiler:enable_arc" ]
+}
+
 source_set("test_support") {
   testonly = true
   sources = [
@@ -69,6 +81,7 @@
     "web_state_opener_unittest.mm",
   ]
   deps = [
+    ":agents",
     ":test_support",
     ":web_state_list",
     "//base",
diff --git a/ios/testing/earl_grey/app_launch_manager.h b/ios/testing/earl_grey/app_launch_manager.h
index c8766f3..4fcd58c 100644
--- a/ios/testing/earl_grey/app_launch_manager.h
+++ b/ios/testing/earl_grey/app_launch_manager.h
@@ -40,13 +40,14 @@
 // Otherwise, the app will be activated instead of (re)launched.
 // Will wait until app is activated or launched, and fail the test if it
 // fails to do so.
-// |configuration| sets features, variations and relaunch manners.
-// If you're trying to call this method in |-setUp()|, please put it in
-// |-launchAppForTestMethod()| instead for better efficiency.
+// |configuration| sets features, variations, arguments and relaunch manners.
+// If you're trying to call this method in |-setUp()|, please specify an
+// |AppLaunchConfiguration| in |-appConfigurationForTestCase()| instead for
+// better efficiency.
 - (void)ensureAppLaunchedWithConfiguration:
     (AppLaunchConfiguration)configuration;
 
-// See ensureAppLaunchedWithConfiguration: for details.
+// DEPRECATED. Use |ensureAppLaunchedWithConfiguration:| instead.
 - (void)ensureAppLaunchedWithFeaturesEnabled:
             (std::vector<base::Feature>)featuresEnabled
                                     disabled:(std::vector<base::Feature>)
diff --git a/ios/testing/earl_grey/base_earl_grey_test_case.h b/ios/testing/earl_grey/base_earl_grey_test_case.h
index db3a2c0..19ff3b64 100644
--- a/ios/testing/earl_grey/base_earl_grey_test_case.h
+++ b/ios/testing/earl_grey/base_earl_grey_test_case.h
@@ -7,6 +7,8 @@
 
 #import <XCTest/XCTest.h>
 
+#import "ios/testing/earl_grey/app_launch_configuration.h"
+
 // Base class for all Earl Grey tests.
 // Provides EG1-compatible start-of-test-case hooks for EG2 tests,
 // as well as handling common EG2 app-launching logic.
@@ -24,12 +26,11 @@
 // Invoked upon starting each test method in a test case.
 - (void)setUp NS_REQUIRES_SUPER;
 
-// Responsible for launching the app under test in EG2 tests.
-// By default, will launch the app once per test process launch with
-// default parameters; individual test cases can override this method if they
-// wish to pass different parameters or provide different behavior.
-// Protected method.
-- (void)launchAppForTestMethod;
+// Provides an |AppLaunchConfiguration| for host app used across a TestCase.
+// Subclasses must override this method to change app launching configuration
+// (f.e. features or flags). Default implementation returns default
+// AppLaunchConfiguration object.
+- (AppLaunchConfiguration)appConfigurationForTestCase;
 
 @end
 
diff --git a/ios/testing/earl_grey/base_earl_grey_test_case.mm b/ios/testing/earl_grey/base_earl_grey_test_case.mm
index 04c403b..ca257ea6 100644
--- a/ios/testing/earl_grey/base_earl_grey_test_case.mm
+++ b/ios/testing/earl_grey/base_earl_grey_test_case.mm
@@ -10,6 +10,7 @@
 #include "base/feature_list.h"
 #include "base/logging.h"
 #include "base/strings/sys_string_conversions.h"
+#import "ios/testing/earl_grey/app_launch_configuration.h"
 #import "ios/testing/earl_grey/app_launch_manager.h"
 #import "ios/testing/earl_grey/base_earl_grey_test_case_app_interface.h"
 #import "ios/testing/earl_grey/coverage_utils.h"
@@ -43,7 +44,8 @@
   [super setUp];
 
 #if defined(CHROME_EARL_GREY_2)
-  [self launchAppForTestMethod];
+  [[AppLaunchManager sharedManager]
+      ensureAppLaunchedWithConfiguration:[self appConfigurationForTestCase]];
   [self handleSystemAlertIfVisible];
 
   NSString* logFormat = @"*********************************\nStarting test: %@";
@@ -112,10 +114,8 @@
 #endif  // CHROME_EARL_GREY_2
 }
 
-- (void)launchAppForTestMethod {
-  [[AppLaunchManager sharedManager] ensureAppLaunchedWithFeaturesEnabled:{}
-      disabled:{}
-      relaunchPolicy:NoForceRelaunchAndResetState];
+- (AppLaunchConfiguration)appConfigurationForTestCase {
+  return AppLaunchConfiguration();
 }
 
 #pragma mark - Private
diff --git a/ios/web/js_messaging/crw_js_window_id_manager.mm b/ios/web/js_messaging/crw_js_window_id_manager.mm
index 288ffa3..2cd6833 100644
--- a/ios/web/js_messaging/crw_js_window_id_manager.mm
+++ b/ios/web/js_messaging/crw_js_window_id_manager.mm
@@ -61,7 +61,8 @@
              completionHandler:^(id result, NSError* error) {
                if (error) {
                  DCHECK(error.code == WKErrorWebViewInvalidated ||
-                        error.code == WKErrorWebContentProcessTerminated);
+                        error.code == WKErrorWebContentProcessTerminated)
+                     << error.description;
                  return;
                }
 
diff --git a/ios/web_view/internal/passwords/web_view_password_feature_manager.h b/ios/web_view/internal/passwords/web_view_password_feature_manager.h
index 3b76fa9..d9917d3 100644
--- a/ios/web_view/internal/passwords/web_view_password_feature_manager.h
+++ b/ios/web_view/internal/passwords/web_view_password_feature_manager.h
@@ -18,8 +18,6 @@
 
   bool IsGenerationEnabled() const override;
 
-  bool ShouldCheckReuseOnLeakDetection() const override;
-
   bool IsOptedInForAccountStorage() const override;
   bool ShouldShowAccountStorageOptIn() const override;
   void SetAccountStorageOptIn(bool opt_in) override;
diff --git a/ios/web_view/internal/passwords/web_view_password_feature_manager.mm b/ios/web_view/internal/passwords/web_view_password_feature_manager.mm
index d4810d47..877fcf9 100644
--- a/ios/web_view/internal/passwords/web_view_password_feature_manager.mm
+++ b/ios/web_view/internal/passwords/web_view_password_feature_manager.mm
@@ -16,10 +16,6 @@
   return false;
 }
 
-bool WebViewPasswordFeatureManager::ShouldCheckReuseOnLeakDetection() const {
-  return false;
-}
-
 bool WebViewPasswordFeatureManager::IsOptedInForAccountStorage() const {
   return false;
 }
diff --git a/media/cast/cast_environment.cc b/media/cast/cast_environment.cc
index 6c4b5a6c..b83ecd5 100644
--- a/media/cast/cast_environment.cc
+++ b/media/cast/cast_environment.cc
@@ -30,8 +30,8 @@
 
 bool CastEnvironment::PostTask(ThreadId identifier,
                                const base::Location& from_here,
-                               const base::Closure& task) {
-  return GetTaskRunner(identifier)->PostTask(from_here, task);
+                               base::OnceClosure task) {
+  return GetTaskRunner(identifier)->PostTask(from_here, std::move(task));
 }
 
 bool CastEnvironment::PostDelayedTask(ThreadId identifier,
diff --git a/media/cast/cast_environment.h b/media/cast/cast_environment.h
index 45c95f4..7a0b7b7 100644
--- a/media/cast/cast_environment.h
+++ b/media/cast/cast_environment.h
@@ -44,7 +44,7 @@
   // the target thread may already have a Quit message in its queue.
   bool PostTask(ThreadId identifier,
                 const base::Location& from_here,
-                const base::Closure& task);
+                base::OnceClosure task);
 
   bool PostDelayedTask(ThreadId identifier,
                        const base::Location& from_here,
diff --git a/media/cast/cast_sender_impl.cc b/media/cast/cast_sender_impl.cc
index 11bb4e61..76e51e8 100644
--- a/media/cast/cast_sender_impl.cc
+++ b/media/cast/cast_sender_impl.cc
@@ -30,8 +30,8 @@
                            base::TimeTicks capture_time) final {
     cast_environment_->PostTask(
         CastEnvironment::MAIN, FROM_HERE,
-        base::BindRepeating(&VideoSender::InsertRawVideoFrame, video_sender_,
-                            std::move(video_frame), capture_time));
+        base::BindOnce(&VideoSender::InsertRawVideoFrame, video_sender_,
+                       std::move(video_frame), capture_time));
   }
 
   scoped_refptr<VideoFrame> MaybeCreateOptimizedFrame(
@@ -68,12 +68,10 @@
 
   void InsertAudio(std::unique_ptr<AudioBus> audio_bus,
                    const base::TimeTicks& recorded_time) final {
-    cast_environment_->PostTask(CastEnvironment::MAIN,
-                                FROM_HERE,
-                                base::Bind(&AudioSender::InsertAudio,
-                                           audio_sender_,
-                                           base::Passed(&audio_bus),
-                                           recorded_time));
+    cast_environment_->PostTask(
+        CastEnvironment::MAIN, FROM_HERE,
+        base::BindOnce(&AudioSender::InsertAudio, audio_sender_,
+                       base::Passed(&audio_bus), recorded_time));
   }
 
  protected:
diff --git a/media/cast/logging/log_event_dispatcher.cc b/media/cast/logging/log_event_dispatcher.cc
index b14511c..7d03f83 100644
--- a/media/cast/logging/log_event_dispatcher.cc
+++ b/media/cast/logging/log_event_dispatcher.cc
@@ -29,8 +29,8 @@
     impl_->DispatchFrameEvent(std::move(event));
   } else {
     env_->PostTask(CastEnvironment::MAIN, FROM_HERE,
-                   base::Bind(&LogEventDispatcher::Impl::DispatchFrameEvent,
-                              impl_, base::Passed(&event)));
+                   base::BindOnce(&LogEventDispatcher::Impl::DispatchFrameEvent,
+                                  impl_, base::Passed(&event)));
   }
 }
 
@@ -39,9 +39,10 @@
   if (env_->CurrentlyOn(CastEnvironment::MAIN)) {
     impl_->DispatchPacketEvent(std::move(event));
   } else {
-    env_->PostTask(CastEnvironment::MAIN, FROM_HERE,
-                   base::Bind(&LogEventDispatcher::Impl::DispatchPacketEvent,
-                              impl_, base::Passed(&event)));
+    env_->PostTask(
+        CastEnvironment::MAIN, FROM_HERE,
+        base::BindOnce(&LogEventDispatcher::Impl::DispatchPacketEvent, impl_,
+                       base::Passed(&event)));
   }
 }
 
@@ -54,8 +55,9 @@
   } else {
     env_->PostTask(
         CastEnvironment::MAIN, FROM_HERE,
-        base::Bind(&LogEventDispatcher::Impl::DispatchBatchOfEvents, impl_,
-                   base::Passed(&frame_events), base::Passed(&packet_events)));
+        base::BindOnce(&LogEventDispatcher::Impl::DispatchBatchOfEvents, impl_,
+                       base::Passed(&frame_events),
+                       base::Passed(&packet_events)));
   }
 }
 
@@ -63,9 +65,9 @@
   if (env_->CurrentlyOn(CastEnvironment::MAIN)) {
     impl_->Subscribe(subscriber);
   } else {
-    env_->PostTask(
-        CastEnvironment::MAIN, FROM_HERE,
-        base::Bind(&LogEventDispatcher::Impl::Subscribe, impl_, subscriber));
+    env_->PostTask(CastEnvironment::MAIN, FROM_HERE,
+                   base::BindOnce(&LogEventDispatcher::Impl::Subscribe, impl_,
+                                  subscriber));
   }
 }
 
@@ -87,9 +89,9 @@
     };
     base::WaitableEvent done(base::WaitableEvent::ResetPolicy::MANUAL,
                              base::WaitableEvent::InitialState::NOT_SIGNALED);
-    CHECK(env_->PostTask(
-        CastEnvironment::MAIN, FROM_HERE,
-        base::Bind(&Helper::UnsubscribeAndSignal, impl_, subscriber, &done)));
+    CHECK(env_->PostTask(CastEnvironment::MAIN, FROM_HERE,
+                         base::BindOnce(&Helper::UnsubscribeAndSignal, impl_,
+                                        subscriber, &done)));
     done.Wait();
   }
 }
diff --git a/media/cast/receiver/audio_decoder.cc b/media/cast/receiver/audio_decoder.cc
index 61f6b3d..5bdff76 100644
--- a/media/cast/receiver/audio_decoder.cc
+++ b/media/cast/receiver/audio_decoder.cc
@@ -63,10 +63,10 @@
                static_cast<int>(encoded_frame->data.size()));
     if (!decoded_audio) {
       VLOG(2) << "Decoding of frame " << encoded_frame->frame_id << " failed.";
-      cast_environment_->GetTaskRunner(CastEnvironment::MAIN)
-          ->PostTask(FROM_HERE,
-                     base::BindOnce(std::move(callback),
-                                    base::Passed(&decoded_audio), false));
+      cast_environment_->PostTask(
+          CastEnvironment::MAIN, FROM_HERE,
+          base::BindOnce(std::move(callback), base::Passed(&decoded_audio),
+                         false));
       return;
     }
 
@@ -78,10 +78,10 @@
     event->frame_id = encoded_frame->frame_id;
     cast_environment_->logger()->DispatchFrameEvent(std::move(event));
 
-    cast_environment_->GetTaskRunner(CastEnvironment::MAIN)
-        ->PostTask(FROM_HERE,
-                   base::BindOnce(std::move(callback),
-                                  base::Passed(&decoded_audio), is_continuous));
+    cast_environment_->PostTask(
+        CastEnvironment::MAIN, FROM_HERE,
+        base::BindOnce(std::move(callback), base::Passed(&decoded_audio),
+                       is_continuous));
   }
 
  protected:
@@ -249,10 +249,10 @@
     std::move(callback).Run(base::WrapUnique<AudioBus>(nullptr), false);
     return;
   }
-  cast_environment_->GetTaskRunner(CastEnvironment::AUDIO)
-      ->PostTask(FROM_HERE, base::BindOnce(&AudioDecoder::ImplBase::DecodeFrame,
-                                           impl_, base::Passed(&encoded_frame),
-                                           std::move(callback)));
+  cast_environment_->PostTask(
+      CastEnvironment::AUDIO, FROM_HERE,
+      base::BindOnce(&AudioDecoder::ImplBase::DecodeFrame, impl_,
+                     base::Passed(&encoded_frame), std::move(callback)));
 }
 
 }  // namespace cast
diff --git a/media/cast/receiver/audio_decoder_unittest.cc b/media/cast/receiver/audio_decoder_unittest.cc
index 750f021..e50940efc 100644
--- a/media/cast/receiver/audio_decoder_unittest.cc
+++ b/media/cast/receiver/audio_decoder_unittest.cc
@@ -126,14 +126,12 @@
     }
 
     cast_environment_->PostTask(
-        CastEnvironment::MAIN,
-        FROM_HERE,
-        base::Bind(&AudioDecoder::DecodeFrame,
-                   base::Unretained(audio_decoder_.get()),
-                   base::Passed(&encoded_frame),
-                   base::Bind(&AudioDecoderTest::OnDecodedFrame,
-                              base::Unretained(this),
-                              num_dropped_frames == 0)));
+        CastEnvironment::MAIN, FROM_HERE,
+        base::BindOnce(
+            &AudioDecoder::DecodeFrame, base::Unretained(audio_decoder_.get()),
+            base::Passed(&encoded_frame),
+            base::Bind(&AudioDecoderTest::OnDecodedFrame,
+                       base::Unretained(this), num_dropped_frames == 0)));
   }
 
   // Blocks the caller until all audio that has been feed in has been decoded.
diff --git a/media/cast/receiver/cast_receiver_impl.cc b/media/cast/receiver/cast_receiver_impl.cc
index d855565..acf2794 100644
--- a/media/cast/receiver/cast_receiver_impl.cc
+++ b/media/cast/receiver/cast_receiver_impl.cc
@@ -70,11 +70,9 @@
     return;
   }
   cast_environment_->PostTask(
-      CastEnvironment::MAIN,
-      FROM_HERE,
-      base::Bind(base::IgnoreResult(&FrameReceiver::ProcessPacket),
-                 target,
-                 base::Passed(&packet)));
+      CastEnvironment::MAIN, FROM_HERE,
+      base::BindOnce(base::IgnoreResult(&FrameReceiver::ProcessPacket), target,
+                     base::Passed(&packet)));
 }
 
 void CastReceiverImpl::RequestDecodedAudioFrame(
diff --git a/media/cast/receiver/frame_receiver.cc b/media/cast/receiver/frame_receiver.cc
index 25322a11..9b1aff2 100644
--- a/media/cast/receiver/frame_receiver.cc
+++ b/media/cast/receiver/frame_receiver.cc
@@ -280,8 +280,9 @@
     }
     cast_environment_->PostTask(
         CastEnvironment::MAIN, FROM_HERE,
-        base::Bind(&FrameReceiver::EmitOneFrame, AsWeakPtr(),
-                   frame_request_queue_.front(), base::Passed(&encoded_frame)));
+        base::BindOnce(&FrameReceiver::EmitOneFrame, AsWeakPtr(),
+                       frame_request_queue_.front(),
+                       base::Passed(&encoded_frame)));
     frame_request_queue_.pop_front();
   }
 }
diff --git a/media/cast/receiver/video_decoder.cc b/media/cast/receiver/video_decoder.cc
index 7ad5314c..3f2c86e 100644
--- a/media/cast/receiver/video_decoder.cc
+++ b/media/cast/receiver/video_decoder.cc
@@ -59,8 +59,9 @@
         static_cast<int>(encoded_frame->data.size()));
     if (!decoded_frame) {
       VLOG(2) << "Decoding of frame " << encoded_frame->frame_id << " failed.";
-      cast_environment_->PostTask(CastEnvironment::MAIN, FROM_HERE,
-                                  base::Bind(callback, decoded_frame, false));
+      cast_environment_->PostTask(
+          CastEnvironment::MAIN, FROM_HERE,
+          base::BindOnce(callback, decoded_frame, false));
       return;
     }
     decoded_frame->set_timestamp(
@@ -75,9 +76,8 @@
     cast_environment_->logger()->DispatchFrameEvent(std::move(decode_event));
 
     cast_environment_->PostTask(
-        CastEnvironment::MAIN,
-        FROM_HERE,
-        base::Bind(callback, decoded_frame, is_continuous));
+        CastEnvironment::MAIN, FROM_HERE,
+        base::BindOnce(callback, decoded_frame, is_continuous));
   }
 
  protected:
@@ -260,12 +260,10 @@
     callback.Run(base::WrapRefCounted<VideoFrame>(nullptr), false);
     return;
   }
-  cast_environment_->PostTask(CastEnvironment::VIDEO,
-                              FROM_HERE,
-                              base::Bind(&VideoDecoder::ImplBase::DecodeFrame,
-                                         impl_,
-                                         base::Passed(&encoded_frame),
-                                         callback));
+  cast_environment_->PostTask(
+      CastEnvironment::VIDEO, FROM_HERE,
+      base::BindOnce(&VideoDecoder::ImplBase::DecodeFrame, impl_,
+                     base::Passed(&encoded_frame), callback));
 }
 
 }  // namespace cast
diff --git a/media/cast/receiver/video_decoder_unittest.cc b/media/cast/receiver/video_decoder_unittest.cc
index 6191077..f950dda7 100644
--- a/media/cast/receiver/video_decoder_unittest.cc
+++ b/media/cast/receiver/video_decoder_unittest.cc
@@ -103,15 +103,13 @@
 
     // Post a task to decode the encoded frame.
     cast_environment_->PostTask(
-        CastEnvironment::MAIN,
-        FROM_HERE,
-        base::Bind(&VideoDecoder::DecodeFrame,
-                   base::Unretained(video_decoder_.get()),
-                   base::Passed(&encoded_frame),
-                   base::Bind(&VideoDecoderTest::OnDecodedFrame,
-                              base::Unretained(this),
-                              video_frame,
-                              num_dropped_frames == 0)));
+        CastEnvironment::MAIN, FROM_HERE,
+        base::BindOnce(&VideoDecoder::DecodeFrame,
+                       base::Unretained(video_decoder_.get()),
+                       base::Passed(&encoded_frame),
+                       base::Bind(&VideoDecoderTest::OnDecodedFrame,
+                                  base::Unretained(this), video_frame,
+                                  num_dropped_frames == 0)));
   }
 
   // Blocks the caller until all video that has been feed in has been decoded.
diff --git a/media/cast/sender/audio_encoder.cc b/media/cast/sender/audio_encoder.cc
index 85282c43..6b7bbb9 100644
--- a/media/cast/sender/audio_encoder.cc
+++ b/media/cast/sender/audio_encoder.cc
@@ -165,11 +165,9 @@
         audio_frame->encode_completion_time =
             cast_environment_->Clock()->NowTicks();
         cast_environment_->PostTask(
-            CastEnvironment::MAIN,
-            FROM_HERE,
-            base::Bind(callback_,
-                       base::Passed(&audio_frame),
-                       samples_dropped_from_buffer_));
+            CastEnvironment::MAIN, FROM_HERE,
+            base::BindOnce(callback_, base::Passed(&audio_frame),
+                           samples_dropped_from_buffer_));
         samples_dropped_from_buffer_ = 0;
       }
 
@@ -824,12 +822,10 @@
     NOTREACHED();
     return;
   }
-  cast_environment_->PostTask(CastEnvironment::AUDIO,
-                              FROM_HERE,
-                              base::Bind(&AudioEncoder::ImplBase::EncodeAudio,
-                                         impl_,
-                                         base::Passed(&audio_bus),
-                                         recorded_time));
+  cast_environment_->PostTask(
+      CastEnvironment::AUDIO, FROM_HERE,
+      base::BindOnce(&AudioEncoder::ImplBase::EncodeAudio, impl_,
+                     base::Passed(&audio_bus), recorded_time));
 }
 
 }  // namespace cast
diff --git a/media/cast/sender/audio_sender.cc b/media/cast/sender/audio_sender.cc
index 2fc40ff..9d3f8f0 100644
--- a/media/cast/sender/audio_sender.cc
+++ b/media/cast/sender/audio_sender.cc
@@ -36,11 +36,10 @@
   // Post a task now with its initialization result status to allow the client
   // to start sending frames.
   cast_environment_->PostTask(
-      CastEnvironment::MAIN,
-      FROM_HERE,
-      base::Bind(status_change_cb,
-                 audio_encoder_ ? audio_encoder_->InitializationResult() :
-                     STATUS_INVALID_CONFIGURATION));
+      CastEnvironment::MAIN, FROM_HERE,
+      base::BindOnce(status_change_cb,
+                     audio_encoder_ ? audio_encoder_->InitializationResult()
+                                    : STATUS_INVALID_CONFIGURATION));
 
   // The number of samples per encoded audio frame depends on the codec and its
   // initialization parameters. Now that we have an encoder, we can calculate
diff --git a/media/cast/sender/external_video_encoder.cc b/media/cast/sender/external_video_encoder.cc
index 2d06929..d164cb6 100644
--- a/media/cast/sender/external_video_encoder.cc
+++ b/media/cast/sender/external_video_encoder.cc
@@ -130,11 +130,11 @@
     UMA_HISTOGRAM_BOOLEAN("Cast.Sender.VideoEncodeAcceleratorInitializeSuccess",
                           encoder_active_);
 
-    cast_environment_->GetTaskRunner(CastEnvironment::MAIN)
-        ->PostTask(FROM_HERE,
-                   base::BindOnce(status_change_cb_,
-                                  encoder_active_ ? STATUS_INITIALIZED
-                                                  : STATUS_CODEC_INIT_FAILED));
+    cast_environment_->PostTask(
+        CastEnvironment::MAIN, FROM_HERE,
+        base::BindOnce(status_change_cb_, encoder_active_
+                                              ? STATUS_INITIALIZED
+                                              : STATUS_CODEC_INIT_FAILED));
   }
 
   void SetBitRate(int bit_rate) {
@@ -237,9 +237,9 @@
 
     encoder_active_ = false;
 
-    cast_environment_->GetTaskRunner(CastEnvironment::MAIN)
-        ->PostTask(FROM_HERE, base::BindOnce(status_change_cb_,
-                                             STATUS_CODEC_RUNTIME_ERROR));
+    cast_environment_->PostTask(
+        CastEnvironment::MAIN, FROM_HERE,
+        base::BindOnce(status_change_cb_, STATUS_CODEC_RUNTIME_ERROR));
 
     // TODO(miu): Force-flush all |in_progress_frame_encodes_| immediately so
     // pending frames do not become stuck, freezing VideoSender.
@@ -399,10 +399,10 @@
 
       encoded_frame->encode_completion_time =
           cast_environment_->Clock()->NowTicks();
-      cast_environment_->GetTaskRunner(CastEnvironment::MAIN)
-          ->PostTask(FROM_HERE,
-                     base::BindOnce(std::move(request.frame_encoded_callback),
-                                    base::Passed(&encoded_frame)));
+      cast_environment_->PostTask(
+          CastEnvironment::MAIN, FROM_HERE,
+          base::BindOnce(std::move(request.frame_encoded_callback),
+                         base::Passed(&encoded_frame)));
 
       in_progress_frame_encodes_.pop_front();
     } else {
@@ -491,11 +491,11 @@
     DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
     std::unique_ptr<SenderEncodedFrame> no_result(nullptr);
-    cast_environment_->GetTaskRunner(CastEnvironment::MAIN)
-        ->PostTask(FROM_HERE,
-                   base::BindOnce(std::move(in_progress_frame_encodes_.back()
-                                                .frame_encoded_callback),
-                                  base::Passed(&no_result)));
+    cast_environment_->PostTask(
+        CastEnvironment::MAIN, FROM_HERE,
+        base::BindOnce(
+            std::move(in_progress_frame_encodes_.back().frame_encoded_callback),
+            base::Passed(&no_result)));
     in_progress_frame_encodes_.pop_back();
   }
 
@@ -731,9 +731,9 @@
   // system does not support or lacks the resources to provide GPU-accelerated
   // video encoding.
   if (!encoder_task_runner || !vea) {
-    cast_environment_->GetTaskRunner(CastEnvironment::MAIN)
-        ->PostTask(FROM_HERE,
-                   base::BindOnce(status_change_cb, STATUS_CODEC_INIT_FAILED));
+    cast_environment_->PostTask(
+        CastEnvironment::MAIN, FROM_HERE,
+        base::BindOnce(status_change_cb, STATUS_CODEC_INIT_FAILED));
     return;
   }
 
@@ -749,9 +749,9 @@
       NOTREACHED() << "Fake software video encoder cannot be external";
       FALLTHROUGH;
     default:
-      cast_environment_->GetTaskRunner(CastEnvironment::MAIN)
-          ->PostTask(FROM_HERE, base::BindOnce(status_change_cb,
-                                               STATUS_UNSUPPORTED_CODEC));
+      cast_environment_->PostTask(
+          CastEnvironment::MAIN, FROM_HERE,
+          base::BindOnce(status_change_cb, STATUS_UNSUPPORTED_CODEC));
       return;
   }
 
diff --git a/media/cast/sender/size_adaptable_video_encoder_base.cc b/media/cast/sender/size_adaptable_video_encoder_base.cc
index cf9d9af..7515263d 100644
--- a/media/cast/sender/size_adaptable_video_encoder_base.cc
+++ b/media/cast/sender/size_adaptable_video_encoder_base.cc
@@ -23,9 +23,8 @@
       frames_in_encoder_(0),
       next_frame_id_(FrameId::first()) {
   cast_environment_->PostTask(
-      CastEnvironment::MAIN,
-      FROM_HERE,
-      base::Bind(status_change_cb_, STATUS_INITIALIZED));
+      CastEnvironment::MAIN, FROM_HERE,
+      base::BindOnce(status_change_cb_, STATUS_INITIALIZED));
 }
 
 SizeAdaptableVideoEncoderBase::~SizeAdaptableVideoEncoderBase() {
diff --git a/media/cast/sender/video_encoder_impl.cc b/media/cast/sender/video_encoder_impl.cc
index 9cb058f..94db36a9 100644
--- a/media/cast/sender/video_encoder_impl.cc
+++ b/media/cast/sender/video_encoder_impl.cc
@@ -40,9 +40,9 @@
   std::unique_ptr<SenderEncodedFrame> encoded_frame(new SenderEncodedFrame());
   encoder->Encode(std::move(video_frame), reference_time, encoded_frame.get());
   encoded_frame->encode_completion_time = environment->Clock()->NowTicks();
-  environment->GetTaskRunner(CastEnvironment::MAIN)
-      ->PostTask(FROM_HERE, base::BindOnce(std::move(frame_encoded_callback),
-                                           base::Passed(&encoded_frame)));
+  environment->PostTask(CastEnvironment::MAIN, FROM_HERE,
+                        base::BindOnce(std::move(frame_encoded_callback),
+                                       base::Passed(&encoded_frame)));
 }
 }  // namespace
 
@@ -66,9 +66,10 @@
 
   if (video_config.codec == CODEC_VIDEO_VP8) {
     encoder_ = std::make_unique<Vp8Encoder>(video_config);
-    cast_environment_->PostTask(CastEnvironment::VIDEO, FROM_HERE,
-                                base::Bind(&InitializeEncoderOnEncoderThread,
-                                           cast_environment, encoder_.get()));
+    cast_environment_->PostTask(
+        CastEnvironment::VIDEO, FROM_HERE,
+        base::BindOnce(&InitializeEncoderOnEncoderThread, cast_environment,
+                       encoder_.get()));
 #ifndef OFFICIAL_BUILD
   } else if (video_config.codec == CODEC_VIDEO_FAKE) {
     encoder_ = std::make_unique<FakeSoftwareVideoEncoder>(video_config);
@@ -81,21 +82,19 @@
   dynamic_config_.bit_rate = video_config.start_bitrate;
 
   cast_environment_->PostTask(
-      CastEnvironment::MAIN,
-      FROM_HERE,
-      base::Bind(status_change_cb,
-                 encoder_.get() ? STATUS_INITIALIZED :
-                                  STATUS_UNSUPPORTED_CODEC));
+      CastEnvironment::MAIN, FROM_HERE,
+      base::BindOnce(status_change_cb, encoder_.get()
+                                           ? STATUS_INITIALIZED
+                                           : STATUS_UNSUPPORTED_CODEC));
 }
 
 VideoEncoderImpl::~VideoEncoderImpl() {
   DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN));
   if (encoder_) {
     cast_environment_->PostTask(
-        CastEnvironment::VIDEO,
-        FROM_HERE,
-        base::Bind(&base::DeletePointer<SoftwareVideoEncoder>,
-                   encoder_.release()));
+        CastEnvironment::VIDEO, FROM_HERE,
+        base::BindOnce(&base::DeletePointer<SoftwareVideoEncoder>,
+                       encoder_.release()));
   }
 }
 
@@ -109,10 +108,9 @@
 
   cast_environment_->PostTask(
       CastEnvironment::VIDEO, FROM_HERE,
-      base::BindRepeating(&EncodeVideoFrameOnEncoderThread, cast_environment_,
-                          encoder_.get(), std::move(video_frame),
-                          reference_time, dynamic_config_,
-                          base::Passed(std::move(frame_encoded_callback))));
+      base::BindOnce(&EncodeVideoFrameOnEncoderThread, cast_environment_,
+                     encoder_.get(), std::move(video_frame), reference_time,
+                     dynamic_config_, std::move(frame_encoded_callback)));
 
   dynamic_config_.key_frame_requested = false;
   return true;
diff --git a/media/cast/sender/video_sender.cc b/media/cast/sender/video_sender.cc
index 912a812ff..eb3a3d9 100644
--- a/media/cast/sender/video_sender.cc
+++ b/media/cast/sender/video_sender.cc
@@ -119,9 +119,8 @@
       create_video_encode_mem_cb);
   if (!video_encoder_) {
     cast_environment_->PostTask(
-        CastEnvironment::MAIN,
-        FROM_HERE,
-        base::Bind(status_change_cb, STATUS_UNSUPPORTED_CODEC));
+        CastEnvironment::MAIN, FROM_HERE,
+        base::BindOnce(status_change_cb, STATUS_UNSUPPORTED_CODEC));
   }
 }
 
diff --git a/media/cast/test/utility/in_process_receiver.cc b/media/cast/test/utility/in_process_receiver.cc
index dba19aa..146b8cdc 100644
--- a/media/cast/test/utility/in_process_receiver.cc
+++ b/media/cast/test/utility/in_process_receiver.cc
@@ -56,10 +56,10 @@
 }
 
 void InProcessReceiver::Start() {
-  cast_environment_->PostTask(CastEnvironment::MAIN,
-                              FROM_HERE,
-                              base::Bind(&InProcessReceiver::StartOnMainThread,
-                                         base::Unretained(this)));
+  cast_environment_->PostTask(
+      CastEnvironment::MAIN, FROM_HERE,
+      base::BindOnce(&InProcessReceiver::StartOnMainThread,
+                     base::Unretained(this)));
   stopped_ = false;
 }
 
@@ -72,11 +72,10 @@
   if (cast_environment_->CurrentlyOn(CastEnvironment::MAIN)) {
     StopOnMainThread(&event);
   } else {
-    cast_environment_->PostTask(CastEnvironment::MAIN,
-                                FROM_HERE,
-                                base::Bind(&InProcessReceiver::StopOnMainThread,
-                                           base::Unretained(this),
-                                           &event));
+    cast_environment_->PostTask(
+        CastEnvironment::MAIN, FROM_HERE,
+        base::BindOnce(&InProcessReceiver::StopOnMainThread,
+                       base::Unretained(this), &event));
     event.Wait();
   }
   stopped_ = true;
diff --git a/media/mojo/services/mojo_video_encode_accelerator_service.cc b/media/mojo/services/mojo_video_encode_accelerator_service.cc
index 50ade44..51d62eb 100644
--- a/media/mojo/services/mojo_video_encode_accelerator_service.cc
+++ b/media/mojo/services/mojo_video_encode_accelerator_service.cc
@@ -48,11 +48,16 @@
     InitializeCallback success_callback) {
   DVLOG(1) << __func__ << " " << config.AsHumanReadableString();
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(!encoder_);
   DCHECK(config.input_format == PIXEL_FORMAT_I420 ||
          config.input_format == PIXEL_FORMAT_NV12)
       << "Only I420 or NV12 format supported";
 
+  if (encoder_) {
+    DLOG(ERROR) << __func__ << " VEA is already initialized";
+    std::move(success_callback).Run(false);
+    return;
+  }
+
   if (!client) {
     DLOG(ERROR) << __func__ << "null |client|";
     std::move(success_callback).Run(false);
diff --git a/mojo/public/tools/bindings/chromium_bindings_configuration.gni b/mojo/public/tools/bindings/chromium_bindings_configuration.gni
index 8de92ba..3f4e071b 100644
--- a/mojo/public/tools/bindings/chromium_bindings_configuration.gni
+++ b/mojo/public/tools/bindings/chromium_bindings_configuration.gni
@@ -17,6 +17,7 @@
   "//chromeos/services/secure_channel/public/mojom/typemaps.gni",
   "//components/arc/mojom/typemaps.gni",
   "//components/chromeos_camera/common/typemaps.gni",
+  "//components/services/storage/public/cpp/filesystem/typemaps.gni",
   "//components/sync/mojom/typemaps.gni",
   "//components/typemaps.gni",
   "//content/browser/typemaps.gni",
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/module-params-data.h.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/module-params-data.h.tmpl
index 92cbffe..b3525b7 100644
--- a/mojo/public/tools/bindings/generators/cpp_templates/module-params-data.h.tmpl
+++ b/mojo/public/tools/bindings/generators/cpp_templates/module-params-data.h.tmpl
@@ -18,11 +18,6 @@
 #if defined(__clang__)
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wunused-private-field"
-#elif defined(_MSC_VER)
-#pragma warning(push)
-#pragma warning(disable:4056)
-#pragma warning(disable:4065)
-#pragma warning(disable:4756)
 #endif
 
 {%- for namespace in namespaces_as_array %}
@@ -73,8 +68,6 @@
 
 #if defined(__clang__)
 #pragma clang diagnostic pop
-#elif defined(_MSC_VER)
-#pragma warning(pop)
 #endif
 
 #endif  // {{header_guard}}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/module-shared.cc.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/module-shared.cc.tmpl
index 9742f85..f51f9bd 100644
--- a/mojo/public/tools/bindings/generators/cpp_templates/module-shared.cc.tmpl
+++ b/mojo/public/tools/bindings/generators/cpp_templates/module-shared.cc.tmpl
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#if defined(_MSC_VER)
-#pragma warning(push)
-#pragma warning(disable:4065)
-#endif
-
 #include "{{module.path}}-shared.h"
 
 #include <utility>
@@ -67,7 +62,3 @@
 {%- for namespace in namespaces_as_array|reverse %}
 }  // namespace {{namespace}}
 {%- endfor %}
-
-#if defined(_MSC_VER)
-#pragma warning(pop)
-#endif
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/module-test-utils.cc.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/module-test-utils.cc.tmpl
index 93e620f..04be5870 100644
--- a/mojo/public/tools/bindings/generators/cpp_templates/module-test-utils.cc.tmpl
+++ b/mojo/public/tools/bindings/generators/cpp_templates/module-test-utils.cc.tmpl
@@ -15,11 +15,6 @@
 #if defined(__clang__)
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wunused-private-field"
-#elif defined(_MSC_VER)
-#pragma warning(push)
-#pragma warning(disable:4056)
-#pragma warning(disable:4065)
-#pragma warning(disable:4756)
 #endif
 
 {%- macro namespace_begin() %}
@@ -130,6 +125,4 @@
 
 #if defined(__clang__)
 #pragma clang diagnostic pop
-#elif defined(_MSC_VER)
-#pragma warning(pop)
-#endif
\ No newline at end of file
+#endif
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/module.cc.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/module.cc.tmpl
index 6a10b73..71ad879 100644
--- a/mojo/public/tools/bindings/generators/cpp_templates/module.cc.tmpl
+++ b/mojo/public/tools/bindings/generators/cpp_templates/module.cc.tmpl
@@ -15,11 +15,6 @@
 #if defined(__clang__)
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wunused-private-field"
-#elif defined(_MSC_VER)
-#pragma warning(push)
-#pragma warning(disable:4056)
-#pragma warning(disable:4065)
-#pragma warning(disable:4756)
 #endif
 
 #include "{{variant_path}}.h"
@@ -125,6 +120,4 @@
 
 #if defined(__clang__)
 #pragma clang diagnostic pop
-#elif defined(_MSC_VER)
-#pragma warning(pop)
 #endif
diff --git a/net/base/network_throttle_manager_impl.cc b/net/base/network_throttle_manager_impl.cc
deleted file mode 100644
index 0c0e7ec5..0000000
--- a/net/base/network_throttle_manager_impl.cc
+++ /dev/null
@@ -1,325 +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 "net/base/network_throttle_manager_impl.h"
-
-#include "base/bind.h"
-#include "base/logging.h"
-#include "base/stl_util.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "base/time/default_tick_clock.h"
-
-namespace net {
-
-const size_t NetworkThrottleManagerImpl::kActiveRequestThrottlingLimit = 2;
-const int NetworkThrottleManagerImpl::kMedianLifetimeMultiple = 5;
-
-// Initial estimate based on the median in the
-// Net.RequestTime2.Success histogram, excluding cached results by eye.
-const int NetworkThrottleManagerImpl::kInitialMedianInMs = 400;
-
-// Set timers slightly further into the future than they need to be set, so
-// that the algorithm isn't vulnerable to timer round off errors triggering
-// the callback before the throttle would be considered aged out of the set.
-// Set to 17 to hanlde systems with |!base::TimeTicks::IsHighResolution()|.
-// Note that even if the timer goes off before it should, all that should cost
-// is a second task; this class does not rely on timer accuracy for its
-// correctness.
-const int kTimerFudgeInMs = 17;
-
-class NetworkThrottleManagerImpl::ThrottleImpl
-    : public NetworkThrottleManager::Throttle {
- public:
-  // Allowed state transitions are BLOCKED -> OUTSTANDING -> AGED.
-  // Throttles may be created in the BLOCKED or OUTSTANDING states.
-  enum class State {
-    // Not allowed to proceed by manager.
-    BLOCKED,
-
-    // Allowed to proceed, counts as an "outstanding" request for
-    // manager accounting purposes.
-    OUTSTANDING,
-
-    // Old enough to not count as "outstanding" anymore for
-    // manager accounting purposes.
-    AGED
-  };
-
-  using ThrottleListQueuePointer =
-      NetworkThrottleManagerImpl::ThrottleList::iterator;
-
-  // Caller must arrange that |*delegate| and |*manager| outlive
-  // the ThrottleImpl class.
-  ThrottleImpl(bool blocked,
-               RequestPriority priority,
-               ThrottleDelegate* delegate,
-               NetworkThrottleManagerImpl* manager,
-               ThrottleListQueuePointer queue_pointer);
-
-  ~ThrottleImpl() override;
-
-  // Throttle:
-  bool IsBlocked() const override;
-  RequestPriority Priority() const override;
-  void SetPriority(RequestPriority priority) override;
-
-  State state() const { return state_; }
-
-  ThrottleListQueuePointer queue_pointer() const { return queue_pointer_; }
-  void set_queue_pointer(const ThrottleListQueuePointer& pointer) {
-    if (state_ != State::AGED)
-      DCHECK_EQ(this, *pointer);
-    queue_pointer_ = pointer;
-  }
-
-  void set_start_time(base::TimeTicks start_time) { start_time_ = start_time; }
-  base::TimeTicks start_time() const { return start_time_; }
-
-  // Change the throttle's state to AGED.  The previous
-  // state must be OUTSTANDING.
-  void SetAged();
-
-  // Note that this call calls the delegate, and hence may result in
-  // re-entrant calls into the manager or ThrottleImpl.  The manager should
-  // not rely on any state other than its own existence being persistent
-  // across this call.
-  void NotifyUnblocked();
-
- private:
-  State state_;
-  RequestPriority priority_;
-  ThrottleDelegate* const delegate_;
-  NetworkThrottleManagerImpl* const manager_;
-
-  base::TimeTicks start_time_;
-
-  // To allow deletion from the blocked queue (when the throttle is in the
-  // blocked queue).
-  ThrottleListQueuePointer queue_pointer_;
-
-  DISALLOW_COPY_AND_ASSIGN(ThrottleImpl);
-};
-
-NetworkThrottleManagerImpl::ThrottleImpl::ThrottleImpl(
-    bool blocked,
-    RequestPriority priority,
-    NetworkThrottleManager::ThrottleDelegate* delegate,
-    NetworkThrottleManagerImpl* manager,
-    ThrottleListQueuePointer queue_pointer)
-    : state_(blocked ? State::BLOCKED : State::OUTSTANDING),
-      priority_(priority),
-      delegate_(delegate),
-      manager_(manager),
-      queue_pointer_(queue_pointer) {
-  DCHECK(delegate);
-  if (!blocked)
-    start_time_ = manager->tick_clock_->NowTicks();
-}
-
-NetworkThrottleManagerImpl::ThrottleImpl::~ThrottleImpl() {
-  manager_->OnThrottleDestroyed(this);
-}
-
-bool NetworkThrottleManagerImpl::ThrottleImpl::IsBlocked() const {
-  return state_ == State::BLOCKED;
-}
-
-RequestPriority NetworkThrottleManagerImpl::ThrottleImpl::Priority() const {
-  return priority_;
-}
-
-void NetworkThrottleManagerImpl::ThrottleImpl::SetPriority(
-    RequestPriority new_priority) {
-  RequestPriority old_priority(priority_);
-  if (old_priority == new_priority)
-    return;
-  priority_ = new_priority;
-  manager_->OnThrottlePriorityChanged(this, old_priority, new_priority);
-}
-
-void NetworkThrottleManagerImpl::ThrottleImpl::SetAged() {
-  DCHECK_EQ(State::OUTSTANDING, state_);
-  state_ = State::AGED;
-}
-
-void NetworkThrottleManagerImpl::ThrottleImpl::NotifyUnblocked() {
-  // This method should only be called once, and only if the
-  // current state is blocked.
-  DCHECK_EQ(State::BLOCKED, state_);
-  state_ = State::OUTSTANDING;
-  delegate_->OnThrottleUnblocked(this);
-}
-
-NetworkThrottleManagerImpl::NetworkThrottleManagerImpl()
-    : lifetime_median_estimate_(PercentileEstimator::kMedianPercentile,
-                                kInitialMedianInMs),
-      outstanding_recomputation_timer_(std::make_unique<base::OneShotTimer>()),
-      tick_clock_(base::DefaultTickClock::GetInstance()),
-      weak_ptr_factory_(this) {}
-
-NetworkThrottleManagerImpl::~NetworkThrottleManagerImpl() = default;
-
-std::unique_ptr<NetworkThrottleManager::Throttle>
-NetworkThrottleManagerImpl::CreateThrottle(
-    NetworkThrottleManager::ThrottleDelegate* delegate,
-    RequestPriority priority,
-    bool ignore_limits) {
-  bool blocked =
-      (!ignore_limits && priority == THROTTLED &&
-       outstanding_throttles_.size() >= kActiveRequestThrottlingLimit);
-
-  std::unique_ptr<NetworkThrottleManagerImpl::ThrottleImpl> throttle(
-      new ThrottleImpl(blocked, priority, delegate, this,
-                       blocked_throttles_.end()));
-
-  ThrottleList& insert_list(blocked ? blocked_throttles_
-                                    : outstanding_throttles_);
-
-  throttle->set_queue_pointer(
-      insert_list.insert(insert_list.end(), throttle.get()));
-
-  // In case oustanding_throttles_ was empty, set up timer.
-  if (!blocked)
-    RecomputeOutstanding();
-
-  return std::move(throttle);
-}
-
-void NetworkThrottleManagerImpl::SetTickClockForTesting(
-    const base::TickClock* tick_clock) {
-  tick_clock_ = tick_clock;
-  DCHECK(!outstanding_recomputation_timer_->IsRunning());
-  outstanding_recomputation_timer_ =
-      std::make_unique<base::OneShotTimer>(tick_clock_);
-}
-
-bool NetworkThrottleManagerImpl::ConditionallyTriggerTimerForTesting() {
-  if (!outstanding_recomputation_timer_->IsRunning() ||
-      (tick_clock_->NowTicks() <
-       outstanding_recomputation_timer_->desired_run_time())) {
-    return false;
-  }
-
-  base::Closure timer_callback(outstanding_recomputation_timer_->user_task());
-  outstanding_recomputation_timer_->Stop();
-  timer_callback.Run();
-  return true;
-}
-
-void NetworkThrottleManagerImpl::OnThrottlePriorityChanged(
-    NetworkThrottleManagerImpl::ThrottleImpl* throttle,
-    RequestPriority old_priority,
-    RequestPriority new_priority) {
-  // The only case requiring a state change is if the priority change
-  // implies unblocking, which can only happen on a transition from blocked
-  // (implies THROTTLED) to non-THROTTLED.
-  if (throttle->IsBlocked() && new_priority != THROTTLED) {
-    // May result in re-entrant calls into this class.
-    UnblockThrottle(throttle);
-  }
-}
-
-void NetworkThrottleManagerImpl::OnThrottleDestroyed(ThrottleImpl* throttle) {
-  switch (throttle->state()) {
-    case ThrottleImpl::State::BLOCKED:
-      DCHECK(throttle->queue_pointer() != blocked_throttles_.end());
-      DCHECK_EQ(throttle, *(throttle->queue_pointer()));
-      blocked_throttles_.erase(throttle->queue_pointer());
-      break;
-    case ThrottleImpl::State::OUTSTANDING:
-      DCHECK(throttle->queue_pointer() != outstanding_throttles_.end());
-      DCHECK_EQ(throttle, *(throttle->queue_pointer()));
-      outstanding_throttles_.erase(throttle->queue_pointer());
-      FALLTHROUGH;
-    case ThrottleImpl::State::AGED:
-      DCHECK(!throttle->start_time().is_null());
-      lifetime_median_estimate_.AddSample(
-          (tick_clock_->NowTicks() - throttle->start_time())
-              .InMillisecondsRoundedUp());
-      break;
-  }
-
-  DCHECK(!base::Contains(blocked_throttles_, throttle));
-  DCHECK(!base::Contains(outstanding_throttles_, throttle));
-
-  // Unblock the throttles if there's some chance there's a throttle to
-  // unblock.
-  if (outstanding_throttles_.size() < kActiveRequestThrottlingLimit &&
-      !blocked_throttles_.empty()) {
-    // Via PostTask so there aren't upcalls from within destructors.
-    base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE,
-        base::BindOnce(&NetworkThrottleManagerImpl::MaybeUnblockThrottles,
-                       weak_ptr_factory_.GetWeakPtr()));
-  }
-}
-
-void NetworkThrottleManagerImpl::RecomputeOutstanding() {
-  // Remove all throttles that have aged out of the outstanding set.
-  base::TimeTicks now(tick_clock_->NowTicks());
-  base::TimeDelta age_horizon(base::TimeDelta::FromMilliseconds((
-      kMedianLifetimeMultiple * lifetime_median_estimate_.current_estimate())));
-  while (!outstanding_throttles_.empty()) {
-    ThrottleImpl* throttle = *outstanding_throttles_.begin();
-    if (throttle->start_time() + age_horizon >= now)
-      break;
-
-    outstanding_throttles_.erase(outstanding_throttles_.begin());
-    throttle->SetAged();
-    throttle->set_queue_pointer(outstanding_throttles_.end());
-  }
-
-  if (outstanding_throttles_.empty())
-    return;
-
-  // If the timer is already running, be conservative and leave it alone;
-  // the time for which it would be set will only be later than when it's
-  // currently set.
-  // This addresses, e.g., situations where a RecomputeOutstanding() races
-  // with a running timer which would unblock blocked throttles.
-  if (outstanding_recomputation_timer_->IsRunning())
-    return;
-
-  ThrottleImpl* first_throttle(*outstanding_throttles_.begin());
-  DCHECK_GE(first_throttle->start_time() + age_horizon, now);
-
-  outstanding_recomputation_timer_->Start(
-      FROM_HERE,
-      ((first_throttle->start_time() + age_horizon) - now +
-       base::TimeDelta::FromMilliseconds(kTimerFudgeInMs)),
-      // Unretained use of |this| is safe because the timer is
-      // owned by this object, and will be torn down if this object
-      // is destroyed.
-      base::Bind(&NetworkThrottleManagerImpl::MaybeUnblockThrottles,
-                 base::Unretained(this)));
-}
-
-void NetworkThrottleManagerImpl::UnblockThrottle(ThrottleImpl* throttle) {
-  DCHECK(throttle->IsBlocked());
-
-  blocked_throttles_.erase(throttle->queue_pointer());
-  throttle->set_start_time(tick_clock_->NowTicks());
-  throttle->set_queue_pointer(
-      outstanding_throttles_.insert(outstanding_throttles_.end(), throttle));
-
-  // Called in case |*throttle| was added to a null set.
-  RecomputeOutstanding();
-
-  // May result in re-entrant calls into this class.
-  throttle->NotifyUnblocked();
-}
-
-void NetworkThrottleManagerImpl::MaybeUnblockThrottles() {
-  RecomputeOutstanding();
-
-  while (outstanding_throttles_.size() < kActiveRequestThrottlingLimit &&
-         !blocked_throttles_.empty()) {
-    // NOTE: This call may result in reentrant calls into
-    // NetworkThrottleManagerImpl; no state should be assumed to be
-    // persistent across this call.
-    UnblockThrottle(blocked_throttles_.front());
-  }
-}
-
-}  // namespace net
diff --git a/net/base/network_throttle_manager_impl.h b/net/base/network_throttle_manager_impl.h
deleted file mode 100644
index 04960fd9..0000000
--- a/net/base/network_throttle_manager_impl.h
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef NET_BASE_NETWORK_THROTTLE_MANAGER_IMPL_H_
-#define NET_BASE_NETWORK_THROTTLE_MANAGER_IMPL_H_
-
-#include <list>
-#include <memory>
-#include <set>
-
-#include "base/memory/weak_ptr.h"
-#include "base/time/tick_clock.h"
-#include "base/time/time.h"
-#include "base/timer/timer.h"
-#include "net/base/network_throttle_manager.h"
-#include "net/base/percentile_estimator.h"
-
-namespace net {
-
-// The NetworkThrottleManagerImpl implements the following semantics:
-// * All throttles of priority above THROTTLED are created unblocked.
-// * Throttles of priority THROTTLED are created unblocked, unless
-//   there are |kActiveRequestThrottlingLimit| or more throttles active,
-//   in which case they are created blocked.
-//   When that condition is no longer true, throttles of priority
-//   THROTTLED are unblocked, in FIFO order.
-// * Throttles that have been alive for more than |kMedianLifetimeMultiple|
-//   times the current estimate of the throttle median lifetime do
-//   not count against the |kActiveRequestThrottlingLimit| limit.
-class NET_EXPORT NetworkThrottleManagerImpl : public NetworkThrottleManager {
- public:
-  // Maximum number of active requests before new THROTTLED throttles
-  // are created blocked.  Throttles are unblocked as the active requests
-  // fall below this limit.
-  static const size_t kActiveRequestThrottlingLimit;
-
-  // Note that the following constants are implementation details exposed in the
-  // header file only for testing, and should not be relied on by consumers.
-
-  // Constants used for the running estimate of the median lifetime
-  // for throttles created by this class.  That estimate is used to detect
-  // throttles that are "unusually old" and hence may represent hanging GETs
-  // or long-running streams.  Such throttles should not be considered
-  // "active" for the purposes of determining whether THROTTLED throttles
-  // should be created in a blocked state.
-  // Note that the precise details of this algorithm aren't very important;
-  // specifically, if it takes a while for the median estimate to reach the
-  // "actual" median of a request stream, the consequence is either a bit more
-  // of a delay in unblocking THROTTLED requests or more THROTTLED requests
-  // being unblocked than would be ideal (i.e. performance tweaks at
-  // the margins).
-
-  // Multiple of the current median lifetime beyond which a throttle is
-  // considered "unusually old" and not considered in counting active
-  // requests. This is used instead of a percentile estimate because the goal
-  // is eliminating requests that are qualitatively different
-  // (e.g. hanging gets, streams), and the percentage of all requests
-  // that are in that category can vary greatly.
-  static const int kMedianLifetimeMultiple;
-
-  // The median lifetime estimate starts at class creation at
-  // |kInitialMedianInMs|.
-  static const int kInitialMedianInMs;
-
-  NetworkThrottleManagerImpl();
-  ~NetworkThrottleManagerImpl() override;
-
-  // NetworkThrottleManager:
-  std::unique_ptr<Throttle> CreateThrottle(ThrottleDelegate* delegate,
-                                           RequestPriority priority,
-                                           bool ignore_limits) override;
-
-  void SetTickClockForTesting(const base::TickClock* tick_clock);
-
-  // If the |NowTicks()| value of |tick_clock_| is greater than the
-  // time the outstanding_recomputation_timer_ has set to go off, Stop()
-  // the timer and manually run the associated user task.  This is to allow
-  // "fast-forwarding" of the clock for testing by working around
-  // base::Timer's direct use of base::TimeTicks rather than a base::TickClock.
-  //
-  // Note specifically that base::Timer::Start takes a time delta into the
-  // future and adds it to base::TimeTicks::Now() to get
-  // base::Timer::desired_run_time(), which is what this method compares
-  // |tick_clock_->NowTicks()| against.  So tests should be written so that
-  // the timer Start() routine whose callback should be run is called
-  // with |tick_clock_| in accord with wallclock time.  This routine can then
-  // be called with |tick_clock_| set into the future.
-  //
-  // Returns true if there was a timer running and it was triggerred
-  // (|tick_clock_->NowTicks() >
-  //   outstanding_recomputation_timer_.desired_run_time()|).
-  bool ConditionallyTriggerTimerForTesting();
-
- private:
-  class ThrottleImpl;
-  using ThrottleList = std::list<ThrottleImpl*>;
-
-  void OnThrottlePriorityChanged(ThrottleImpl* throttle,
-                                 RequestPriority old_priority,
-                                 RequestPriority new_priority);
-  void OnThrottleDestroyed(ThrottleImpl* throttle);
-
-  // Recompute how many requests count as outstanding (i.e.
-  // are not older than kMedianLifetimeMultiple * MedianThrottleLifetime()).
-  // If outstanding_recomputation_timer_ is not set, it will be set
-  // to the earliest a throttle might "age out" of the outstanding list.
-  void RecomputeOutstanding();
-
-  // Unblock the specified throttle.  May result in re-entrant calls
-  // into NetworkThrottleManagerImpl.
-  void UnblockThrottle(ThrottleImpl* throttle);
-
-  // Recomputes how many requests count as outstanding, checks to see
-  // if any currently blocked throttles should be unblocked,
-  // and unblock them if so.  Note that unblocking may result in
-  // re-entrant calls to this class, so no assumptions about state persistence
-  // should be made across this call.
-  void MaybeUnblockThrottles();
-
-  PercentileEstimator lifetime_median_estimate_;
-
-  // base::Timer controlling outstanding request recomputation.
-  //
-  // This is started whenever it is not running and a new throttle is
-  // added to |outstanding_throttles_|, and is never cleared except by
-  // execution, which re-starts it if there are any
-  // outstanding_throttles_.  So it should always be running if any
-  // throttles are outstanding.  This guarantees that the class will
-  // eventually detect aging out of outstanding throttles and unblock
-  // throttles blocked on those outstanding throttles.
-  std::unique_ptr<base::OneShotTimer> outstanding_recomputation_timer_;
-
-  // FIFO of OUTSTANDING throttles (ordered by time of entry into the
-  // OUTSTANDING state).
-  ThrottleList outstanding_throttles_;
-
-  // FIFO list of BLOCKED throttles.  This is a list so that the
-  // throttles can store iterators to themselves.
-  ThrottleList blocked_throttles_;
-
-  // For testing.
-  const base::TickClock* tick_clock_;
-
-  base::WeakPtrFactory<NetworkThrottleManagerImpl> weak_ptr_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(NetworkThrottleManagerImpl);
-};
-
-}  // namespace net
-
-#endif  // NET_BASE_NETWORK_THROTTLE_MANAGER_IMPL_H_
diff --git a/net/cert/coalescing_cert_verifier.cc b/net/cert/coalescing_cert_verifier.cc
index 905f98f..6f1a1f5 100644
--- a/net/cert/coalescing_cert_verifier.cc
+++ b/net/cert/coalescing_cert_verifier.cc
@@ -277,8 +277,8 @@
       params_, &verify_result_,
       // Safe, because |verify_request_| is self-owned and guarantees the
       // callback won't be called if |this| is deleted.
-      base::Bind(&CoalescingCertVerifier::Job::OnVerifyComplete,
-                 base::Unretained(this)),
+      base::BindOnce(&CoalescingCertVerifier::Job::OnVerifyComplete,
+                     base::Unretained(this)),
       &pending_request_, net_log_);
   if (result != ERR_IO_PENDING) {
     LogMetrics();
diff --git a/net/disk_cache/disk_cache_perftest.cc b/net/disk_cache/disk_cache_perftest.cc
index 595ca38..6fdcf1a 100644
--- a/net/disk_cache/disk_cache_perftest.cc
+++ b/net/disk_cache/disk_cache_perftest.cc
@@ -551,7 +551,7 @@
   base::RunLoop().RunUntilIdle();
 }
 
-void VerifyRvAndCallClosure(base::Closure* c, int expect_rv, int rv) {
+void VerifyRvAndCallClosure(base::RepeatingClosure* c, int expect_rv, int rv) {
   EXPECT_EQ(expect_rv, rv);
   c->Run();
 }
@@ -603,7 +603,7 @@
 
   for (int i = 0; i < kIterations; ++i) {
     base::RunLoop event_loop;
-    base::Closure barrier =
+    base::RepeatingClosure barrier =
         base::BarrierClosure(kBatchSize, event_loop.QuitWhenIdleClosure());
     net::CompletionRepeatingCallback cb_batch(base::BindRepeating(
         VerifyRvAndCallClosure, base::Unretained(&barrier), kHeadersSize));
diff --git a/net/disk_cache/simple/simple_index.cc b/net/disk_cache/simple/simple_index.cc
index d91f1e09..070741ed 100644
--- a/net/disk_cache/simple/simple_index.cc
+++ b/net/disk_cache/simple/simple_index.cc
@@ -185,9 +185,9 @@
       task_runner_(task_runner),
       // Creating the callback once so it is reused every time
       // write_to_disk_timer_.Start() is called.
-      write_to_disk_cb_(base::Bind(&SimpleIndex::WriteToDisk,
-                                   AsWeakPtr(),
-                                   INDEX_WRITE_REASON_IDLE)) {}
+      write_to_disk_cb_(base::BindRepeating(&SimpleIndex::WriteToDisk,
+                                            AsWeakPtr(),
+                                            INDEX_WRITE_REASON_IDLE)) {}
 
 SimpleIndex::~SimpleIndex() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
diff --git a/net/disk_cache/simple/simple_index.h b/net/disk_cache/simple/simple_index.h
index 3936646..17ca017 100644
--- a/net/disk_cache/simple/simple_index.h
+++ b/net/disk_cache/simple/simple_index.h
@@ -300,7 +300,7 @@
   base::TimeTicks last_write_to_disk_;
 
   base::OneShotTimer write_to_disk_timer_;
-  base::Closure write_to_disk_cb_;
+  base::RepeatingClosure write_to_disk_cb_;
 
   typedef std::list<net::CompletionOnceCallback> CallbackList;
   CallbackList to_run_when_initialized_;
diff --git a/net/proxy_resolution/proxy_config_service_android.h b/net/proxy_resolution/proxy_config_service_android.h
index 566a8b5c..014b837 100644
--- a/net/proxy_resolution/proxy_config_service_android.h
+++ b/net/proxy_resolution/proxy_config_service_android.h
@@ -29,7 +29,7 @@
   // key. If it was not found, an empty string is returned. Note that this
   // interface does not let you distinguish an empty property from a
   // non-existing property. This callback is invoked on the JNI thread.
-  typedef base::Callback<std::string (const std::string& property)>
+  typedef base::RepeatingCallback<std::string(const std::string& property)>
       GetPropertyCallback;
 
   // Separate class whose instance is owned by the Delegate class implemented in
diff --git a/net/proxy_resolution/proxy_config_service_android_unittest.cc b/net/proxy_resolution/proxy_config_service_android_unittest.cc
index b798313..775e7d3 100644
--- a/net/proxy_resolution/proxy_config_service_android_unittest.cc
+++ b/net/proxy_resolution/proxy_config_service_android_unittest.cc
@@ -66,10 +66,11 @@
   // suite (see net/test/net_test_suite.cc).
   ProxyConfigServiceAndroidTestBase(const StringMap& initial_configuration)
       : configuration_(initial_configuration),
-        service_(base::ThreadTaskRunnerHandle::Get(),
-                 base::ThreadTaskRunnerHandle::Get(),
-                 base::Bind(&ProxyConfigServiceAndroidTestBase::GetProperty,
-                            base::Unretained(this))) {}
+        service_(
+            base::ThreadTaskRunnerHandle::Get(),
+            base::ThreadTaskRunnerHandle::Get(),
+            base::BindRepeating(&ProxyConfigServiceAndroidTestBase::GetProperty,
+                                base::Unretained(this))) {}
 
   ~ProxyConfigServiceAndroidTestBase() override {}
 
diff --git a/net/quic/quic_chromium_client_session_test.cc b/net/quic/quic_chromium_client_session_test.cc
index ac2f6c9..71e76fc 100644
--- a/net/quic/quic_chromium_client_session_test.cc
+++ b/net/quic/quic_chromium_client_session_test.cc
@@ -1752,7 +1752,7 @@
   quic::test::QuicStreamPeer::SendBuffer(stream).SaveStreamData(iov, 1, 0, 4);
   quic::test::QuicStreamPeer::SetStreamBytesWritten(4, stream);
   session_->WritevData(stream->id(), 4, 0, quic::NO_FIN,
-                       /*is_retransmission=*/false, QuicheNullOpt);
+                       quic::NOT_RETRANSMISSION, QuicheNullOpt);
 
   EXPECT_TRUE(socket_data.AllReadDataConsumed());
   EXPECT_TRUE(socket_data.AllWriteDataConsumed());
diff --git a/net/quic/quic_chromium_client_stream_test.cc b/net/quic/quic_chromium_client_stream_test.cc
index 8765e52..612f042 100644
--- a/net/quic/quic_chromium_client_stream_test.cc
+++ b/net/quic/quic_chromium_client_stream_test.cc
@@ -66,7 +66,7 @@
                    size_t write_length,
                    quic::QuicStreamOffset offset,
                    quic::StreamSendingState state,
-                   bool is_retransmission,
+                   quic::TransmissionType type,
                    quiche::QuicheOptional<quic::EncryptionLevel> level));
   MOCK_METHOD3(SendRstStream,
                void(quic::QuicStreamId stream_id,
@@ -322,10 +322,12 @@
   // All data written.
   std::string header = ConstructDataHeader(kDataLen);
   if (version_.HasIetfQuicFrames()) {
-    EXPECT_CALL(session_, WritevData(stream_->id(), _, _, _, false, _))
+    EXPECT_CALL(session_,
+                WritevData(stream_->id(), _, _, _, quic::NOT_RETRANSMISSION, _))
         .WillOnce(Return(quic::QuicConsumedData(header.length(), false)));
   }
-  EXPECT_CALL(session_, WritevData(stream_->id(), _, _, _, false, _))
+  EXPECT_CALL(session_,
+              WritevData(stream_->id(), _, _, _, quic::NOT_RETRANSMISSION, _))
       .WillOnce(Return(quic::QuicConsumedData(kDataLen, true)));
   TestCompletionCallback callback;
   EXPECT_EQ(
@@ -756,10 +758,12 @@
   // All data written.
   if (version_.HasIetfQuicFrames()) {
     std::string header = ConstructDataHeader(kDataLen);
-    EXPECT_CALL(session_, WritevData(stream_->id(), _, _, _, false, _))
+    EXPECT_CALL(session_,
+                WritevData(stream_->id(), _, _, _, quic::NOT_RETRANSMISSION, _))
         .WillOnce(Return(quic::QuicConsumedData(header.length(), false)));
   }
-  EXPECT_CALL(session_, WritevData(stream_->id(), _, _, _, false, _))
+  EXPECT_CALL(session_,
+              WritevData(stream_->id(), _, _, _, quic::NOT_RETRANSMISSION, _))
       .WillOnce(Return(quic::QuicConsumedData(kDataLen, true)));
   TestCompletionCallback callback;
   EXPECT_EQ(
@@ -773,7 +777,8 @@
   const size_t kDataLen = base::size(kData1);
 
   // No data written.
-  EXPECT_CALL(session_, WritevData(stream_->id(), _, _, _, false, _))
+  EXPECT_CALL(session_,
+              WritevData(stream_->id(), _, _, _, quic::NOT_RETRANSMISSION, _))
       .WillOnce(Return(quic::QuicConsumedData(0, false)));
   TestCompletionCallback callback;
   EXPECT_EQ(ERR_IO_PENDING, handle_->WriteStreamData(
@@ -784,10 +789,12 @@
   // All data written.
   if (version_.HasIetfQuicFrames()) {
     std::string header = ConstructDataHeader(kDataLen);
-    EXPECT_CALL(session_, WritevData(stream_->id(), _, _, _, false, _))
+    EXPECT_CALL(session_,
+                WritevData(stream_->id(), _, _, _, quic::NOT_RETRANSMISSION, _))
         .WillOnce(Return(quic::QuicConsumedData(header.length(), false)));
   }
-  EXPECT_CALL(session_, WritevData(stream_->id(), _, _, _, false, _))
+  EXPECT_CALL(session_,
+              WritevData(stream_->id(), _, _, _, quic::NOT_RETRANSMISSION, _))
       .WillOnce(Return(quic::QuicConsumedData(kDataLen, true)));
   stream_->OnCanWrite();
   // Do 2 writes in version 99.
@@ -808,17 +815,21 @@
   // All data written.
   if (version_.HasIetfQuicFrames()) {
     std::string header = ConstructDataHeader(buf1->size());
-    EXPECT_CALL(session_, WritevData(stream_->id(), _, _, _, false, _))
+    EXPECT_CALL(session_,
+                WritevData(stream_->id(), _, _, _, quic::NOT_RETRANSMISSION, _))
         .WillOnce(Return(quic::QuicConsumedData(header.length(), false)));
   }
-  EXPECT_CALL(session_, WritevData(stream_->id(), _, _, _, false, _))
+  EXPECT_CALL(session_,
+              WritevData(stream_->id(), _, _, _, quic::NOT_RETRANSMISSION, _))
       .WillOnce(Return(quic::QuicConsumedData(buf1->size(), false)));
   if (version_.HasIetfQuicFrames()) {
     std::string header = ConstructDataHeader(buf2->size());
-    EXPECT_CALL(session_, WritevData(stream_->id(), _, _, _, false, _))
+    EXPECT_CALL(session_,
+                WritevData(stream_->id(), _, _, _, quic::NOT_RETRANSMISSION, _))
         .WillOnce(Return(quic::QuicConsumedData(header.length(), false)));
   }
-  EXPECT_CALL(session_, WritevData(stream_->id(), _, _, _, false, _))
+  EXPECT_CALL(session_,
+              WritevData(stream_->id(), _, _, _, quic::NOT_RETRANSMISSION, _))
       .WillOnce(Return(quic::QuicConsumedData(buf2->size(), true)));
   TestCompletionCallback callback;
   EXPECT_EQ(
@@ -836,14 +847,17 @@
   // Only a part of the data is written.
   if (version_.HasIetfQuicFrames()) {
     std::string header = ConstructDataHeader(buf1->size());
-    EXPECT_CALL(session_, WritevData(stream_->id(), _, _, _, false, _))
+    EXPECT_CALL(session_,
+                WritevData(stream_->id(), _, _, _, quic::NOT_RETRANSMISSION, _))
         .WillOnce(Return(quic::QuicConsumedData(header.length(), false)));
   }
-  EXPECT_CALL(session_, WritevData(stream_->id(), _, _, _, false, _))
+  EXPECT_CALL(session_,
+              WritevData(stream_->id(), _, _, _, quic::NOT_RETRANSMISSION, _))
       // First piece of data is written.
       .WillOnce(Return(quic::QuicConsumedData(buf1->size(), false)));
   // Second piece of data is queued.
-  EXPECT_CALL(session_, WritevData(stream_->id(), _, _, _, false, _))
+  EXPECT_CALL(session_,
+              WritevData(stream_->id(), _, _, _, quic::NOT_RETRANSMISSION, _))
       .WillOnce(Return(quic::QuicConsumedData(0, false)));
   TestCompletionCallback callback;
   EXPECT_EQ(ERR_IO_PENDING,
@@ -855,10 +869,12 @@
   // The second piece of data is written.
   if (version_.HasIetfQuicFrames()) {
     std::string header = ConstructDataHeader(buf2->size());
-    EXPECT_CALL(session_, WritevData(stream_->id(), _, _, _, false, _))
+    EXPECT_CALL(session_,
+                WritevData(stream_->id(), _, _, _, quic::NOT_RETRANSMISSION, _))
         .WillOnce(Return(quic::QuicConsumedData(header.length(), false)));
   }
-  EXPECT_CALL(session_, WritevData(stream_->id(), _, _, _, false, _))
+  EXPECT_CALL(session_,
+              WritevData(stream_->id(), _, _, _, quic::NOT_RETRANSMISSION, _))
       .WillOnce(Return(quic::QuicConsumedData(buf2->size(), true)));
   stream_->OnCanWrite();
   if (version_.HasIetfQuicFrames()) {
diff --git a/net/quic/quic_flags_list.h b/net/quic/quic_flags_list.h
index 6f14bfe..380e1bb 100644
--- a/net/quic/quic_flags_list.h
+++ b/net/quic/quic_flags_list.h
@@ -388,3 +388,13 @@
 // If true, QuicSession::WritevData() will support writing data at a specified
 // encryption level.
 QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_writevdata_at_level, false)
+
+// If true, use standard deviation when calculating PTO timeout.
+QUIC_FLAG(bool,
+          FLAGS_quic_reloadable_flag_quic_use_standard_deviation_for_pto,
+          false)
+
+// If true, QUIC BBRv2 to avoid unnecessary PROBE_RTTs after quiescence.
+QUIC_FLAG(bool,
+          FLAGS_quic_reloadable_flag_quic_bbr2_avoid_unnecessary_probe_rtt,
+          false)
diff --git a/net/ssl/ssl_client_session_cache.cc b/net/ssl/ssl_client_session_cache.cc
index b5027654..89020b7 100644
--- a/net/ssl/ssl_client_session_cache.cc
+++ b/net/ssl/ssl_client_session_cache.cc
@@ -53,8 +53,9 @@
       config_(config),
       cache_(config.max_entries),
       lookups_since_flush_(0) {
-  memory_pressure_listener_.reset(new base::MemoryPressureListener(base::Bind(
-      &SSLClientSessionCache::OnMemoryPressure, base::Unretained(this))));
+  memory_pressure_listener_.reset(
+      new base::MemoryPressureListener(base::BindRepeating(
+          &SSLClientSessionCache::OnMemoryPressure, base::Unretained(this))));
 }
 
 SSLClientSessionCache::~SSLClientSessionCache() {
diff --git a/net/test/embedded_test_server/embedded_test_server_unittest.cc b/net/test/embedded_test_server/embedded_test_server_unittest.cc
index 68580f6..58ed5958 100644
--- a/net/test/embedded_test_server/embedded_test_server_unittest.cc
+++ b/net/test/embedded_test_server/embedded_test_server_unittest.cc
@@ -420,8 +420,8 @@
   void SendResponse(const SendBytesCallback& send,
                     SendCompleteCallback done) override {
     send.Run(ToResponseString(),
-             base::Bind(&InfiniteResponse::SendInfinite,
-                        weak_ptr_factory_.GetWeakPtr(), send));
+             base::BindOnce(&InfiniteResponse::SendInfinite,
+                            weak_ptr_factory_.GetWeakPtr(), send));
   }
 
  private:
@@ -429,8 +429,8 @@
     base::ThreadTaskRunnerHandle::Get()->PostTask(
         FROM_HERE,
         base::BindOnce(send, "echo",
-                       base::Bind(&InfiniteResponse::SendInfinite,
-                                  weak_ptr_factory_.GetWeakPtr(), send)));
+                       base::BindOnce(&InfiniteResponse::SendInfinite,
+                                      weak_ptr_factory_.GetWeakPtr(), send)));
   }
 
   base::WeakPtrFactory<InfiniteResponse> weak_ptr_factory_{this};
diff --git a/remoting/host/client_session.cc b/remoting/host/client_session.cc
index 5c110f27..274a352 100644
--- a/remoting/host/client_session.cc
+++ b/remoting/host/client_session.cc
@@ -229,20 +229,42 @@
 
 void ClientSession::SelectDesktopDisplay(
     const protocol::SelectDesktopDisplayRequest& select_display) {
-  int id = webrtc::kFullDesktopScreenId;
-  if (select_display.id() != "all") {
+  LOG(INFO) << "SelectDesktopDisplay "
+            << "'" << select_display.id() << "'";
+
+  // Parse the string with the selected display.
+  int id = webrtc::kInvalidScreenId;
+  if (select_display.id() == "all") {
+    id = webrtc::kFullDesktopScreenId;
+  } else {
     if (!base::StringToInt(select_display.id().c_str(), &id)) {
-      // Default to fullscreen if unable to parse id.
-      id = webrtc::kFullDesktopScreenId;
+      LOG(ERROR) << "  Unable to parse display id "
+                 << "'" << select_display.id() << "'";
+      id = webrtc::kInvalidScreenId;
     }
-    // Invalid display index defaults to showing all displays.
     if (!desktop_display_info_.GetDisplayInfo(id)) {
-      id = webrtc::kFullDesktopScreenId;
+      LOG(ERROR) << "  Invalid display id "
+                 << "'" << select_display.id() << "'";
+      id = webrtc::kInvalidScreenId;
     }
   }
+  // Don't allow requests for fullscreen if not supported by the current
+  // display configuration.
+  if (!can_capture_full_desktop_ && id == webrtc::kFullDesktopScreenId) {
+    LOG(ERROR) << "  Full desktop not supported";
+    id = webrtc::kInvalidScreenId;
+  }
+  // Fall back to default capture config if invalid request.
+  if (id == webrtc::kInvalidScreenId) {
+    LOG(ERROR) << "  Invalid display specification, falling back to default";
+    id = can_capture_full_desktop_ ? webrtc::kFullDesktopScreenId : 0;
+  }
 
-  LOG(INFO) << "SelectDesktopDisplay " << id << " = '" << select_display.id()
-            << "'";
+  if (show_display_id_ == id) {
+    LOG(INFO) << "  Display " << id << " is already selected. Ignoring";
+    return;
+  }
+
   video_stream_->SelectSource(id);
   show_display_id_ = id;
 
@@ -567,6 +589,9 @@
 }
 
 void ClientSession::UpdateMouseClampingFilterOffset() {
+  if (show_display_id_ == webrtc::kInvalidScreenId)
+    return;
+
   webrtc::DesktopVector origin;
   origin = desktop_display_info_.CalcDisplayOffset(show_display_id_);
   mouse_clamping_filter_.set_output_offset(origin);
@@ -581,6 +606,18 @@
       DisplaySize::FromPixels(size_px.width(), size_px.height(), dpi.x());
   LOG(INFO) << "  DisplaySize: " << size;
 
+  // The first video size message that we receive from WebRtc is the full
+  // desktop size (if supported). If full desktop capture is not supported,
+  // then this will be the size of the default display.
+  if (default_webrtc_desktop_size_.IsEmpty()) {
+    default_webrtc_desktop_size_ = size;
+    LOG(INFO) << "  display id " << show_display_id_;
+    DCHECK(show_display_id_ == webrtc::kInvalidScreenId);
+    LOG(INFO) << "  Recording default webrtc capture size "
+              << default_webrtc_desktop_size_;
+  }
+  webrtc_capture_size_ = size;
+
   SetMouseClampingFilter(size);
 
   // Record default DPI in case a display reports 0 for DPI.
@@ -625,7 +662,7 @@
   int max_y = 0;
   int dpi_x = 0;
   int dpi_y = 0;
-  LOG(INFO) << "  Scanning display info...";
+  LOG(INFO) << "  Scanning display info... (dips)";
   for (int display_id = 0; display_id < displays->video_track_size();
        display_id++) {
     protocol::VideoTrackLayout track = displays->video_track(display_id);
@@ -638,17 +675,12 @@
     if (dpi_y == 0)
       dpi_y = track.y_dpi();
 
-    // The WebRTC desktop only includes displays that match the main display's
-    // DPI. Here, we filter out non-matching displays so that our desktop
-    // geometry matches what WebRTC can handle.
-    if (dpi_x == track.x_dpi() && dpi_y == track.y_dpi()) {
-      int x = track.position_x();
-      int y = track.position_y();
-      min_x = std::min(x, min_x);
-      min_y = std::min(y, min_y);
-      max_x = std::max(x + track.width(), max_x);
-      max_y = std::max(y + track.height(), max_y);
-    }
+    int x = track.position_x();
+    int y = track.position_y();
+    min_x = std::min(x, min_x);
+    min_y = std::min(y, min_y);
+    max_x = std::max(x + track.width(), max_x);
+    max_y = std::max(y + track.height(), max_y);
   }
 
   // TODO(garykac): Investigate why these DPI values are 0 for some users.
@@ -660,28 +692,42 @@
   // Calc desktop scaled geometry (in DIPs)
   // See comment in OnVideoSizeChanged() for details.
   const webrtc::DesktopSize size(max_x - min_x, max_y - min_y);
-  webrtc::DesktopSize size_dips =
-      DesktopDisplayInfo::CalcSizeDips(size, dpi_x, dpi_y);
+
+  // If this is our first message, then we need to determine if the current
+  // display configuration supports capturing the entire desktop.
+  LOG(INFO) << "    Webrtc desktop size " << default_webrtc_desktop_size_;
+  if (show_display_id_ == webrtc::kInvalidScreenId) {
+    if (size.width() == default_webrtc_desktop_size_.WidthAsDips() &&
+        size.height() == default_webrtc_desktop_size_.HeightAsDips()) {
+      LOG(INFO) << "    Full desktop capture supported.";
+      can_capture_full_desktop_ = true;
+    } else {
+      LOG(INFO)
+          << "    This configuration does not support full desktop capture.";
+      can_capture_full_desktop_ = false;
+    }
+  }
 
   // Generate and send VideoLayout message.
   protocol::VideoLayout layout;
+  layout.set_supports_full_desktop_capture(can_capture_full_desktop_);
   protocol::VideoTrackLayout* video_track;
 
-  // Add scaled geometry for entire desktop (in DIPs).
-  // The first layout must be the scaled geometry for backwards compatibility
-  // with the VideoLayout message. The scaled geometry is used for mouse
-  // coordinates sent from the client.
+  // The first layout must be the current webrtc capture size.
+  // This is required because we reuse the same message for both
+  // VideoSizeChanged (which is used to scale mouse coordinates)
+  // and DisplayDesktopChanged.
   video_track = layout.add_video_track();
   video_track->set_position_x(0);
   video_track->set_position_y(0);
-  video_track->set_width(size_dips.width());
-  video_track->set_height(size_dips.height());
+  video_track->set_width(webrtc_capture_size_.WidthAsDips());
+  video_track->set_height(webrtc_capture_size_.HeightAsDips());
   video_track->set_x_dpi(dpi_x);
   video_track->set_y_dpi(dpi_y);
-  LOG(INFO) << "  Desktop (DIPS) = 0,0 " << size_dips.width() << "x"
-            << size_dips.height() << " [" << dpi_x << "," << dpi_y << "]";
+  LOG(INFO) << "  Webrtc capture size (DIPS) = 0,0 "
+            << default_webrtc_desktop_size_;
 
-  // Add raw geometry for entire desktop (in pixels).
+  // Add raw geometry for entire desktop (in DIPs).
   video_track = layout.add_video_track();
   video_track->set_position_x(0);
   video_track->set_position_y(0);
@@ -689,7 +735,7 @@
   video_track->set_height(size.height());
   video_track->set_x_dpi(dpi_x);
   video_track->set_y_dpi(dpi_y);
-  LOG(INFO) << "  Desktop (pixels) = 0,0 " << size.width() << "x"
+  LOG(INFO) << "  Full Desktop (DIPS) = 0,0 " << size.width() << "x"
             << size.height() << " [" << dpi_x << "," << dpi_y << "]";
 
   // Add a VideoTrackLayout entry for each separate display.
@@ -707,6 +753,18 @@
               << display.y_dpi() << "]";
   }
 
+  // Set the display id, if this is the first message being processed.
+  if (show_display_id_ == webrtc::kInvalidScreenId) {
+    if (can_capture_full_desktop_) {
+      show_display_id_ = webrtc::kFullDesktopScreenId;
+    } else {
+      // Select the default display.
+      protocol::SelectDesktopDisplayRequest req;
+      req.set_id("0");
+      SelectDesktopDisplay(req);
+    }
+  }
+
   // We need to update the input filters whenever the displays change.
   DisplaySize display_size =
       DisplaySize::FromPixels(size.width(), size.height(), default_x_dpi_);
diff --git a/remoting/host/client_session.h b/remoting/host/client_session.h
index e0a947e..66989fd 100644
--- a/remoting/host/client_session.h
+++ b/remoting/host/client_session.h
@@ -275,8 +275,24 @@
   int default_y_dpi_;
 
   // The id of the desktop display to show to the user.
-  // Default is webrtc::kFullDesktopScreenId which shows all displays.
-  webrtc::ScreenId show_display_id_ = webrtc::kFullDesktopScreenId;
+  // Default is webrtc::kInvalidScreenScreenId because we need to perform
+  // an initial capture to determine if the current setup support capturing
+  // the entire desktop or if it is restricted to a single display.
+  webrtc::ScreenId show_display_id_ = webrtc::kInvalidScreenId;
+
+  // The initial video size captured by WebRTC.
+  // This will be the full desktop unless webrtc cannot capture the entire
+  // desktop (e.g., because the DPIs don't match). In that case, it will
+  // be equal to the dimensions of the default display.
+  DisplaySize default_webrtc_desktop_size_;
+
+  // The current size of the area being captured by webrtc. This will be
+  // equal to the size of the entire desktop, or to a single display.
+  DisplaySize webrtc_capture_size_;
+
+  // Set to true if the current display configuration supports capturing the
+  // entire desktop.
+  bool can_capture_full_desktop_ = true;
 
   // The pairing registry for PIN-less authentication.
   scoped_refptr<protocol::PairingRegistry> pairing_registry_;
diff --git a/remoting/host/client_session_unittest.cc b/remoting/host/client_session_unittest.cc
index c309d52..2fe3589 100644
--- a/remoting/host/client_session_unittest.cc
+++ b/remoting/host/client_session_unittest.cc
@@ -136,7 +136,6 @@
   static const int kDisplay2Width = 1024;
   static const int kDisplay2Height = 768;
   static const int kDisplay2YOffset = 35;
-  static const int kInvalidDisplayIndex = -2;
 
   // Creates the client session from a FakeSession instance.
   void CreateClientSession(std::unique_ptr<protocol::FakeSession> session);
@@ -368,7 +367,7 @@
 
 void ClientSessionTest::ResetDisplayInfo() {
   displays_.Reset();
-  curr_display_ = kInvalidDisplayIndex;
+  curr_display_ = webrtc::kInvalidScreenId;
 }
 
 // Set up a single display (default size).
@@ -377,8 +376,8 @@
   auto displays = std::make_unique<protocol::VideoLayout>();
   AddDisplayToLayout(displays.get(), 0, 0, kDisplay1Width, kDisplay1Height,
                      kDefaultDpi, kDefaultDpi);
-  NotifyDesktopDisplaySize(std::move(displays));
   NotifyVideoSizeAll();
+  NotifyDesktopDisplaySize(std::move(displays));
 }
 
 // Set up multiple displays:
@@ -395,8 +394,8 @@
                      kDefaultDpi, kDefaultDpi);
   AddDisplayToLayout(displays.get(), kDisplay1Width, kDisplay2YOffset,
                      kDisplay2Width, kDisplay2Height, kDefaultDpi, kDefaultDpi);
-  NotifyDesktopDisplaySize(std::move(displays));
   NotifyVideoSizeAll();
+  NotifyDesktopDisplaySize(std::move(displays));
 }
 
 // Set up multiple displays that are the same size:
@@ -412,8 +411,8 @@
                      kDefaultDpi, kDefaultDpi);
   AddDisplayToLayout(displays.get(), kDisplay1Width, kDisplay2YOffset,
                      kDisplay1Width, kDisplay1Height, kDefaultDpi, kDefaultDpi);
-  NotifyDesktopDisplaySize(std::move(displays));
   NotifyVideoSizeAll();
+  NotifyDesktopDisplaySize(std::move(displays));
 }
 
 void ClientSessionTest::MultiMon_SelectFirstDisplay() {
diff --git a/remoting/host/desktop_display_info.cc b/remoting/host/desktop_display_info.cc
index 5989228..299a24c 100644
--- a/remoting/host/desktop_display_info.cc
+++ b/remoting/host/desktop_display_info.cc
@@ -67,7 +67,7 @@
 }
 
 const DisplayGeometry* DesktopDisplayInfo::GetDisplayInfo(unsigned int id) {
-  if (id >= displays_.size())
+  if (id < 0 || id >= displays_.size())
     return nullptr;
   return &displays_[id];
 }
diff --git a/remoting/proto/control.proto b/remoting/proto/control.proto
index 9b04437..9ddc353 100644
--- a/remoting/proto/control.proto
+++ b/remoting/proto/control.proto
@@ -110,6 +110,9 @@
 message VideoLayout {
   // Layout for each video track.
   repeated VideoTrackLayout video_track = 1;
+
+  // True if this display configuration supports capturing the entire desktop.
+  optional bool supports_full_desktop_capture = 2;
 }
 
 message SelectDesktopDisplayRequest {
diff --git a/remoting/signaling/ftl_signal_strategy.cc b/remoting/signaling/ftl_signal_strategy.cc
index 05d096c..455d604 100644
--- a/remoting/signaling/ftl_signal_strategy.cc
+++ b/remoting/signaling/ftl_signal_strategy.cc
@@ -152,6 +152,10 @@
 void FtlSignalStrategy::Core::Disconnect() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
+  if (registration_manager_->IsSignedIn()) {
+    registration_manager_->SignOut();
+  }
+
   if (receive_message_subscription_) {
     local_address_ = SignalingAddress();
     receive_message_subscription_.reset();
@@ -395,7 +399,6 @@
              << ", message: " << status.error_message()
              << ", location: " << location.ToString();
   if (status.error_code() == grpc::StatusCode::UNAUTHENTICATED) {
-    registration_manager_->SignOut();
     oauth_token_getter_->InvalidateCache();
   }
   Disconnect();
diff --git a/sandbox/win/src/interception.cc b/sandbox/win/src/interception.cc
index b2c0bc47..966a2fa 100644
--- a/sandbox/win/src/interception.cc
+++ b/sandbox/win/src/interception.cc
@@ -449,14 +449,15 @@
   thunk.reset(new ServiceResolverThunk(child_->Process(), relaxed_));
 #else
   base::win::OSInfo* os_info = base::win::OSInfo::GetInstance();
+  base::win::Version real_os_version = os_info->Kernel32Version();
   if (os_info->wow64_status() == base::win::OSInfo::WOW64_ENABLED) {
-    if (os_info->version() >= base::win::Version::WIN10)
+    if (real_os_version >= base::win::Version::WIN10)
       thunk.reset(new Wow64W10ResolverThunk(child_->Process(), relaxed_));
-    else if (os_info->version() >= base::win::Version::WIN8)
+    else if (real_os_version >= base::win::Version::WIN8)
       thunk.reset(new Wow64W8ResolverThunk(child_->Process(), relaxed_));
     else
       thunk.reset(new Wow64ResolverThunk(child_->Process(), relaxed_));
-  } else if (os_info->version() >= base::win::Version::WIN8) {
+  } else if (real_os_version >= base::win::Version::WIN8) {
     thunk.reset(new Win8ResolverThunk(child_->Process(), relaxed_));
   } else {
     thunk.reset(new ServiceResolverThunk(child_->Process(), relaxed_));
diff --git a/services/device/public/cpp/usb/tools/usb_ids.py b/services/device/public/cpp/usb/tools/usb_ids.py
index 71761b4..1a1a1fe 100644
--- a/services/device/public/cpp/usb/tools/usb_ids.py
+++ b/services/device/public/cpp/usb/tools/usb_ids.py
@@ -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 codecs
+import io
 import itertools
 import optparse
 import re
@@ -17,7 +17,7 @@
   return name
 
 def ParseTable(input_path):
-  input_file = codecs.open(input_path, "r", encoding="ascii", errors="ignore")
+  input_file = io.open(input_path, "r", encoding="ascii", errors="ignore")
   input = input_file.read().split("\n")
   input_file.close()
 
diff --git a/services/viz/public/cpp/compositing/mojom_traits_perftest.cc b/services/viz/public/cpp/compositing/mojom_traits_perftest.cc
index fb32cdb..1c4605b 100644
--- a/services/viz/public/cpp/compositing/mojom_traits_perftest.cc
+++ b/services/viz/public/cpp/compositing/mojom_traits_perftest.cc
@@ -140,7 +140,7 @@
   }
 
   static void RunComplexCompositorFrameTest(const std::string& story) {
-    CompositorFrame frame;
+    CompositorFrame frame = MakeEmptyCompositorFrame();
     frame.metadata.begin_frame_ack = BeginFrameAck(0, 1, true);
 
     std::vector<TransferableResource>& resource_list = frame.resource_list;
diff --git a/services/viz/public/cpp/compositing/mojom_traits_unittest.cc b/services/viz/public/cpp/compositing/mojom_traits_unittest.cc
index 438cb36..8398354 100644
--- a/services/viz/public/cpp/compositing/mojom_traits_unittest.cc
+++ b/services/viz/public/cpp/compositing/mojom_traits_unittest.cc
@@ -923,7 +923,7 @@
       sqs, rect3, rect3, SurfaceRange(fallback_surface_id, primary_surface_id),
       SK_ColorBLUE, false);
 
-  const gfx::Rect rect4(1234, 5678, 9101112, 13141516);
+  const gfx::Rect rect4(1234, 5678, 91012, 13141);
   const bool needs_blending = true;
   const ResourceId resource_id4(1337);
   const RenderPassId render_pass_id = 1234u;
@@ -943,7 +943,7 @@
                            force_anti_aliasing_off, backdrop_filter_quality,
                            can_use_backdrop_filter_cache);
 
-  const gfx::Rect rect5(123, 567, 91011, 131415);
+  const gfx::Rect rect5(123, 567, 91011, 13141);
   const ResourceId resource_id5(1337);
   const float vertex_opacity[4] = {1.f, 2.f, 3.f, 4.f};
   const bool premultiplied_alpha = true;
diff --git a/services/viz/public/cpp/compositing/quads_mojom_traits.cc b/services/viz/public/cpp/compositing/quads_mojom_traits.cc
index c5fe892..80f7b3cc 100644
--- a/services/viz/public/cpp/compositing/quads_mojom_traits.cc
+++ b/services/viz/public/cpp/compositing/quads_mojom_traits.cc
@@ -227,6 +227,12 @@
   if (!data.ReadRect(&out->rect) || !data.ReadVisibleRect(&out->visible_rect)) {
     return false;
   }
+  // Reject quads with areas larger than int32.
+  if (!out->rect.size().GetCheckedArea().IsValid())
+    return false;
+  if (!out->rect.Contains(out->visible_rect))
+    return false;
+
   out->needs_blending = data.needs_blending();
   return data.ReadDrawQuadState(out);
 }
diff --git a/storage/browser/quota/quota_features.cc b/storage/browser/quota/quota_features.cc
index d2a0845..7e3aae4 100644
--- a/storage/browser/quota/quota_features.cc
+++ b/storage/browser/quota/quota_features.cc
@@ -22,7 +22,7 @@
 // quota computation takes into account free disk space, in addition to the
 // disk's total capacity.
 const base::Feature kStaticHostQuota{"StaticHostQuota",
-                                     base::FEATURE_DISABLED_BY_DEFAULT};
+                                     base::FEATURE_ENABLED_BY_DEFAULT};
 
 // QuotaUnlimitedPoolSize removes limitations around disk space consumption with
 // respect to client-side storage web platform APIs. When enabled, quota will
diff --git a/storage/browser/quota/quota_manager_unittest.cc b/storage/browser/quota/quota_manager_unittest.cc
index b7d035a..14f32b69e 100644
--- a/storage/browser/quota/quota_manager_unittest.cc
+++ b/storage/browser/quota/quota_manager_unittest.cc
@@ -1219,13 +1219,10 @@
   const int kPoolSize = 10000000;
   const int kPerHostQuota = kPoolSize / 5;
 
-  // Simulating a low available disk space scenario by making
-  // kMustRemainAvailable 64KB less than GetAvailableDiskSpaceForTest(), which
-  // means there is 64KB of storage quota that can be used before triggering
-  // the low available space logic branch in quota_manager.cc. From the
-  // perspective of QuotaManager, there are 64KB of free space in the temporary
-  // pool, so it should return (64KB + usage) as quota since the sum is less
-  // than the default host quota.
+  // In here, we expect the low available space logic branch
+  // to be ignored. Doing so should have QuotaManager return the same per-host
+  // quota as what is set in QuotaSettings, despite being in a state of low
+  // available space.
   const int kMustRemainAvailable =
       static_cast<int>(GetAvailableDiskSpaceForTest() - 65536);
   SetQuotaSettings(kPoolSize, kPerHostQuota, kMustRemainAvailable);
@@ -1234,18 +1231,21 @@
   task_environment_.RunUntilIdle();
   EXPECT_EQ(QuotaStatusCode::kOk, status());
   EXPECT_EQ(100000, usage());
-  EXPECT_GT(kPerHostQuota, quota());
-  EXPECT_EQ(65536 + usage(), quota());
+  EXPECT_EQ(kPerHostQuota, quota());
 }
 
-TEST_F(QuotaManagerTest, GetStaticQuotaLowAvailableDiskSpace) {
+TEST_F(QuotaManagerTest,
+       GetQuotaLowAvailableDiskSpace_StaticHostQuotaDisabled) {
   // This test is the same as the previous but with the kStaticHostQuota Finch
-  // feature enabled. In here, we expect the low available space logic branch
-  // to be ignored. Doing so should have QuotaManager return the same per host
-  // quota as what is set in QuotaSettings, despite being in a state of low
-  // available space. Notice the different expectation in the last line of
-  // each test.
-  scoped_feature_list_.InitAndEnableFeature(features::kStaticHostQuota);
+  // feature disabled.
+  // Simulating a low available disk space scenario by making
+  // kMustRemainAvailable 64KB less than GetAvailableDiskSpaceForTest(), which
+  // means there is 64KB of storage quota that can be used before triggering
+  // the low available space logic branch in quota_manager.cc. From the
+  // perspective of QuotaManager, there are 64KB of free space in the temporary
+  // pool, so it should return (64KB + usage) as quota since the sum is less
+  // than the default host quota.
+  scoped_feature_list_.InitAndDisableFeature(features::kStaticHostQuota);
   static const MockOriginData kData[] = {
       {"http://foo.com/", kTemp, 100000},
       {"http://unlimited/", kTemp, 4000000},
@@ -1265,7 +1265,8 @@
   task_environment_.RunUntilIdle();
   EXPECT_EQ(QuotaStatusCode::kOk, status());
   EXPECT_EQ(100000, usage());
-  EXPECT_EQ(kPerHostQuota, quota());
+  EXPECT_GT(kPerHostQuota, quota());
+  EXPECT_EQ(65536 + usage(), quota());
 }
 
 TEST_F(QuotaManagerTest, GetSyncableQuota) {
@@ -1276,14 +1277,18 @@
   EXPECT_LE(kAvailableSpaceForApp,
             QuotaManager::kSyncableStorageDefaultHostQuota);
 
-  // For unlimited origins the quota manager should return
-  // kAvailableSpaceForApp as syncable quota (because of the pre-condition).
+  // The quota manager should return
+  // QuotaManager::kSyncableStorageDefaultHostQuota as syncable quota,
+  // despite available space being less than the desired quota. Only
+  // origins with unlimited storage, which is never the case for syncable
+  // storage, shall have their quota calculation take into account the amount of
+  // available disk space.
   mock_special_storage_policy()->AddUnlimited(GURL("http://unlimited/"));
   GetUsageAndQuotaForWebApps(ToOrigin("http://unlimited/"), kSync);
   task_environment_.RunUntilIdle();
   EXPECT_EQ(QuotaStatusCode::kOk, status());
   EXPECT_EQ(0, usage());
-  EXPECT_EQ(kAvailableSpaceForApp, quota());
+  EXPECT_EQ(QuotaManager::kSyncableStorageDefaultHostQuota, quota());
 }
 
 TEST_F(QuotaManagerTest, GetPersistentUsageAndQuota_MultiOrigins) {
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json
index 7a7a289..70a2725 100644
--- a/testing/buildbot/chromium.chromiumos.json
+++ b/testing/buildbot/chromium.chromiumos.json
@@ -675,7 +675,7 @@
             {
               "device_type": "kevin",
               "os": "ChromeOS",
-              "pool": "chrome-cros-dut"
+              "pool": "chrome-cros-dut.template"
             }
           ]
         },
@@ -696,7 +696,7 @@
             {
               "device_type": "kevin",
               "os": "ChromeOS",
-              "pool": "chrome-cros-dut"
+              "pool": "chrome-cros-dut.template"
             }
           ],
           "idempotent": false
@@ -718,7 +718,7 @@
             {
               "device_type": "kevin",
               "os": "ChromeOS",
-              "pool": "chrome-cros-dut"
+              "pool": "chrome-cros-dut.template"
             }
           ]
         },
@@ -738,7 +738,7 @@
             {
               "device_type": "kevin",
               "os": "ChromeOS",
-              "pool": "chrome-cros-dut"
+              "pool": "chrome-cros-dut.template"
             }
           ],
           "idempotent": false
@@ -769,7 +769,7 @@
             {
               "device_type": "kevin",
               "os": "ChromeOS",
-              "pool": "chrome-cros-dut"
+              "pool": "chrome-cros-dut.template"
             }
           ],
           "idempotent": false,
@@ -798,7 +798,7 @@
             {
               "device_type": "kevin",
               "os": "ChromeOS",
-              "pool": "chrome-cros-dut"
+              "pool": "chrome-cros-dut.template"
             }
           ],
           "idempotent": false,
@@ -2539,6 +2539,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
+              "kvm": "1",
               "os": "Ubuntu-16.04"
             }
           ],
diff --git a/testing/buildbot/chromium.clang.json b/testing/buildbot/chromium.clang.json
index 285f009..b91c8f69 100644
--- a/testing/buildbot/chromium.clang.json
+++ b/testing/buildbot/chromium.clang.json
@@ -632,7 +632,7 @@
             {
               "gpu": "10de:1cb3",
               "os": "Ubuntu",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
diff --git a/testing/buildbot/chromium.dawn.json b/testing/buildbot/chromium.dawn.json
index 502ae669..271dfd1 100644
--- a/testing/buildbot/chromium.dawn.json
+++ b/testing/buildbot/chromium.dawn.json
@@ -20,7 +20,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -45,7 +45,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -69,7 +69,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -94,7 +94,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -119,7 +119,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -143,7 +143,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -167,7 +167,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -188,7 +188,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -210,7 +210,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -239,7 +239,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -269,7 +269,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -294,7 +294,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -319,7 +319,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -343,7 +343,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -368,7 +368,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -393,7 +393,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -417,7 +417,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -441,7 +441,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -462,7 +462,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -484,7 +484,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -513,7 +513,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -543,7 +543,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -568,7 +568,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -593,7 +593,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -617,7 +617,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -642,7 +642,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -667,7 +667,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -691,7 +691,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -715,7 +715,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -744,7 +744,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -769,7 +769,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -794,7 +794,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -818,7 +818,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -843,7 +843,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -868,7 +868,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -892,7 +892,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -916,7 +916,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -945,7 +945,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -973,7 +973,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -999,7 +999,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1024,7 +1024,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1050,7 +1050,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1076,7 +1076,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1101,7 +1101,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1126,7 +1126,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1148,7 +1148,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1170,7 +1170,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1200,7 +1200,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1230,7 +1230,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1517,7 +1517,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1543,7 +1543,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1568,7 +1568,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1594,7 +1594,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1620,7 +1620,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1645,7 +1645,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1670,7 +1670,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1700,7 +1700,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1920,7 +1920,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1945,7 +1945,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1969,7 +1969,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1994,7 +1994,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2019,7 +2019,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2043,7 +2043,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2067,7 +2067,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2088,7 +2088,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2109,7 +2109,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2138,7 +2138,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2168,7 +2168,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2193,7 +2193,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2218,7 +2218,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2242,7 +2242,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2267,7 +2267,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2292,7 +2292,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2316,7 +2316,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2340,7 +2340,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2361,7 +2361,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2382,7 +2382,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2411,7 +2411,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2441,7 +2441,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2466,7 +2466,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2491,7 +2491,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2515,7 +2515,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2540,7 +2540,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2565,7 +2565,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2589,7 +2589,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2613,7 +2613,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2642,7 +2642,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2667,7 +2667,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2692,7 +2692,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2716,7 +2716,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2741,7 +2741,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2766,7 +2766,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2790,7 +2790,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2814,7 +2814,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2843,7 +2843,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2870,7 +2870,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2895,7 +2895,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2919,7 +2919,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2944,7 +2944,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2969,7 +2969,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2993,7 +2993,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3017,7 +3017,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3038,7 +3038,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3059,7 +3059,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3088,7 +3088,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3117,7 +3117,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3142,7 +3142,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3167,7 +3167,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3191,7 +3191,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3216,7 +3216,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3241,7 +3241,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3265,7 +3265,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3289,7 +3289,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3310,7 +3310,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3331,7 +3331,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3360,7 +3360,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3389,7 +3389,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3414,7 +3414,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3439,7 +3439,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3463,7 +3463,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3488,7 +3488,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3513,7 +3513,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3537,7 +3537,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3561,7 +3561,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3590,7 +3590,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3615,7 +3615,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3640,7 +3640,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3664,7 +3664,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3689,7 +3689,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3714,7 +3714,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3738,7 +3738,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3762,7 +3762,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3791,7 +3791,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index eb7120a2..88558cbb6 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -10180,7 +10180,7 @@
             {
               "device_type": "kevin",
               "os": "ChromeOS",
-              "pool": "chrome-cros-dut"
+              "pool": "chrome-cros-dut.template"
             }
           ],
           "hard_timeout": 5400,
@@ -10203,7 +10203,7 @@
             {
               "device_type": "kevin",
               "os": "ChromeOS",
-              "pool": "chrome-cros-dut"
+              "pool": "chrome-cros-dut.template"
             }
           ],
           "idempotent": false
@@ -10240,7 +10240,7 @@
             {
               "device_type": "kevin",
               "os": "ChromeOS",
-              "pool": "chrome-cros-dut"
+              "pool": "chrome-cros-dut.template"
             }
           ],
           "idempotent": false,
@@ -23427,7 +23427,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "Mac-10.13.6",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 20
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json
index b7f0329..9b0a78b4 100644
--- a/testing/buildbot/chromium.gpu.fyi.json
+++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -173,7 +173,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -199,7 +199,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -223,7 +223,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -245,7 +245,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -268,7 +268,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -290,7 +290,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -320,7 +320,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -353,7 +353,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -382,7 +382,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -413,7 +413,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -445,7 +445,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -475,7 +475,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -506,7 +506,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -535,7 +535,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -561,7 +561,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -585,7 +585,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -607,7 +607,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -630,7 +630,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -652,7 +652,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -682,7 +682,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -715,7 +715,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -744,7 +744,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -775,7 +775,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -807,7 +807,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -837,7 +837,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -868,7 +868,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -1153,7 +1153,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -1179,7 +1179,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1202,7 +1202,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1225,7 +1225,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1248,7 +1248,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1268,7 +1268,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1305,7 +1305,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -1337,7 +1337,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -1368,7 +1368,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -1400,7 +1400,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -1429,7 +1429,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -1455,7 +1455,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1483,7 +1483,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -1506,7 +1506,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1530,7 +1530,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1553,7 +1553,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1578,7 +1578,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1602,7 +1602,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1627,7 +1627,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1657,7 +1657,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1690,7 +1690,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -1721,7 +1721,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -1751,7 +1751,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -1781,7 +1781,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -1812,7 +1812,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -1842,7 +1842,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -1870,7 +1870,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -1893,7 +1893,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1917,7 +1917,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1940,7 +1940,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1965,7 +1965,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -1989,7 +1989,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2014,7 +2014,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2044,7 +2044,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2077,7 +2077,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -2107,7 +2107,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2138,7 +2138,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -2170,7 +2170,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -2200,7 +2200,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -2230,7 +2230,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -2261,7 +2261,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -2291,7 +2291,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -2331,7 +2331,7 @@
               "device_os_type": "userdebug",
               "device_type": "walleye",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -2375,7 +2375,7 @@
               "device_os_type": "userdebug",
               "device_type": "walleye",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -2418,7 +2418,7 @@
               "device_os_type": "userdebug",
               "device_type": "walleye",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2458,7 +2458,7 @@
               "device_os_type": "userdebug",
               "device_type": "walleye",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -2506,7 +2506,7 @@
               "device_os_type": "userdebug",
               "device_type": "walleye",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -2554,7 +2554,7 @@
               "device_os_type": "userdebug",
               "device_type": "walleye",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -2602,7 +2602,7 @@
               "device_os_type": "userdebug",
               "device_type": "walleye",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -2650,7 +2650,7 @@
               "device_os_type": "userdebug",
               "device_type": "walleye",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -2697,7 +2697,7 @@
               "device_os_type": "userdebug",
               "device_type": "walleye",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -2745,7 +2745,7 @@
               "device_os_type": "userdebug",
               "device_type": "walleye",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -2787,7 +2787,7 @@
               "device_os_type": "userdebug",
               "device_type": "walleye",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2826,7 +2826,7 @@
               "device_os_type": "userdebug",
               "device_type": "walleye",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -2870,7 +2870,7 @@
               "device_os_type": "userdebug",
               "device_type": "walleye",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -2913,7 +2913,7 @@
               "device_os_type": "userdebug",
               "device_type": "walleye",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2953,7 +2953,7 @@
               "device_os_type": "userdebug",
               "device_type": "walleye",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -3001,7 +3001,7 @@
               "device_os_type": "userdebug",
               "device_type": "walleye",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -3049,7 +3049,7 @@
               "device_os_type": "userdebug",
               "device_type": "walleye",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -3097,7 +3097,7 @@
               "device_os_type": "userdebug",
               "device_type": "walleye",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -3145,7 +3145,7 @@
               "device_os_type": "userdebug",
               "device_type": "walleye",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -3192,7 +3192,7 @@
               "device_os_type": "userdebug",
               "device_type": "walleye",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -3240,7 +3240,7 @@
               "device_os_type": "userdebug",
               "device_type": "walleye",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -3288,7 +3288,7 @@
               "device_os_type": "user",
               "device_type": "foster",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -3332,7 +3332,7 @@
               "device_os_type": "user",
               "device_type": "foster",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -3374,7 +3374,7 @@
               "device_os_type": "user",
               "device_type": "foster",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -3416,7 +3416,7 @@
               "device_os_type": "user",
               "device_type": "foster",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -3458,7 +3458,7 @@
               "device_os_type": "user",
               "device_type": "foster",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -3501,7 +3501,7 @@
               "device_os_type": "user",
               "device_type": "foster",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3532,7 +3532,7 @@
               "device_os_type": "user",
               "device_type": "foster",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -3563,7 +3563,7 @@
               "device_os_type": "user",
               "device_type": "foster",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -3594,7 +3594,7 @@
               "device_os_type": "user",
               "device_type": "foster",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -3625,7 +3625,7 @@
               "device_os_type": "user",
               "device_type": "foster",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -3660,7 +3660,7 @@
               "device_os_type": "user",
               "device_type": "foster",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -3704,7 +3704,7 @@
               "device_os_type": "user",
               "device_type": "foster",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -3749,7 +3749,7 @@
               "device_os_type": "user",
               "device_type": "foster",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -3782,7 +3782,7 @@
               "device_os_type": "user",
               "device_type": "foster",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -3813,7 +3813,7 @@
               "device_os_type": "user",
               "device_type": "foster",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -3845,7 +3845,7 @@
               "device_os_type": "user",
               "device_type": "foster",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -3882,7 +3882,7 @@
               "device_os_type": "userdebug",
               "device_type": "hammerhead",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -3924,7 +3924,7 @@
               "device_os_type": "userdebug",
               "device_type": "hammerhead",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -3966,7 +3966,7 @@
               "device_os_type": "userdebug",
               "device_type": "hammerhead",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -4008,7 +4008,7 @@
               "device_os_type": "userdebug",
               "device_type": "hammerhead",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -4052,7 +4052,7 @@
               "device_os_type": "userdebug",
               "device_type": "hammerhead",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -4083,7 +4083,7 @@
               "device_os_type": "userdebug",
               "device_type": "hammerhead",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -4114,7 +4114,7 @@
               "device_os_type": "userdebug",
               "device_type": "hammerhead",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -4145,7 +4145,7 @@
               "device_os_type": "userdebug",
               "device_type": "hammerhead",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -4180,7 +4180,7 @@
               "device_os_type": "userdebug",
               "device_type": "hammerhead",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -4224,7 +4224,7 @@
               "device_os_type": "userdebug",
               "device_type": "hammerhead",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -4269,7 +4269,7 @@
               "device_os_type": "userdebug",
               "device_type": "hammerhead",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -4302,7 +4302,7 @@
               "device_os_type": "userdebug",
               "device_type": "hammerhead",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -4333,7 +4333,7 @@
               "device_os_type": "userdebug",
               "device_type": "hammerhead",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -4365,7 +4365,7 @@
               "device_os_type": "userdebug",
               "device_type": "hammerhead",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -4958,7 +4958,7 @@
               "device_os_type": "userdebug",
               "device_type": "shamu",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -5000,7 +5000,7 @@
               "device_os_type": "userdebug",
               "device_type": "shamu",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -5042,7 +5042,7 @@
               "device_os_type": "userdebug",
               "device_type": "shamu",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -5084,7 +5084,7 @@
               "device_os_type": "userdebug",
               "device_type": "shamu",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -5128,7 +5128,7 @@
               "device_os_type": "userdebug",
               "device_type": "shamu",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -5159,7 +5159,7 @@
               "device_os_type": "userdebug",
               "device_type": "shamu",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -5190,7 +5190,7 @@
               "device_os_type": "userdebug",
               "device_type": "shamu",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -5221,7 +5221,7 @@
               "device_os_type": "userdebug",
               "device_type": "shamu",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -5256,7 +5256,7 @@
               "device_os_type": "userdebug",
               "device_type": "shamu",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -5300,7 +5300,7 @@
               "device_os_type": "userdebug",
               "device_type": "shamu",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -5345,7 +5345,7 @@
               "device_os_type": "userdebug",
               "device_type": "shamu",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -5378,7 +5378,7 @@
               "device_os_type": "userdebug",
               "device_type": "shamu",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -5409,7 +5409,7 @@
               "device_os_type": "userdebug",
               "device_type": "shamu",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -5441,7 +5441,7 @@
               "device_os_type": "userdebug",
               "device_type": "shamu",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -5478,7 +5478,7 @@
               "device_os_type": "userdebug",
               "device_type": "angler",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -5522,7 +5522,7 @@
               "device_os_type": "userdebug",
               "device_type": "angler",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -5564,7 +5564,7 @@
               "device_os_type": "userdebug",
               "device_type": "angler",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -5606,7 +5606,7 @@
               "device_os_type": "userdebug",
               "device_type": "angler",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -5648,7 +5648,7 @@
               "device_os_type": "userdebug",
               "device_type": "angler",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -5691,7 +5691,7 @@
               "device_os_type": "userdebug",
               "device_type": "angler",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -5722,7 +5722,7 @@
               "device_os_type": "userdebug",
               "device_type": "angler",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -5753,7 +5753,7 @@
               "device_os_type": "userdebug",
               "device_type": "angler",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -5784,7 +5784,7 @@
               "device_os_type": "userdebug",
               "device_type": "angler",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -5815,7 +5815,7 @@
               "device_os_type": "userdebug",
               "device_type": "angler",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -5850,7 +5850,7 @@
               "device_os_type": "userdebug",
               "device_type": "angler",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -5894,7 +5894,7 @@
               "device_os_type": "userdebug",
               "device_type": "angler",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -5939,7 +5939,7 @@
               "device_os_type": "userdebug",
               "device_type": "angler",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -5972,7 +5972,7 @@
               "device_os_type": "userdebug",
               "device_type": "angler",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -6003,7 +6003,7 @@
               "device_os_type": "userdebug",
               "device_type": "angler",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -6035,7 +6035,7 @@
               "device_os_type": "userdebug",
               "device_type": "angler",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -6072,7 +6072,7 @@
               "device_os_type": "userdebug",
               "device_type": "flounder",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -6114,7 +6114,7 @@
               "device_os_type": "userdebug",
               "device_type": "flounder",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -6156,7 +6156,7 @@
               "device_os_type": "userdebug",
               "device_type": "flounder",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -6198,7 +6198,7 @@
               "device_os_type": "userdebug",
               "device_type": "flounder",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "output_links": [
@@ -6241,7 +6241,7 @@
               "device_os_type": "userdebug",
               "device_type": "flounder",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -6272,7 +6272,7 @@
               "device_os_type": "userdebug",
               "device_type": "flounder",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -6303,7 +6303,7 @@
               "device_os_type": "userdebug",
               "device_type": "flounder",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -6334,7 +6334,7 @@
               "device_os_type": "userdebug",
               "device_type": "flounder",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -6365,7 +6365,7 @@
               "device_os_type": "userdebug",
               "device_type": "flounder",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -6400,7 +6400,7 @@
               "device_os_type": "userdebug",
               "device_type": "flounder",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -6444,7 +6444,7 @@
               "device_os_type": "userdebug",
               "device_type": "flounder",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -6489,7 +6489,7 @@
               "device_os_type": "userdebug",
               "device_type": "flounder",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -6522,7 +6522,7 @@
               "device_os_type": "userdebug",
               "device_type": "flounder",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -6553,7 +6553,7 @@
               "device_os_type": "userdebug",
               "device_type": "flounder",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -6585,7 +6585,7 @@
               "device_os_type": "userdebug",
               "device_type": "flounder",
               "os": "Android",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -7076,7 +7076,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -7100,7 +7100,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -7122,7 +7122,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -7145,7 +7145,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -7167,7 +7167,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -7186,7 +7186,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -7218,7 +7218,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -7247,7 +7247,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -7276,7 +7276,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -7305,7 +7305,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -7338,7 +7338,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -7380,7 +7380,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -7423,7 +7423,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -7454,7 +7454,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -7483,7 +7483,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -7512,7 +7512,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -7543,7 +7543,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -7577,7 +7577,7 @@
             {
               "gpu": "8086:5912-19.0.2",
               "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -7611,7 +7611,7 @@
             {
               "gpu": "10de:1cb3-418.56",
               "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -7640,7 +7640,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -7662,7 +7662,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -7685,7 +7685,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -7707,7 +7707,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -7726,7 +7726,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -7756,7 +7756,7 @@
             {
               "gpu": "8086:1912",
               "os": "Ubuntu",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -7782,7 +7782,7 @@
             {
               "gpu": "8086:1912",
               "os": "Ubuntu",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -7811,7 +7811,7 @@
             {
               "gpu": "1002:6613",
               "os": "Ubuntu",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -7836,7 +7836,7 @@
             {
               "gpu": "1002:6613",
               "os": "Ubuntu",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -7864,7 +7864,7 @@
             {
               "gpu": "1002:6613",
               "os": "Ubuntu",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -7887,7 +7887,7 @@
             {
               "gpu": "1002:6613",
               "os": "Ubuntu",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -7910,7 +7910,7 @@
             {
               "gpu": "1002:6613",
               "os": "Ubuntu",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -7930,7 +7930,7 @@
             {
               "gpu": "1002:6613",
               "os": "Ubuntu",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -7963,7 +7963,7 @@
             {
               "gpu": "1002:6613",
               "os": "Ubuntu",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -7993,7 +7993,7 @@
             {
               "gpu": "1002:6613",
               "os": "Ubuntu",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -8023,7 +8023,7 @@
             {
               "gpu": "1002:6613",
               "os": "Ubuntu",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -8053,7 +8053,7 @@
             {
               "gpu": "1002:6613",
               "os": "Ubuntu",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -8087,7 +8087,7 @@
             {
               "gpu": "1002:6613",
               "os": "Ubuntu",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -8130,7 +8130,7 @@
             {
               "gpu": "1002:6613",
               "os": "Ubuntu",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -8174,7 +8174,7 @@
             {
               "gpu": "1002:6613",
               "os": "Ubuntu",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -8206,7 +8206,7 @@
             {
               "gpu": "1002:6613",
               "os": "Ubuntu",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -8236,7 +8236,7 @@
             {
               "gpu": "1002:6613",
               "os": "Ubuntu",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -8268,7 +8268,7 @@
             {
               "gpu": "1002:6613",
               "os": "Ubuntu",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -8299,7 +8299,7 @@
             {
               "gpu": "1002:6613",
               "os": "Ubuntu",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -8331,7 +8331,7 @@
             {
               "gpu": "1002:6613",
               "os": "Ubuntu",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -8361,7 +8361,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -8387,7 +8387,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -8411,7 +8411,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -8433,7 +8433,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -8456,7 +8456,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -8478,7 +8478,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -8497,7 +8497,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -8529,7 +8529,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -8558,7 +8558,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -8587,7 +8587,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -8616,7 +8616,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -8649,7 +8649,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -8691,7 +8691,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -8734,7 +8734,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -8765,7 +8765,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -8794,7 +8794,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -8825,7 +8825,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -8857,7 +8857,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -8887,7 +8887,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -8918,7 +8918,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -8947,7 +8947,7 @@
             {
               "gpu": "intel-uhd-630-ubuntu-stable",
               "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -8974,7 +8974,7 @@
             {
               "gpu": "intel-uhd-630-ubuntu-stable",
               "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400
@@ -8999,7 +8999,7 @@
             {
               "gpu": "intel-uhd-630-ubuntu-stable",
               "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400
@@ -9022,7 +9022,7 @@
             {
               "gpu": "intel-uhd-630-ubuntu-stable",
               "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400
@@ -9046,7 +9046,7 @@
             {
               "gpu": "intel-uhd-630-ubuntu-stable",
               "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400
@@ -9069,7 +9069,7 @@
             {
               "gpu": "intel-uhd-630-ubuntu-stable",
               "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400
@@ -9089,7 +9089,7 @@
             {
               "gpu": "intel-uhd-630-ubuntu-stable",
               "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400
@@ -9122,7 +9122,7 @@
             {
               "gpu": "intel-uhd-630-ubuntu-stable",
               "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -9152,7 +9152,7 @@
             {
               "gpu": "intel-uhd-630-ubuntu-stable",
               "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -9182,7 +9182,7 @@
             {
               "gpu": "intel-uhd-630-ubuntu-stable",
               "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -9212,7 +9212,7 @@
             {
               "gpu": "intel-uhd-630-ubuntu-stable",
               "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -9246,7 +9246,7 @@
             {
               "gpu": "intel-uhd-630-ubuntu-stable",
               "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -9289,7 +9289,7 @@
             {
               "gpu": "intel-uhd-630-ubuntu-stable",
               "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -9333,7 +9333,7 @@
             {
               "gpu": "intel-uhd-630-ubuntu-stable",
               "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -9365,7 +9365,7 @@
             {
               "gpu": "intel-uhd-630-ubuntu-stable",
               "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -9395,7 +9395,7 @@
             {
               "gpu": "intel-uhd-630-ubuntu-stable",
               "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -9427,7 +9427,7 @@
             {
               "gpu": "intel-uhd-630-ubuntu-stable",
               "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -9460,7 +9460,7 @@
             {
               "gpu": "intel-uhd-630-ubuntu-stable",
               "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -9491,7 +9491,7 @@
             {
               "gpu": "intel-uhd-630-ubuntu-stable",
               "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -9523,7 +9523,7 @@
             {
               "gpu": "intel-uhd-630-ubuntu-stable",
               "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -9553,7 +9553,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -9579,7 +9579,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -9603,7 +9603,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -9625,7 +9625,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -9648,7 +9648,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -9670,7 +9670,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -9689,7 +9689,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -9719,7 +9719,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -9748,7 +9748,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -9777,7 +9777,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -9806,7 +9806,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -9835,7 +9835,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -9868,7 +9868,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -9910,7 +9910,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -9953,7 +9953,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -9984,7 +9984,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -10013,7 +10013,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -10044,7 +10044,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -10076,7 +10076,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -10106,7 +10106,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -10137,7 +10137,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -10171,7 +10171,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -10209,7 +10209,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -10241,7 +10241,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -10270,7 +10270,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -10299,7 +10299,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -10328,7 +10328,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -10370,7 +10370,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -10401,7 +10401,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -10441,7 +10441,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -10483,7 +10483,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -10527,7 +10527,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -10569,7 +10569,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -10608,7 +10608,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -10640,7 +10640,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -10669,7 +10669,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -10698,7 +10698,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -10727,7 +10727,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -10769,7 +10769,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -10800,7 +10800,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -10840,7 +10840,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -10882,7 +10882,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -10926,7 +10926,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -10968,7 +10968,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -10998,7 +10998,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -11029,7 +11029,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -11056,7 +11056,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -11083,7 +11083,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -11110,7 +11110,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -11137,7 +11137,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 10
@@ -11164,7 +11164,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 10
@@ -11191,7 +11191,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 12
@@ -11218,7 +11218,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 12
@@ -11245,7 +11245,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -11271,7 +11271,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 2
@@ -11298,7 +11298,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 2
@@ -11856,7 +11856,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "Mac-10.13.6",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -11891,7 +11891,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "Mac-10.14.6",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -11924,7 +11924,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -11954,7 +11954,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -11985,7 +11985,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -12012,7 +12012,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -12039,7 +12039,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -12066,7 +12066,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -12090,7 +12090,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -12118,7 +12118,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -12142,7 +12142,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -12180,7 +12180,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -12214,7 +12214,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -12248,7 +12248,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -12282,7 +12282,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -12329,7 +12329,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -12377,7 +12377,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -12413,7 +12413,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -12447,7 +12447,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -12483,7 +12483,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -12521,7 +12521,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -12556,7 +12556,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -12593,7 +12593,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -13250,7 +13250,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -13276,7 +13276,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -13299,7 +13299,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -13322,7 +13322,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -13345,7 +13345,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -13365,7 +13365,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -13389,7 +13389,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -13409,7 +13409,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -13442,7 +13442,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -13472,7 +13472,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -13502,7 +13502,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -13532,7 +13532,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -13566,7 +13566,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -13609,7 +13609,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -13653,7 +13653,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -13685,7 +13685,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -13715,7 +13715,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -13746,7 +13746,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -13775,7 +13775,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -13801,7 +13801,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -13824,7 +13824,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -13847,7 +13847,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -13870,7 +13870,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -13890,7 +13890,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -13914,7 +13914,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -13934,7 +13934,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -13967,7 +13967,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -13997,7 +13997,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -14027,7 +14027,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -14057,7 +14057,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -14091,7 +14091,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -14134,7 +14134,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -14178,7 +14178,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -14210,7 +14210,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -14240,7 +14240,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -14268,7 +14268,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -14294,7 +14294,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -14321,7 +14321,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -14344,7 +14344,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -14367,7 +14367,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -14390,7 +14390,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -14410,7 +14410,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -14434,7 +14434,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -14454,7 +14454,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -14487,7 +14487,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -14517,7 +14517,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -14547,7 +14547,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -14577,7 +14577,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -14611,7 +14611,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -14654,7 +14654,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -14698,7 +14698,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -14724,7 +14724,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -14755,7 +14755,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -14785,7 +14785,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -14817,7 +14817,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -14850,7 +14850,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -14881,7 +14881,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -14913,7 +14913,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -14942,7 +14942,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -14968,7 +14968,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -14995,7 +14995,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -15018,7 +15018,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -15041,7 +15041,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -15064,7 +15064,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -15084,7 +15084,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -15108,7 +15108,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -15128,7 +15128,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -15161,7 +15161,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -15191,7 +15191,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -15221,7 +15221,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -15251,7 +15251,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -15285,7 +15285,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -15328,7 +15328,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -15372,7 +15372,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -15404,7 +15404,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -15434,7 +15434,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -15466,7 +15466,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -15497,7 +15497,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -15529,7 +15529,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -15559,7 +15559,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -15586,7 +15586,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -15613,7 +15613,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 12
@@ -15721,7 +15721,7 @@
             {
               "gpu": "1002:679e",
               "os": "Mac-10.12.6",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -15747,7 +15747,7 @@
             {
               "gpu": "1002:679e",
               "os": "Mac-10.12.6",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -15774,7 +15774,7 @@
             {
               "gpu": "1002:679e",
               "os": "Mac-10.12.6",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -15797,7 +15797,7 @@
             {
               "gpu": "1002:679e",
               "os": "Mac-10.12.6",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -15820,7 +15820,7 @@
             {
               "gpu": "1002:679e",
               "os": "Mac-10.12.6",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -15843,7 +15843,7 @@
             {
               "gpu": "1002:679e",
               "os": "Mac-10.12.6",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -15863,7 +15863,7 @@
             {
               "gpu": "1002:679e",
               "os": "Mac-10.12.6",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -15896,7 +15896,7 @@
             {
               "gpu": "1002:679e",
               "os": "Mac-10.12.6",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -15926,7 +15926,7 @@
             {
               "gpu": "1002:679e",
               "os": "Mac-10.12.6",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -15956,7 +15956,7 @@
             {
               "gpu": "1002:679e",
               "os": "Mac-10.12.6",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -15986,7 +15986,7 @@
             {
               "gpu": "1002:679e",
               "os": "Mac-10.12.6",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -16020,7 +16020,7 @@
             {
               "gpu": "1002:679e",
               "os": "Mac-10.12.6",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -16063,7 +16063,7 @@
             {
               "gpu": "1002:679e",
               "os": "Mac-10.12.6",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -16107,7 +16107,7 @@
             {
               "gpu": "1002:679e",
               "os": "Mac-10.12.6",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -16139,7 +16139,7 @@
             {
               "gpu": "1002:679e",
               "os": "Mac-10.12.6",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -16169,7 +16169,7 @@
             {
               "gpu": "1002:679e",
               "os": "Mac-10.12.6",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -16201,7 +16201,7 @@
             {
               "gpu": "1002:679e",
               "os": "Mac-10.12.6",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -16232,7 +16232,7 @@
             {
               "gpu": "1002:679e",
               "os": "Mac-10.12.6",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -16264,7 +16264,7 @@
             {
               "gpu": "1002:679e",
               "os": "Mac-10.12.6",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -16295,7 +16295,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -16320,7 +16320,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -16342,7 +16342,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -16361,7 +16361,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -16397,7 +16397,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -16426,7 +16426,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -16457,7 +16457,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -16487,7 +16487,7 @@
             {
               "gpu": "intel-hd-630-ubuntu-stable",
               "os": "linux-intel-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -16516,7 +16516,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -16541,7 +16541,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -16563,7 +16563,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -16582,7 +16582,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -16612,7 +16612,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -16645,7 +16645,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -16665,7 +16665,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -16694,7 +16694,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -16725,7 +16725,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -16755,7 +16755,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -17013,7 +17013,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -17037,7 +17037,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -17057,7 +17057,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -17081,7 +17081,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -17101,7 +17101,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -17138,7 +17138,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -17168,7 +17168,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -17200,7 +17200,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -17231,7 +17231,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -17260,7 +17260,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -17284,7 +17284,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -17304,7 +17304,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -17328,7 +17328,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -17348,7 +17348,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -17385,7 +17385,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -17415,7 +17415,7 @@
               "gpu": "10de:0fe9",
               "hidpi": "1",
               "os": "mac-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -17442,7 +17442,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -17465,7 +17465,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -17488,7 +17488,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -17510,7 +17510,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -17534,7 +17534,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -17559,7 +17559,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -17578,7 +17578,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -17597,7 +17597,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -17620,7 +17620,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -17650,7 +17650,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -17683,7 +17683,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -17712,7 +17712,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -17741,7 +17741,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -17772,7 +17772,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -17802,7 +17802,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -17832,7 +17832,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -17863,7 +17863,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -17893,7 +17893,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -17921,7 +17921,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -17931,7 +17931,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -17953,7 +17953,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -17962,7 +17962,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -17985,7 +17985,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -17994,7 +17994,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -18016,7 +18016,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -18025,7 +18025,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -18049,7 +18049,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -18058,7 +18058,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -18083,7 +18083,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -18092,7 +18092,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -18111,7 +18111,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -18120,7 +18120,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -18139,7 +18139,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -18148,7 +18148,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -18171,7 +18171,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -18180,7 +18180,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -18210,7 +18210,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -18218,7 +18218,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -18252,7 +18252,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -18260,7 +18260,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -18291,7 +18291,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -18299,7 +18299,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -18329,7 +18329,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -18337,7 +18337,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -18369,7 +18369,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -18378,7 +18378,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -18408,7 +18408,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -18417,7 +18417,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -18447,7 +18447,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -18456,7 +18456,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -18487,7 +18487,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -18496,7 +18496,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -18526,7 +18526,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -18535,7 +18535,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -18569,7 +18569,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -18602,7 +18602,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -18629,7 +18629,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -18652,7 +18652,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -18676,7 +18676,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -18699,7 +18699,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -18721,7 +18721,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -18743,7 +18743,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -18765,7 +18765,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -18789,7 +18789,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -18814,7 +18814,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -18833,7 +18833,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -18852,7 +18852,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -18875,7 +18875,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -18907,7 +18907,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -18936,7 +18936,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -18965,7 +18965,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -18994,7 +18994,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -19027,7 +19027,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -19069,7 +19069,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -19112,7 +19112,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -19143,7 +19143,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -19172,7 +19172,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -19201,7 +19201,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -19231,7 +19231,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -19262,7 +19262,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -19292,7 +19292,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -19326,7 +19326,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -19360,7 +19360,7 @@
             {
               "gpu": "10de:1cb3-26.21.14.3102",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -19386,7 +19386,7 @@
             {
               "gpu": "1002:699f",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -19411,7 +19411,7 @@
             {
               "gpu": "1002:699f",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -19438,7 +19438,7 @@
             {
               "gpu": "1002:699f",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -19461,7 +19461,7 @@
             {
               "gpu": "1002:699f",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -19484,7 +19484,7 @@
             {
               "gpu": "1002:699f",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -19507,7 +19507,7 @@
             {
               "gpu": "1002:699f",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -19532,7 +19532,7 @@
             {
               "gpu": "1002:699f",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -19558,7 +19558,7 @@
             {
               "gpu": "1002:699f",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -19578,7 +19578,7 @@
             {
               "gpu": "1002:699f",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -19598,7 +19598,7 @@
             {
               "gpu": "1002:699f",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -19631,7 +19631,7 @@
             {
               "gpu": "1002:699f",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -19661,7 +19661,7 @@
             {
               "gpu": "1002:699f",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -19691,7 +19691,7 @@
             {
               "gpu": "1002:699f",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -19721,7 +19721,7 @@
             {
               "gpu": "1002:699f",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -19755,7 +19755,7 @@
             {
               "gpu": "1002:699f",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -19798,7 +19798,7 @@
             {
               "gpu": "1002:699f",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -19842,7 +19842,7 @@
             {
               "gpu": "1002:699f",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -19874,7 +19874,7 @@
             {
               "gpu": "1002:699f",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -19904,7 +19904,7 @@
             {
               "gpu": "1002:699f",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -19936,7 +19936,7 @@
             {
               "gpu": "1002:699f",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -19967,7 +19967,7 @@
             {
               "gpu": "1002:699f",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -19999,7 +19999,7 @@
             {
               "gpu": "1002:699f",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -20030,7 +20030,7 @@
             {
               "gpu": "1002:699f",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -20059,7 +20059,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -20082,7 +20082,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -20106,7 +20106,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -20129,7 +20129,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -20155,7 +20155,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -20177,7 +20177,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -20199,7 +20199,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -20221,7 +20221,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -20245,7 +20245,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -20270,7 +20270,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -20289,7 +20289,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -20308,7 +20308,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -20331,7 +20331,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -20361,7 +20361,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -20390,7 +20390,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -20419,7 +20419,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -20448,7 +20448,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -20477,7 +20477,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -20510,7 +20510,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -20552,7 +20552,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -20595,7 +20595,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -20625,7 +20625,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -20650,7 +20650,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -20680,7 +20680,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -20709,7 +20709,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -20740,7 +20740,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -20772,7 +20772,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -20802,7 +20802,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -20832,7 +20832,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -20863,7 +20863,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -20893,7 +20893,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -20921,7 +20921,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -20945,7 +20945,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400
@@ -20970,7 +20970,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400
@@ -20994,7 +20994,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400
@@ -21021,7 +21021,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400
@@ -21044,7 +21044,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400
@@ -21067,7 +21067,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400
@@ -21090,7 +21090,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400
@@ -21115,7 +21115,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400
@@ -21141,7 +21141,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400
@@ -21161,7 +21161,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400
@@ -21181,7 +21181,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400
@@ -21205,7 +21205,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400
@@ -21236,7 +21236,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400
@@ -21266,7 +21266,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -21296,7 +21296,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -21326,7 +21326,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -21356,7 +21356,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -21390,7 +21390,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -21433,7 +21433,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -21477,7 +21477,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -21508,7 +21508,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -21534,7 +21534,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400
@@ -21565,7 +21565,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -21595,7 +21595,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -21627,7 +21627,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -21660,7 +21660,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -21691,7 +21691,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -21722,7 +21722,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -21754,7 +21754,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -21785,7 +21785,7 @@
             {
               "gpu": "intel-uhd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 14400,
@@ -21814,7 +21814,7 @@
             {
               "gpu": "10de:2184",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -21838,7 +21838,7 @@
             {
               "gpu": "10de:2184",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -21863,7 +21863,7 @@
             {
               "gpu": "10de:2184",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -21887,7 +21887,7 @@
             {
               "gpu": "10de:2184",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -21914,7 +21914,7 @@
             {
               "gpu": "10de:2184",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -21937,7 +21937,7 @@
             {
               "gpu": "10de:2184",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -21960,7 +21960,7 @@
             {
               "gpu": "10de:2184",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -21983,7 +21983,7 @@
             {
               "gpu": "10de:2184",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -22008,7 +22008,7 @@
             {
               "gpu": "10de:2184",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -22034,7 +22034,7 @@
             {
               "gpu": "10de:2184",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -22054,7 +22054,7 @@
             {
               "gpu": "10de:2184",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -22074,7 +22074,7 @@
             {
               "gpu": "10de:2184",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -22098,7 +22098,7 @@
             {
               "gpu": "10de:2184",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -22131,7 +22131,7 @@
             {
               "gpu": "10de:2184",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -22161,7 +22161,7 @@
             {
               "gpu": "10de:2184",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -22191,7 +22191,7 @@
             {
               "gpu": "10de:2184",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -22221,7 +22221,7 @@
             {
               "gpu": "10de:2184",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -22255,7 +22255,7 @@
             {
               "gpu": "10de:2184",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -22298,7 +22298,7 @@
             {
               "gpu": "10de:2184",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -22342,7 +22342,7 @@
             {
               "gpu": "10de:2184",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -22374,7 +22374,7 @@
             {
               "gpu": "10de:2184",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -22404,7 +22404,7 @@
             {
               "gpu": "10de:2184",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -22436,7 +22436,7 @@
             {
               "gpu": "10de:2184",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -22469,7 +22469,7 @@
             {
               "gpu": "10de:2184",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -22500,7 +22500,7 @@
             {
               "gpu": "10de:2184",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -22531,7 +22531,7 @@
             {
               "gpu": "10de:2184",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -22563,7 +22563,7 @@
             {
               "gpu": "10de:2184",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -22594,7 +22594,7 @@
             {
               "gpu": "10de:2184",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -22623,7 +22623,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -22633,7 +22633,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -22655,7 +22655,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -22664,7 +22664,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -22688,7 +22688,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -22697,7 +22697,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -22720,7 +22720,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -22729,7 +22729,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -22755,7 +22755,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -22764,7 +22764,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -22786,7 +22786,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -22795,7 +22795,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -22817,7 +22817,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -22826,7 +22826,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -22848,7 +22848,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -22857,7 +22857,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -22881,7 +22881,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -22890,7 +22890,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -22915,7 +22915,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -22924,7 +22924,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -22943,7 +22943,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -22952,7 +22952,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -22971,7 +22971,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -22980,7 +22980,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -23003,7 +23003,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -23012,7 +23012,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -23042,7 +23042,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -23050,7 +23050,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -23080,7 +23080,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -23088,7 +23088,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -23118,7 +23118,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -23126,7 +23126,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -23156,7 +23156,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -23164,7 +23164,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -23194,7 +23194,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -23202,7 +23202,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -23236,7 +23236,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -23244,7 +23244,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -23287,7 +23287,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -23296,7 +23296,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -23327,7 +23327,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -23335,7 +23335,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -23378,7 +23378,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -23387,7 +23387,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -23413,7 +23413,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -23421,7 +23421,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -23452,7 +23452,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -23460,7 +23460,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -23490,7 +23490,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -23498,7 +23498,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -23530,7 +23530,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -23539,7 +23539,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -23571,7 +23571,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -23580,7 +23580,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -23610,7 +23610,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -23619,7 +23619,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -23649,7 +23649,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -23658,7 +23658,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -23689,7 +23689,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -23698,7 +23698,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -23728,7 +23728,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -23737,7 +23737,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -23769,7 +23769,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -23796,7 +23796,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -23828,7 +23828,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -23857,7 +23857,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -23886,7 +23886,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -23915,7 +23915,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -23957,7 +23957,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -23988,7 +23988,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -24030,7 +24030,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -24072,7 +24072,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -24101,7 +24101,7 @@
             {
               "gpu": "intel-hd-630-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -24131,7 +24131,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -24141,7 +24141,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -24166,7 +24166,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -24176,7 +24176,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -24201,7 +24201,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -24211,7 +24211,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -24236,7 +24236,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -24246,7 +24246,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -24271,7 +24271,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -24281,7 +24281,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -24306,7 +24306,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -24316,7 +24316,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -24341,7 +24341,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 10
@@ -24351,7 +24351,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -24376,7 +24376,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 10
@@ -24386,7 +24386,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -24411,7 +24411,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 10
@@ -24421,7 +24421,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -24446,7 +24446,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 12
@@ -24456,7 +24456,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -24481,7 +24481,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 12
@@ -24491,7 +24491,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -24516,7 +24516,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 12
@@ -24526,7 +24526,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -24551,7 +24551,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -24560,7 +24560,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -24585,7 +24585,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 2
@@ -24595,7 +24595,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -24620,7 +24620,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 2
@@ -24630,7 +24630,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -24658,7 +24658,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 4
@@ -24668,7 +24668,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -24690,7 +24690,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -24699,7 +24699,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -24723,7 +24723,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -24732,7 +24732,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -24755,7 +24755,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -24764,7 +24764,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -24790,7 +24790,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -24799,7 +24799,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -24821,7 +24821,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -24830,7 +24830,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -24852,7 +24852,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -24861,7 +24861,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -24883,7 +24883,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -24892,7 +24892,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -24916,7 +24916,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -24925,7 +24925,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -24950,7 +24950,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -24959,7 +24959,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -24978,7 +24978,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -24987,7 +24987,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -25006,7 +25006,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -25015,7 +25015,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -25038,7 +25038,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -25047,7 +25047,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -25077,7 +25077,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -25085,7 +25085,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -25115,7 +25115,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -25123,7 +25123,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -25153,7 +25153,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -25161,7 +25161,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -25191,7 +25191,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -25199,7 +25199,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -25229,7 +25229,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -25237,7 +25237,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -25271,7 +25271,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -25279,7 +25279,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -25322,7 +25322,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -25331,7 +25331,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -25362,7 +25362,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -25370,7 +25370,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -25413,7 +25413,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -25422,7 +25422,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -25447,7 +25447,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -25455,7 +25455,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -25486,7 +25486,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -25494,7 +25494,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -25524,7 +25524,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -25532,7 +25532,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -25564,7 +25564,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -25573,7 +25573,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -25605,7 +25605,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -25614,7 +25614,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -25644,7 +25644,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -25653,7 +25653,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -25683,7 +25683,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -25692,7 +25692,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -25723,7 +25723,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -25732,7 +25732,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -25762,7 +25762,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -25771,7 +25771,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -25799,7 +25799,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -25825,7 +25825,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -25849,7 +25849,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -25882,7 +25882,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -25914,7 +25914,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -25945,7 +25945,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -25974,7 +25974,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -25998,7 +25998,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -26023,7 +26023,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -26047,7 +26047,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -26070,7 +26070,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -26093,7 +26093,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -26116,7 +26116,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -26141,7 +26141,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -26167,7 +26167,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -26187,7 +26187,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -26207,7 +26207,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -26240,7 +26240,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -26270,7 +26270,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -26300,7 +26300,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -26330,7 +26330,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -26364,7 +26364,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -26407,7 +26407,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -26451,7 +26451,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -26483,7 +26483,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -26513,7 +26513,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -26543,7 +26543,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -26575,7 +26575,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -26604,7 +26604,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -26628,7 +26628,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -26653,7 +26653,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -26677,7 +26677,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -26704,7 +26704,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -26727,7 +26727,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -26750,7 +26750,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -26773,7 +26773,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -26798,7 +26798,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -26824,7 +26824,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -26844,7 +26844,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -26864,7 +26864,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -26897,7 +26897,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -26927,7 +26927,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -26957,7 +26957,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -26987,7 +26987,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -27021,7 +27021,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -27064,7 +27064,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -27108,7 +27108,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -27140,7 +27140,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -27170,7 +27170,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -27202,7 +27202,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -27233,7 +27233,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -27265,7 +27265,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -27296,7 +27296,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -27325,7 +27325,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -27336,7 +27336,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -27358,7 +27358,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -27368,7 +27368,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -27392,7 +27392,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -27402,7 +27402,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -27425,7 +27425,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -27435,7 +27435,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -27461,7 +27461,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -27471,7 +27471,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -27493,7 +27493,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -27503,7 +27503,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -27525,7 +27525,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -27535,7 +27535,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -27557,7 +27557,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -27567,7 +27567,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -27591,7 +27591,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -27601,7 +27601,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -27626,7 +27626,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -27636,7 +27636,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -27655,7 +27655,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -27665,7 +27665,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -27684,7 +27684,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -27694,7 +27694,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -27726,7 +27726,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -27735,7 +27735,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -27765,7 +27765,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -27774,7 +27774,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -27804,7 +27804,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -27813,7 +27813,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -27843,7 +27843,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -27852,7 +27852,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -27886,7 +27886,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -27895,7 +27895,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -27938,7 +27938,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -27948,7 +27948,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -27991,7 +27991,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -28001,7 +28001,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -28032,7 +28032,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -28041,7 +28041,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -28071,7 +28071,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -28080,7 +28080,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -28112,7 +28112,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -28122,7 +28122,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -28152,7 +28152,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -28162,7 +28162,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -28192,7 +28192,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -28202,7 +28202,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -28233,7 +28233,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -28243,7 +28243,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -28273,7 +28273,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -28283,7 +28283,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -28312,7 +28312,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -28339,7 +28339,7 @@
             {
               "gpu": "1002:6613",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -28369,7 +28369,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -28380,7 +28380,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -28402,7 +28402,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -28412,7 +28412,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -28436,7 +28436,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -28446,7 +28446,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -28469,7 +28469,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -28479,7 +28479,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -28505,7 +28505,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -28515,7 +28515,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -28537,7 +28537,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -28547,7 +28547,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -28569,7 +28569,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -28579,7 +28579,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -28601,7 +28601,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -28611,7 +28611,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -28635,7 +28635,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -28645,7 +28645,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -28670,7 +28670,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -28680,7 +28680,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -28699,7 +28699,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -28709,7 +28709,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -28728,7 +28728,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -28738,7 +28738,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -28770,7 +28770,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -28779,7 +28779,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -28809,7 +28809,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -28818,7 +28818,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -28848,7 +28848,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -28857,7 +28857,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -28887,7 +28887,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -28896,7 +28896,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -28930,7 +28930,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -28939,7 +28939,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -28982,7 +28982,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -28992,7 +28992,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -29035,7 +29035,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -29045,7 +29045,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -29076,7 +29076,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -29085,7 +29085,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -29115,7 +29115,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -29124,7 +29124,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -29156,7 +29156,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -29166,7 +29166,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -29196,7 +29196,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -29206,7 +29206,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -29236,7 +29236,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -29246,7 +29246,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -29277,7 +29277,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -29287,7 +29287,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -29317,7 +29317,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -29327,7 +29327,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -29356,7 +29356,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -29367,7 +29367,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -29392,7 +29392,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -29403,7 +29403,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -29428,7 +29428,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -29439,7 +29439,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -29464,7 +29464,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -29475,7 +29475,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -29500,7 +29500,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -29511,7 +29511,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -29536,7 +29536,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -29547,7 +29547,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -29572,7 +29572,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -29583,7 +29583,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -29608,7 +29608,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -29619,7 +29619,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -29644,7 +29644,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -29655,7 +29655,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -29680,7 +29680,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -29691,7 +29691,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -29716,7 +29716,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -29727,7 +29727,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -29752,7 +29752,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -29763,7 +29763,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -29788,7 +29788,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600
@@ -29798,7 +29798,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -29823,7 +29823,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -29834,7 +29834,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -29859,7 +29859,7 @@
             {
               "gpu": "10de:1cb3-24.21.14.1195",
               "os": "Windows-2008ServerR2-SP1",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "expiration": 21600,
@@ -29870,7 +29870,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"10de:1cb3-24.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}, {\"gpu\": \"10de:1cb3-23.21.14.1195\", \"os\": \"Windows-2008ServerR2-SP1\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
diff --git a/testing/buildbot/chromium.gpu.json b/testing/buildbot/chromium.gpu.json
index a383702..f14dc53 100644
--- a/testing/buildbot/chromium.gpu.json
+++ b/testing/buildbot/chromium.gpu.json
@@ -392,7 +392,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -414,7 +414,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -437,7 +437,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -469,7 +469,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -498,7 +498,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -528,7 +528,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -557,7 +557,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -586,7 +586,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -619,7 +619,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -661,7 +661,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -704,7 +704,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -735,7 +735,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -764,7 +764,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -794,7 +794,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -823,7 +823,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -845,7 +845,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -868,7 +868,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -900,7 +900,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -929,7 +929,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -959,7 +959,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -988,7 +988,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -1017,7 +1017,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -1050,7 +1050,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -1092,7 +1092,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -1135,7 +1135,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -1166,7 +1166,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -1195,7 +1195,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -1225,7 +1225,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -2523,7 +2523,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2546,7 +2546,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2569,7 +2569,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2602,7 +2602,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -2632,7 +2632,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -2662,7 +2662,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -2692,7 +2692,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -2726,7 +2726,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -2769,7 +2769,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -2813,7 +2813,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -2845,7 +2845,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -2875,7 +2875,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -2906,7 +2906,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -2935,7 +2935,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2962,7 +2962,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -2985,7 +2985,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3008,7 +3008,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3041,7 +3041,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -3071,7 +3071,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -3101,7 +3101,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -3131,7 +3131,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -3165,7 +3165,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -3208,7 +3208,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -3252,7 +3252,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -3278,7 +3278,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3309,7 +3309,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -3339,7 +3339,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -3370,7 +3370,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -3400,7 +3400,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3428,7 +3428,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3452,7 +3452,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3476,7 +3476,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3510,7 +3510,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -3541,7 +3541,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -3572,7 +3572,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -3603,7 +3603,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -3638,7 +3638,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -3682,7 +3682,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -3727,7 +3727,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -3754,7 +3754,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3786,7 +3786,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -3817,7 +3817,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -3849,7 +3849,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "mac-amd-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -3877,7 +3877,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3903,7 +3903,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3925,7 +3925,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3947,7 +3947,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -3970,7 +3970,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -4002,7 +4002,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -4031,7 +4031,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -4061,7 +4061,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -4090,7 +4090,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -4119,7 +4119,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -4152,7 +4152,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -4194,7 +4194,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -4237,7 +4237,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -4268,7 +4268,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -4297,7 +4297,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -4327,7 +4327,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -4355,7 +4355,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -4364,7 +4364,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -4390,7 +4390,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -4399,7 +4399,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -4421,7 +4421,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -4430,7 +4430,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -4452,7 +4452,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -4461,7 +4461,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -4484,7 +4484,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -4493,7 +4493,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -4525,7 +4525,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -4533,7 +4533,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -4563,7 +4563,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -4571,7 +4571,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -4602,7 +4602,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -4610,7 +4610,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -4640,7 +4640,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -4648,7 +4648,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -4678,7 +4678,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -4686,7 +4686,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -4720,7 +4720,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -4728,7 +4728,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -4771,7 +4771,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -4780,7 +4780,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -4823,7 +4823,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -4832,7 +4832,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -4859,7 +4859,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -4867,7 +4867,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -4898,7 +4898,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -4906,7 +4906,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -4936,7 +4936,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -4944,7 +4944,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -4975,7 +4975,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -4984,7 +4984,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -5013,7 +5013,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -5022,7 +5022,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -5049,7 +5049,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -5058,7 +5058,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -5081,7 +5081,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -5090,7 +5090,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -5113,7 +5113,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -5122,7 +5122,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -5146,7 +5146,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -5155,7 +5155,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -5188,7 +5188,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -5196,7 +5196,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -5227,7 +5227,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -5235,7 +5235,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -5267,7 +5267,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -5275,7 +5275,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -5306,7 +5306,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -5314,7 +5314,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -5345,7 +5345,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -5353,7 +5353,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -5388,7 +5388,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -5396,7 +5396,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -5440,7 +5440,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -5449,7 +5449,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -5493,7 +5493,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -5502,7 +5502,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -5534,7 +5534,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -5542,7 +5542,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -5573,7 +5573,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -5581,7 +5581,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
@@ -5613,7 +5613,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -5622,7 +5622,7 @@
         "trigger_script": {
           "args": [
             "--multiple-trigger-configs",
-            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu\"}]",
+            "[{\"gpu\": \"nvidia-quadro-p400-win10-stable\", \"os\": \"Windows-10\", \"pool\": \"chromium.tests.gpu.template\"}]",
             "--multiple-dimension-script-verbose",
             "True"
           ],
diff --git a/testing/buildbot/chromium.mac.json b/testing/buildbot/chromium.mac.json
index 601dcf29..039af289 100644
--- a/testing/buildbot/chromium.mac.json
+++ b/testing/buildbot/chromium.mac.json
@@ -11422,7 +11422,7 @@
               "gpu": "1002:6821",
               "hidpi": "1",
               "os": "Mac-10.13.6",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "shards": 12
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json
index 104aae7..ab2a988 100644
--- a/testing/buildbot/chromium.memory.json
+++ b/testing/buildbot/chromium.memory.json
@@ -3838,7 +3838,7 @@
             {
               "gpu": "10de:1cb3",
               "os": "Ubuntu",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -5459,7 +5459,7 @@
             {
               "gpu": "10de:1cb3",
               "os": "Ubuntu",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -5482,7 +5482,7 @@
             {
               "gpu": "10de:1cb3",
               "os": "Ubuntu",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
@@ -12215,7 +12215,7 @@
             {
               "gpu": "10de:1cb3",
               "os": "Ubuntu",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ]
         },
diff --git a/testing/buildbot/client.v8.fyi.json b/testing/buildbot/client.v8.fyi.json
index e2ba9fb..2ebd4fc 100644
--- a/testing/buildbot/client.v8.fyi.json
+++ b/testing/buildbot/client.v8.fyi.json
@@ -352,7 +352,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -380,7 +380,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -408,7 +408,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -436,7 +436,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -477,7 +477,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -519,7 +519,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -549,7 +549,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -577,7 +577,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -607,7 +607,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -637,7 +637,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -670,7 +670,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -698,7 +698,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -726,7 +726,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -754,7 +754,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -795,7 +795,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -837,7 +837,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -867,7 +867,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -895,7 +895,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -925,7 +925,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -955,7 +955,7 @@
             {
               "gpu": "nvidia-quadro-p400-ubuntu-stable",
               "os": "linux-nvidia-stable",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -1633,7 +1633,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -1661,7 +1661,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -1689,7 +1689,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -1717,7 +1717,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -1758,7 +1758,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -1800,7 +1800,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -1830,7 +1830,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -1858,7 +1858,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false
@@ -1888,7 +1888,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
@@ -1918,7 +1918,7 @@
             {
               "gpu": "nvidia-quadro-p400-win10-stable",
               "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
+              "pool": "chromium.tests.gpu.template"
             }
           ],
           "idempotent": false,
diff --git a/testing/buildbot/filters/android.emulator.chrome_public_test_apk.filter b/testing/buildbot/filters/android.emulator.chrome_public_test_apk.filter
index 90dfc65..764190b 100644
--- a/testing/buildbot/filters/android.emulator.chrome_public_test_apk.filter
+++ b/testing/buildbot/filters/android.emulator.chrome_public_test_apk.filter
@@ -1,6 +1,7 @@
 # crbug/1036571
 -org.chromium.shape_detection.BarcodeDetectionImplTest.testDetectBarcodeWithHint
 -org.chromium.shape_detection.BarcodeDetectionImplTest.testDetectBarcodeWithoutHint
+-org.chromium.shape_detection.FaceDetectionImplTest.testDetectFacesInProfileWithGmsCore
 -org.chromium.shape_detection.FaceDetectionImplTest.testDetectRotatedFaceWithGmsCore
 -org.chromium.shape_detection.FaceDetectionImplTest.testDetectValidImageWithGmsCore
 -org.chromium.shape_detection.TextDetectionImplTest.testDetectSucceedsOnValidBitmap
@@ -28,3 +29,9 @@
 
 # crbug/1040088
 -org.chromium.chrome.browser.payments.PaymentRequestRetryTest.testRetryWithShippingAddressErrorsAndPayerErrors
+
+# crbug/1036553
+-org.chromium.chrome.browser.translate.TranslateCompactInfoBarTest.testTabMenuDismissedOnOrientationChange
+-org.chromium.chrome.browser.translate.TranslateCompactInfoBarTest.testTranslateCompactInfoBarAppears
+-org.chromium.chrome.browser.translate.TranslateCompactInfoBarTest.testTranslateCompactInfoBarOverflowMenus
+-org.chromium.chrome.browser.translate.TranslateCompactInfoBarTest.testTranslateCompactInfoBarReopenOnTarget
diff --git a/testing/buildbot/filters/android.emulator.content_browsertests.filter b/testing/buildbot/filters/android.emulator.content_browsertests.filter
index 7981578..90207a3d 100644
--- a/testing/buildbot/filters/android.emulator.content_browsertests.filter
+++ b/testing/buildbot/filters/android.emulator.content_browsertests.filter
@@ -1,6 +1,13 @@
+# crbug.com/1054829
+-All/TouchActionBrowserTest.PanXAtYAreaWithTimeout/0
+-All/TouchActionBrowserTest.TouchActionNone/1
+
 # crbug.com/1056878
 -BackForwardCacheBrowserTest.VideoSuspendAndResume
 
+# crbug.com/1058447
+-SitePerProcessBrowserTest.FrameViewportOffsetTestSimple
+
 # crbug.com/1056325
 -WebRtcAudioBrowserTest.EstablishAudioVideoCallAndVerifyLocalMutingWorks
 
diff --git a/testing/buildbot/mixins.pyl b/testing/buildbot/mixins.pyl
index 640f3da4..7d44864 100644
--- a/testing/buildbot/mixins.pyl
+++ b/testing/buildbot/mixins.pyl
@@ -212,7 +212,9 @@
   'gpu_pool': {
     'swarming': {
       'dimensions': {
-        'pool': 'chromium.tests.gpu',
+         # TODO(crbug.com/812428): Remove the ".template" bit once the old pool
+         # has been migrated to using templates.
+        'pool': 'chromium.tests.gpu.template',
       },
     },
   },
@@ -285,7 +287,7 @@
       'dimensions': {
         'gpu': '1002:6613',
         'os': 'Ubuntu',
-        'pool': 'chromium.tests.gpu',
+        'pool': 'chromium.tests.gpu.template',
       },
     },
   },
@@ -294,7 +296,7 @@
       'dimensions': {
         'gpu': '8086:1912',
         'os': 'Ubuntu',
-        'pool': 'chromium.tests.gpu',
+        'pool': 'chromium.tests.gpu.template',
       }
     }
   },
@@ -304,7 +306,7 @@
         # Defined in bot_config.py in internal infradata/config workspace
         'gpu': 'intel-hd-630-ubuntu-stable',
         'os': 'linux-intel-stable',
-        'pool': 'chromium.tests.gpu',
+        'pool': 'chromium.tests.gpu.template',
       }
     }
   },
@@ -314,7 +316,7 @@
       'dimensions': {
         'gpu': '8086:5912-19.0.2',
         'os': 'Ubuntu-19.04',
-        'pool': 'chromium.tests.gpu',
+        'pool': 'chromium.tests.gpu.template',
       },
     },
   },
@@ -324,7 +326,7 @@
         # Defined in bot_config.py in internal infradata/config workspace
         'gpu': 'intel-uhd-630-ubuntu-stable',
         'os': 'Ubuntu-19.04',
-        'pool': 'chromium.tests.gpu',
+        'pool': 'chromium.tests.gpu.template',
       },
       # Same long expiration as win10_intel_uhd_630_stable due to capacity.
       # TODO(https://crbug.com/986939): Remove this when more devices
@@ -338,7 +340,7 @@
         # Defined in bot_config.py in internal infradata/config workspace
         'gpu': 'nvidia-quadro-p400-ubuntu-stable',
         'os': 'linux-nvidia-stable',
-        'pool': 'chromium.tests.gpu',
+        'pool': 'chromium.tests.gpu.template',
       }
     }
   },
@@ -347,7 +349,7 @@
       'dimensions': {
         'gpu': '10de:1cb3-418.56',
         'os': 'Ubuntu-19.04',
-        'pool': 'chromium.tests.gpu',
+        'pool': 'chromium.tests.gpu.template',
       },
     },
   },
@@ -427,7 +429,7 @@
       'dimensions': {
         'gpu': '1002:679e',
         'os': 'Mac-10.12.6',
-        'pool': 'chromium.tests.gpu',
+        'pool': 'chromium.tests.gpu.template',
       },
     },
   },
@@ -437,7 +439,7 @@
         'gpu': '1002:6821',
         'hidpi': '1',
         'os': 'mac-amd-stable',
-        'pool': 'chromium.tests.gpu',
+        'pool': 'chromium.tests.gpu.template',
       },
     },
   },
@@ -448,7 +450,7 @@
         'gpu': '1002:6821',
         'hidpi': '1',
         'os': 'Mac-10.13.6',
-        'pool': 'chromium.tests.gpu',
+        'pool': 'chromium.tests.gpu.template',
       },
     },
   },
@@ -458,7 +460,7 @@
         'gpu': '10de:0fe9',
         'hidpi': '1',
         'os': 'mac-nvidia-stable',
-        'pool': 'chromium.tests.gpu',
+        'pool': 'chromium.tests.gpu.template',
       },
     },
   },
@@ -469,7 +471,7 @@
         'gpu': '10de:0fe9',
         'hidpi': '1',
         'os': 'Mac-10.14.6',
-        'pool': 'chromium.tests.gpu',
+        'pool': 'chromium.tests.gpu.template',
       },
     },
   },
@@ -615,7 +617,7 @@
       'dimensions': {
         'gpu': '1002:699f',
         'os': 'Windows-10',
-        'pool': 'chromium.tests.gpu',
+        'pool': 'chromium.tests.gpu.template',
       },
     },
   },
@@ -626,7 +628,7 @@
   #     'dimensions': {
   #       'gpu': '8086:5912-26.20.100.7323',
   #       'os': 'Windows-10',
-  #       'pool': 'chromium.tests.gpu',
+  #       'pool': 'chromium.tests.gpu.template',
   #     },
   #   },
   # },
@@ -636,7 +638,7 @@
         # Defined in bot_config.py in internal infradata/config workspace
         'gpu': 'intel-hd-630-win10-stable',
         'os': 'Windows-10',
-        'pool': 'chromium.tests.gpu',
+        'pool': 'chromium.tests.gpu.template',
       },
     },
   },
@@ -646,7 +648,7 @@
         # Defined in bot_config.py in internal infradata/config workspace
         'gpu': 'intel-uhd-630-win10-stable',
         'os': 'Windows-10',
-        'pool': 'chromium.tests.gpu',
+        'pool': 'chromium.tests.gpu.template',
       },
       # ~50% of the WebGL2 conformance tests time out with the default
       # 1 hour expiration, but the last shard times out with a 3 hour
@@ -661,7 +663,7 @@
       'dimensions': {
         'gpu': '10de:2184',
         'os': 'Windows-10',
-        'pool': 'chromium.tests.gpu',
+        'pool': 'chromium.tests.gpu.template',
       },
     },
   },
@@ -670,7 +672,7 @@
       'dimensions': {
         'gpu': '10de:1cb3-26.21.14.3102',
         'os': 'Windows-10',
-        'pool': 'chromium.tests.gpu',
+        'pool': 'chromium.tests.gpu.template',
       },
     },
   },
@@ -680,7 +682,7 @@
         # Defined in bot_config.py in internal infradata/config workspace
         'gpu': 'nvidia-quadro-p400-win10-stable',
         'os': 'Windows-10',
-        'pool': 'chromium.tests.gpu',
+        'pool': 'chromium.tests.gpu.template',
       },
     },
   },
@@ -696,7 +698,7 @@
       'dimensions': {
         'gpu': '1002:6613',
         'os': 'Windows-2008ServerR2-SP1',
-        'pool': 'chromium.tests.gpu',
+        'pool': 'chromium.tests.gpu.template',
       },
     },
   },
@@ -705,7 +707,7 @@
       'dimensions': {
         'gpu': '10de:1cb3-24.21.14.1195',
         'os': 'Windows-2008ServerR2-SP1',
-        'pool': 'chromium.tests.gpu',
+        'pool': 'chromium.tests.gpu.template',
       },
     },
   },
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index 41257da..205fb51d 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -522,6 +522,11 @@
       'linux-chromeos-rel': {
         'swarming': {
           'shards': 20,
+          'dimension_sets': [
+            {
+              'kvm': '1',
+            },
+          ],
         },
       },
       'linux-code-coverage': {
@@ -989,7 +994,7 @@
             {
               'gpu': '10de:1cb3',
               'os': 'Ubuntu',
-              'pool': 'chromium.tests.gpu',
+              'pool': 'chromium.tests.gpu.template',
             },
           ],
         },
@@ -1005,7 +1010,7 @@
             {
               'gpu': '10de:1cb3',
               'os': 'Ubuntu',
-              'pool': 'chromium.tests.gpu',
+              'pool': 'chromium.tests.gpu.template',
             },
           ],
         },
@@ -1021,7 +1026,7 @@
             {
               'gpu': '10de:1cb3',
               'os': 'Ubuntu',
-              'pool': 'chromium.tests.gpu',
+              'pool': 'chromium.tests.gpu.template',
             },
           ],
         },
@@ -1063,7 +1068,7 @@
             {
               'gpu': '10de:1cb3',
               'os': 'Ubuntu',
-              'pool': 'chromium.tests.gpu',
+              'pool': 'chromium.tests.gpu.template',
             },
           ],
         },
@@ -1079,7 +1084,7 @@
             {
               'gpu': '10de:1cb3',
               'os': 'Ubuntu',
-              'pool': 'chromium.tests.gpu',
+              'pool': 'chromium.tests.gpu.template',
             },
           ],
         },
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index 113667d..540758e 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -841,7 +841,7 @@
               'device_type': 'kevin',
               # Special pool is needed for the devices since they also run
               # swarmbucket builds.
-              'pool': 'chrome-cros-dut',
+              'pool': 'chrome-cros-dut.template',
             },
           ],
         },
@@ -1710,7 +1710,7 @@
               'device_type': 'kevin',
               # Special pool is needed for the devices since they also run
               # swarmbucket builds.
-              'pool': 'chrome-cros-dut',
+              'pool': 'chrome-cros-dut.template',
             },
           ],
         },
@@ -2004,7 +2004,7 @@
               'gpu': '1002:6821',
               'hidpi': '1',
               'os': 'Mac-10.13.6',
-              'pool': 'chromium.tests.gpu',
+              'pool': 'chromium.tests.gpu.template',
             },
           ],
         },
@@ -3084,7 +3084,7 @@
               'gpu': '1002:6821',
               'hidpi': '1',
               'os': 'mac-amd-stable',
-              'pool': 'chromium.tests.gpu',
+              'pool': 'chromium.tests.gpu.template',
             },
           ],
         },
@@ -3545,7 +3545,7 @@
           {
             'gpu': '10de:1cb3-23.21.14.1195',
             'os': 'Windows-2008ServerR2-SP1',
-            'pool': 'chromium.tests.gpu',
+            'pool': 'chromium.tests.gpu.template',
           },
         ],
       },
@@ -3564,7 +3564,7 @@
           {
             'gpu': '10de:1cb3-23.21.14.1195',
             'os': 'Windows-2008ServerR2-SP1',
-            'pool': 'chromium.tests.gpu',
+            'pool': 'chromium.tests.gpu.template',
           },
         ],
       }
@@ -3936,7 +3936,7 @@
               'gpu': '1002:6821',
               'hidpi': '1',
               'os': 'Mac-10.13.6',
-              'pool': 'chromium.tests.gpu',
+              'pool': 'chromium.tests.gpu.template',
             }
           ],
         },
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index a8c91ac..9c421fec 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -1415,6 +1415,26 @@
             ]
         }
     ],
+    "CompositeCrossOriginIframes": [
+        {
+            "platforms": [
+                "android",
+                "android_webview",
+                "chromeos",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "CompositeCrossOriginIframes"
+                    ]
+                }
+            ]
+        }
+    ],
     "ContentCapture": [
         {
             "platforms": [
@@ -2368,25 +2388,6 @@
             ]
         }
     ],
-    "GpuWatchdogV2": [
-        {
-            "platforms": [
-                "android",
-                "chromeos",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "GpuWatchdogV2"
-                    ]
-                }
-            ]
-        }
-    ],
     "GwpAsanAndroid": [
         {
             "platforms": [
@@ -5157,26 +5158,6 @@
             ]
         }
     ],
-    "StaticHostQuota": [
-        {
-            "platforms": [
-                "android",
-                "android_webview",
-                "chromeos",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "StaticHostQuota"
-                    ]
-                }
-            ]
-        }
-    ],
     "SyncButterWallet": [
         {
             "platforms": [
diff --git a/third_party/android_deps/BUILD.gn b/third_party/android_deps/BUILD.gn
index e29f0f97..1a74be34 100644
--- a/third_party/android_deps/BUILD.gn
+++ b/third_party/android_deps/BUILD.gn
@@ -346,14 +346,6 @@
   input_jars_paths = [ "${target_out_dir}/com_android_support_support_vector_drawable_java_orig/classes.jar" ]
 }
 
-java_group("com_android_support_swiperefreshlayout_java") {
-  deps = [
-    ":${target_name}_orig__unpack_aar",
-    ":androidx_swiperefreshlayout_swiperefreshlayout_java",
-  ]
-  input_jars_paths = [ "${target_out_dir}/com_android_support_swiperefreshlayout_java_orig/classes.jar" ]
-}
-
 java_group("com_android_support_transition_java") {
   deps = [
     ":${target_name}_orig__unpack_aar",
diff --git a/third_party/android_protoc/.gitignore b/third_party/android_protoc/.gitignore
new file mode 100644
index 0000000..7a132693
--- /dev/null
+++ b/third_party/android_protoc/.gitignore
@@ -0,0 +1 @@
+protoc
diff --git a/third_party/android_protoc/LICENSE b/third_party/android_protoc/LICENSE
new file mode 100644
index 0000000..19b305b0
--- /dev/null
+++ b/third_party/android_protoc/LICENSE
@@ -0,0 +1,32 @@
+Copyright 2008 Google Inc.  All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+    * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Code generated by the Protocol Buffer compiler is owned by the owner
+of the input file used when generating it.  This code is not
+standalone and requires a support library to be linked with it.  This
+support library is itself covered by the above license.
diff --git a/third_party/android_protoc/OWNERS b/third_party/android_protoc/OWNERS
new file mode 100644
index 0000000..07b6b541
--- /dev/null
+++ b/third_party/android_protoc/OWNERS
@@ -0,0 +1,2 @@
+agrieve@chromium.org
+mheikal@chromium.org
diff --git a/third_party/android_protoc/README.chromium b/third_party/android_protoc/README.chromium
new file mode 100644
index 0000000..e3de1a0
--- /dev/null
+++ b/third_party/android_protoc/README.chromium
@@ -0,0 +1,25 @@
+Name: Protocol Buffers - Google's data interchange format
+Short Name: protobuf
+URL: https://github.com/protocolbuffers/protobuf/releases/download/v3.11.4/protoc-3.11.4-linux-x86_64.zip
+Version: 3.11.4
+License: BSD
+License File: NOT_SHIPPED
+Security Critical: no
+
+Description:
+protobuf library's protoc compiler (prebuilt release). This is used by the
+chrome android gn targets to compile javalite protobufs (i.e. those which use
+the javalite runtime). The runtime lives in
+//third_party/android_deps/libs/com_google_protobuf_protobuf_javalite.
+
+This package exists to decouple the protoc version that compiles java protos
+from the protoc that compiles c++ protos since the runtimes are already
+decoupled and the runtimes should be in lockstep with the compiler.
+
+This package is not to be confused with //third_party/android_protobuf which is
+the nano runtime, //third_party/protoc_javalite which is a now deprecated code
+gen plugin for older versions of protoc, or //third_party/protobuf which
+contains the protoc used to compile c++ protos and contains the c++ runtime.
+
+Local Modifications:
+None.
diff --git a/third_party/android_protoc/cipd.yaml b/third_party/android_protoc/cipd.yaml
new file mode 100644
index 0000000..a44577b04
--- /dev/null
+++ b/third_party/android_protoc/cipd.yaml
@@ -0,0 +1,4 @@
+package: chromium/third_party/android_protoc
+description: Protobuf's protoc compiler prebuilt.
+data:
+  - file: protoc
diff --git a/third_party/blink/common/feature_policy/document_policy.cc b/third_party/blink/common/feature_policy/document_policy.cc
index a472449..96ae844 100644
--- a/third_party/blink/common/feature_policy/document_policy.cc
+++ b/third_party/blink/common/feature_policy/document_policy.cc
@@ -13,11 +13,12 @@
 
 // static
 std::unique_ptr<DocumentPolicy> DocumentPolicy::CreateWithHeaderPolicy(
-    const FeatureState& header_policy) {
+    const FeatureState& header_policy,
+    const FeatureEndpointMap& endpoint_map) {
   DocumentPolicy::FeatureState feature_defaults;
   for (const auto& entry : GetDocumentPolicyFeatureInfoMap())
     feature_defaults.emplace(entry.first, entry.second.default_value);
-  return CreateWithHeaderPolicy(header_policy, feature_defaults);
+  return CreateWithHeaderPolicy(header_policy, endpoint_map, feature_defaults);
 }
 
 namespace {
@@ -135,6 +136,19 @@
   return internal_feature_state_[static_cast<size_t>(feature)];
 }
 
+const std::string DocumentPolicy::GetFeatureEndpoint(
+    mojom::DocumentPolicyFeature feature) const {
+  if (endpoint_map_.find(feature) != endpoint_map_.end()) {
+    return endpoint_map_.at(feature);
+  } else {
+    // TODO(crbug.com/993790): Until the parsing of endpoint information
+    // in DocumentPolicyParser is implemented, use default endpoint as temporary
+    // solution to match existing feature policy behavior.
+    // Report to default endpoint if unspecified.
+    return "default";
+  }
+}
+
 bool DocumentPolicy::IsFeatureSupported(
     mojom::DocumentPolicyFeature feature) const {
   // TODO(iclelland): Generate this switch block
@@ -154,17 +168,23 @@
   }
 }
 
-DocumentPolicy::DocumentPolicy(const FeatureState& defaults) {
+DocumentPolicy::DocumentPolicy(const FeatureState& header_policy,
+                               const FeatureEndpointMap& endpoint_map,
+                               const DocumentPolicy::FeatureState& defaults)
+    : endpoint_map_(endpoint_map) {
+  // Fill the internal feature state with default value first,
+  // and overwrite the value if it is specified in the header.
   UpdateFeatureState(defaults);
+  UpdateFeatureState(header_policy);
 }
 
 // static
 std::unique_ptr<DocumentPolicy> DocumentPolicy::CreateWithHeaderPolicy(
     const FeatureState& header_policy,
+    const FeatureEndpointMap& endpoint_map,
     const DocumentPolicy::FeatureState& defaults) {
-  std::unique_ptr<DocumentPolicy> new_policy =
-      base::WrapUnique(new DocumentPolicy(defaults));
-  new_policy->UpdateFeatureState(header_policy);
+  std::unique_ptr<DocumentPolicy> new_policy = base::WrapUnique(
+      new DocumentPolicy(header_policy, endpoint_map, defaults));
   return new_policy;
 }
 
diff --git a/third_party/blink/common/feature_policy/feature_policy.cc b/third_party/blink/common/feature_policy/feature_policy.cc
index 9a7b956b..a123b77c 100644
--- a/third_party/blink/common/feature_policy/feature_policy.cc
+++ b/third_party/blink/common/feature_policy/feature_policy.cc
@@ -507,9 +507,6 @@
        {mojom::FeaturePolicyFeature::kFocusWithoutUserActivation,
         FeatureDefaultValue(FeaturePolicy::FeatureDefault::EnableForAll,
                             mojom::PolicyValueType::kBool)},
-       {mojom::FeaturePolicyFeature::kFontDisplay,
-        FeatureDefaultValue(FeaturePolicy::FeatureDefault::EnableForAll,
-                            mojom::PolicyValueType::kBool)},
        {mojom::FeaturePolicyFeature::kFormSubmission,
         FeatureDefaultValue(FeaturePolicy::FeatureDefault::EnableForAll,
                             mojom::PolicyValueType::kBool)},
diff --git a/third_party/blink/public/common/feature_policy/document_policy.h b/third_party/blink/public/common/feature_policy/document_policy.h
index 257f24a..adf1ce0 100644
--- a/third_party/blink/public/common/feature_policy/document_policy.h
+++ b/third_party/blink/public/common/feature_policy/document_policy.h
@@ -5,7 +5,6 @@
 #ifndef THIRD_PARTY_BLINK_PUBLIC_COMMON_FEATURE_POLICY_DOCUMENT_POLICY_H_
 #define THIRD_PARTY_BLINK_PUBLIC_COMMON_FEATURE_POLICY_DOCUMENT_POLICY_H_
 
-#include <limits>
 #include <memory>
 
 #include "base/containers/flat_map.h"
@@ -66,8 +65,14 @@
   using FeatureState =
       base::flat_map<mojom::DocumentPolicyFeature, PolicyValue>;
 
+  // Mapping of feature to endpoint group.
+  // https://w3c.github.io/reporting/#endpoint-group
+  using FeatureEndpointMap =
+      base::flat_map<mojom::DocumentPolicyFeature, std::string>;
+
   static std::unique_ptr<DocumentPolicy> CreateWithHeaderPolicy(
-      const FeatureState& header_policy);
+      const FeatureState& header_policy,
+      const FeatureEndpointMap& endpoint_map = {});
 
   // Returns true if the feature is unrestricted (has its default value for the
   // platform)
@@ -86,6 +91,10 @@
   // Returns the value of the given feature on the given origin.
   PolicyValue GetFeatureValue(mojom::DocumentPolicyFeature feature) const;
 
+  // Returns the endpoint the given feature should report to.
+  const std::string GetFeatureEndpoint(
+      mojom::DocumentPolicyFeature feature) const;
+
   // Returns true if the incoming policy is compatible with the given required
   // policy, i.e. incoming policy is at least as strict as required policy.
   static bool IsPolicyCompatible(const FeatureState& required_policy,
@@ -104,9 +113,12 @@
  private:
   friend class DocumentPolicyTest;
 
-  DocumentPolicy(const FeatureState& feature_list);
+  DocumentPolicy(const FeatureState& header_policy,
+                 const FeatureEndpointMap& endpoint_map,
+                 const FeatureState& defaults);
   static std::unique_ptr<DocumentPolicy> CreateWithHeaderPolicy(
       const FeatureState& header_policy,
+      const FeatureEndpointMap& endpoint_map,
       const FeatureState& defaults);
 
   void UpdateFeatureState(const FeatureState& feature_state);
@@ -116,6 +128,8 @@
   PolicyValue internal_feature_state_
       [static_cast<size_t>(mojom::DocumentPolicyFeature::kMaxValue) + 1];
 
+  FeatureEndpointMap endpoint_map_;
+
   DISALLOW_COPY_AND_ASSIGN(DocumentPolicy);
 };
 
diff --git a/third_party/blink/public/mojom/feature_policy/feature_policy_feature.mojom b/third_party/blink/public/mojom/feature_policy/feature_policy_feature.mojom
index 4849222..e88d525 100644
--- a/third_party/blink/public/mojom/feature_policy/feature_policy_feature.mojom
+++ b/third_party/blink/public/mojom/feature_policy/feature_policy_feature.mojom
@@ -72,8 +72,6 @@
   kLayoutAnimations = 30,
   // Controls access to WakeLock
   kWakeLock = 31,
-  // Controls access to font-display attribute in @font-face CSS rule
-  kFontDisplay = 32,
 
   // These are the defined sandbox features implemented as policy-controlled
   // features.
diff --git a/third_party/blink/public/mojom/reporting/reporting.mojom b/third_party/blink/public/mojom/reporting/reporting.mojom
index 1390f90..44d4314 100644
--- a/third_party/blink/public/mojom/reporting/reporting.mojom
+++ b/third_party/blink/public/mojom/reporting/reporting.mojom
@@ -56,5 +56,15 @@
                                     string? source_file,
                                     int32 line_number,
                                     int32 column_number);
-
+  // Attempts to queue a Document Policy violation report using the Reporting API.
+  //
+  // (See //third_party/blink/renderer/core/frame/document_policy_violation_report_body.h.)
+  QueueDocumentPolicyViolationReport(url.mojom.Url url,
+                                     string group,
+                                     string policy_id,
+                                     string disposition,
+                                     string? message,
+                                     string? source_file,
+                                     int32 line_number,
+                                     int32 column_number);
 };
diff --git a/third_party/blink/renderer/build/scripts/template_expander.py b/third_party/blink/renderer/build/scripts/template_expander.py
index ccc43a4..6e23970 100644
--- a/third_party/blink/renderer/build/scripts/template_expander.py
+++ b/third_party/blink/renderer/build/scripts/template_expander.py
@@ -73,7 +73,7 @@
                 tests=tests,
                 template_cache=template_cache)
 
-        generator_internal.func_name = generator.func_name
+        generator_internal.__name__ = generator.__name__
         return generator_internal
 
     return real_decorator
diff --git a/third_party/blink/renderer/core/animation/keyframe_effect.cc b/third_party/blink/renderer/core/animation/keyframe_effect.cc
index 3326b59e..9dee8a62 100644
--- a/third_party/blink/renderer/core/animation/keyframe_effect.cc
+++ b/third_party/blink/renderer/core/animation/keyframe_effect.cc
@@ -117,6 +117,7 @@
   if (!pseudo.IsEmpty()) {
     effect->target_pseudo_ = pseudo;
     if (element) {
+      element->GetDocument().UpdateStyleAndLayoutTreeForNode(element);
       effect->effect_target_ =
           element->GetPseudoElement(CSSSelector::ParsePseudoId(pseudo));
     }
@@ -200,6 +201,8 @@
   } else if (target_pseudo_.IsEmpty()) {
     new_target = target_element_;
   } else {
+    target_element_->GetDocument().UpdateStyleAndLayoutTreeForNode(
+        target_element_);
     PseudoId pseudoId = CSSSelector::ParsePseudoId(target_pseudo_);
     new_target = target_element_->GetPseudoElement(pseudoId);
   }
diff --git a/third_party/blink/renderer/core/core_idl_files.gni b/third_party/blink/renderer/core/core_idl_files.gni
index 19dcb07..2e21438c 100644
--- a/third_party/blink/renderer/core/core_idl_files.gni
+++ b/third_party/blink/renderer/core/core_idl_files.gni
@@ -186,6 +186,7 @@
                     "frame/bar_prop.idl",
                     "frame/csp/csp_violation_report_body.idl",
                     "frame/deprecation_report_body.idl",
+                    "frame/document_policy_violation_report_body.idl",
                     "frame/external.idl",
                     "frame/feature_policy_violation_report_body.idl",
                     "frame/fragment_directive.idl",
diff --git a/third_party/blink/renderer/core/css/remote_font_face_source.cc b/third_party/blink/renderer/core/css/remote_font_face_source.cc
index 8c57988f..6a1ea49 100644
--- a/third_party/blink/renderer/core/css/remote_font_face_source.cc
+++ b/third_party/blink/renderer/core/css/remote_font_face_source.cc
@@ -205,12 +205,12 @@
 FontDisplay RemoteFontFaceSource::GetFontDisplayWithFeaturePolicyCheck(
     FontDisplay display,
     const FontSelector* font_selector,
-    ReportOptions report) const {
+    ReportOptions report_option) const {
   ExecutionContext* context = font_selector->GetExecutionContext();
   if (display != kFontDisplayFallback && display != kFontDisplayOptional &&
       context && context->IsDocument() &&
-      !Document::From(context)->IsFeatureEnabled(
-          mojom::blink::FeaturePolicyFeature::kFontDisplay, report)) {
+      !context->IsFeatureEnabled(
+          mojom::blink::DocumentPolicyFeature::kFontDisplay, report_option)) {
     return kFontDisplayOptional;
   }
   return display;
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver.cc b/third_party/blink/renderer/core/css/resolver/style_resolver.cc
index 7293a782..ab48452 100644
--- a/third_party/blink/renderer/core/css/resolver/style_resolver.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_resolver.cc
@@ -849,10 +849,10 @@
     // contenteditable attribute (implemented by -webkit-user-modify) should
     // be propagated from shadow host to distributed node.
     if (state.DistributedToV0InsertionPoint() || element.AssignedSlot()) {
-      Element* parent = element.parentElement();
-      DCHECK(parent);
-      if (const ComputedStyle* shadow_host_style = parent->GetComputedStyle())
-        state.Style()->SetUserModify(shadow_host_style->UserModify());
+      if (Element* parent = element.parentElement()) {
+        if (const ComputedStyle* shadow_host_style = parent->GetComputedStyle())
+          state.Style()->SetUserModify(shadow_host_style->UserModify());
+      }
     }
   } else {
     state.SetStyle(InitialStyleForElement(GetDocument()));
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver_test.cc b/third_party/blink/renderer/core/css/resolver/style_resolver_test.cc
index 1dcaf8ba..dd4e8b5 100644
--- a/third_party/blink/renderer/core/css/resolver/style_resolver_test.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_resolver_test.cc
@@ -9,6 +9,7 @@
 #include "third_party/blink/renderer/core/css/style_engine.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/node_computed_style.h"
+#include "third_party/blink/renderer/core/dom/shadow_root.h"
 #include "third_party/blink/renderer/core/dom/text.h"
 #include "third_party/blink/renderer/core/testing/page_test_base.h"
 
@@ -67,4 +68,23 @@
   EXPECT_EQ(20, resolver->StyleForElement(div)->FontSize());
 }
 
+TEST_F(StyleResolverTest, ShadowDOMV0Crash) {
+  GetDocument().documentElement()->SetInnerHTMLFromString(R"HTML(
+    <style>
+      span { display: contents; }
+    </style>
+    <summary><span id="outer"><span id="inner"></b></b></summary>
+  )HTML");
+
+  Element* outer = GetDocument().getElementById("outer");
+  Element* inner = GetDocument().getElementById("inner");
+  ShadowRoot& outer_root = outer->CreateV0ShadowRootForTesting();
+  ShadowRoot& inner_root = inner->CreateV0ShadowRootForTesting();
+  outer_root.SetInnerHTMLFromString("<content>");
+  inner_root.SetInnerHTMLFromString("<span>");
+
+  // Test passes if it doesn't crash.
+  UpdateAllLifecyclePhasesForTest();
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
index d926830e8..7271c54a 100644
--- a/third_party/blink/renderer/core/dom/document.cc
+++ b/third_party/blink/renderer/core/dom/document.cc
@@ -50,6 +50,7 @@
 #include "services/network/public/mojom/ip_address_space.mojom-blink.h"
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
 #include "third_party/blink/public/common/browser_interface_broker_proxy.h"
+#include "third_party/blink/public/common/feature_policy/document_policy_features.h"
 #include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h"
 #include "third_party/blink/public/mojom/feature_policy/feature_policy.mojom-blink.h"
@@ -1057,6 +1058,23 @@
       feature, threshold_value, report_on_failure, message, source_file);
 }
 
+bool Document::IsFeatureEnabled(mojom::blink::DocumentPolicyFeature feature,
+                                ReportOptions report_option,
+                                const String& message,
+                                const String& source_file) {
+  return ExecutionContext::IsFeatureEnabled(feature, report_option, message,
+                                            source_file);
+}
+
+bool Document::IsFeatureEnabled(mojom::blink::DocumentPolicyFeature feature,
+                                PolicyValue threshold_value,
+                                ReportOptions report_option,
+                                const String& message,
+                                const String& source_file) {
+  return ExecutionContext::IsFeatureEnabled(
+      feature, threshold_value, report_option, message, source_file);
+}
+
 String Document::addressSpaceForBindings() const {
   return ExecutionContext::addressSpaceForBindings();
 }
diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h
index 08abc4f2..768838d 100644
--- a/third_party/blink/renderer/core/dom/document.h
+++ b/third_party/blink/renderer/core/dom/document.h
@@ -385,6 +385,18 @@
       ReportOptions report_on_failure = ReportOptions::kDoNotReport,
       const String& message = g_empty_string,
       const String& source_file = g_empty_string) const;
+  bool IsFeatureEnabled(
+      mojom::blink::DocumentPolicyFeature,
+      ReportOptions report_option = ReportOptions::kDoNotReport,
+      const String& message = g_empty_string,
+      const String& source_file = g_empty_string);
+  bool IsFeatureEnabled(
+      mojom::blink::DocumentPolicyFeature,
+      PolicyValue threshold_value,
+      ReportOptions report_option = ReportOptions::kDoNotReport,
+      const String& message = g_empty_string,
+      const String& source_file = g_empty_string);
+
   String addressSpaceForBindings() const;
 
   bool CanContainRangeEndPoint() const override { return true; }
diff --git a/third_party/blink/renderer/core/dom/document_init.cc b/third_party/blink/renderer/core/dom/document_init.cc
index 85e7d2b..f2e0ca5 100644
--- a/third_party/blink/renderer/core/dom/document_init.cc
+++ b/third_party/blink/renderer/core/dom/document_init.cc
@@ -415,6 +415,13 @@
   return *this;
 }
 
+DocumentInit& DocumentInit::WithReportOnlyDocumentPolicyHeader(
+    const String& header) {
+  DCHECK(report_only_document_policy_header_.IsEmpty());
+  report_only_document_policy_header_ = header;
+  return *this;
+}
+
 bool IsPagePopupRunningInWebTest(LocalFrame* frame) {
   return frame && frame->GetPage()->GetChromeClient().IsPopup() &&
          WebTestSupport::IsRunningWebTest();
diff --git a/third_party/blink/renderer/core/dom/document_init.h b/third_party/blink/renderer/core/dom/document_init.h
index c5aa0ee..d476cf2 100644
--- a/third_party/blink/renderer/core/dom/document_init.h
+++ b/third_party/blink/renderer/core/dom/document_init.h
@@ -180,6 +180,11 @@
     return document_policy_;
   }
 
+  DocumentInit& WithReportOnlyDocumentPolicyHeader(const String& header);
+  const String& ReportOnlyDocumentPolicyHeader() const {
+    return report_only_document_policy_header_;
+  }
+
   WindowAgentFactory* GetWindowAgentFactory() const;
   Settings* GetSettingsForWindowAgentFactory() const;
 
@@ -259,7 +264,9 @@
   // The frame policy snapshot from the beginning of navigation.
   base::Optional<FramePolicy> frame_policy_ = base::nullopt;
 
+  // The document policy set via response header.
   DocumentPolicy::FeatureState document_policy_;
+  String report_only_document_policy_header_;
 
   bool is_for_external_handler_ = false;
   Color plugin_background_color_;
diff --git a/third_party/blink/renderer/core/execution_context/execution_context.cc b/third_party/blink/renderer/core/execution_context/execution_context.cc
index 5cadb4c..c903aac8 100644
--- a/third_party/blink/renderer/core/execution_context/execution_context.cc
+++ b/third_party/blink/renderer/core/execution_context/execution_context.cc
@@ -40,6 +40,9 @@
 #include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_state_observer.h"
 #include "third_party/blink/renderer/core/fileapi/public_url_manager.h"
 #include "third_party/blink/renderer/core/frame/csp/execution_context_csp_delegate.h"
+#include "third_party/blink/renderer/core/frame/document_policy_violation_report_body.h"
+#include "third_party/blink/renderer/core/frame/report.h"
+#include "third_party/blink/renderer/core/frame/reporting_context.h"
 #include "third_party/blink/renderer/core/inspector/console_message.h"
 #include "third_party/blink/renderer/core/origin_trials/origin_trial_context.h"
 #include "third_party/blink/renderer/core/probe/core_probes.h"
@@ -443,29 +446,81 @@
                 : mojom::blink::FeaturePolicyDisposition::kEnforce;
     ReportFeaturePolicyViolation(feature, disposition, message, source_file);
   }
-
   return enabled;
 }
 
 bool ExecutionContext::IsFeatureEnabled(
-    mojom::blink::DocumentPolicyFeature feature) const {
-  // The default value for any feature should be true unless restricted by
-  // document policy
-  if (!RuntimeEnabledFeatures::DocumentPolicyEnabled(this))
-    return true;
-  PolicyValue threshold_value = PolicyValue::CreateMaxPolicyValue(
-      GetDocumentPolicyFeatureInfoMap().at(feature).default_value.Type());
-  return IsFeatureEnabled(feature, threshold_value);
+    mojom::blink::DocumentPolicyFeature feature,
+    ReportOptions report_option,
+    const String& message,
+    const String& source_file) {
+  DCHECK(GetDocumentPolicyFeatureInfoMap().at(feature).default_value.Type() ==
+         mojom::blink::PolicyValueType::kBool);
+  return IsFeatureEnabled(feature, PolicyValue(true), report_option, message,
+                          source_file);
 }
 
 bool ExecutionContext::IsFeatureEnabled(
     mojom::blink::DocumentPolicyFeature feature,
-    PolicyValue threshold_value) const {
+    PolicyValue threshold_value,
+    ReportOptions report_option,
+    const String& message,
+    const String& source_file) {
   // The default value for any feature should be true unless restricted by
   // document policy
   if (!RuntimeEnabledFeatures::DocumentPolicyEnabled(this))
     return true;
-  return GetSecurityContext().IsFeatureEnabled(feature, threshold_value);
+
+  SecurityContext::FeatureStatus status =
+      GetSecurityContext().IsFeatureEnabled(feature, threshold_value);
+  if (status.should_report &&
+      report_option == ReportOptions::kReportOnFailure) {
+    // If both |enabled| and |should_report| are true, the usage must have
+    // violated the report-only policy, i.e. |is_report_only| == |enabled|.
+    ReportDocumentPolicyViolation(feature, status.enabled /* is_report_only */,
+                                  message, source_file);
+  }
+  return status.enabled;
+}
+
+void ExecutionContext::ReportDocumentPolicyViolation(
+    mojom::blink::DocumentPolicyFeature feature,
+    bool is_report_only,
+    const String& message,
+    const String& source_file) {
+  // Construct the document policy violation report.
+  const String& feature_name =
+      GetDocumentPolicyFeatureInfoMap().at(feature).feature_name.c_str();
+  const String& disp_str = is_report_only ? "report" : "enforce";
+  const DocumentPolicy* relevant_document_policy =
+      is_report_only ? GetSecurityContext().GetReportOnlyDocumentPolicy()
+                     : GetSecurityContext().GetDocumentPolicy();
+
+  DocumentPolicyViolationReportBody* body =
+      source_file.IsEmpty()
+          ? MakeGarbageCollected<DocumentPolicyViolationReportBody>(
+                feature_name, "Document policy violation", disp_str)
+          : MakeGarbageCollected<DocumentPolicyViolationReportBody>(
+                feature_name, "Document policy violation", disp_str,
+                source_file);
+
+  Report* report = MakeGarbageCollected<Report>(
+      ReportType::kDocumentPolicyViolation, Url().GetString(), body);
+
+  // Send the feature policy violation report to any ReportingObservers.
+  auto* reporting_context = ReportingContext::From(this);
+  reporting_context->QueueReport(
+      report, {relevant_document_policy->GetFeatureEndpoint(feature).c_str()});
+
+  // TODO(iclelland): Report something different in report-only mode
+  if (!is_report_only) {
+    AddConsoleMessage(MakeGarbageCollected<ConsoleMessage>(
+        mojom::blink::ConsoleMessageSource::kViolation,
+        mojom::blink::ConsoleMessageLevel::kError,
+        (message.IsEmpty() ? ("Document policy violation: " + feature_name +
+                              " is not allowed in this document.")
+                           : message)));
+  }
 }
 
 bool ExecutionContext::RequireTrustedTypes() const {
diff --git a/third_party/blink/renderer/core/execution_context/execution_context.h b/third_party/blink/renderer/core/execution_context/execution_context.h
index 932d365..c475c8a8 100644
--- a/third_party/blink/renderer/core/execution_context/execution_context.h
+++ b/third_party/blink/renderer/core/execution_context/execution_context.h
@@ -315,9 +315,17 @@
       ReportOptions report_on_failure = ReportOptions::kDoNotReport,
       const String& message = g_empty_string,
       const String& source_file = g_empty_string) const;
-  bool IsFeatureEnabled(mojom::blink::DocumentPolicyFeature) const;
-  bool IsFeatureEnabled(mojom::blink::DocumentPolicyFeature,
-                        PolicyValue threshold_value) const;
+  bool IsFeatureEnabled(
+      mojom::blink::DocumentPolicyFeature,
+      ReportOptions report_option = ReportOptions::kDoNotReport,
+      const String& message = g_empty_string,
+      const String& source_file = g_empty_string);
+  bool IsFeatureEnabled(
+      mojom::blink::DocumentPolicyFeature,
+      PolicyValue threshold_value,
+      ReportOptions report_option = ReportOptions::kDoNotReport,
+      const String& message = g_empty_string,
+      const String& source_file = g_empty_string);
 
   virtual void CountPotentialFeaturePolicyViolation(
       mojom::blink::FeaturePolicyFeature) const {}
@@ -354,6 +362,12 @@
   void FeaturePolicyPotentialBehaviourChangeObserved(
       mojom::blink::FeaturePolicyFeature feature) const;
 
+  void ReportDocumentPolicyViolation(
+      mojom::blink::DocumentPolicyFeature,
+      bool is_report_only,
+      const String& message = g_empty_string,
+      const String& source_file = g_empty_string);
+
   v8::Isolate* const isolate_;
 
   bool DispatchErrorEventInternal(ErrorEvent*, SanitizeScriptErrors);
diff --git a/third_party/blink/renderer/core/execution_context/security_context.cc b/third_party/blink/renderer/core/execution_context/security_context.cc
index a4d58d4d..b5f7ed3 100644
--- a/third_party/blink/renderer/core/execution_context/security_context.cc
+++ b/third_party/blink/renderer/core/execution_context/security_context.cc
@@ -63,6 +63,7 @@
       feature_policy_(init.CreateFeaturePolicy()),
       report_only_feature_policy_(init.CreateReportOnlyFeaturePolicy()),
       document_policy_(init.CreateDocumentPolicy()),
+      report_only_document_policy_(init.CreateReportOnlyDocumentPolicy()),
       content_security_policy_(init.GetCSP()),
       address_space_(network::mojom::IPAddressSpace::kUnknown),
       insecure_request_policy_(
@@ -170,17 +171,21 @@
 
 bool SecurityContext::IsFeatureEnabled(
     mojom::blink::DocumentPolicyFeature feature) const {
-  return IsFeatureEnabled(
-      feature,
-      PolicyValue::CreateMaxPolicyValue(
-          GetDocumentPolicyFeatureInfoMap().at(feature).default_value.Type()));
+  DCHECK(GetDocumentPolicyFeatureInfoMap().at(feature).default_value.Type() ==
+         mojom::blink::PolicyValueType::kBool);
+  return IsFeatureEnabled(feature, PolicyValue(true)).enabled;
 }
 
-bool SecurityContext::IsFeatureEnabled(
+SecurityContext::FeatureStatus SecurityContext::IsFeatureEnabled(
     mojom::blink::DocumentPolicyFeature feature,
     PolicyValue threshold_value) const {
   DCHECK(document_policy_);
-  return document_policy_->IsFeatureEnabled(feature, threshold_value);
+  bool policy_result =
+      document_policy_->IsFeatureEnabled(feature, threshold_value);
+  bool report_only_policy_result =
+      !report_only_document_policy_ ||
+      report_only_document_policy_->IsFeatureEnabled(feature, threshold_value);
+  return {policy_result, !policy_result || !report_only_policy_result};
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/execution_context/security_context.h b/third_party/blink/renderer/core/execution_context/security_context.h
index c0a5349f..2a12264 100644
--- a/third_party/blink/renderer/core/execution_context/security_context.h
+++ b/third_party/blink/renderer/core/execution_context/security_context.h
@@ -157,6 +157,11 @@
   const DocumentPolicy* GetDocumentPolicy() const {
     return document_policy_.get();
   }
+
+  const DocumentPolicy* GetReportOnlyDocumentPolicy() const {
+    return report_only_document_policy_.get();
+  }
+
   void SetDocumentPolicyForTesting(
       std::unique_ptr<DocumentPolicy> document_policy);
 
@@ -170,8 +175,12 @@
                         bool* should_report = nullptr) const;
 
   bool IsFeatureEnabled(mojom::blink::DocumentPolicyFeature) const;
-  bool IsFeatureEnabled(mojom::blink::DocumentPolicyFeature,
-                        PolicyValue threshold_value) const;
+  struct FeatureStatus {
+    bool enabled;       /* Whether the feature is enabled. */
+    bool should_report; /* Whether a report should be sent. */
+  };
+  FeatureStatus IsFeatureEnabled(mojom::blink::DocumentPolicyFeature,
+                                 PolicyValue threshold_value) const;
 
   Agent* GetAgent() const { return agent_; }
 
@@ -194,6 +203,7 @@
   std::unique_ptr<FeaturePolicy> feature_policy_;
   std::unique_ptr<FeaturePolicy> report_only_feature_policy_;
   std::unique_ptr<DocumentPolicy> document_policy_;
+  std::unique_ptr<DocumentPolicy> report_only_document_policy_;
 
  private:
   Member<ContentSecurityPolicy> content_security_policy_;
diff --git a/third_party/blink/renderer/core/execution_context/security_context_init.cc b/third_party/blink/renderer/core/execution_context/security_context_init.cc
index 307b27f..3cd9752 100644
--- a/third_party/blink/renderer/core/execution_context/security_context_init.cc
+++ b/third_party/blink/renderer/core/execution_context/security_context_init.cc
@@ -9,6 +9,7 @@
 #include "third_party/blink/renderer/core/dom/element.h"
 #include "third_party/blink/renderer/core/execution_context/window_agent.h"
 #include "third_party/blink/renderer/core/execution_context/window_agent_factory.h"
+#include "third_party/blink/renderer/core/feature_policy/document_policy_parser.h"
 #include "third_party/blink/renderer/core/feature_policy/feature_policy_parser.h"
 #include "third_party/blink/renderer/core/frame/csp/content_security_policy.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
@@ -286,6 +287,17 @@
       document_policy_.insert(entry);
     }
   }
+
+  base::Optional<DocumentPolicy::FeatureState>
+      report_only_document_policy_header = DocumentPolicyParser::Parse(
+          initializer.ReportOnlyDocumentPolicyHeader());
+  if (report_only_document_policy_header) {
+    for (const auto& entry : *report_only_document_policy_header) {
+      if (!DisabledByOriginTrial(entry.first, this)) {
+        report_only_document_policy_.insert(entry);
+      }
+    }
+  }
 }
 
 void SecurityContextInit::InitializeFeaturePolicy(
@@ -404,6 +416,14 @@
   return DocumentPolicy::CreateWithHeaderPolicy(document_policy_);
 }
 
+std::unique_ptr<DocumentPolicy>
+SecurityContextInit::CreateReportOnlyDocumentPolicy() const {
+  return report_only_document_policy_.empty()
+             ? nullptr
+             : DocumentPolicy::CreateWithHeaderPolicy(
+                   report_only_document_policy_);
+}
+
 void SecurityContextInit::InitializeSecureContextMode(
     const DocumentInit& initializer) {
   auto* frame = initializer.GetFrame();
diff --git a/third_party/blink/renderer/core/execution_context/security_context_init.h b/third_party/blink/renderer/core/execution_context/security_context_init.h
index 0e9007e..5022ac89 100644
--- a/third_party/blink/renderer/core/execution_context/security_context_init.h
+++ b/third_party/blink/renderer/core/execution_context/security_context_init.h
@@ -54,6 +54,7 @@
   std::unique_ptr<FeaturePolicy> CreateReportOnlyFeaturePolicy() const;
 
   std::unique_ptr<DocumentPolicy> CreateDocumentPolicy() const;
+  std::unique_ptr<DocumentPolicy> CreateReportOnlyDocumentPolicy() const;
 
   const ParsedFeaturePolicy& FeaturePolicyHeader() const {
     return feature_policy_header_;
@@ -93,6 +94,7 @@
   mojom::blink::WebSandboxFlags sandbox_flags_ =
       mojom::blink::WebSandboxFlags::kNone;
   DocumentPolicy::FeatureState document_policy_;
+  DocumentPolicy::FeatureState report_only_document_policy_;
   bool initialized_feature_policy_state_ = false;
   Vector<String> feature_policy_parse_messages_;
   Vector<String> report_only_feature_policy_parse_messages_;
diff --git a/third_party/blink/renderer/core/feature_policy/feature_policy.dict b/third_party/blink/renderer/core/feature_policy/feature_policy.dict
index 3e9db3b..43ebe11 100644
--- a/third_party/blink/renderer/core/feature_policy/feature_policy.dict
+++ b/third_party/blink/renderer/core/feature_policy/feature_policy.dict
@@ -9,7 +9,6 @@
 "document-domain"
 "document-write"
 "encrypted-media"
-"font-display-late-swap"
 "forms"
 "fullscreen"
 "geolocation"
diff --git a/third_party/blink/renderer/core/feature_policy/feature_policy_features.json5 b/third_party/blink/renderer/core/feature_policy/feature_policy_features.json5
index 54c4975..9c35128 100644
--- a/third_party/blink/renderer/core/feature_policy/feature_policy_features.json5
+++ b/third_party/blink/renderer/core/feature_policy/feature_policy_features.json5
@@ -142,11 +142,6 @@
       depends_on: ["BlockingFocusWithoutUserActivation"],
     },
     {
-      name: "FontDisplay",
-      feature_policy_name: "font-display-late-swap",
-      depends_on: ["ExperimentalProductivityFeatures"],
-    },
-    {
       name: "FormSubmission",
       feature_policy_name: "forms",
       depends_on: ["FeaturePolicyForSandbox"],
diff --git a/third_party/blink/renderer/core/frame/BUILD.gn b/third_party/blink/renderer/core/frame/BUILD.gn
index 70df8c3a..ff8838d5 100644
--- a/third_party/blink/renderer/core/frame/BUILD.gn
+++ b/third_party/blink/renderer/core/frame/BUILD.gn
@@ -45,6 +45,8 @@
     "device_single_window_event_controller.h",
     "display_cutout_client_impl.cc",
     "display_cutout_client_impl.h",
+    "document_policy_violation_report_body.cc",
+    "document_policy_violation_report_body.h",
     "dom_timer.cc",
     "dom_timer.h",
     "dom_timer_coordinator.cc",
diff --git a/third_party/blink/renderer/core/frame/document_policy_violation_report_body.cc b/third_party/blink/renderer/core/frame/document_policy_violation_report_body.cc
new file mode 100644
index 0000000..0c7de40e
--- /dev/null
+++ b/third_party/blink/renderer/core/frame/document_policy_violation_report_body.cc
@@ -0,0 +1,17 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "third_party/blink/renderer/core/frame/document_policy_violation_report_body.h"
+
+namespace blink {
+
+void DocumentPolicyViolationReportBody::BuildJSONValue(
+    V8ObjectBuilder& builder) const {
+  LocationReportBody::BuildJSONValue(builder);
+  builder.AddString("featureId", featureId());
+  builder.AddString("disposition", disposition());
+  builder.AddStringOrNull("message", message());
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/core/frame/document_policy_violation_report_body.h b/third_party/blink/renderer/core/frame/document_policy_violation_report_body.h
new file mode 100644
index 0000000..d3d2be1
--- /dev/null
+++ b/third_party/blink/renderer/core/frame/document_policy_violation_report_body.h
@@ -0,0 +1,50 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_DOCUMENT_POLICY_VIOLATION_REPORT_BODY_H_
+#define THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_DOCUMENT_POLICY_VIOLATION_REPORT_BODY_H_
+
+#include "third_party/blink/renderer/bindings/core/v8/source_location.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_object_builder.h"
+#include "third_party/blink/renderer/core/frame/location_report_body.h"
+
+namespace blink {
+
+class CORE_EXPORT DocumentPolicyViolationReportBody
+    : public LocationReportBody {
+  DEFINE_WRAPPERTYPEINFO();
+
+ public:
+  DocumentPolicyViolationReportBody(const String& feature_id,
+                                    const String& message,
+                                    const String& disposition)
+      : feature_id_(feature_id), message_(message), disposition_(disposition) {}
+
+  DocumentPolicyViolationReportBody(
+      const String& feature_id,
+      const String& message,
+      const String& disposition,
+      // URL of the resource that violated the document policy.
+      const String& resource_url)
+      : LocationReportBody(resource_url),
+        feature_id_(feature_id),
+        message_(message),
+        disposition_(disposition) {}
+
+  String featureId() const { return feature_id_; }
+  String disposition() const { return disposition_; }
+  String message() const { return message_; }
+  void BuildJSONValue(V8ObjectBuilder& builder) const override;
+
+  ~DocumentPolicyViolationReportBody() override = default;
+
+ private:
+  const String feature_id_;
+  const String message_;
+  const String disposition_;
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_DOCUMENT_POLICY_VIOLATION_REPORT_BODY_H_
diff --git a/third_party/blink/renderer/core/frame/document_policy_violation_report_body.idl b/third_party/blink/renderer/core/frame/document_policy_violation_report_body.idl
new file mode 100644
index 0000000..6b7d310
--- /dev/null
+++ b/third_party/blink/renderer/core/frame/document_policy_violation_report_body.idl
@@ -0,0 +1,17 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// https://w3c.github.io/webappsec-feature-policy/document-policy.html#reporting
+
+[
+    NoInterfaceObject
+] interface DocumentPolicyViolationReportBody : ReportBody {
+  readonly attribute DOMString featureId;
+  readonly attribute DOMString? sourceFile;
+  readonly attribute unsigned long? lineNumber;
+  readonly attribute unsigned long? columnNumber;
+  readonly attribute DOMString disposition;
+  readonly attribute DOMString? message;
+  [CallWith=ScriptState] object toJSON();
+};
diff --git a/third_party/blink/renderer/core/frame/report.cc b/third_party/blink/renderer/core/frame/report.cc
index 46d331d..10c53d8 100644
--- a/third_party/blink/renderer/core/frame/report.cc
+++ b/third_party/blink/renderer/core/frame/report.cc
@@ -8,6 +8,7 @@
 
 constexpr const char ReportType::kDeprecation[];
 constexpr const char ReportType::kFeaturePolicyViolation[];
+constexpr const char ReportType::kDocumentPolicyViolation[];
 constexpr const char ReportType::kIntervention[];
 constexpr const char ReportType::kCSPViolation[];
 
diff --git a/third_party/blink/renderer/core/frame/report.h b/third_party/blink/renderer/core/frame/report.h
index e18a86b..27ca7ab2 100644
--- a/third_party/blink/renderer/core/frame/report.h
+++ b/third_party/blink/renderer/core/frame/report.h
@@ -17,6 +17,8 @@
   static constexpr const char kDeprecation[] = "deprecation";
   static constexpr const char kFeaturePolicyViolation[] =
       "feature-policy-violation";
+  static constexpr const char kDocumentPolicyViolation[] =
+      "document-policy-violation";
   static constexpr const char kIntervention[] = "intervention";
   static constexpr const char kCSPViolation[] = "csp-violation";
 };
diff --git a/third_party/blink/renderer/core/frame/reporting_context.cc b/third_party/blink/renderer/core/frame/reporting_context.cc
index 942a137..fbbc1b1 100644
--- a/third_party/blink/renderer/core/frame/reporting_context.cc
+++ b/third_party/blink/renderer/core/frame/reporting_context.cc
@@ -11,6 +11,7 @@
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/core/frame/csp/csp_violation_report_body.h"
 #include "third_party/blink/renderer/core/frame/deprecation_report_body.h"
+#include "third_party/blink/renderer/core/frame/document_policy_violation_report_body.h"
 #include "third_party/blink/renderer/core/frame/feature_policy_violation_report_body.h"
 #include "third_party/blink/renderer/core/frame/intervention_report_body.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
@@ -123,7 +124,8 @@
   const String& type = report->type();
   if (!(type == ReportType::kCSPViolation || type == ReportType::kDeprecation ||
         type == ReportType::kFeaturePolicyViolation ||
-        type == ReportType::kIntervention)) {
+        type == ReportType::kIntervention ||
+        type == ReportType::kDocumentPolicyViolation)) {
     return;
   }
 
@@ -171,6 +173,14 @@
     GetReportingService()->QueueInterventionReport(
         url, body->id(), body->message(), body->sourceFile(), line_number,
         column_number);
+  } else if (type == ReportType::kDocumentPolicyViolation) {
+    const DocumentPolicyViolationReportBody* body =
+        static_cast<DocumentPolicyViolationReportBody*>(report->body());
+    // Send the document policy violation report.
+    GetReportingService()->QueueDocumentPolicyViolationReport(
+        url, endpoint, body->featureId(), body->disposition(),
+        "Document policy violation", body->sourceFile(), line_number,
+        column_number);
   }
 }
 
diff --git a/third_party/blink/renderer/core/frame/reporting_context_test.cc b/third_party/blink/renderer/core/frame/reporting_context_test.cc
index 721c7670..4b72123 100644
--- a/third_party/blink/renderer/core/frame/reporting_context_test.cc
+++ b/third_party/blink/renderer/core/frame/reporting_context_test.cc
@@ -101,6 +101,18 @@
       std::move(reached_callback_).Run();
   }
 
+  void QueueDocumentPolicyViolationReport(const KURL& url,
+                                          const String& endpoint,
+                                          const String& policy_id,
+                                          const String& disposition,
+                                          const String& message,
+                                          const String& source_file,
+                                          int32_t line_number,
+                                          int32_t column_number) override {
+    if (reached_callback_)
+      std::move(reached_callback_).Run();
+  }
+
   ThreadSafeBrowserInterfaceBrokerProxy& broker_;
   mojo::ReceiverSet<ReportingServiceProxy> receivers_;
   base::OnceClosure reached_callback_;
diff --git a/third_party/blink/renderer/core/layout/layout_object.h b/third_party/blink/renderer/core/layout/layout_object.h
index e71b666..48a5cf39 100644
--- a/third_party/blink/renderer/core/layout/layout_object.h
+++ b/third_party/blink/renderer/core/layout/layout_object.h
@@ -2279,7 +2279,13 @@
       }
     }
     void SetShouldCheckForPaintInvalidation() {
-      layout_object_.SetShouldCheckForPaintInvalidation();
+      // This method is only intended to be called when visiting this object
+      // during pre-paint, and as such it should only mark itself, and not the
+      // entire containing block chain.
+      DCHECK_EQ(layout_object_.GetDocument().Lifecycle().GetState(),
+                DocumentLifecycle::kInPrePaint);
+      layout_object_.bitfields_.SetNeedsPaintOffsetAndVisualRectUpdate(true);
+      layout_object_.bitfields_.SetShouldCheckForPaintInvalidation(true);
     }
     void SetShouldDoFullPaintInvalidation(PaintInvalidationReason reason) {
       layout_object_.SetShouldDoFullPaintInvalidation(reason);
diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc
index 68d1755aa..15143c8 100644
--- a/third_party/blink/renderer/core/loader/document_loader.cc
+++ b/third_party/blink/renderer/core/loader/document_loader.cc
@@ -1502,6 +1502,15 @@
           .WithReportOnlyFeaturePolicyHeader(
               response_.HttpHeaderField(http_names::kFeaturePolicyReportOnly))
           .WithDocumentPolicy(document_policy_)
+          // |document_policy_| is parsed in document loader because it is
+          // compared with |frame_policy.required_document_policy| to decide
+          // whether to block the document load or not.
+          // |report_only_document_policy| does not block the page load. Its
+          // initialization is delayed to
+          // SecurityContextInit::InitializeDocumentPolicy(), similar to
+          // |report_only_feature_policy|.
+          .WithReportOnlyDocumentPolicyHeader(
+              response_.HttpHeaderField(http_names::kDocumentPolicyReportOnly))
           .WithOriginTrialsHeader(
               response_.HttpHeaderField(http_names::kOriginTrial))
           .WithContentSecurityPolicy(content_security_policy_.Get());
diff --git a/third_party/blink/renderer/core/paint/fragment_data.h b/third_party/blink/renderer/core/paint/fragment_data.h
index c0b43ea2..9ae6c02 100644
--- a/third_party/blink/renderer/core/paint/fragment_data.h
+++ b/third_party/blink/renderer/core/paint/fragment_data.h
@@ -100,15 +100,16 @@
       EnsureRareData().logical_top_in_flow_thread = top;
   }
 
-  // The pagination offset is the additional factor to add in to map
-  // from flow thread coordinates relative to the enclosing pagination
-  // layer, to visual coordiantes relative to that pagination layer.
-  PhysicalOffset PaginationOffset() const {
-    return rare_data_ ? rare_data_->pagination_offset : PhysicalOffset();
+  // The pagination offset is the additional factor to add in to map from flow
+  // thread coordinates relative to the enclosing pagination layer, to visual
+  // coordinates relative to that pagination layer. Not to be used in LayoutNG
+  // fragment painting.
+  PhysicalOffset LegacyPaginationOffset() const {
+    return rare_data_ ? rare_data_->legacy_pagination_offset : PhysicalOffset();
   }
-  void SetPaginationOffset(const PhysicalOffset& pagination_offset) {
+  void SetLegacyPaginationOffset(const PhysicalOffset& pagination_offset) {
     if (rare_data_ || pagination_offset != PhysicalOffset())
-      EnsureRareData().pagination_offset = pagination_offset;
+      EnsureRareData().legacy_pagination_offset = pagination_offset;
   }
 
   bool IsClipPathCacheValid() const {
@@ -256,7 +257,7 @@
     IntRect partial_invalidation_visual_rect;
 
     // Fragment specific data.
-    PhysicalOffset pagination_offset;
+    PhysicalOffset legacy_pagination_offset;
     LayoutUnit logical_top_in_flow_thread;
     std::unique_ptr<ObjectPaintProperties> paint_properties;
     std::unique_ptr<RefCountedPropertyTreeState> local_border_box_properties;
diff --git a/third_party/blink/renderer/core/paint/paint_layer.cc b/third_party/blink/renderer/core/paint/paint_layer.cc
index 4ab46f3..7d795732 100644
--- a/third_party/blink/renderer/core/paint/paint_layer.cc
+++ b/third_party/blink/renderer/core/paint/paint_layer.cc
@@ -2347,7 +2347,7 @@
     PaintLayer* hit_layer = HitTestLayerByApplyingTransform(
         root_layer, container_layer, result, recursion_data, transform_state,
         z_offset, check_resizer_only,
-        fragment.fragment_data->PaginationOffset());
+        fragment.fragment_data->LegacyPaginationOffset());
     if (hit_layer)
       return hit_layer;
   }
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
index 0b08ee51..207d512 100644
--- a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
+++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
@@ -2219,7 +2219,7 @@
     PhysicalOffset paint_offset =
         PaintOffsetInPaginationContainer(object_, *enclosing_pagination_layer);
 
-    paint_offset += fragment_data_.PaginationOffset();
+    paint_offset += fragment_data_.LegacyPaginationOffset();
     paint_offset += context_.repeating_paint_offset_adjustment;
     paint_offset +=
         VisualOffsetFromPaintOffsetRoot(context_, enclosing_pagination_layer);
@@ -2529,7 +2529,7 @@
         PaintPropertyTreeBuilderContext::kSubtreeUpdateIsolationBlocked;
     fragment.ClearPaintProperties();
   }
-  fragment.SetPaginationOffset(pagination_offset);
+  fragment.SetLegacyPaginationOffset(pagination_offset);
   fragment.SetLogicalTopInFlowThread(logical_top_in_flow_thread);
 }
 
@@ -2625,7 +2625,7 @@
         BoundingBoxInPaginationContainer(object_, *enclosing_pagination_layer)
             .ToLayoutRect());
     if (!iterator.AtEnd()) {
-      first_fragment.SetPaginationOffset(
+      first_fragment.SetLegacyPaginationOffset(
           PhysicalOffsetToBeNoop(iterator.PaginationOffset()));
       first_fragment.SetLogicalTopInFlowThread(
           iterator.FragmentainerLogicalTopInFlowThread());
@@ -2634,7 +2634,7 @@
     // All objects under the composited layer use the same pagination offset.
     const auto& fragment =
         parent_composited_layer->GetLayoutObject().FirstFragment();
-    first_fragment.SetPaginationOffset(fragment.PaginationOffset());
+    first_fragment.SetLegacyPaginationOffset(fragment.LegacyPaginationOffset());
     first_fragment.SetLogicalTopInFlowThread(fragment.LogicalTopInFlowThread());
   }
 }
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc b/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc
index 6e3abc22..f05eb83 100644
--- a/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc
+++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc
@@ -4108,11 +4108,12 @@
   EXPECT_EQ(4u, NumFragments(flowthread));
 
   EXPECT_EQ(PhysicalOffset(), FragmentAt(relpos, 0).PaintOffset());
-  EXPECT_EQ(PhysicalOffset(), FragmentAt(relpos, 0).PaginationOffset());
+  EXPECT_EQ(PhysicalOffset(), FragmentAt(relpos, 0).LegacyPaginationOffset());
   EXPECT_EQ(LayoutUnit(), FragmentAt(relpos, 0).LogicalTopInFlowThread());
   EXPECT_EQ(nullptr, FragmentAt(relpos, 0).PaintProperties());
   EXPECT_EQ(PhysicalOffset(), FragmentAt(flowthread, 0).PaintOffset());
-  EXPECT_EQ(PhysicalOffset(), FragmentAt(flowthread, 0).PaginationOffset());
+  EXPECT_EQ(PhysicalOffset(),
+            FragmentAt(flowthread, 0).LegacyPaginationOffset());
   EXPECT_EQ(LayoutUnit(), FragmentAt(flowthread, 0).LogicalTopInFlowThread());
   const auto* fragment_clip =
       FragmentAt(flowthread, 0).PaintProperties()->FragmentClip();
@@ -4123,12 +4124,13 @@
             &FragmentAt(relpos, 0).LocalBorderBoxProperties().Clip());
 
   EXPECT_EQ(PhysicalOffset(100, -30), FragmentAt(relpos, 1).PaintOffset());
-  EXPECT_EQ(PhysicalOffset(100, -30), FragmentAt(relpos, 1).PaginationOffset());
+  EXPECT_EQ(PhysicalOffset(100, -30),
+            FragmentAt(relpos, 1).LegacyPaginationOffset());
   EXPECT_EQ(LayoutUnit(30), FragmentAt(relpos, 1).LogicalTopInFlowThread());
   EXPECT_EQ(nullptr, FragmentAt(relpos, 1).PaintProperties());
   EXPECT_EQ(PhysicalOffset(100, -30), FragmentAt(flowthread, 1).PaintOffset());
   EXPECT_EQ(PhysicalOffset(100, -30),
-            FragmentAt(flowthread, 1).PaginationOffset());
+            FragmentAt(flowthread, 1).LegacyPaginationOffset());
   EXPECT_EQ(LayoutUnit(30), FragmentAt(flowthread, 1).LogicalTopInFlowThread());
   fragment_clip = FragmentAt(flowthread, 1).PaintProperties()->FragmentClip();
   ASSERT_NE(nullptr, fragment_clip);
@@ -4138,12 +4140,13 @@
             &FragmentAt(relpos, 1).LocalBorderBoxProperties().Clip());
 
   EXPECT_EQ(PhysicalOffset(0, 20), FragmentAt(relpos, 2).PaintOffset());
-  EXPECT_EQ(PhysicalOffset(0, 20), FragmentAt(relpos, 2).PaginationOffset());
+  EXPECT_EQ(PhysicalOffset(0, 20),
+            FragmentAt(relpos, 2).LegacyPaginationOffset());
   EXPECT_EQ(LayoutUnit(60), FragmentAt(relpos, 2).LogicalTopInFlowThread());
   EXPECT_EQ(nullptr, FragmentAt(relpos, 2).PaintProperties());
   EXPECT_EQ(PhysicalOffset(0, 20), FragmentAt(flowthread, 2).PaintOffset());
   EXPECT_EQ(PhysicalOffset(0, 20),
-            FragmentAt(flowthread, 2).PaginationOffset());
+            FragmentAt(flowthread, 2).LegacyPaginationOffset());
   EXPECT_EQ(LayoutUnit(60), FragmentAt(flowthread, 2).LogicalTopInFlowThread());
   fragment_clip = FragmentAt(flowthread, 2).PaintProperties()->FragmentClip();
   ASSERT_NE(nullptr, fragment_clip);
@@ -4153,12 +4156,13 @@
             &FragmentAt(relpos, 2).LocalBorderBoxProperties().Clip());
 
   EXPECT_EQ(PhysicalOffset(100, -10), FragmentAt(relpos, 3).PaintOffset());
-  EXPECT_EQ(PhysicalOffset(100, -10), FragmentAt(relpos, 3).PaginationOffset());
+  EXPECT_EQ(PhysicalOffset(100, -10),
+            FragmentAt(relpos, 3).LegacyPaginationOffset());
   EXPECT_EQ(LayoutUnit(90), FragmentAt(relpos, 3).LogicalTopInFlowThread());
   EXPECT_EQ(nullptr, FragmentAt(relpos, 3).PaintProperties());
   EXPECT_EQ(PhysicalOffset(100, -10), FragmentAt(flowthread, 3).PaintOffset());
   EXPECT_EQ(PhysicalOffset(100, -10),
-            FragmentAt(flowthread, 3).PaginationOffset());
+            FragmentAt(flowthread, 3).LegacyPaginationOffset());
   EXPECT_EQ(LayoutUnit(90), FragmentAt(flowthread, 3).LogicalTopInFlowThread());
   fragment_clip = FragmentAt(flowthread, 3).PaintProperties()->FragmentClip();
   ASSERT_NE(nullptr, fragment_clip);
@@ -4237,20 +4241,21 @@
   EXPECT_TRUE(thread->IsLayoutFlowThread());
   EXPECT_EQ(2u, NumFragments(thread));
   EXPECT_EQ(PhysicalOffset(100, 0), FragmentAt(thread, 0).PaintOffset());
-  EXPECT_EQ(PhysicalOffset(), FragmentAt(thread, 0).PaginationOffset());
+  EXPECT_EQ(PhysicalOffset(), FragmentAt(thread, 0).LegacyPaginationOffset());
   EXPECT_EQ(LayoutUnit(), FragmentAt(thread, 0).LogicalTopInFlowThread());
   EXPECT_EQ(PhysicalOffset(300, 100), FragmentAt(thread, 1).PaintOffset());
-  EXPECT_EQ(PhysicalOffset(200, 100), FragmentAt(thread, 1).PaginationOffset());
+  EXPECT_EQ(PhysicalOffset(200, 100),
+            FragmentAt(thread, 1).LegacyPaginationOffset());
   EXPECT_EQ(LayoutUnit(200), FragmentAt(thread, 1).LogicalTopInFlowThread());
 
   LayoutObject* content = GetLayoutObjectByElementId("content");
   EXPECT_EQ(2u, NumFragments(content));
   EXPECT_EQ(PhysicalOffset(-200, 0), FragmentAt(content, 0).PaintOffset());
-  EXPECT_EQ(PhysicalOffset(), FragmentAt(content, 0).PaginationOffset());
+  EXPECT_EQ(PhysicalOffset(), FragmentAt(content, 0).LegacyPaginationOffset());
   EXPECT_EQ(LayoutUnit(), FragmentAt(content, 0).LogicalTopInFlowThread());
   EXPECT_EQ(PhysicalOffset(0, 100), FragmentAt(content, 1).PaintOffset());
   EXPECT_EQ(PhysicalOffset(200, 100),
-            FragmentAt(content, 1).PaginationOffset());
+            FragmentAt(content, 1).LegacyPaginationOffset());
   EXPECT_EQ(LayoutUnit(200), FragmentAt(content, 1).LogicalTopInFlowThread());
 }
 
@@ -4290,15 +4295,15 @@
   EXPECT_TRUE(thread->IsLayoutFlowThread());
   EXPECT_EQ(3u, NumFragments(thread));
   EXPECT_EQ(PhysicalOffset(), FragmentAt(thread, 0).PaintOffset());
-  EXPECT_EQ(PhysicalOffset(), FragmentAt(thread, 0).PaginationOffset());
+  EXPECT_EQ(PhysicalOffset(), FragmentAt(thread, 0).LegacyPaginationOffset());
   EXPECT_EQ(LayoutUnit(), FragmentAt(thread, 0).LogicalTopInFlowThread());
   EXPECT_EQ(PhysicalOffset(100, -200), FragmentAt(thread, 1).PaintOffset());
   EXPECT_EQ(PhysicalOffset(100, -200),
-            FragmentAt(thread, 1).PaginationOffset());
+            FragmentAt(thread, 1).LegacyPaginationOffset());
   EXPECT_EQ(LayoutUnit(200), FragmentAt(thread, 1).LogicalTopInFlowThread());
   EXPECT_EQ(PhysicalOffset(200, -400), FragmentAt(thread, 2).PaintOffset());
   EXPECT_EQ(PhysicalOffset(200, -400),
-            FragmentAt(thread, 2).PaginationOffset());
+            FragmentAt(thread, 2).LegacyPaginationOffset());
   EXPECT_EQ(LayoutUnit(400), FragmentAt(thread, 2).LogicalTopInFlowThread());
 
   LayoutObject* composited = GetLayoutObjectByElementId("composited");
@@ -4312,33 +4317,33 @@
     EXPECT_EQ(PhysicalOffset(100, 100),
               FragmentAt(composited, 0).PaintOffset());
     EXPECT_EQ(PhysicalOffset(100, -200),
-              FragmentAt(composited, 0).PaginationOffset());
+              FragmentAt(composited, 0).LegacyPaginationOffset());
     EXPECT_EQ(LayoutUnit(200),
               FragmentAt(composited, 0).LogicalTopInFlowThread());
     EXPECT_EQ(PhysicalOffset(200, -100),
               FragmentAt(composited, 1).PaintOffset());
     EXPECT_EQ(PhysicalOffset(200, -400),
-              FragmentAt(composited, 1).PaginationOffset());
+              FragmentAt(composited, 1).LegacyPaginationOffset());
     EXPECT_EQ(LayoutUnit(400),
               FragmentAt(composited, 1).LogicalTopInFlowThread());
     EXPECT_EQ(2u, NumFragments(non_composited_child));
     EXPECT_EQ(PhysicalOffset(100, 100),
               FragmentAt(non_composited_child, 0).PaintOffset());
     EXPECT_EQ(PhysicalOffset(100, -200),
-              FragmentAt(non_composited_child, 0).PaginationOffset());
+              FragmentAt(non_composited_child, 0).LegacyPaginationOffset());
     EXPECT_EQ(LayoutUnit(200),
               FragmentAt(non_composited_child, 0).LogicalTopInFlowThread());
     EXPECT_EQ(PhysicalOffset(200, -100),
               FragmentAt(non_composited_child, 1).PaintOffset());
     EXPECT_EQ(PhysicalOffset(200, -400),
-              FragmentAt(non_composited_child, 1).PaginationOffset());
+              FragmentAt(non_composited_child, 1).LegacyPaginationOffset());
     EXPECT_EQ(LayoutUnit(400),
               FragmentAt(non_composited_child, 1).LogicalTopInFlowThread());
     EXPECT_EQ(1u, NumFragments(composited_child));
     EXPECT_EQ(PhysicalOffset(200, 50),
               FragmentAt(composited_child, 0).PaintOffset());
     EXPECT_EQ(PhysicalOffset(200, -400),
-              FragmentAt(composited_child, 0).PaginationOffset());
+              FragmentAt(composited_child, 0).LegacyPaginationOffset());
     EXPECT_EQ(LayoutUnit(400),
               FragmentAt(composited_child, 0).LogicalTopInFlowThread());
   } else {
@@ -4347,21 +4352,21 @@
     EXPECT_EQ(PhysicalOffset(100, 100),
               FragmentAt(composited, 0).PaintOffset());
     EXPECT_EQ(PhysicalOffset(100, -200),
-              FragmentAt(composited, 0).PaginationOffset());
+              FragmentAt(composited, 0).LegacyPaginationOffset());
     EXPECT_EQ(LayoutUnit(200),
               FragmentAt(composited, 0).LogicalTopInFlowThread());
     EXPECT_EQ(1u, NumFragments(non_composited_child));
     EXPECT_EQ(PhysicalOffset(100, 100),
               FragmentAt(non_composited_child, 0).PaintOffset());
     EXPECT_EQ(PhysicalOffset(100, -200),
-              FragmentAt(non_composited_child, 0).PaginationOffset());
+              FragmentAt(non_composited_child, 0).LegacyPaginationOffset());
     EXPECT_EQ(LayoutUnit(200),
               FragmentAt(non_composited_child, 0).LogicalTopInFlowThread());
     EXPECT_EQ(1u, NumFragments(composited_child));
     EXPECT_EQ(PhysicalOffset(100, 250),
               FragmentAt(composited_child, 0).PaintOffset());
     EXPECT_EQ(PhysicalOffset(100, -200),
-              FragmentAt(composited_child, 0).PaginationOffset());
+              FragmentAt(composited_child, 0).LegacyPaginationOffset());
     EXPECT_EQ(LayoutUnit(200),
               FragmentAt(composited_child, 0).LogicalTopInFlowThread());
   }
@@ -4443,8 +4448,9 @@
   // TODO(crbug.com/797779): Add code to verify fragments under the iframe.
 }
 
-TEST_P(PaintPropertyTreeBuilderTest,
-       BecomingUnfragmentedClearsPaginationOffsetAndLogicalTopInFlowThread) {
+TEST_P(
+    PaintPropertyTreeBuilderTest,
+    BecomingUnfragmentedClearsLegacyPaginationOffsetAndLogicalTopInFlowThread) {
   SetBodyInnerHTML(R"HTML(
     <style>
       #target {
@@ -4460,13 +4466,13 @@
 
   LayoutObject* target = GetLayoutObjectByElementId("target");
   EXPECT_EQ(PhysicalOffset(LayoutUnit(392.5f), LayoutUnit(-20)),
-            target->FirstFragment().PaginationOffset());
+            target->FirstFragment().LegacyPaginationOffset());
   EXPECT_EQ(LayoutUnit(20), target->FirstFragment().LogicalTopInFlowThread());
   Element* target_element = GetDocument().getElementById("target");
 
   target_element->setAttribute(html_names::kStyleAttr, "position: absolute");
   UpdateAllLifecyclePhasesForTest();
-  EXPECT_EQ(PhysicalOffset(), target->FirstFragment().PaginationOffset());
+  EXPECT_EQ(PhysicalOffset(), target->FirstFragment().LegacyPaginationOffset());
   EXPECT_EQ(LayoutUnit(), target->FirstFragment().LogicalTopInFlowThread());
 }
 
diff --git a/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc b/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc
index 3f2530d..ce8f86a 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc
@@ -2464,47 +2464,29 @@
   if (Traversal<HTMLTableColElement>::FirstChild(*table_element))
     return true;
 
-  // Everything from here forward uses cell style info, but only if a CSS table.
-  // If this code is reached for a <table> with another display type, consider
-  // this to be a layout table.
-  // TODO(accessibility) consider rewriting the following cell inspection code
-  // using purely DOM methods, such as table->rows()->Item(index)->cells().
-  if (!layout_object_->IsTable())
+  // If there are at least 20 rows, we'll call it a data table.
+  HTMLTableRowsCollection* rows = table_element->rows();
+  int num_rows = rows->length();
+  if (num_rows >= 20)
+    return true;
+  if (num_rows <= 0)
     return false;
 
-  // If there's no node, it's definitely a layout table. This happens
-  // when table CSS styles are used without a complete table DOM structure.
-  LayoutNGTableInterface* table =
-      ToInterface<LayoutNGTableInterface>(layout_object_);
-  table->RecalcSectionsIfNeeded();
-  Node* table_node = layout_object_->GetNode();
-  if (!table_node)
-    return false;
-
-  // go through the cell's and check for tell-tale signs of "data" table status
-  // cells have borders, or use attributes like headers, abbr, scope or axis
-  table->RecalcSectionsIfNeeded();
-  LayoutNGTableSectionInterface* first_body = table->FirstBodyInterface();
-  if (!first_body)
-    return false;
-
-  int num_cols_in_first_body = first_body->NumEffectiveColumns();
-  int num_rows = first_body->NumRows();
+  int num_cols_in_first_body = rows->Item(0)->cells()->length();
   // If there's only one cell, it's not a good AXTable candidate.
   if (num_rows == 1 && num_cols_in_first_body == 1)
     return false;
 
-  // If there are at least 20 rows, we'll call it a data table.
-  if (num_rows >= 20)
-    return true;
-
   // Store the background color of the table to check against cell's background
   // colors.
-  const ComputedStyle* table_style = table->ToLayoutObject()->Style();
+  const ComputedStyle* table_style = layout_object_->Style();
   if (!table_style)
     return false;
+
   Color table_bg_color =
       table_style->VisitedDependentColor(GetCSSPropertyBackgroundColor());
+  bool has_cell_spacing = table_style->HorizontalBorderSpacing() &&
+                          table_style->VerticalBorderSpacing();
 
   // check enough of the cells to find if the table matches our criteria
   // Criteria:
@@ -2523,38 +2505,37 @@
   Color alternating_row_colors[5];
   int alternating_row_color_count = 0;
   for (int row = 0; row < num_rows; ++row) {
-    int n_cols = first_body->NumCols(row);
+    HTMLTableRowElement* row_element = rows->Item(row);
+    int n_cols = row_element->cells()->length();
     for (int col = 0; col < n_cols; ++col) {
-      const LayoutNGTableCellInterface* cell =
-          first_body->PrimaryCellInterfaceAt(row, col);
+      const Element* cell = row_element->cells()->item(col);
       if (!cell)
         continue;
-      const LayoutBlock* cell_layout_block =
-          To<LayoutBlock>(cell->ToLayoutObject());
-      Node* cell_node = cell_layout_block->GetNode();
-      if (!cell_node)
+      // Any <th> tag -> treat as data table.
+      if (cell->HasTagName(html_names::kThTag))
+        return true;
+
+      // Check for an explicitly assigned a "data" table attribute.
+      auto* cell_elem = DynamicTo<HTMLTableCellElement>(*cell);
+      if (cell_elem) {
+        if (!cell_elem->Headers().IsEmpty() || !cell_elem->Abbr().IsEmpty() ||
+            !cell_elem->Axis().IsEmpty() ||
+            !cell_elem->FastGetAttribute(html_names::kScopeAttr).IsEmpty())
+          return true;
+      }
+
+      LayoutObject* cell_layout_object = cell->GetLayoutObject();
+      if (!cell_layout_object)
         continue;
 
+      const LayoutBlock* cell_layout_block =
+          To<LayoutBlock>(cell_layout_object);
       if (cell_layout_block->Size().Width() < 1 ||
           cell_layout_block->Size().Height() < 1)
         continue;
 
       valid_cell_count++;
 
-      // Any <th> tag -> treat as data table.
-      if (cell_node->HasTagName(html_names::kThTag))
-        return true;
-
-      // In this case, the developer explicitly assigned a "data" table
-      // attribute.
-      if (auto* cell_element = DynamicTo<HTMLTableCellElement>(*cell_node)) {
-        if (!cell_element->Headers().IsEmpty() ||
-            !cell_element->Abbr().IsEmpty() ||
-            !cell_element->Axis().IsEmpty() ||
-            !cell_element->FastGetAttribute(html_names::kScopeAttr).IsEmpty())
-          return true;
-      }
-
       const ComputedStyle* computed_style = cell_layout_block->Style();
       if (!computed_style)
         continue;
@@ -2586,8 +2567,8 @@
       // the place of borders).
       Color cell_color = computed_style->VisitedDependentColor(
           GetCSSPropertyBackgroundColor());
-      if (table->HBorderSpacing() > 0 && table->VBorderSpacing() > 0 &&
-          table_bg_color != cell_color && cell_color.Alpha() != 1)
+      if (has_cell_spacing && table_bg_color != cell_color &&
+          cell_color.Alpha() != 1)
         background_difference_cell_count++;
 
       // If we've found 10 "good" cells, we don't need to keep searching.
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_stream_unittest.cc b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_stream_unittest.cc
index 7ceff6f..1ffe37f 100644
--- a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_stream_unittest.cc
+++ b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_stream_unittest.cc
@@ -83,12 +83,13 @@
 
 TEST_F(P2PQuicStreamTest, StreamSendsFinAndCanNoLongerWrite) {
   InitializeStream();
-  EXPECT_CALL(session_, WritevData(kStreamId, 0u, 0u,
-                                   quic::StreamSendingState::FIN, false, _))
+  EXPECT_CALL(session_,
+              WritevData(kStreamId, 0u, 0u, quic::StreamSendingState::FIN,
+                         quic::NOT_RETRANSMISSION, _))
       .WillOnce(InvokeWithoutArgs([this]() {
         return session_.ConsumeData(stream_->id(), 0u, 0u,
-                                    quic::StreamSendingState::FIN, false,
-                                    QuicheNullOpt);
+                                    quic::StreamSendingState::FIN,
+                                    quic::NOT_RETRANSMISSION, QuicheNullOpt);
       }));
 
   stream_->WriteData({}, /*fin=*/true);
@@ -122,11 +123,12 @@
 // it has written the FIN bit, then the stream will close.
 TEST_F(P2PQuicStreamTest, StreamClosedAfterSendingThenReceivingFin) {
   InitializeStream();
-  EXPECT_CALL(session_, WritevData(kStreamId, 0u, 0u, _, false, _))
+  EXPECT_CALL(session_,
+              WritevData(kStreamId, 0u, 0u, _, quic::NOT_RETRANSMISSION, _))
       .WillOnce(InvokeWithoutArgs([this]() {
         return session_.ConsumeData(stream_->id(), 0u, 0u,
-                                    quic::StreamSendingState::FIN, false,
-                                    QuicheNullOpt);
+                                    quic::StreamSendingState::FIN,
+                                    quic::NOT_RETRANSMISSION, QuicheNullOpt);
       }));
 
   stream_->WriteData({}, /*fin=*/true);
@@ -148,12 +150,13 @@
   stream_->OnStreamFrame(fin_frame);
   EXPECT_FALSE(stream_->IsClosedForTesting());
 
-  EXPECT_CALL(session_, WritevData(kStreamId, 0u, 0u,
-                                   quic::StreamSendingState::FIN, false, _))
+  EXPECT_CALL(session_,
+              WritevData(kStreamId, 0u, 0u, quic::StreamSendingState::FIN,
+                         quic::NOT_RETRANSMISSION, _))
       .WillOnce(InvokeWithoutArgs([this]() {
         return session_.ConsumeData(stream_->id(), 0u, 0u,
-                                    quic::StreamSendingState::FIN, false,
-                                    QuicheNullOpt);
+                                    quic::StreamSendingState::FIN,
+                                    quic::NOT_RETRANSMISSION, QuicheNullOpt);
       }));
 
   stream_->WriteData({}, /*fin=*/true);
@@ -168,11 +171,11 @@
   EXPECT_CALL(session_,
               WritevData(kStreamId,
                          /*write_length=*/base::size(kSomeData), _, _, _, _))
-      .WillOnce(
-          Invoke([this](quic::QuicStreamId id, size_t write_length,
-                        quic::QuicStreamOffset offset,
-                        quic::StreamSendingState state, bool is_retransmission,
-                        quiche::QuicheOptional<quic::EncryptionLevel> level) {
+      .WillOnce(Invoke(
+          [this](quic::QuicStreamId id, size_t write_length,
+                 quic::QuicStreamOffset offset, quic::StreamSendingState state,
+                 quic::TransmissionType type,
+                 quiche::QuicheOptional<quic::EncryptionLevel> level) {
             // WritevData does not pass the data. The data is saved to the
             // stream, so we must grab it before it's consumed, in order to
             // check that it's what was written.
@@ -236,11 +239,11 @@
   EXPECT_CALL(session_,
               WritevData(kStreamId,
                          /*write_length=*/base::size(kSomeData), _, _, _, _))
-      .WillOnce(
-          Invoke([this](quic::QuicStreamId id, size_t write_length,
-                        quic::QuicStreamOffset offset,
-                        quic::StreamSendingState state, bool is_retransmission,
-                        quiche::QuicheOptional<quic::EncryptionLevel> level) {
+      .WillOnce(Invoke(
+          [this](quic::QuicStreamId id, size_t write_length,
+                 quic::QuicStreamOffset offset, quic::StreamSendingState state,
+                 quic::TransmissionType type,
+                 quiche::QuicheOptional<quic::EncryptionLevel> level) {
             // quic::QuicSession::WritevData does not pass the data. The data is
             // saved to the stream, so we must grab it before it's consumed, in
             // order to check that it's what was written.
@@ -266,11 +269,11 @@
   EXPECT_CALL(session_,
               WritevData(kStreamId,
                          /*write_length=*/base::size(kSomeData), _, _, _, _))
-      .WillOnce(
-          Invoke([this](quic::QuicStreamId id, size_t write_length,
-                        quic::QuicStreamOffset offset,
-                        quic::StreamSendingState state, bool is_retransmission,
-                        quiche::QuicheOptional<quic::EncryptionLevel> level) {
+      .WillOnce(Invoke(
+          [this](quic::QuicStreamId id, size_t write_length,
+                 quic::QuicStreamOffset offset, quic::StreamSendingState state,
+                 quic::TransmissionType type,
+                 quiche::QuicheOptional<quic::EncryptionLevel> level) {
             // WritevData does not pass the data. The data is saved to the
             // stream, so we must grab it before it's consumed, in order to
             // check that it's what was written.
@@ -300,7 +303,7 @@
       .WillOnce(Invoke([](quic::QuicStreamId id, size_t write_length,
                           quic::QuicStreamOffset offset,
                           quic::StreamSendingState state,
-                          bool is_retransmission,
+                          quic::TransmissionType type,
                           quiche::QuicheOptional<quic::EncryptionLevel> level) {
         // We mock that the QUIC library is not consuming the data, meaning it's
         // being buffered. In this case, the OnWriteDataConsumed() callback
@@ -324,12 +327,12 @@
   EXPECT_CALL(session_,
               WritevData(kStreamId,
                          /*write_length=*/base::size(kSomeData), _, _, _, _))
-      .WillOnce(
-          Invoke([&amount_consumed_by_quic](
-                     quic::QuicStreamId id, size_t write_length,
-                     quic::QuicStreamOffset offset,
-                     quic::StreamSendingState state, bool is_retransmission,
-                     quiche::QuicheOptional<quic::EncryptionLevel> level) {
+      .WillOnce(Invoke(
+          [&amount_consumed_by_quic](
+              quic::QuicStreamId id, size_t write_length,
+              quic::QuicStreamOffset offset, quic::StreamSendingState state,
+              quic::TransmissionType type,
+              quiche::QuicheOptional<quic::EncryptionLevel> level) {
             // We mock that the QUIC library is only consuming some of the data,
             // meaning the rest is being buffered.
             return quic::QuicConsumedData(
@@ -511,7 +514,7 @@
       .WillOnce(Invoke([](quic::QuicStreamId id, size_t write_length,
                           quic::QuicStreamOffset offset,
                           quic::StreamSendingState state,
-                          bool is_retransmission,
+                          quic::TransmissionType type,
                           quiche::QuicheOptional<quic::EncryptionLevel> level) {
         return quic::QuicConsumedData(
             write_length, state != quic::StreamSendingState::NO_FIN);
diff --git a/third_party/blink/renderer/platform/heap/thread_state.cc b/third_party/blink/renderer/platform/heap/thread_state.cc
index aa59853..c7ee7ce 100644
--- a/third_party/blink/renderer/platform/heap/thread_state.cc
+++ b/third_party/blink/renderer/platform/heap/thread_state.cc
@@ -746,11 +746,6 @@
     stack_state = BlinkGC::kHeapPointersOnStack;
   }
 
-  // Compaction needs to be canceled when incremental marking ends with a
-  // conservative GC.
-  if (stack_state == BlinkGC::kHeapPointersOnStack)
-    Heap().Compaction()->Cancel();
-
   if (IsMarkingInProgress()) {
     // Incremental marking is already in progress. Only update the state
     // that is necessary to update.
@@ -772,11 +767,16 @@
       DCHECK(write_barrier_worklist->IsLocalEmpty(concurrent_task));
     }
 #endif  // DCHECK_IS_ON()
+    // Compaction needs to be canceled when incremental marking ends with a
+    // conservative GC.
+    if (stack_state == BlinkGC::kHeapPointersOnStack)
+      Heap().Compaction()->Cancel();
     DisableIncrementalMarkingBarrier();
     current_gc_data_.reason = reason;
     current_gc_data_.stack_state = stack_state;
     Heap().stats_collector()->UpdateReason(reason);
   } else {
+    DCHECK(!Heap().Compaction()->IsCompacting());
     MarkPhasePrologue(collection_type, stack_state, marking_type, reason);
   }
 
diff --git a/third_party/blink/renderer/platform/network/http_names.json5 b/third_party/blink/renderer/platform/network/http_names.json5
index 61c1791..fa2fda6 100644
--- a/third_party/blink/renderer/platform/network/http_names.json5
+++ b/third_party/blink/renderer/platform/network/http_names.json5
@@ -32,6 +32,7 @@
     "Content-Security-Policy-Report-Only",
     "Content-Type",
     "Document-Policy",
+    "Document-Policy-Report-Only",
     "ETag",
     "Expires",
     "Date",
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 6997742..e44625e 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -444,7 +444,7 @@
       // https://wicg.github.io/display-locking/contain-intrinsic-size.html
       name: "CSSIntrinsicSize",
       implied_by: ["CSSSubtreeVisibility"],
-      status: "experimental",
+      status: "stable",
     },
     {
       name: "CSSLayoutAPI",
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index f4c06978..75da86f 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -6257,7 +6257,6 @@
 
 # Failing document policy tests
 crbug.com/993790 external/wpt/document-policy/required-policy/separate-document-policies.html [ Failure ]
-crbug.com/993790 external/wpt/document-policy/font-display/font-display-document-policy-01.tentative.html [ Failure ]
 crbug.com/993790 http/tests/images/document-policy-unoptimized-lossless-images.php [ Failure ]
 
 # Temporary suppression to allow devtools-frontend changes
@@ -6732,9 +6731,6 @@
 crbug.com/1056022 [ Fuchsia ] virtual/text-antialias/international/001.html [ Pass Timeout ]
 crbug.com/1056022 [ Fuchsia ] http/tests/eventsource/eventsource-bad-mime-type.html [ Pass Timeout ]
 
-# Temporarily disable promise realm tests while a V8 bug is being fixed.
-crbug.com/v8/10200 external/wpt/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry-different-function-realm.html [ Skip ]
-
 # Sheriff 2020-02-28
 crbug.com/1057138 [ Linux Debug ] virtual/not-site-per-process/http/tests/devtools/oopif/oopif-storage.js [ Pass Timeout ]
 crbug.com/1056879 [ Win7 ] external/wpt/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html [ Pass Failure Timeout ]
diff --git a/third_party/blink/web_tests/accessibility/table-detection-display-flex-expected.txt b/third_party/blink/web_tests/accessibility/table-detection-display-flex-expected.txt
new file mode 100644
index 0000000..b238c72e2
--- /dev/null
+++ b/third_party/blink/web_tests/accessibility/table-detection-display-flex-expected.txt
@@ -0,0 +1,190 @@
+
+
+This should be a table because it has a thead.
+
+AXRole: AXTable
+
+
+asdf	asdf
+asdf	asdf
+
+
+This should be a table because cells have borders.
+
+AXRole: AXTable
+
+
+asdf	asdf
+
+
+This should not be a table because its cells do not have borders.
+
+AXRole: AXLayoutTable
+
+
+asdf	asdf
+
+
+This should be a table because a cell has a special attribute
+
+AXRole: AXTable
+
+
+asdf	asdf
+
+
+This should be a table because a cell has a special attribute.
+
+AXRole: AXTable
+
+
+asdf	asdf
+
+
+This should be a table because a cell has a special attribute.
+
+AXRole: AXTable
+
+
+asdf	asdf
+asdf	asdf
+
+
+This should be a table because cells have different colors.
+
+AXRole: AXTable
+
+
+asdf	asdf
+
+
+This should not be a table because cells have different but no spacing.
+
+AXRole: AXLayoutTable
+
+
+asdf	asdf
+
+
+This should not be a table because cells have the same colors even though there is spacing.
+
+AXRole: AXLayoutTable
+
+
+asdf	asdf
+
+
+This should be a table because it has the "rules" attr.
+
+AXRole: AXTable
+
+
+asdf	asdf
+
+
+This should not be a table because it only has one valid cell (need more than one).
+
+AXRole: AXLayoutTable
+
+
+Contributions
+
+
+This should not be a table because it does not have enough cell borders or background colors
+
+AXRole: AXLayoutTable
+
+
+Politics
+Decision '08
+The debates
+The White House
+Capitol Hill
+National Journal
+New York Times
+
+
+This should be a table because it's editable.
+
+AXRole: AXTable
+
+
+asdf	asdf
+
+
+This should be a table because most cells have a top border.
+
+AXRole: AXTable
+
+
+asdf	asdf
+asdf	asdf
+
+
+This should not be a table because cells have different borders.
+
+AXRole: AXLayoutTable
+
+
+asdf	asdf
+asdf	asdf
+
+
+This should be a table because it sets empty-cells: hide on the table.
+
+AXRole: AXTable
+
+
+asdf	asdf
+	asdf
+asdf	asdf
+
+
+This should be a table because it sets empty-cells: hide on a cell.
+
+AXRole: AXTable
+
+
+asdf	asdf
+	asdf
+asdf	asdf
+
+
+This should be a table because it has a col.
+
+AXRole: AXTable
+
+
+asdf	asdf
+asdf	asdf
+
+
+This should be a table because it has at least 20 rows
+
+AXRole: AXTable
+
+
+asdf
+asdf
+asdf
+asdf
+asdf
+asdf
+asdf
+asdf
+asdf
+asdf
+asdf
+asdf
+asdf
+asdf
+asdf
+asdf
+asdf
+asdf
+asdf
+asdf
+asdf
+asdf
+asdf
+asdf
diff --git a/third_party/blink/web_tests/accessibility/table-detection-display-flex.html b/third_party/blink/web_tests/accessibility/table-detection-display-flex.html
new file mode 100644
index 0000000..b871eb0
--- /dev/null
+++ b/third_party/blink/web_tests/accessibility/table-detection-display-flex.html
@@ -0,0 +1,247 @@
+<html>
+<script>
+    if (window.testRunner)
+        testRunner.dumpAsText();
+</script>
+<style>
+table {display: flex;}
+</style>
+<body id="body">
+
+    <h2 tabindex=0>
+        This should be a table because it has a thead.
+    </h2>
+    <table border=0>
+    <thead><tr><td>asdf</td><td>asdf</td></tr></thead>
+    <tr><td>asdf</td><td>asdf</td></tr>
+    </table>
+
+    <h2 tabindex=0>
+        This should be a table because cells have borders.
+    </h2>
+    <table border=1>
+    <tr><td >asdf</td><td>asdf</td></tr>
+    </table>
+
+    <h2 tabindex=0>
+        This should not be a table because its cells do not have borders.
+    </h2>
+    <table style='border: 1px solid black'>
+    <tr><td >asdf</td><td>asdf</td></tr>
+    </table>
+
+    <h2 tabindex=0>
+        This should be a table because a cell has a special attribute
+    </h2>
+    <table border=0 cellpadding=0>
+    <tr><td abbr="abbr tag">asdf</td><td>asdf</td></tr>
+    </table>
+
+    <h2 tabindex=0>
+        This should be a table because a cell has a special attribute.
+    </h2>
+    <table border=0 cellpadding=0>
+    <tr><td axis="abbr tag">asdf</td><td>asdf</td></tr>
+    </table>
+
+    <h2 tabindex=0>
+        This should be a table because a cell has a special attribute.
+    </h2>
+    <table border=0 cellpadding=0>
+    <tr><td id="test">asdf</td><td>asdf</td></tr>
+    <tr><td headers="test">asdf</td><td>asdf</td></tr>
+    </table>
+
+    <h2 tabindex=0>
+        This should be a table because cells have different colors.
+    </h2>
+    <table border=0 cellpadding=0>
+    <tr><td bgcolor="red">asdf</td><td bgcolor="blue">asdf</td></tr>
+    </table>
+
+    <h2 tabindex=0>
+        This should not be a table because cells have different but no spacing.
+    </h2>
+    <table border=0 cellpadding=0 cellspacing=0>
+    <tr><td style="background-color: red;">asdf</td><td style="background-color: blue;">asdf</td></tr>
+    </table>
+
+    <h2 tabindex=0>
+        This should not be a table because cells have the same colors even though there is spacing.
+    </h2>
+    <table border=0 cellpadding=0 bgcolor="green" cellspacing=3>
+    <tr><td style="background-color: green;">asdf</td><td style="background-color: green;">asdf</td></tr>
+    </table>
+
+    <h2 tabindex=0>
+        This should be a table because it has the "rules" attr.
+    </h2>
+    <table rules="cols" border=0 cellpadding=0>
+    <tr><td>asdf</td><td>asdf</td></tr>
+    </table>
+
+    <style type="text/css">
+    .appPol_080915_Lehman_Contributions {  } .labelPol_080915_Lehman_Contributions { undefined } .hedPol_080915_Lehman_Contributions { font-size: 19px; font-family:arial; font-weight:bold;color:#26386b;border-top:1px solid #a4abc1;border-left:1px solid #a4abc1;border-right:1px solid #a4abc1;font-family: Arial, Helvetica, sans-serif; font-size: 100%;font-weight:bold;padding-left:4px;width:90%;height:25px; } .deckPol_080915_Lehman_Contributions { color:#666;font-weight:bold; font-family:verdana; font-size:11px;padding:5px 9px; } .subhedPol_080915_Lehman_Contributions { font-weight:bold;text-decoration:none;text-transform:uppercase;padding:3px 3px; } .colhdrPol_080915_Lehman_Contributions { color:ffffff; font-size:10px;font-weight:bold;background-color:999999; } .font1Pol_080915_Lehman_Contributions { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 70%; line-height: 140%; } .boxB_Pol_080915_Lehman_Contributions { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 70%; line-height: 140%;;border-left:1px #a4abc1 solid;border-bottom:1px #a4abc1 solid;border-right:1px #a4abc1 solid;  ;width:100%; } .headlinePol_080915_Lehman_Contributions { font-weight:bold; } .headlinePol_080915_Lehman_Contributions:hover { } .headlinePol_080915_Lehman_Contributions:visited { font-weight:bold;} .captionPol_080915_Lehman_Contributions { undefined} #NoBg { background-color:transparent; } .navlinkPol_080915_Lehman_Contributions {  color:000000;font-size: 10px;font-family:verdana;line-height: 130%;text-decoration:none; } .navlinkPol_080915_Lehman_Contributions:hover { color:cc3333; } .navlinkPol_080915_Lehman_Contributions:active { color:#cc0000; } .navCellPol_080915_Lehman_Contributions { width:20px;text-align:center;background-color:#EEEEEE;border-left:1px #CCCCCC solid;border-top:1px #CCCCCC solid;padding:2px;cursor:hand;width:100%; } .bulletPol_080915_Lehman_Contributions { color:CC0000;font-family:verdana;font-size:11px;font-weight:bold;color:cc3333; }
+    </style>
+    <h2 tabindex=0>
+        This should not be a table because it only has one valid cell (need more than one).
+    </h2>
+    <table width=100% cellspacing=0 cellpadding=0>
+    <tr>
+    <td nowrap="1" class="hedPol_080915_Lehman_Contributions">Contributions</td>
+    </tr></table>
+
+    <style type="text/css">
+    .nmIS,.nmISH{padding-left:20px;padding-right:12px;cursor:pointer;}
+    .nmIP{padding-left:20px;padding-right:12px;font:60% Tahoma,sans-serif;color:#CC0000}
+    .nmIB,.nmIBH,.nmIBD,.nmIBDH,.nmIK,.nmIKH,.nmIKD,.nmIKDH{padding-left:12px;padding-right:12px;cursor:pointer;}
+    .nmIS,.nmISH,.nmIP{border-bottom:1px solid #CCCCCC}
+    .nmIS,.nmIBH,.nmIBDH,.nmIKH,.nmIP{background-color:#EEEEEE}
+    .nmIKD,.nmIKDH{background-color:#CC0000}
+    .nmISH,.nmIB,.nmIBD,.nmIK{background-color:white}
+    .nmLS,.nmLSH,.nmLB,.nmLBH,.nmLBD,.nmLBDH,.nmLK,.nmLKH,.nmLKD,.nmLKDH{font:70% Tahoma,sans-serif}
+    .nmLS,.nmLSH,.nmLBD,.nmLBDH,.nmLKD,.nmLKDH,.nmIP{font-weight:bold}
+    .nmLK,.nmLK:visited,.nmLKH,.nmLKH:visited{color:black;text-decoration:none}
+    .nmLS,.nmLS:visited,.nmLS:hover,.nmLS:active,.nmLSH,.nmLSH:visited,.nmLSH:hover,.nmLSH:active,.nmLB,.nmLB:visited,.nmLBH,.nmLBH:visited,.nmLBD,.nmLBD:visited,.nmLBD:hover,.nmLBD:active,.nmLBDH,.nmLBDH:visited,.nmLBDH:hover,.nmLBDH:active{color:black !important;text-decoration:none}
+    .nmLB:hover,.nmLBH:hover,nmLK:hover,.nmLKH:hover{color:#CC0000;text-decoration:underline}
+    .nmLB:active,.nmLBH:active,.nmLK:active,.nmLKH:active{color:#CC0000;text-decoration:none}
+    .nmLKD,.nmLKD:visited,.nmLKD:hover,.nmLKD:active,.nmLKDH,.nmLKDH:visited,.nmLKDH:hover,.nmLKDH:active{color:white;text-decoration:none}
+    .nmLKD:visited:hover,.nmLKDH:visited:hover{text-decoration:underline;color:white;}
+    .nmTB{border-top:1px solid #CCCCCC;border-left:1px solid #CCCCCC;border-bottom:1px solid #CCCCCC}
+    .nmTK{border-left:3px solid #CC0000;border-bottom:3px solid #CC0000}
+    .nmX{position:absolute;z-index: 100000000;left:0;top:0;height:0;line-height:0px}
+    .nmTB,.nmTK{margin-bottom:2px}
+    .nmTB,.nmTK,.nmTS{text-align:left;}
+    .nmTS {width: 130px;}
+    .nmTB {width: 130px; margin: 0px !important; border-left: 0px; border-top: 0px;}
+    .nmTB{margin-top:12px}
+    .nmCM{padding-top:2px;display:block;height:20px;}
+    .nmCM:visited:hover{text-decoration:none;color:#000000;}
+    </style>
+    <h2 tabindex=0>
+        This should not be a table because it does not have enough cell borders or background colors
+    </h2>
+    <table class="nmTB" cellpadding="0" cellspacing="0"><tr><td class="nmIBD" id="nmb" name="nmb" nm_sn="3032552" nm_suf="" CM_sf="Ex" CM="NewsMenuL1" pn="newsmenu" ct="nm0" cn="Politics"><a class="nmLBD" href="/id/3032553">Politics</a></td></tr><tr><td class="nmIB" id="nmb" name="nmb" nm_sn="18970411" nm_suf="" CM_sf="Ex" CM="NewsMenuL1" pn="newsmenu" ct="nxf" cn="Decision '08"><a class="nmLB" href="/id/18970417">Decision '08</a></td></tr><tr><td class="nmIB" id="nmb" name="nmb" nm_sn="18296896" nm_suf="" CM_sf="Ex" CM="NewsMenuL1" pn="newsmenu" ct="nxf" cn="The debates"><a class="nmLB" href="/id/18296908">The debates</a></td></tr><tr><td class="nmIB" id="nmb" name="nmb" nm_sn="21491043" nm_suf="" CM_sf="Ex" CM="NewsMenuL1" pn="newsmenu" ct="nxf" cn="The White House"><a class="nmLB" href="/id/21672863">The White House</a></td></tr><tr><td class="nmIB" id="nmb" name="nmb" nm_sn="21491571" nm_suf="" CM_sf="Ex" CM="NewsMenuL1" pn="newsmenu" ct="nxf" cn="Capitol Hill"><a class="nmLB" href="/id/21672985">Capitol Hill</a></td></tr><tr><td class="nmIB" id="nmb" name="nmb" nm_sn="14016004" nm_suf="" CM_sf="Ex" CM="NewsMenuL1" pn="newsmenu" ct="nxf" cn="National Journal"><a class="nmLB" href="/id/14016001">National Journal</a></td></tr><tr><td class="nmIB" id="nmb" name="nmb" nm_sn="19748467" nm_suf="" CM_sf="Ex" CM="NewsMenuL1" pn="newsmenu" ct="nxf" cn="New York Times"><a class="nmLB" href="/id/19747577">New York Times</a></td></tr></table>
+
+    <h2 tabindex=0>
+      This should be a table because it's editable.
+    </h2>
+    <table style='border: 1px solid black' contenteditable>
+      <tr><td >asdf</td><td>asdf</td></tr>
+    </table>
+
+    <h2 tabindex=0>
+      This should be a table because most cells have a top border.
+    </h2>
+    <table>
+      <tr>
+        <td style="border-top: 1px solid black">asdf</td>
+        <td style="border-top: 1px solid black">asdf</td>
+      </tr>
+      <tr>
+        <td style="border-top: 1px solid black">asdf</td>
+        <td>asdf</td>
+      </tr>
+    </table>
+
+    <h2 tabindex=0>
+      This should not be a table because cells have different borders.
+    </h2>
+    <table border=0>
+      <tr>
+        <td style="xborder-top: 1px solid black">asdf</td>
+        <td style="xborder-left: 1px solid black">asdf</td>
+      </tr>
+      <tr>
+        <td style="xborder-bottom: 1px solid black">asdf</td>
+        <td style="xborder-right: 1px solid black">asdf</td>
+      </tr>
+    </table>
+
+    <h2 tabindex=0>
+      This should be a table because it sets empty-cells: hide on the table.
+    </h2>
+    <table style="empty-cells: hide">
+      <tr>
+        <td>asdf</td><td>asdf</td>
+      </tr>
+      <tr>
+        <td style="border: 1px solid black"></td>
+        <td style="border: 1px solid black">asdf</td>
+      </tr>
+      <tr>
+        <td>asdf</td><td>asdf</td>
+      </tr>
+    </table>
+
+    <h2 tabindex=0>
+      This should be a table because it sets empty-cells: hide on a cell.
+    </h2>
+    <table>
+      <tr>
+        <td>asdf</td><td>asdf</td>
+      </tr>
+      <tr>
+        <td style="border: 1px solid black; empty-cells: hide"></td>
+        <td style="border: 1px solid black">asdf</td>
+      </tr>
+      <tr>
+        <td>asdf</td><td>asdf</td>
+      </tr>
+    </table>
+
+    <h2 tabindex=0>
+        This should be a table because it has a col.
+    </h2>
+    <table border=0>
+    <colgroup>
+      <col span="2" style="background-color:#ccf">
+    </colgroup>
+    <tr><td>asdf</td><td>asdf</td></tr>
+    <tr><td>asdf</td><td>asdf</td></tr>
+    </table>
+
+    <h2 tabindex=0>
+        This should be a table because it has at least 20 rows
+    </h2>
+    <table border=0>
+    <tr><td>asdf</td></tr> <tr><td>asdf</td></tr> <tr><td>asdf</td></tr> <tr><td>asdf</td></tr>
+    <tr><td>asdf</td></tr> <tr><td>asdf</td></tr> <tr><td>asdf</td></tr> <tr><td>asdf</td></tr>
+    <tr><td>asdf</td></tr> <tr><td>asdf</td></tr> <tr><td>asdf</td></tr> <tr><td>asdf</td></tr>
+    <tr><td>asdf</td></tr> <tr><td>asdf</td></tr> <tr><td>asdf</td></tr> <tr><td>asdf</td></tr>
+    <tr><td>asdf</td></tr> <tr><td>asdf</td></tr> <tr><td>asdf</td></tr> <tr><td>asdf</td></tr>
+    <tr><td>asdf</td></tr> <tr><td>asdf</td></tr> <tr><td>asdf</td></tr> <tr><td>asdf</td></tr>
+    </table>
+
+    <div id="result"></div>
+
+    <script>
+        if (window.accessibilityController) {
+            function nextAxSibling(axElement) {
+                var axParent = axElement.parentElement();
+                for (var i = 0; i < axParent.childrenCount - 1; i++) {
+                    if (axParent.childAtIndex(i).isEqual(axElement))
+                        return axParent.childAtIndex(i + 1);
+                }
+                return null;
+            }
+
+            var tableHeadings = document.getElementsByTagName('h2');
+            for (var i = 0; i < tableHeadings.length; i++) {
+                var tableHeading = tableHeadings[i];
+                tableHeading.focus();
+                var axTableHeading = accessibilityController.focusedElement;
+                var axTable = nextAxSibling(axTableHeading);
+                var output = axTable.allAttributes();
+
+                var spacerElement = document.createElement('br');
+                tableHeading.parentElement.insertBefore(spacerElement, tableHeading);
+
+                var outputElement = document.createElement('pre');
+                outputElement.innerText = output + '\n\n';
+                tableHeading.parentElement.insertBefore(outputElement, tableHeading.nextSibling);
+            }
+        }
+    </script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/font-display/font-display-feature-policy-01.tentative-ref.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/font-display/font-display-feature-policy-01.tentative-ref.html
deleted file mode 100644
index fc43ebc..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-fonts/font-display/font-display-feature-policy-01.tentative-ref.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<title>Test for font-display-late-swap feature policy behavior when set to reporting</title>
-<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
-<style>
-.ahem {
-  font-family: 'Ahem';
-}
-.arial {
-  font-family: 'Arial';
-}
-</style>
-<p>Tests if font-display is set to optional for each option except for when it is set to fallback</p>
-<table id="container">
- <tr>
-  <th>not-set</th>
-  <th>auto</th>
-  <th>block</th>
-  <th>swap</th>
-  <th>fallback</th>
-  <th>optional</th>
- </tr>
- <tr>
-  <td class="arial">a</td>
-  <td class="arial">a</td>
-  <td class="arial">a</td>
-  <td class="arial">a</td>
-  <td class="ahem">a</td>
-  <td class="arial">a</td>
- </tr>
-</table>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/font-display/font-display-feature-policy-01.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/font-display/font-display-feature-policy-01.tentative.html
deleted file mode 100644
index 56b040d..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-fonts/font-display/font-display-feature-policy-01.tentative.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!DOCTYPE html>
-<html class="reftest-wait">
-<title>Test for font-display-late-swap feature policy behavior when set to reporting</title>
-<link rel="help" href="https://github.com/w3c/webappsec-feature-policy/blob/master/policies/font-display-late-swap.md">
-<link rel="match" href="font-display-feature-policy-01.tentative-ref.html">
-<style>
-</style>
-<p>Tests if font-display is set to optional for each option except for when it is set to fallback</p>
-<table id="container">
- <tr>
-  <th>not-set</th>
-  <th>auto</th>
-  <th>block</th>
-  <th>swap</th>
-  <th>fallback</th>
-  <th>optional</th>
- </tr>
-</table>
-<script>
-const fontDisplayValues = ['', 'auto', 'block', 'swap', 'fallback', 'optional'];
-const table = document.getElementById('container');
-
-function makeFontFaceDeclaration(family, display) {
-    url = '/fonts/Ahem.ttf?pipe=trickle(d1)'; // Before the swap period is over
-    return '@font-face { font-family: ' + family + '; src: url("' + url + '"); font-display: ' + display + '; }';
-}
-
-window.onload = () => {
-    let tr = document.createElement('tr');
-    for (let display of fontDisplayValues) {
-        const family = display + '-face';
-        const rule = makeFontFaceDeclaration(family, display);
-        document.styleSheets[0].insertRule(rule, 0);
-        let td = document.createElement('td');
-        td.textContent = 'a';
-        td.style.fontFamily = family + ', Arial';
-        tr.appendChild(td);
-    }
-    table.appendChild(tr);
-    const timeoutMilliSec = 1500; // After the font is loaded
-    setTimeout(() => {
-        document.documentElement.classList.remove("reftest-wait");
-    }, timeoutMilliSec);
-}
-</script>
-</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/font-display/font-display-feature-policy-01.tentative.html.headers b/third_party/blink/web_tests/external/wpt/css/css-fonts/font-display/font-display-feature-policy-01.tentative.html.headers
deleted file mode 100644
index 0c3e29d..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-fonts/font-display/font-display-feature-policy-01.tentative.html.headers
+++ /dev/null
@@ -1 +0,0 @@
-Feature-Policy: font-display-late-swap 'none';
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/font-display/font-display-feature-policy-report-only.tentative.html.headers b/third_party/blink/web_tests/external/wpt/css/css-fonts/font-display/font-display-feature-policy-report-only.tentative.html.headers
deleted file mode 100644
index e6c4898d..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-fonts/font-display/font-display-feature-policy-report-only.tentative.html.headers
+++ /dev/null
@@ -1 +0,0 @@
-Feature-Policy-Report-Only: font-display-late-swap 'none';
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/font-display/font-display-feature-policy-reporting.tentative.html.headers b/third_party/blink/web_tests/external/wpt/css/css-fonts/font-display/font-display-feature-policy-reporting.tentative.html.headers
deleted file mode 100644
index 0c3e29d..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-fonts/font-display/font-display-feature-policy-reporting.tentative.html.headers
+++ /dev/null
@@ -1 +0,0 @@
-Feature-Policy: font-display-late-swap 'none';
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/font-display/font-display-feature-policy-report-only.tentative.html b/third_party/blink/web_tests/external/wpt/document-policy/font-display/font-display-document-policy-report-only.tentative.html
similarity index 89%
rename from third_party/blink/web_tests/external/wpt/css/css-fonts/font-display/font-display-feature-policy-report-only.tentative.html
rename to third_party/blink/web_tests/external/wpt/document-policy/font-display/font-display-document-policy-report-only.tentative.html
index ff3a7f1..03fa5b68 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-fonts/font-display/font-display-feature-policy-report-only.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/document-policy/font-display/font-display-document-policy-report-only.tentative.html
@@ -2,7 +2,7 @@
 <html>
   <head>
     <title>Test for font-display-late-swap feature policy set to report-only</title>
-    <link rel="help" href="https://w3c.github.io/webappsec-feature-policy/#reporting">
+    <link rel="help" href="https://github.com/w3c/webappsec-feature-policy/blob/master/policies/font-display-late-swap.md">
     <script src='/resources/testharness.js'></script>
     <script src='/resources/testharnessreport.js'></script>
     <style>
@@ -52,7 +52,7 @@
 let check_report_format = (reports, observer) => {
   reportCounter -= reports.length;
   for (let report of reports) {
-    assert_equals(report.type, 'feature-policy-violation');
+    assert_equals(report.type, 'document-policy-violation');
     assert_equals(report.url, document.location.href, 'Report URL');
     assert_equals(report.body.featureId, 'font-display-late-swap');
     assert_equals(report.body.disposition, 'report');
@@ -66,7 +66,7 @@
 };
 
 new ReportingObserver(t.step_func(check_report_format),
-                      {types: ['feature-policy-violation'], buffered: true}).observe();
+                      {types: ['document-policy-violation'], buffered: true}).observe();
     </script>
   </body>
 </html>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/document-policy/font-display/font-display-document-policy-report-only.tentative.html.headers b/third_party/blink/web_tests/external/wpt/document-policy/font-display/font-display-document-policy-report-only.tentative.html.headers
new file mode 100644
index 0000000..e090edd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/document-policy/font-display/font-display-document-policy-report-only.tentative.html.headers
@@ -0,0 +1 @@
+Document-Policy-Report-Only: no-font-display-late-swap
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/font-display/font-display-feature-policy-reporting.tentative.html b/third_party/blink/web_tests/external/wpt/document-policy/font-display/font-display-document-policy-reporting.tentative.html
similarity index 89%
rename from third_party/blink/web_tests/external/wpt/css/css-fonts/font-display/font-display-feature-policy-reporting.tentative.html
rename to third_party/blink/web_tests/external/wpt/document-policy/font-display/font-display-document-policy-reporting.tentative.html
index 6f6a51a2..db871d1 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-fonts/font-display/font-display-feature-policy-reporting.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/document-policy/font-display/font-display-document-policy-reporting.tentative.html
@@ -2,7 +2,7 @@
 <html>
   <head>
     <title>Test for font-display-late-swap feature policy set to reporting</title>
-    <link rel="help" href="https://w3c.github.io/webappsec-feature-policy/#reporting">
+    <link rel="help" href="https://github.com/w3c/webappsec-feature-policy/blob/master/policies/font-display-late-swap.md">
     <script src='/resources/testharness.js'></script>
     <script src='/resources/testharnessreport.js'></script>
     <style>
@@ -52,7 +52,7 @@
 let check_report_format = (reports, observer) => {
   reportCounter -= reports.length;
   for (let report of reports) {
-    assert_equals(report.type, 'feature-policy-violation');
+    assert_equals(report.type, 'document-policy-violation');
     assert_equals(report.url, document.location.href, 'Report URL');
     assert_equals(report.body.featureId, 'font-display-late-swap');
     assert_equals(report.body.disposition, 'enforce');
@@ -66,7 +66,7 @@
 };
 
 new ReportingObserver(t.step_func(check_report_format),
-                      {types: ['feature-policy-violation'], buffered: true}).observe();
+                      {types: ['document-policy-violation'], buffered: true}).observe();
     </script>
   </body>
 </html>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/document-policy/font-display/font-display-document-policy-reporting.tentative.html.headers b/third_party/blink/web_tests/external/wpt/document-policy/font-display/font-display-document-policy-reporting.tentative.html.headers
new file mode 100644
index 0000000..84ad7cb
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/document-policy/font-display/font-display-document-policy-reporting.tentative.html.headers
@@ -0,0 +1 @@
+Document-Policy: no-font-display-late-swap
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animatable/animate.html b/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animatable/animate.html
index ba10b17..bfe3512 100644
--- a/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animatable/animate.html
+++ b/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animatable/animate.html
@@ -247,7 +247,6 @@
 test(t => {
   const div = createDiv(t);
   div.classList.add('pseudo');
-  getComputedStyle(div,"::before").content; // Sync style
   const anim = div.animate(null, {pseudoElement: '::before'});
   assert_class_string(anim, 'Animation', 'The returned object is an Animation');
 }, 'animate() with pseudoElement parameter creates an Animation object');
@@ -262,7 +261,6 @@
   const div = createDiv(t);
   div.classList.add('pseudo');
   div.style.display = 'list-item';
-  getComputedStyle(div,"::marker").content; // Sync style
   const anim = div.animate(null, {pseudoElement: '::marker'});
   assert_class_string(anim, 'Animation', 'The returned object is an Animation for ::marker');
 }, 'animate() with pseudoElement parameter creates an Animation object for ::marker');
@@ -278,7 +276,6 @@
 test(t => {
   const div = createDiv(t);
   div.classList.add('pseudo');
-  getComputedStyle(div,"::before").content; // Sync style
   const anim = div.animate(null, {pseudoElement: '::before'});
   assert_equals(anim.effect.target, div, 'The returned element has the correct target element');
   assert_equals(anim.effect.pseudoElement, '::before',
@@ -299,7 +296,6 @@
   const div = createDiv(t);
   div.classList.add('pseudo');
   div.style.display = 'list-item';
-  getComputedStyle(div,"::marker").content; // Sync style
   const anim = div.animate(null, {pseudoElement: '::marker'});
   assert_equals(anim.effect.target, div, 'The returned element has the correct target element');
   assert_equals(anim.effect.pseudoElement, '::marker',
diff --git a/third_party/blink/web_tests/external/wpt/web-animations/interfaces/KeyframeEffect/target.html b/third_party/blink/web_tests/external/wpt/web-animations/interfaces/KeyframeEffect/target.html
index eaef10f..6951682c 100644
--- a/third_party/blink/web_tests/external/wpt/web-animations/interfaces/KeyframeEffect/target.html
+++ b/third_party/blink/web_tests/external/wpt/web-animations/interfaces/KeyframeEffect/target.html
@@ -122,7 +122,6 @@
     d.classList.add('pseudoa');
     if (hasContent) {
       d.classList.add('before');
-      getComputedStyle(d,"::before").content; // Sync style
     }
 
     const effect = new KeyframeEffect(null, gKeyFrames, 100 * MS_PER_SEC);
@@ -147,7 +146,6 @@
     d.classList.add('pseudoa');
     if (hasContent) {
       d.classList.add('before');
-      getComputedStyle(d,"::before").content; // Sync style
     }
 
     const effect = new KeyframeEffect(null, gKeyFrames, 100 * MS_PER_SEC);
@@ -172,7 +170,6 @@
     d.classList.add('pseudoa');
     if (hasContent) {
       d.classList.add('before');
-      getComputedStyle(d,"::before").content; // Sync style
     }
     const anim = d.animate(gKeyFrames, {duration: 100 * MS_PER_SEC, pseudoElement: '::before'});
 
@@ -198,11 +195,9 @@
       b.classList.add('pseudob');
       if (prevHasContent) {
         a.classList.add('before');
-        getComputedStyle(a,"::before").content; // Sync style
       }
       if (hasContent) {
         b.classList.add('before');
-        getComputedStyle(b,"::before").content; // Sync style
       }
 
       const anim = a.animate(gKeyFrames, {duration: 100 * MS_PER_SEC, pseudoElement: '::before'});
@@ -228,11 +223,9 @@
       d.classList.add('pseudoc');
       if (prevHasContent) {
         d.classList.add('before');
-        getComputedStyle(d,"::before").content; // Sync style
       }
       if (hasContent) {
         d.classList.add('after');
-        getComputedStyle(d,"::after").content; // Sync style
       }
 
       const anim = d.animate(gKeyFrames, {duration: 100 * MS_PER_SEC, pseudoElement: '::before'});
diff --git a/third_party/blink/web_tests/virtual/stable/webexposed/css-properties-as-js-properties-expected.txt b/third_party/blink/web_tests/virtual/stable/webexposed/css-properties-as-js-properties-expected.txt
index 6129c81..9c6f487 100644
--- a/third_party/blink/web_tests/virtual/stable/webexposed/css-properties-as-js-properties-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/webexposed/css-properties-as-js-properties-expected.txt
@@ -111,6 +111,7 @@
 columnWidth
 columns
 contain
+containIntrinsicSize
 content
 counterIncrement
 counterReset
diff --git a/third_party/blink/web_tests/virtual/stable/webexposed/css-property-listing-expected.txt b/third_party/blink/web_tests/virtual/stable/webexposed/css-property-listing-expected.txt
index def2890e..6e921fb9 100644
--- a/third_party/blink/web_tests/virtual/stable/webexposed/css-property-listing-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/webexposed/css-property-listing-expected.txt
@@ -147,6 +147,7 @@
     column-span
     column-width
     contain
+    contain-intrinsic-size
     content
     counter-increment
     counter-reset
diff --git a/third_party/blink/web_tests/webexposed/feature-policy-features-expected.txt b/third_party/blink/web_tests/webexposed/feature-policy-features-expected.txt
index 83d205e..13fe291 100644
--- a/third_party/blink/web_tests/webexposed/feature-policy-features-expected.txt
+++ b/third_party/blink/web_tests/webexposed/feature-policy-features-expected.txt
@@ -25,7 +25,6 @@
 execution-while-not-rendered
 execution-while-out-of-viewport
 focus-without-user-activation
-font-display-late-swap
 forms
 fullscreen
 geolocation
diff --git a/tools/binary_size/libsupersize/static/auth-consts.js b/tools/binary_size/libsupersize/static/auth-consts.js
new file mode 100644
index 0000000..891d70c
--- /dev/null
+++ b/tools/binary_size/libsupersize/static/auth-consts.js
@@ -0,0 +1,12 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// @ts-check
+'use strict';
+
+const AUTH_API_KEY = 'AIzaSyAeKy_bJvcqYoLG02gCVF23an0kx8KzMng';
+const AUTH_CLIENT_ID = '84462612899-hsikvugfjv36k8nt8459b7at62hi9sba.apps.googleusercontent.com';
+const AUTH_SCOPE = 'https://www.googleapis.com/auth/devstorage.read_only';
+const AUTH_DISCOVERY_URL = 'https://www.googleapis.com/discovery/v1/apis/storage/v1/rest';
+const STORAGE_API_ENDPOINT = 'https://storage.googleapis.com/storage/v1';
diff --git a/tools/binary_size/libsupersize/static/auth.js b/tools/binary_size/libsupersize/static/auth.js
new file mode 100644
index 0000000..4b2cf766
--- /dev/null
+++ b/tools/binary_size/libsupersize/static/auth.js
@@ -0,0 +1,44 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// @ts-check
+'use strict';
+
+window.googleAuth = null;
+window.googleAuthPromise = new Promise((resolve, reject) => {
+  googleAuthPromiseResolve = resolve;
+});
+
+let _googleAuthPromiseResolve = null;
+function handleClientLoad() {
+  if (requiresAuthentication()) {
+    gapi.load('client:auth2', initClient);
+  }
+}
+
+function initClient() {
+  return gapi.client.init({
+      'apiKey': AUTH_API_KEY,
+      'clientId': AUTH_CLIENT_ID,
+      'discoveryDocs': [AUTH_DISCOVERY_URL],
+      'scope': AUTH_SCOPE,
+  }).then(function () {
+    window.googleAuth = gapi.auth2.getAuthInstance();
+    if (!window.googleAuth.isSignedIn.get()) {
+      window.googleAuth.signIn().then(setSigninStatus);
+    } else {
+      setSigninStatus();
+    }
+  });
+}
+
+function setSigninStatus() {
+  let user = window.googleAuth.currentUser.get();
+  _googleAuthPromiseResolve(user.getAuthResponse());
+}
+
+function requiresAuthentication() {
+  let urlParams = new URLSearchParams(window.location.search);
+  return !!urlParams.get('authenticate');
+}
diff --git a/tools/binary_size/libsupersize/static/index.js b/tools/binary_size/libsupersize/static/index.js
index 5e7b1e1..497cbdc 100644
--- a/tools/binary_size/libsupersize/static/index.js
+++ b/tools/binary_size/libsupersize/static/index.js
@@ -3,6 +3,10 @@
 // found in the LICENSE file.
 
 const DO_NOT_DIFF = 'Don\'t diff';
+// Domain hosting the viewer.html
+const FIREBASE_HOST = 'https://chrome-supersize.firebaseapp.com'
+// Storage bucket hosting the size diffs.
+const SIZE_FILEHOST = 'https://storage.googleapis.com/chrome-supersize'
 
 function buildOptions(options) {
   const fragment = document.createDocumentFragment();
@@ -25,19 +29,20 @@
   form.addEventListener('submit', event => {
     event.preventDefault();
     const dataUrl = fetchDataUrl();
-    window.open(`viewer.html?load_url=${dataUrl}`);
+    window.open(`${FIREBASE_HOST}/viewer.html?load_url=${dataUrl}`);
   });
 }
 
 // Milestones.
 (async () => {
   // Milestones.
-  const milestoneResponse = await fetch('milestones/milestones.json');
+  const milestoneResponse = await fetch(
+      `${SIZE_FILEHOST}/milestones/milestones.json`);
   const milestonesPushed = (await milestoneResponse.json())['pushed'];
 
   // Official Builds
   const officialBuildsResponse =
-      await fetch('official_builds/canary_reports.json');
+      await fetch(`${SIZE_FILEHOST}/official_builds/canary_reports.json`);
   const officialBuildsPushed = (await officialBuildsResponse.json())['pushed'];
 
   if (document.readyState === 'loading') {
@@ -169,10 +174,10 @@
     function sizeUrlFor(value) {
       if (value.indexOf('canary') != -1) {
         const strippedVersion = value.replace(/[^\d.]/g, '');
-        return `official_builds/reports/${strippedVersion}/${
+        return `${SIZE_FILEHOST}/official_builds/reports/${strippedVersion}/${
             selApk.value}.size`;
       }
-      return `milestones/${value}/${selApk.value}.size`;
+      return `${SIZE_FILEHOST}/milestones/${value}/${selApk.value}.size`;
     }
     let ret = sizeUrlFor(selVersion1.value);
     if (selVersion2.value !== DO_NOT_DIFF) {
diff --git a/tools/binary_size/libsupersize/static/start-worker.js b/tools/binary_size/libsupersize/static/start-worker.js
index 426a63a..3792228f 100644
--- a/tools/binary_size/libsupersize/static/start-worker.js
+++ b/tools/binary_size/libsupersize/static/start-worker.js
@@ -76,37 +76,50 @@
    * Loads the tree data given on a worker thread and replaces the tree view in
    * the UI once complete. Uses query string as state for the options.
    * Use `onProgress` before calling `loadTree`.
-   * @param {string} input
+   * @param {?string=} input
+   * @param {?string=} accessToken
    * @returns {Promise<TreeProgress>}
    */
-  loadTree(input = null) {
+  loadTree(input = null, accessToken = null) {
     return this._waitForResponse('load', {
       input,
+      accessToken,
       options: location.search.slice(1),
     });
   }
 }
 
-let _innerWorker = null;
-let worker = null;
+window.supersize = {
+  worker: null,
+  treeReady: null,
+};
 
 // .size files and .ndjson files require different web workers.
 // Switch between the two dynamically.
 function startWorkerForFileName(fileName) {
+  let innerWorker = null;
   if (fileName &&
       (fileName.endsWith('.size') || fileName.endsWith('.sizediff'))) {
     console.log('Using WebAssembly web worker');
-    _innerWorker = new Worker('tree-worker-wasm.js');
+    innerWorker = new Worker('tree-worker-wasm.js');
   } else {
     console.log('Using JavaScript web worker');
-    _innerWorker = new Worker('tree-worker.js');
+    innerWorker = new Worker('tree-worker.js');
   }
-  worker = new TreeWorker(_innerWorker);
+  window.supersize.worker = new TreeWorker(innerWorker);
 }
 
-const urlParams = new URLSearchParams(window.location.search);
-startWorkerForFileName(urlParams.get('load_url'));
+(function() {
+  const urlParams = new URLSearchParams(window.location.search);
+  const url = urlParams.get('load_url');
+  startWorkerForFileName(url);
 
-// Kick off the worker ASAP so it can start parsing data faster.
-// Subsequent calls will just use a worker locally.
-const treeReady = worker.loadTree('from-url://');
+  if (requiresAuthentication()) {
+    window.supersize.treeReady = window.googleAuthPromise.then((authResponse) =>
+        window.supersize.worker.loadTree('from-url://',
+          authResponse.access_token));
+  } else {
+    window.supersize.treeReady = window.supersize.worker.loadTree('from-url://');
+  }
+
+})()
diff --git a/tools/binary_size/libsupersize/static/tree-ui.js b/tools/binary_size/libsupersize/static/tree-ui.js
index edbb182..2b5a989 100644
--- a/tools/binary_size/libsupersize/static/tree-ui.js
+++ b/tools/binary_size/libsupersize/static/tree-ui.js
@@ -102,7 +102,7 @@
         /** @type {HTMLSpanElement} */
         const symbolName = link.querySelector('.symbol-name');
         const idPath = symbolName.title;
-        data = await worker.openNode(idPath);
+        data = await window.supersize.worker.openNode(idPath);
         _uiNodeData.set(link, data);
       }
 
@@ -451,8 +451,8 @@
     );
   }
 
-  treeReady.then(displayTree);
-  worker.setOnProgressHandler(displayTree);
+  window.supersize.treeReady.then(displayTree);
+  window.supersize.worker.setOnProgressHandler(displayTree);
 
   _fileUpload.addEventListener('change', event => {
     const input = /** @type {HTMLInputElement} */ (event.currentTarget);
@@ -463,7 +463,7 @@
     _dataUrlInput.value = '';
     _dataUrlInput.dispatchEvent(new Event('change'));
 
-    worker.loadTree(fileUrl).then(displayTree);
+    window.supersize.worker.loadTree(fileUrl).then(displayTree);
     // Clean up afterwards so new files trigger event
     input.value = '';
   });
@@ -474,12 +474,12 @@
     // options (marked by `data-dynamic`) are changed.
     if (!event.target.dataset.hasOwnProperty('dynamic')) {
       _progress.setValue(0);
-      worker.loadTree().then(displayTree);
+      window.supersize.worker.loadTree().then(displayTree);
     }
   });
   form.addEventListener('submit', event => {
     event.preventDefault();
     _progress.setValue(0);
-    worker.loadTree().then(displayTree);
+    window.supersize.worker.loadTree().then(displayTree);
   });
 }
diff --git a/tools/binary_size/libsupersize/static/tree-worker-wasm.js b/tools/binary_size/libsupersize/static/tree-worker-wasm.js
index dcc9301..5146898 100644
--- a/tools/binary_size/libsupersize/static/tree-worker-wasm.js
+++ b/tools/binary_size/libsupersize/static/tree-worker-wasm.js
@@ -6,6 +6,7 @@
 
 importScripts('./shared.js');
 importScripts('./caspian_web.js');
+importScripts('./auth-consts.js');
 
 const LoadWasm = new Promise(function(resolve, reject) {
   Module['onRuntimeInitialized'] = function() {
@@ -49,13 +50,42 @@
   }
 
   /**
+   * Sets the access token to be used for authenticated requests. If accessToken
+   * is non-null and the URL is a google storage URL, an authenticated request
+   * is performed instead.
+   * @param {?string} accessToken
+   */
+  setAccessToken(accessToken) {
+    this._accessToken = accessToken;
+  }
+
+  /**
    * Starts a new request and aborts the previous one.
    * @param {string | Request} url
    */
-  async fetch(url) {
+  async fetchUrl(url) {
+    if (this._accessToken && looksLikeGoogleCloudStorage(url)) {
+      return this._fetchFromGoogleCloudStorage(url);
+    } else {
+      return this._doFetch(url);
+    }
+  }
+
+  async _fetchFromGoogleCloudStorage(url) {
+    const {bucket, file} = parseGoogleCloudStorageUrl(url);
+    const params = `alt=media&key=${AUTH_API_KEY}`;
+    const api_url = `${STORAGE_API_ENDPOINT}/b/${bucket}/o/${file}?${params}`;
+    const headers = new Headers();
+    headers.append('Authorization', `Bearer ${this._accessToken}`);
+    return this._doFetch(api_url, headers);
+  }
+
+  async _doFetch(url, headers) {
     if (this._controller) this._controller.abort();
     this._controller = new AbortController();
-    const headers = new Headers();
+    if (!headers) {
+      headers = new Headers();
+    }
     headers.append('cache-control', 'no-cache');
     return fetch(url, {
       headers,
@@ -69,13 +99,25 @@
    */
   async loadSizeBuffer() {
     if (!this._cache) {
-      const response = await this.fetch(this._input);
+      const response = await this.fetchUrl(this._input);
       this._cache = new Uint8Array(await response.arrayBuffer());
     }
     return this._cache;
   }
 }
 
+function looksLikeGoogleCloudStorage(url) {
+  return url.startsWith('https://storage.googleapis.com/');
+}
+
+function parseGoogleCloudStorageUrl(url) {
+  const re = /^https:\/\/storage\.googleapis\.com\/(?<bucket>[^\/]+)\/(?<file>.+)/;
+  const match = re.exec(url);
+  const bucket = encodeURIComponent(match.groups['bucket']);
+  const file = encodeURIComponent(match.groups['file']);
+  return {bucket, file};
+}
+
 function mallocBuffer(buf) {
   var dataPtr = Module._malloc(buf.byteLength);
   var dataHeap = new Uint8Array(Module.HEAPU8.buffer, dataPtr, buf.byteLength);
@@ -195,8 +237,8 @@
 }
 
 const actions = {
-  /** @param {{input:string|null,options:string}} param0 */
-  load({input, options}) {
+  /** @param {{input:string|null,accessToken:string|null,options:string}} param0 */
+  load({input, accessToken, options}) {
     const {
       groupBy,
       includeRegex,
@@ -208,6 +250,9 @@
       url,
       beforeUrl,
     } = parseOptions(options);
+    if (accessToken) {
+      fetcher.setAccessToken(accessToken);
+    }
     if (input === 'from-url://' && url) {
       // Display the data from the `load_url` query parameter
       console.info('Displaying data from', url);
diff --git a/tools/binary_size/libsupersize/static/viewer.html b/tools/binary_size/libsupersize/static/viewer.html
index 5225e100..2bf3b04 100644
--- a/tools/binary_size/libsupersize/static/viewer.html
+++ b/tools/binary_size/libsupersize/static/viewer.html
@@ -8,6 +8,8 @@
 
 <head>
   <title>Super Size Tiger View</title>
+  <script src="auth-consts.js"></script>
+  <script src="auth.js"></script>
   <script src="start-worker.js"></script>
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <meta name="theme-color" content="#4285f4">
@@ -20,11 +22,15 @@
   <script defer src="state.js"></script>
   <script defer src="infocard-ui.js"></script>
   <script defer src="tree-ui.js"></script>
+  <script async defer src="https://apis.google.com/js/api.js"
+     onload="this.onload=function(){};handleClientLoad()"
+     onreadystatechange="if (this.readyState === 'complete') this.onload()">
+  </script>
   <script defer async>
-if ('serviceWorker' in navigator) {
-  navigator.serviceWorker.register('sw.js')
-      .catch(() => console.warn('ServiceWorker not loaded.'));
-}
+    if ('serviceWorker' in navigator) {
+      navigator.serviceWorker.register('sw.js')
+          .catch(() => console.warn('ServiceWorker not loaded.'));
+    }
   </script>
 </head>
 
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index c698ef07..bd8a4a3 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -14191,6 +14191,17 @@
   </description>
 </action>
 
+<action name="MobileWillEnterForeground">
+  <owner>eugenebut@chromium.org</owner>
+  <owner>marq@chromium.org</owner>
+  <description>
+    App transitioned from background to foreground. This action is directly or
+    indirectly triggered by the user. Example of direct trigger: the user tapped
+    on app icon or choose the app in app switcher. Example of indirect trigger:
+    the user tapped on GMail link or used Today's View extension. iOS only.
+  </description>
+</action>
+
 <action name="MostVisited0">
   <obsolete>No longer recorded.</obsolete>
   <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
@@ -18810,6 +18821,16 @@
   </description>
 </action>
 
+<action name="Settings_A11y_ShelfNavigationButtonsLearnMoreClicked">
+  <owner>gzadina@chromium.org</owner>
+  <owner>tbarzic@chromium.org</owner>
+  <description>
+    The user clicked the &quot;Learn more&quot; link for the setting to show
+    shelf navigation buttons when in tablet mode. The setting is part of
+    accessibility settings in Chrome OS settings page.
+  </description>
+</action>
+
 <action name="SettingsAppMonitor.AppFocused">
   <owner>grt@chromium.org</owner>
   <description>The Windows Settings app became focused.</description>
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml
index 87ceb2d..cf5b40a 100644
--- a/tools/metrics/ukm/ukm.xml
+++ b/tools/metrics/ukm/ukm.xml
@@ -6834,6 +6834,11 @@
       is in the foreground. Measured in milliseconds.
     </summary>
   </metric>
+  <metric name="DidCommit">
+    <summary>
+      Set to 1 if the navigation successfully commited.
+    </summary>
+  </metric>
   <metric name="DocumentTiming.NavigationToDOMContentLoadedEventFired">
     <summary>
       Measures the time in milliseconds from navigation timing's navigation
diff --git a/tools/perf/benchmark_schedules.csv b/tools/perf/benchmark_schedules.csv
index 4b1a856d..596c81d 100644
--- a/tools/perf/benchmark_schedules.csv
+++ b/tools/perf/benchmark_schedules.csv
@@ -1,61 +1,61 @@
 AUTOGENERATED FILE DO NOT EDIT
 View a prettier version of this at,https://docs.google.com/spreadsheets/d/1RQepnii8sGTGiSdcQfWPpaYMZd6SRk9bRKd_HrdC3jI
 benchmark name,total device usage hours per cycle,platforms count (unabridged),platforms count (abridged),platforms where unabridged,platforms where abridged
-rendering.mobile,8.67,3,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf",
-rendering.desktop,6.89,5,1,"linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",Win 7 Nvidia GPU Perf
-system_health.common_mobile,4.63,5,2,"Android Nexus5X WebView Perf, android-go-perf, android-go_webview-perf, android-pixel2-perf, android-pixel2_webview-perf","Android Nexus5 Perf, android-pixel2_weblayer-perf"
-system_health.memory_mobile,4.55,5,1,"Android Nexus5X WebView Perf, android-go-perf, android-go_webview-perf, android-pixel2-perf, android-pixel2_webview-perf",android-pixel2_weblayer-perf
-v8.browsing_mobile,3.87,5,0,"Android Nexus5X WebView Perf, android-go-perf, android-go_webview-perf, android-pixel2-perf, android-pixel2_webview-perf",
-system_health.common_desktop,3.23,5,0,"linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-system_health.memory_desktop,2.66,5,0,"linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-loading.desktop,2.54,5,1,"linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",Win 7 Perf
-blink_perf.layout,2.22,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-blink_perf.css,2.12,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-v8.browsing_desktop-future,1.75,5,0,"linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-v8.browsing_desktop,1.68,5,0,"linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-v8.runtime_stats.top_25,1.57,1,0,win-10_laptop_low_end-perf,
-startup.mobile,1.46,3,1,"android-go-perf, android-pixel2-perf, android-pixel2_weblayer-perf",Android Nexus5 Perf
-loading.mobile,1.32,3,1,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf",Android Nexus5 Perf
-blink_perf.bindings,1.21,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-rasterize_and_record_micro.top_25,1.21,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+rendering.desktop,13.83,5,1,"linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",Win 7 Nvidia GPU Perf
+rendering.mobile,10.06,3,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf",
+system_health.common_mobile,6.73,5,2,"Android Nexus5X WebView Perf, android-go-perf, android-go_webview-perf, android-pixel2-perf, android-pixel2_webview-perf","Android Nexus5 Perf, android-pixel2_weblayer-perf"
+system_health.memory_mobile,6.62,5,1,"Android Nexus5X WebView Perf, android-go-perf, android-go_webview-perf, android-pixel2-perf, android-pixel2_webview-perf",android-pixel2_weblayer-perf
+system_health.common_desktop,6.43,5,0,"linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+system_health.memory_desktop,5.33,5,0,"linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+loading.desktop,5.22,5,1,"linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",Win 7 Perf
+v8.browsing_mobile,4.14,5,0,"Android Nexus5X WebView Perf, android-go-perf, android-go_webview-perf, android-pixel2-perf, android-pixel2_webview-perf",
+v8.browsing_desktop-future,3.45,5,0,"linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+v8.browsing_desktop,3.37,5,0,"linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+blink_perf.layout,3.37,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+v8.runtime_stats.top_25,3.16,1,0,win-10_laptop_low_end-perf,
+blink_perf.bindings,1.99,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+rasterize_and_record_micro.top_25,1.95,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+power.desktop,1.73,5,0,"linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+loading.mobile,1.54,3,1,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf",Android Nexus5 Perf
+blink_perf.canvas,1.51,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+blink_perf.css,1.39,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+blink_perf.parser,1.29,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+media.desktop,1.22,5,0,"linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
 angle_perftests,1.10,2,0,"Win 7 Nvidia GPU Perf, win-10-perf",
-power.desktop,0.86,5,0,"linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-blink_perf.canvas,0.86,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-blink_perf.parser,0.83,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-media.desktop,0.61,5,0,"linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-blink_perf.paint,0.59,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-v8.browsing_mobile-future,0.54,1,0,android-pixel2-perf,
-webrtc,0.51,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-blink_perf.shadow_dom,0.49,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-blink_perf.image_decoder,0.49,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-jetstream2,0.36,5,0,"android-pixel2-perf, linux-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-speedometer2,0.33,10,0,"Android Nexus5X WebView Perf, android-go-perf, android-go_webview-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-dromaeo,0.32,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-blink_perf.dom,0.29,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-memory.desktop,0.28,5,0,"linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-blink_perf.events,0.27,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-jetstream,0.26,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-tracing.tracing_with_background_memory_infra,0.26,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-blink_perf.svg,0.24,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+v8.browsing_mobile-future,1.08,1,0,android-pixel2-perf,
+blink_perf.paint,1.01,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+startup.mobile,0.97,3,1,"android-go-perf, android-pixel2-perf, android-pixel2_weblayer-perf",Android Nexus5 Perf
+webrtc,0.86,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+blink_perf.image_decoder,0.78,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+blink_perf.shadow_dom,0.73,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+jetstream2,0.72,5,0,"android-pixel2-perf, linux-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+memory.desktop,0.57,5,0,"linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+dromaeo,0.54,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+jetstream,0.53,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+speedometer2,0.52,10,0,"Android Nexus5X WebView Perf, android-go-perf, android-go_webview-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+blink_perf.dom,0.49,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+tracing.tracing_with_background_memory_infra,0.45,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+blink_perf.events,0.42,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+blink_perf.svg,0.41,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+speedometer2-future,0.33,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+speedometer,0.30,10,0,"Android Nexus5X WebView Perf, android-go-perf, android-go_webview-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+blink_perf.owp_storage,0.28,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
 base_perftests,0.23,3,0,"linux-perf, mac-10_13_laptop_high_end-perf, win-10-perf",
-speedometer,0.19,10,0,"Android Nexus5X WebView Perf, android-go-perf, android-go_webview-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-speedometer2-future,0.18,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-blink_perf.owp_storage,0.15,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+media.mobile,0.20,1,0,android-pixel2-perf,
+octane,0.18,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+speedometer-future,0.18,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+blink_perf.accessibility,0.18,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
 dawn_perf_tests,0.15,2,0,"mac-10_13_laptop_high_end-perf, win-10-perf",
-octane,0.11,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-speedometer-future,0.11,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-blink_perf.accessibility,0.10,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-kraken,0.10,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-media.mobile,0.10,1,0,android-pixel2-perf,
+kraken,0.15,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
 components_perftests,0.09,3,0,"Android Nexus5 Perf, android-pixel2-perf, win-10-perf",
 performance_browser_tests,0.06,3,0,"linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf",
-dummy_benchmark.stable_benchmark_1,0.04,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+rasterize_and_record_micro.partial_invalidation,0.05,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+blink_perf.display_locking,0.04,1,0,mac-10_12_laptop_low_end-perf,
 net_perftests,0.03,2,0,"linux-perf, mac-10_13_laptop_high_end-perf",
+dummy_benchmark.noisy_benchmark_1,0.03,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
 tracing_perftests,0.03,2,0,"Android Nexus5 Perf, linux-perf",
-rasterize_and_record_micro.partial_invalidation,0.03,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+dummy_benchmark.stable_benchmark_1,0.02,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
 media_perftests,0.02,4,0,"android-pixel2-perf, linux-perf, mac-10_13_laptop_high_end-perf, win-10-perf",
-blink_perf.display_locking,0.02,1,0,mac-10_12_laptop_low_end-perf,
-dummy_benchmark.noisy_benchmark_1,0.02,8,0,"Android Nexus5X WebView Perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
 gpu_perftests,0.02,1,0,Android Nexus5 Perf,
 system_health.webview_startup,0.01,2,0,"Android Nexus5X WebView Perf, android-pixel2_webview-perf",
 views_perftests,0.00,2,0,"mac-10_13_laptop_high_end-perf, win-10-perf",
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps_manager_unittest.py b/tools/perf/core/perfetto_binary_roller/binary_deps_manager_unittest.py
index 511b7af..9ad75f7 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps_manager_unittest.py
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps_manager_unittest.py
@@ -17,9 +17,11 @@
   def setUp(self):
     self.temp_dir = tempfile.mkdtemp()
     self.config_path = os.path.join(self.temp_dir, 'config.json')
+    self.original_config_path = binary_deps_manager.CONFIG_PATH
     binary_deps_manager.CONFIG_PATH = self.config_path
 
   def tearDown(self):
+    binary_deps_manager.CONFIG_PATH = self.original_config_path
     shutil.rmtree(self.temp_dir)
 
   def writeConfig(self, config):
diff --git a/tools/perf/core/shard_maps/timing_data/android-go-perf_timing.json b/tools/perf/core/shard_maps/timing_data/android-go-perf_timing.json
index 1a5f6044..fe7f8c4c4 100644
--- a/tools/perf/core/shard_maps/timing_data/android-go-perf_timing.json
+++ b/tools/perf/core/shard_maps/timing_data/android-go-perf_timing.json
@@ -1,710 +1,710 @@
 [
     {
-        "duration": "143.0",
+        "duration": "284.0",
         "name": "speedometer/http://browserbench.org/Speedometer/"
     },
     {
-        "duration": "259.0",
+        "duration": "510.0",
         "name": "speedometer2/Speedometer2"
     },
     {
-        "duration": "149.0",
+        "duration": "308.0",
         "name": "startup.mobile/cct:coldish:bbc"
     },
     {
-        "duration": "181.0",
+        "duration": "376.0",
         "name": "startup.mobile/intent:coldish:bbc"
     },
     {
-        "duration": "153.0",
+        "duration": "324.0",
         "name": "startup.mobile/intent:warm:bbc"
     },
     {
-        "duration": "146.0",
+        "duration": "280.0",
         "name": "startup.mobile/maps_pwa:with_http_cache"
     },
     {
-        "duration": "44.0",
+        "duration": "92.0",
         "name": "system_health.common_mobile/background:media:imgur:2019"
     },
     {
-        "duration": "133.0",
+        "duration": "264.0",
         "name": "system_health.common_mobile/background:news:nytimes:2019"
     },
     {
-        "duration": "37.0",
+        "duration": "72.0",
         "name": "system_health.common_mobile/background:search:google:2019"
     },
     {
-        "duration": "31.0",
+        "duration": "62.0",
         "name": "system_health.common_mobile/background:social:facebook:2019"
     },
     {
-        "duration": "50.0",
+        "duration": "102.0",
         "name": "system_health.common_mobile/background:tools:gmail:2019"
     },
     {
-        "duration": "222.0",
+        "duration": "442.0",
         "name": "system_health.common_mobile/browse:chrome:newtab:2019"
     },
     {
-        "duration": "66.0",
+        "duration": "124.0",
         "name": "system_health.common_mobile/browse:chrome:omnibox:2019"
     },
     {
-        "duration": "99.0",
+        "duration": "196.0",
         "name": "system_health.common_mobile/browse:media:facebook_photos:2019"
     },
     {
-        "duration": "66.0",
+        "duration": "132.0",
         "name": "system_health.common_mobile/browse:media:flickr_infinite_scroll:2019"
     },
     {
-        "duration": "60.0",
+        "duration": "118.0",
         "name": "system_health.common_mobile/browse:media:googleplaystore:2019"
     },
     {
-        "duration": "113.0",
+        "duration": "228.0",
         "name": "system_health.common_mobile/browse:media:imgur:2019"
     },
     {
-        "duration": "81.0",
+        "duration": "164.0",
         "name": "system_health.common_mobile/browse:media:youtube:2019"
     },
     {
-        "duration": "174.0",
+        "duration": "344.0",
         "name": "system_health.common_mobile/browse:news:cnn:2018"
     },
     {
-        "duration": "79.0",
+        "duration": "162.0",
         "name": "system_health.common_mobile/browse:news:cricbuzz:2019"
     },
     {
-        "duration": "101.0",
+        "duration": "208.0",
         "name": "system_health.common_mobile/browse:news:globo:2019"
     },
     {
-        "duration": "252.0",
+        "duration": "440.0",
         "name": "system_health.common_mobile/browse:news:nytimes:2019"
     },
     {
-        "duration": "59.0",
+        "duration": "124.0",
         "name": "system_health.common_mobile/browse:news:qq:2019"
     },
     {
-        "duration": "108.0",
+        "duration": "222.0",
         "name": "system_health.common_mobile/browse:news:reddit:2019"
     },
     {
-        "duration": "143.0",
+        "duration": "286.0",
         "name": "system_health.common_mobile/browse:news:toi:2019"
     },
     {
-        "duration": "129.0",
+        "duration": "260.0",
         "name": "system_health.common_mobile/browse:news:washingtonpost:2019"
     },
     {
-        "duration": "31.0",
+        "duration": "64.0",
         "name": "system_health.common_mobile/browse:search:amp:2018"
     },
     {
-        "duration": "34.0",
+        "duration": "70.0",
         "name": "system_health.common_mobile/browse:search:amp:sxg:2019"
     },
     {
-        "duration": "87.0",
+        "duration": "174.0",
         "name": "system_health.common_mobile/browse:shopping:amazon:2019"
     },
     {
-        "duration": "82.0",
+        "duration": "166.0",
         "name": "system_health.common_mobile/browse:shopping:avito:2019"
     },
     {
-        "duration": "88.0",
+        "duration": "178.0",
         "name": "system_health.common_mobile/browse:shopping:flipkart:2019"
     },
     {
-        "duration": "119.0",
+        "duration": "238.0",
         "name": "system_health.common_mobile/browse:shopping:lazada:2019"
     },
     {
-        "duration": "88.0",
+        "duration": "172.0",
         "name": "system_health.common_mobile/browse:social:facebook:2019"
     },
     {
-        "duration": "99.0",
+        "duration": "192.0",
         "name": "system_health.common_mobile/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "107.0",
+        "duration": "216.0",
         "name": "system_health.common_mobile/browse:social:instagram:2019"
     },
     {
-        "duration": "65.0",
+        "duration": "8.0",
         "name": "system_health.common_mobile/browse:social:pinterest_infinite_scroll:2019"
     },
     {
-        "duration": "98.0",
+        "duration": "196.0",
         "name": "system_health.common_mobile/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "100.0",
+        "duration": "204.0",
         "name": "system_health.common_mobile/browse:social:twitter:2019"
     },
     {
-        "duration": "92.0",
+        "duration": "188.0",
         "name": "system_health.common_mobile/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "62.0",
+        "duration": "124.0",
         "name": "system_health.common_mobile/browse:tools:maps:2019"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "system_health.common_mobile/load:chrome:blank"
     },
     {
-        "duration": "29.0",
+        "duration": "60.0",
         "name": "system_health.common_mobile/load:games:bubbles:2019"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "system_health.common_mobile/load:games:lazors"
     },
     {
-        "duration": "38.0",
+        "duration": "78.0",
         "name": "system_health.common_mobile/load:games:spychase:2018"
     },
     {
-        "duration": "41.0",
+        "duration": "84.0",
         "name": "system_health.common_mobile/load:media:dailymotion:2019"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "system_health.common_mobile/load:media:facebook_photos:2019"
     },
     {
-        "duration": "39.0",
+        "duration": "80.0",
         "name": "system_health.common_mobile/load:media:flickr:2018"
     },
     {
-        "duration": "32.0",
+        "duration": "66.0",
         "name": "system_health.common_mobile/load:media:google_images:2018"
     },
     {
-        "duration": "39.0",
+        "duration": "78.0",
         "name": "system_health.common_mobile/load:media:imgur:2018"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "system_health.common_mobile/load:media:soundcloud:2018"
     },
     {
-        "duration": "32.0",
+        "duration": "66.0",
         "name": "system_health.common_mobile/load:media:youtube:2018"
     },
     {
-        "duration": "33.0",
+        "duration": "68.0",
         "name": "system_health.common_mobile/load:news:bbc:2019"
     },
     {
-        "duration": "50.0",
+        "duration": "100.0",
         "name": "system_health.common_mobile/load:news:cnn:2018"
     },
     {
-        "duration": "43.0",
+        "duration": "80.0",
         "name": "system_health.common_mobile/load:news:irctc:2019"
     },
     {
-        "duration": "63.0",
+        "duration": "128.0",
         "name": "system_health.common_mobile/load:news:nytimes:2019"
     },
     {
-        "duration": "35.0",
+        "duration": "72.0",
         "name": "system_health.common_mobile/load:news:qq:2019"
     },
     {
-        "duration": "34.0",
+        "duration": "70.0",
         "name": "system_health.common_mobile/load:news:reddit:2019"
     },
     {
-        "duration": "32.0",
+        "duration": "64.0",
         "name": "system_health.common_mobile/load:news:washingtonpost:2019"
     },
     {
-        "duration": "30.0",
+        "duration": "62.0",
         "name": "system_health.common_mobile/load:news:wikipedia:2018"
     },
     {
-        "duration": "37.0",
+        "duration": "74.0",
         "name": "system_health.common_mobile/load:search:amazon:2019"
     },
     {
-        "duration": "42.0",
+        "duration": "84.0",
         "name": "system_health.common_mobile/load:search:baidu:2018"
     },
     {
-        "duration": "32.0",
+        "duration": "64.0",
         "name": "system_health.common_mobile/load:search:ebay:2018"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "system_health.common_mobile/load:search:google:2018"
     },
     {
-        "duration": "30.0",
+        "duration": "62.0",
         "name": "system_health.common_mobile/load:search:taobao:2019"
     },
     {
-        "duration": "27.0",
+        "duration": "56.0",
         "name": "system_health.common_mobile/load:search:yahoo:2018"
     },
     {
-        "duration": "31.0",
+        "duration": "64.0",
         "name": "system_health.common_mobile/load:search:yandex:2018"
     },
     {
-        "duration": "30.0",
+        "duration": "62.0",
         "name": "system_health.common_mobile/load:social:instagram:2019"
     },
     {
-        "duration": "37.0",
+        "duration": "76.0",
         "name": "system_health.common_mobile/load:social:pinterest:2019"
     },
     {
-        "duration": "31.0",
+        "duration": "64.0",
         "name": "system_health.common_mobile/load:social:twitter:2019"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "system_health.common_mobile/load:tools:docs:2019"
     },
     {
-        "duration": "33.0",
+        "duration": "66.0",
         "name": "system_health.common_mobile/load:tools:drive:2019"
     },
     {
-        "duration": "71.0",
+        "duration": "144.0",
         "name": "system_health.common_mobile/load:tools:dropbox:2019"
     },
     {
-        "duration": "51.0",
+        "duration": "104.0",
         "name": "system_health.common_mobile/load:tools:gmail:2019"
     },
     {
-        "duration": "31.0",
+        "duration": "64.0",
         "name": "system_health.common_mobile/load:tools:stackoverflow:2018"
     },
     {
-        "duration": "30.0",
+        "duration": "62.0",
         "name": "system_health.common_mobile/load:tools:weather:2019"
     },
     {
-        "duration": "3.0",
+        "duration": "8.0",
         "name": "system_health.common_mobile/long_running:tools:gmail-background"
     },
     {
-        "duration": "3.0",
+        "duration": "8.0",
         "name": "system_health.common_mobile/long_running:tools:gmail-foreground"
     },
     {
-        "duration": "47.0",
+        "duration": "90.0",
         "name": "system_health.memory_mobile/background:media:imgur:2019"
     },
     {
-        "duration": "126.0",
+        "duration": "254.0",
         "name": "system_health.memory_mobile/background:news:nytimes:2019"
     },
     {
-        "duration": "39.0",
+        "duration": "80.0",
         "name": "system_health.memory_mobile/background:search:google:2019"
     },
     {
-        "duration": "34.0",
+        "duration": "72.0",
         "name": "system_health.memory_mobile/background:social:facebook:2019"
     },
     {
-        "duration": "52.0",
+        "duration": "106.0",
         "name": "system_health.memory_mobile/background:tools:gmail:2019"
     },
     {
-        "duration": "223.0",
+        "duration": "452.0",
         "name": "system_health.memory_mobile/browse:chrome:newtab:2019"
     },
     {
-        "duration": "70.0",
+        "duration": "134.0",
         "name": "system_health.memory_mobile/browse:chrome:omnibox:2019"
     },
     {
-        "duration": "97.0",
+        "duration": "196.0",
         "name": "system_health.memory_mobile/browse:media:facebook_photos:2019"
     },
     {
-        "duration": "68.0",
+        "duration": "138.0",
         "name": "system_health.memory_mobile/browse:media:flickr_infinite_scroll:2019"
     },
     {
-        "duration": "61.0",
+        "duration": "124.0",
         "name": "system_health.memory_mobile/browse:media:googleplaystore:2019"
     },
     {
-        "duration": "104.0",
+        "duration": "210.0",
         "name": "system_health.memory_mobile/browse:media:imgur:2019"
     },
     {
-        "duration": "78.0",
+        "duration": "158.0",
         "name": "system_health.memory_mobile/browse:media:youtube:2019"
     },
     {
-        "duration": "2.0",
+        "duration": "6.0",
         "name": "system_health.memory_mobile/browse:news:cnn:2018"
     },
     {
-        "duration": "76.0",
+        "duration": "152.0",
         "name": "system_health.memory_mobile/browse:news:cricbuzz:2019"
     },
     {
-        "duration": "100.0",
+        "duration": "204.0",
         "name": "system_health.memory_mobile/browse:news:globo:2019"
     },
     {
-        "duration": "219.0",
+        "duration": "406.0",
         "name": "system_health.memory_mobile/browse:news:nytimes:2019"
     },
     {
-        "duration": "62.0",
+        "duration": "124.0",
         "name": "system_health.memory_mobile/browse:news:qq:2019"
     },
     {
-        "duration": "111.0",
+        "duration": "218.0",
         "name": "system_health.memory_mobile/browse:news:reddit:2019"
     },
     {
-        "duration": "133.0",
+        "duration": "262.0",
         "name": "system_health.memory_mobile/browse:news:toi:2019"
     },
     {
-        "duration": "127.0",
+        "duration": "252.0",
         "name": "system_health.memory_mobile/browse:news:washingtonpost:2019"
     },
     {
-        "duration": "35.0",
+        "duration": "70.0",
         "name": "system_health.memory_mobile/browse:search:amp:2018"
     },
     {
-        "duration": "38.0",
+        "duration": "78.0",
         "name": "system_health.memory_mobile/browse:search:amp:sxg:2019"
     },
     {
-        "duration": "83.0",
+        "duration": "166.0",
         "name": "system_health.memory_mobile/browse:shopping:amazon:2019"
     },
     {
-        "duration": "79.0",
+        "duration": "158.0",
         "name": "system_health.memory_mobile/browse:shopping:avito:2019"
     },
     {
-        "duration": "89.0",
+        "duration": "178.0",
         "name": "system_health.memory_mobile/browse:shopping:flipkart:2019"
     },
     {
-        "duration": "111.0",
+        "duration": "222.0",
         "name": "system_health.memory_mobile/browse:shopping:lazada:2019"
     },
     {
-        "duration": "86.0",
+        "duration": "174.0",
         "name": "system_health.memory_mobile/browse:social:facebook:2019"
     },
     {
-        "duration": "94.0",
+        "duration": "188.0",
         "name": "system_health.memory_mobile/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "107.0",
+        "duration": "216.0",
         "name": "system_health.memory_mobile/browse:social:instagram:2019"
     },
     {
-        "duration": "124.0",
+        "duration": "248.0",
         "name": "system_health.memory_mobile/browse:social:pinterest_infinite_scroll:2019"
     },
     {
-        "duration": "95.0",
+        "duration": "192.0",
         "name": "system_health.memory_mobile/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "104.0",
+        "duration": "212.0",
         "name": "system_health.memory_mobile/browse:social:twitter:2019"
     },
     {
-        "duration": "88.0",
+        "duration": "182.0",
         "name": "system_health.memory_mobile/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "62.0",
+        "duration": "126.0",
         "name": "system_health.memory_mobile/browse:tools:maps:2019"
     },
     {
-        "duration": "31.0",
+        "duration": "62.0",
         "name": "system_health.memory_mobile/load:chrome:blank"
     },
     {
-        "duration": "32.0",
+        "duration": "66.0",
         "name": "system_health.memory_mobile/load:games:bubbles:2019"
     },
     {
-        "duration": "32.0",
+        "duration": "66.0",
         "name": "system_health.memory_mobile/load:games:lazors"
     },
     {
-        "duration": "41.0",
+        "duration": "84.0",
         "name": "system_health.memory_mobile/load:games:spychase:2018"
     },
     {
-        "duration": "46.0",
+        "duration": "92.0",
         "name": "system_health.memory_mobile/load:media:dailymotion:2019"
     },
     {
-        "duration": "33.0",
+        "duration": "66.0",
         "name": "system_health.memory_mobile/load:media:facebook_photos:2019"
     },
     {
-        "duration": "43.0",
+        "duration": "86.0",
         "name": "system_health.memory_mobile/load:media:flickr:2018"
     },
     {
-        "duration": "36.0",
+        "duration": "72.0",
         "name": "system_health.memory_mobile/load:media:google_images:2018"
     },
     {
-        "duration": "42.0",
+        "duration": "84.0",
         "name": "system_health.memory_mobile/load:media:imgur:2018"
     },
     {
-        "duration": "32.0",
+        "duration": "68.0",
         "name": "system_health.memory_mobile/load:media:soundcloud:2018"
     },
     {
-        "duration": "36.0",
+        "duration": "72.0",
         "name": "system_health.memory_mobile/load:media:youtube:2018"
     },
     {
-        "duration": "37.0",
+        "duration": "76.0",
         "name": "system_health.memory_mobile/load:news:bbc:2019"
     },
     {
-        "duration": "54.0",
+        "duration": "108.0",
         "name": "system_health.memory_mobile/load:news:cnn:2018"
     },
     {
-        "duration": "45.0",
+        "duration": "88.0",
         "name": "system_health.memory_mobile/load:news:irctc:2019"
     },
     {
-        "duration": "64.0",
+        "duration": "130.0",
         "name": "system_health.memory_mobile/load:news:nytimes:2019"
     },
     {
-        "duration": "39.0",
+        "duration": "80.0",
         "name": "system_health.memory_mobile/load:news:qq:2019"
     },
     {
-        "duration": "38.0",
+        "duration": "78.0",
         "name": "system_health.memory_mobile/load:news:reddit:2019"
     },
     {
-        "duration": "36.0",
+        "duration": "72.0",
         "name": "system_health.memory_mobile/load:news:washingtonpost:2019"
     },
     {
-        "duration": "35.0",
+        "duration": "70.0",
         "name": "system_health.memory_mobile/load:news:wikipedia:2018"
     },
     {
-        "duration": "40.0",
+        "duration": "82.0",
         "name": "system_health.memory_mobile/load:search:amazon:2019"
     },
     {
-        "duration": "44.0",
+        "duration": "90.0",
         "name": "system_health.memory_mobile/load:search:baidu:2018"
     },
     {
-        "duration": "36.0",
+        "duration": "72.0",
         "name": "system_health.memory_mobile/load:search:ebay:2018"
     },
     {
-        "duration": "34.0",
+        "duration": "72.0",
         "name": "system_health.memory_mobile/load:search:google:2018"
     },
     {
-        "duration": "35.0",
+        "duration": "70.0",
         "name": "system_health.memory_mobile/load:search:taobao:2019"
     },
     {
-        "duration": "31.0",
+        "duration": "62.0",
         "name": "system_health.memory_mobile/load:search:yahoo:2018"
     },
     {
-        "duration": "35.0",
+        "duration": "70.0",
         "name": "system_health.memory_mobile/load:search:yandex:2018"
     },
     {
-        "duration": "35.0",
+        "duration": "72.0",
         "name": "system_health.memory_mobile/load:social:instagram:2019"
     },
     {
-        "duration": "41.0",
+        "duration": "84.0",
         "name": "system_health.memory_mobile/load:social:pinterest:2019"
     },
     {
-        "duration": "35.0",
+        "duration": "70.0",
         "name": "system_health.memory_mobile/load:social:twitter:2019"
     },
     {
-        "duration": "33.0",
+        "duration": "64.0",
         "name": "system_health.memory_mobile/load:tools:docs:2019"
     },
     {
-        "duration": "37.0",
+        "duration": "74.0",
         "name": "system_health.memory_mobile/load:tools:drive:2019"
     },
     {
-        "duration": "73.0",
+        "duration": "146.0",
         "name": "system_health.memory_mobile/load:tools:dropbox:2019"
     },
     {
-        "duration": "53.0",
+        "duration": "106.0",
         "name": "system_health.memory_mobile/load:tools:gmail:2019"
     },
     {
-        "duration": "35.0",
+        "duration": "70.0",
         "name": "system_health.memory_mobile/load:tools:stackoverflow:2018"
     },
     {
-        "duration": "34.0",
+        "duration": "70.0",
         "name": "system_health.memory_mobile/load:tools:weather:2019"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "system_health.memory_mobile/long_running:tools:gmail-background"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "system_health.memory_mobile/long_running:tools:gmail-foreground"
     },
     {
-        "duration": "232.0",
+        "duration": "464.0",
         "name": "v8.browsing_mobile/browse:chrome:newtab:2019"
     },
     {
-        "duration": "75.0",
+        "duration": "146.0",
         "name": "v8.browsing_mobile/browse:chrome:omnibox:2019"
     },
     {
-        "duration": "116.0",
+        "duration": "238.0",
         "name": "v8.browsing_mobile/browse:media:facebook_photos:2019"
     },
     {
-        "duration": "84.0",
+        "duration": "174.0",
         "name": "v8.browsing_mobile/browse:media:flickr_infinite_scroll:2019"
     },
     {
-        "duration": "73.0",
+        "duration": "150.0",
         "name": "v8.browsing_mobile/browse:media:googleplaystore:2019"
     },
     {
-        "duration": "147.0",
+        "duration": "302.0",
         "name": "v8.browsing_mobile/browse:media:imgur:2019"
     },
     {
-        "duration": "111.0",
+        "duration": "208.0",
         "name": "v8.browsing_mobile/browse:media:youtube:2019"
     },
     {
-        "duration": "8.0",
+        "duration": "20.0",
         "name": "v8.browsing_mobile/browse:news:cnn:2018"
     },
     {
-        "duration": "103.0",
+        "duration": "212.0",
         "name": "v8.browsing_mobile/browse:news:cricbuzz:2019"
     },
     {
-        "duration": "125.0",
+        "duration": "256.0",
         "name": "v8.browsing_mobile/browse:news:globo:2019"
     },
     {
-        "duration": "394.0",
+        "duration": "690.0",
         "name": "v8.browsing_mobile/browse:news:nytimes:2019"
     },
     {
-        "duration": "76.0",
+        "duration": "148.0",
         "name": "v8.browsing_mobile/browse:news:qq:2019"
     },
     {
-        "duration": "155.0",
+        "duration": "304.0",
         "name": "v8.browsing_mobile/browse:news:reddit:2019"
     },
     {
-        "duration": "187.0",
+        "duration": "382.0",
         "name": "v8.browsing_mobile/browse:news:toi:2019"
     },
     {
-        "duration": "189.0",
+        "duration": "364.0",
         "name": "v8.browsing_mobile/browse:news:washingtonpost:2019"
     },
     {
-        "duration": "37.0",
+        "duration": "80.0",
         "name": "v8.browsing_mobile/browse:search:amp:2018"
     },
     {
-        "duration": "44.0",
+        "duration": "90.0",
         "name": "v8.browsing_mobile/browse:search:amp:sxg:2019"
     },
     {
-        "duration": "113.0",
+        "duration": "276.0",
         "name": "v8.browsing_mobile/browse:shopping:amazon:2019"
     },
     {
-        "duration": "107.0",
+        "duration": "218.0",
         "name": "v8.browsing_mobile/browse:shopping:avito:2019"
     },
     {
-        "duration": "120.0",
+        "duration": "246.0",
         "name": "v8.browsing_mobile/browse:shopping:flipkart:2019"
     },
     {
-        "duration": "156.0",
+        "duration": "318.0",
         "name": "v8.browsing_mobile/browse:shopping:lazada:2019"
     },
     {
-        "duration": "123.0",
+        "duration": "248.0",
         "name": "v8.browsing_mobile/browse:social:facebook:2019"
     },
     {
-        "duration": "120.0",
+        "duration": "246.0",
         "name": "v8.browsing_mobile/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "139.0",
+        "duration": "266.0",
         "name": "v8.browsing_mobile/browse:social:instagram:2019"
     },
     {
-        "duration": "172.0",
+        "duration": "94.0",
         "name": "v8.browsing_mobile/browse:social:pinterest_infinite_scroll:2019"
     },
     {
-        "duration": "123.0",
+        "duration": "242.0",
         "name": "v8.browsing_mobile/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "131.0",
+        "duration": "242.0",
         "name": "v8.browsing_mobile/browse:social:twitter:2019"
     },
     {
-        "duration": "111.0",
+        "duration": "234.0",
         "name": "v8.browsing_mobile/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "75.0",
+        "duration": "154.0",
         "name": "v8.browsing_mobile/browse:tools:maps:2019"
     }
 ]
\ No newline at end of file
diff --git a/tools/perf/core/shard_maps/timing_data/android-go_webview-perf_timing.json b/tools/perf/core/shard_maps/timing_data/android-go_webview-perf_timing.json
index f9d839db..67beaa4 100644
--- a/tools/perf/core/shard_maps/timing_data/android-go_webview-perf_timing.json
+++ b/tools/perf/core/shard_maps/timing_data/android-go_webview-perf_timing.json
@@ -1,122 +1,122 @@
 [
     {
-        "duration": "142.0",
+        "duration": "137.0",
         "name": "speedometer/http://browserbench.org/Speedometer/"
     },
     {
-        "duration": "272.0",
+        "duration": "251.0",
         "name": "speedometer2/Speedometer2"
     },
     {
-        "duration": "40.0",
+        "duration": "42.0",
         "name": "system_health.common_mobile/background:media:imgur:2019"
     },
     {
-        "duration": "128.0",
+        "duration": "117.0",
         "name": "system_health.common_mobile/background:news:nytimes:2019"
     },
     {
-        "duration": "39.0",
+        "duration": "34.0",
         "name": "system_health.common_mobile/background:search:google:2019"
     },
     {
-        "duration": "51.0",
+        "duration": "29.0",
         "name": "system_health.common_mobile/background:social:facebook:2019"
     },
     {
-        "duration": "62.0",
+        "duration": "45.0",
         "name": "system_health.common_mobile/background:tools:gmail:2019"
     },
     {
-        "duration": "11.0",
+        "duration": "12.0",
         "name": "system_health.common_mobile/browse:chrome:newtab:2019"
     },
     {
-        "duration": "12.0",
+        "duration": "14.0",
         "name": "system_health.common_mobile/browse:chrome:omnibox:2019"
     },
     {
-        "duration": "90.0",
+        "duration": "94.0",
         "name": "system_health.common_mobile/browse:media:facebook_photos:2019"
     },
     {
-        "duration": "59.0",
+        "duration": "65.0",
         "name": "system_health.common_mobile/browse:media:flickr_infinite_scroll:2019"
     },
     {
-        "duration": "55.0",
+        "duration": "57.0",
         "name": "system_health.common_mobile/browse:media:googleplaystore:2019"
     },
     {
-        "duration": "101.0",
+        "duration": "106.0",
         "name": "system_health.common_mobile/browse:media:imgur:2019"
     },
     {
-        "duration": "79.0",
+        "duration": "82.0",
         "name": "system_health.common_mobile/browse:media:youtube:2019"
     },
     {
-        "duration": "161.0",
+        "duration": "159.0",
         "name": "system_health.common_mobile/browse:news:cnn:2018"
     },
     {
-        "duration": "76.0",
+        "duration": "69.0",
         "name": "system_health.common_mobile/browse:news:cricbuzz:2019"
     },
     {
-        "duration": "119.0",
+        "duration": "112.0",
         "name": "system_health.common_mobile/browse:news:globo:2019"
     },
     {
-        "duration": "272.0",
+        "duration": "228.0",
         "name": "system_health.common_mobile/browse:news:nytimes:2019"
     },
     {
-        "duration": "61.0",
+        "duration": "65.0",
         "name": "system_health.common_mobile/browse:news:qq:2019"
     },
     {
-        "duration": "102.0",
+        "duration": "108.0",
         "name": "system_health.common_mobile/browse:news:reddit:2019"
     },
     {
-        "duration": "132.0",
+        "duration": "128.0",
         "name": "system_health.common_mobile/browse:news:toi:2019"
     },
     {
-        "duration": "122.0",
+        "duration": "123.0",
         "name": "system_health.common_mobile/browse:news:washingtonpost:2019"
     },
     {
-        "duration": "26.0",
+        "duration": "30.0",
         "name": "system_health.common_mobile/browse:search:amp:2018"
     },
     {
-        "duration": "31.0",
+        "duration": "33.0",
         "name": "system_health.common_mobile/browse:search:amp:sxg:2019"
     },
     {
-        "duration": "86.0",
+        "duration": "79.0",
         "name": "system_health.common_mobile/browse:shopping:amazon:2019"
     },
     {
-        "duration": "83.0",
+        "duration": "75.0",
         "name": "system_health.common_mobile/browse:shopping:avito:2019"
     },
     {
-        "duration": "89.0",
+        "duration": "84.0",
         "name": "system_health.common_mobile/browse:shopping:flipkart:2019"
     },
     {
-        "duration": "4.0",
+        "duration": "6.0",
         "name": "system_health.common_mobile/browse:shopping:lazada:2019"
     },
     {
-        "duration": "82.0",
+        "duration": "83.0",
         "name": "system_health.common_mobile/browse:social:facebook:2019"
     },
     {
-        "duration": "102.0",
+        "duration": "94.0",
         "name": "system_health.common_mobile/browse:social:facebook_infinite_scroll:2018"
     },
     {
@@ -124,23 +124,23 @@
         "name": "system_health.common_mobile/browse:social:instagram:2019"
     },
     {
-        "duration": "3.0",
+        "duration": "5.0",
         "name": "system_health.common_mobile/browse:social:pinterest_infinite_scroll:2019"
     },
     {
-        "duration": "90.0",
+        "duration": "91.0",
         "name": "system_health.common_mobile/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "98.0",
+        "duration": "101.0",
         "name": "system_health.common_mobile/browse:social:twitter:2019"
     },
     {
-        "duration": "91.0",
+        "duration": "103.0",
         "name": "system_health.common_mobile/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "57.0",
+        "duration": "60.0",
         "name": "system_health.common_mobile/browse:tools:maps:2019"
     },
     {
@@ -152,11 +152,11 @@
         "name": "system_health.common_mobile/load:games:bubbles:2019"
     },
     {
-        "duration": "26.0",
+        "duration": "25.0",
         "name": "system_health.common_mobile/load:games:lazors"
     },
     {
-        "duration": "3.0",
+        "duration": "34.0",
         "name": "system_health.common_mobile/load:games:spychase:2018"
     },
     {
@@ -168,7 +168,7 @@
         "name": "system_health.common_mobile/load:media:facebook_photos:2019"
     },
     {
-        "duration": "36.0",
+        "duration": "35.0",
         "name": "system_health.common_mobile/load:media:flickr:2018"
     },
     {
@@ -192,19 +192,19 @@
         "name": "system_health.common_mobile/load:news:bbc:2019"
     },
     {
-        "duration": "47.0",
+        "duration": "46.0",
         "name": "system_health.common_mobile/load:news:cnn:2018"
     },
     {
-        "duration": "35.0",
+        "duration": "34.0",
         "name": "system_health.common_mobile/load:news:irctc:2019"
     },
     {
-        "duration": "63.0",
+        "duration": "61.0",
         "name": "system_health.common_mobile/load:news:nytimes:2019"
     },
     {
-        "duration": "32.0",
+        "duration": "33.0",
         "name": "system_health.common_mobile/load:news:qq:2019"
     },
     {
@@ -220,11 +220,11 @@
         "name": "system_health.common_mobile/load:news:wikipedia:2018"
     },
     {
-        "duration": "33.0",
+        "duration": "32.0",
         "name": "system_health.common_mobile/load:search:amazon:2019"
     },
     {
-        "duration": "38.0",
+        "duration": "35.0",
         "name": "system_health.common_mobile/load:search:baidu:2018"
     },
     {
@@ -232,15 +232,15 @@
         "name": "system_health.common_mobile/load:search:ebay:2018"
     },
     {
-        "duration": "24.0",
+        "duration": "25.0",
         "name": "system_health.common_mobile/load:search:google:2018"
     },
     {
-        "duration": "26.0",
+        "duration": "25.0",
         "name": "system_health.common_mobile/load:search:taobao:2019"
     },
     {
-        "duration": "23.0",
+        "duration": "24.0",
         "name": "system_health.common_mobile/load:search:yahoo:2018"
     },
     {
@@ -264,7 +264,7 @@
         "name": "system_health.common_mobile/load:tools:docs:2019"
     },
     {
-        "duration": "30.0",
+        "duration": "29.0",
         "name": "system_health.common_mobile/load:tools:drive:2019"
     },
     {
@@ -272,7 +272,7 @@
         "name": "system_health.common_mobile/load:tools:dropbox:2019"
     },
     {
-        "duration": "44.0",
+        "duration": "43.0",
         "name": "system_health.common_mobile/load:tools:gmail:2019"
     },
     {
@@ -280,7 +280,7 @@
         "name": "system_health.common_mobile/load:tools:stackoverflow:2018"
     },
     {
-        "duration": "27.0",
+        "duration": "28.0",
         "name": "system_health.common_mobile/load:tools:weather:2019"
     },
     {
@@ -296,15 +296,15 @@
         "name": "system_health.memory_mobile/background:media:imgur:2019"
     },
     {
-        "duration": "116.0",
+        "duration": "115.0",
         "name": "system_health.memory_mobile/background:news:nytimes:2019"
     },
     {
-        "duration": "37.0",
+        "duration": "38.0",
         "name": "system_health.memory_mobile/background:search:google:2019"
     },
     {
-        "duration": "32.0",
+        "duration": "34.0",
         "name": "system_health.memory_mobile/background:social:facebook:2019"
     },
     {
@@ -312,7 +312,7 @@
         "name": "system_health.memory_mobile/background:tools:gmail:2019"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "system_health.memory_mobile/browse:chrome:newtab:2019"
     },
     {
@@ -320,15 +320,15 @@
         "name": "system_health.memory_mobile/browse:chrome:omnibox:2019"
     },
     {
-        "duration": "93.0",
+        "duration": "94.0",
         "name": "system_health.memory_mobile/browse:media:facebook_photos:2019"
     },
     {
-        "duration": "64.0",
+        "duration": "65.0",
         "name": "system_health.memory_mobile/browse:media:flickr_infinite_scroll:2019"
     },
     {
-        "duration": "58.0",
+        "duration": "57.0",
         "name": "system_health.memory_mobile/browse:media:googleplaystore:2019"
     },
     {
@@ -344,51 +344,51 @@
         "name": "system_health.memory_mobile/browse:news:cnn:2018"
     },
     {
-        "duration": "68.0",
+        "duration": "70.0",
         "name": "system_health.memory_mobile/browse:news:cricbuzz:2019"
     },
     {
-        "duration": "110.0",
+        "duration": "108.0",
         "name": "system_health.memory_mobile/browse:news:globo:2019"
     },
     {
-        "duration": "257.0",
+        "duration": "212.0",
         "name": "system_health.memory_mobile/browse:news:nytimes:2019"
     },
     {
-        "duration": "64.0",
+        "duration": "65.0",
         "name": "system_health.memory_mobile/browse:news:qq:2019"
     },
     {
-        "duration": "105.0",
+        "duration": "104.0",
         "name": "system_health.memory_mobile/browse:news:reddit:2019"
     },
     {
-        "duration": "125.0",
+        "duration": "120.0",
         "name": "system_health.memory_mobile/browse:news:toi:2019"
     },
     {
-        "duration": "121.0",
+        "duration": "119.0",
         "name": "system_health.memory_mobile/browse:news:washingtonpost:2019"
     },
     {
-        "duration": "31.0",
+        "duration": "32.0",
         "name": "system_health.memory_mobile/browse:search:amp:2018"
     },
     {
-        "duration": "35.0",
+        "duration": "36.0",
         "name": "system_health.memory_mobile/browse:search:amp:sxg:2019"
     },
     {
-        "duration": "79.0",
+        "duration": "78.0",
         "name": "system_health.memory_mobile/browse:shopping:amazon:2019"
     },
     {
-        "duration": "74.0",
+        "duration": "75.0",
         "name": "system_health.memory_mobile/browse:shopping:avito:2019"
     },
     {
-        "duration": "86.0",
+        "duration": "85.0",
         "name": "system_health.memory_mobile/browse:shopping:flipkart:2019"
     },
     {
@@ -396,15 +396,15 @@
         "name": "system_health.memory_mobile/browse:shopping:lazada:2019"
     },
     {
-        "duration": "101.0",
+        "duration": "82.0",
         "name": "system_health.memory_mobile/browse:social:facebook:2019"
     },
     {
-        "duration": "97.0",
+        "duration": "92.0",
         "name": "system_health.memory_mobile/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "system_health.memory_mobile/browse:social:instagram:2019"
     },
     {
@@ -416,7 +416,7 @@
         "name": "system_health.memory_mobile/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "101.0",
+        "duration": "107.0",
         "name": "system_health.memory_mobile/browse:social:twitter:2019"
     },
     {
@@ -424,35 +424,35 @@
         "name": "system_health.memory_mobile/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "59.0",
+        "duration": "58.0",
         "name": "system_health.memory_mobile/browse:tools:maps:2019"
     },
     {
-        "duration": "28.0",
+        "duration": "29.0",
         "name": "system_health.memory_mobile/load:chrome:blank"
     },
     {
-        "duration": "29.0",
+        "duration": "30.0",
         "name": "system_health.memory_mobile/load:games:bubbles:2019"
     },
     {
-        "duration": "29.0",
+        "duration": "30.0",
         "name": "system_health.memory_mobile/load:games:lazors"
     },
     {
-        "duration": "2.0",
+        "duration": "38.0",
         "name": "system_health.memory_mobile/load:games:spychase:2018"
     },
     {
-        "duration": "40.0",
+        "duration": "39.0",
         "name": "system_health.memory_mobile/load:media:dailymotion:2019"
     },
     {
-        "duration": "30.0",
+        "duration": "29.0",
         "name": "system_health.memory_mobile/load:media:facebook_photos:2019"
     },
     {
-        "duration": "41.0",
+        "duration": "40.0",
         "name": "system_health.memory_mobile/load:media:flickr:2018"
     },
     {
@@ -460,11 +460,11 @@
         "name": "system_health.memory_mobile/load:media:google_images:2018"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "system_health.memory_mobile/load:media:imgur:2018"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "system_health.memory_mobile/load:media:soundcloud:2018"
     },
     {
@@ -476,7 +476,7 @@
         "name": "system_health.memory_mobile/load:news:bbc:2019"
     },
     {
-        "duration": "52.0",
+        "duration": "51.0",
         "name": "system_health.memory_mobile/load:news:cnn:2018"
     },
     {
@@ -484,15 +484,15 @@
         "name": "system_health.memory_mobile/load:news:irctc:2019"
     },
     {
-        "duration": "65.0",
+        "duration": "63.0",
         "name": "system_health.memory_mobile/load:news:nytimes:2019"
     },
     {
-        "duration": "36.0",
+        "duration": "38.0",
         "name": "system_health.memory_mobile/load:news:qq:2019"
     },
     {
-        "duration": "35.0",
+        "duration": "36.0",
         "name": "system_health.memory_mobile/load:news:reddit:2019"
     },
     {
@@ -516,7 +516,7 @@
         "name": "system_health.memory_mobile/load:search:ebay:2018"
     },
     {
-        "duration": "30.0",
+        "duration": "31.0",
         "name": "system_health.memory_mobile/load:search:google:2018"
     },
     {
@@ -524,7 +524,7 @@
         "name": "system_health.memory_mobile/load:search:taobao:2019"
     },
     {
-        "duration": "28.0",
+        "duration": "29.0",
         "name": "system_health.memory_mobile/load:search:yahoo:2018"
     },
     {
@@ -532,23 +532,23 @@
         "name": "system_health.memory_mobile/load:search:yandex:2018"
     },
     {
-        "duration": "32.0",
+        "duration": "33.0",
         "name": "system_health.memory_mobile/load:social:instagram:2019"
     },
     {
-        "duration": "37.0",
+        "duration": "38.0",
         "name": "system_health.memory_mobile/load:social:pinterest:2019"
     },
     {
-        "duration": "31.0",
+        "duration": "32.0",
         "name": "system_health.memory_mobile/load:social:twitter:2019"
     },
     {
-        "duration": "31.0",
+        "duration": "30.0",
         "name": "system_health.memory_mobile/load:tools:docs:2019"
     },
     {
-        "duration": "35.0",
+        "duration": "34.0",
         "name": "system_health.memory_mobile/load:tools:drive:2019"
     },
     {
@@ -556,15 +556,15 @@
         "name": "system_health.memory_mobile/load:tools:dropbox:2019"
     },
     {
-        "duration": "48.0",
+        "duration": "47.0",
         "name": "system_health.memory_mobile/load:tools:gmail:2019"
     },
     {
-        "duration": "32.0",
+        "duration": "33.0",
         "name": "system_health.memory_mobile/load:tools:stackoverflow:2018"
     },
     {
-        "duration": "31.0",
+        "duration": "32.0",
         "name": "system_health.memory_mobile/load:tools:weather:2019"
     },
     {
diff --git a/tools/perf/core/shard_maps/timing_data/android-pixel2-perf_timing.json b/tools/perf/core/shard_maps/timing_data/android-pixel2-perf_timing.json
index 1bb2068..c530d1f 100644
--- a/tools/perf/core/shard_maps/timing_data/android-pixel2-perf_timing.json
+++ b/tools/perf/core/shard_maps/timing_data/android-pixel2-perf_timing.json
@@ -1,130 +1,130 @@
 [
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "blink_perf.accessibility/line-breaks.html"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "blink_perf.accessibility/textarea-append.html"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "blink_perf.bindings/append-child.html"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "blink_perf.bindings/create-element.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.bindings/document-implementation.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.bindings/dom-attribute-on-prototoype.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.bindings/first-child.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.bindings/gc-forest.html"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "blink_perf.bindings/gc-mini-tree.html"
     },
     {
-        "duration": "34.0",
+        "duration": "68.0",
         "name": "blink_perf.bindings/gc-tree.html"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "blink_perf.bindings/get-attribute-rare.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.bindings/get-attribute.html"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "blink_perf.bindings/get-element-by-id.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.bindings/get-elements-by-tag-name.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.bindings/id-getter.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.bindings/id-setter.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.bindings/indexed-getter.html"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "blink_perf.bindings/insert-before.html"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "blink_perf.bindings/named-property-enumerator.html"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "blink_perf.bindings/node-list-access.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.bindings/node-type.html"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "blink_perf.bindings/post-message.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.bindings/sequence-conversion-array.html"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "blink_perf.bindings/sequence-conversion-custom-iterator.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.bindings/serialize-array.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/serialize-long-string.html"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "blink_perf.bindings/serialize-map.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/serialize-nested-array.html"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "blink_perf.bindings/set-attribute-rare.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.bindings/set-attribute.html"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "blink_perf.bindings/structured-clone-json-deserialize.html"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "blink_perf.bindings/structured-clone-json-serialize.html"
     },
     {
@@ -136,127 +136,127 @@
         "name": "blink_perf.bindings/structured-clone-long-string-serialize.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.bindings/typed-array-construct-from-array.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.bindings/typed-array-construct-from-same-type.html"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "blink_perf.bindings/typed-array-construct-from-typed.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.bindings/typed-array-set-from-typed.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.bindings/undefined-first-child.html"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "blink_perf.bindings/undefined-get-element-by-id.html"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "blink_perf.bindings/undefined-id-getter.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/worker-structured-clone-different-payloads.html"
     },
     {
-        "duration": "36.0",
+        "duration": "66.0",
         "name": "blink_perf.bindings/worker-structured-clone-json-from-worker.html"
     },
     {
-        "duration": "37.0",
+        "duration": "68.0",
         "name": "blink_perf.bindings/worker-structured-clone-json-roundtrip.html"
     },
     {
-        "duration": "37.0",
+        "duration": "66.0",
         "name": "blink_perf.bindings/worker-structured-clone-json-to-worker.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.bindings/worker-structured-clone-workerDOM-DBMon-from-worker.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/worker-structured-clone-workerDOM-Map-from-worker.html"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "blink_perf.bindings/worker-text-encoded-transferable-from-worker.html"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "blink_perf.bindings/worker-text-encoded-transferable-roundtrip.html"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "blink_perf.bindings/worker-text-encoded-transferable-to-worker.html"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "blink_perf.bindings/worker-transferable-from-worker.html"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "blink_perf.bindings/worker-transferable-roundtrip.html"
     },
     {
-        "duration": "56.0",
+        "duration": "32.0",
         "name": "blink_perf.bindings/worker-transferable-to-worker.html"
     },
     {
-        "duration": "35.0",
+        "duration": "74.0",
         "name": "blink_perf.canvas/canvas-to-canvas-draw.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.canvas/canvas-to-canvas-draw_RAF.html?RAF"
     },
     {
-        "duration": "26.0",
+        "duration": "32.0",
         "name": "blink_perf.canvas/createImageBitmapFromImageData.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.canvas/createImageBitmapFromImageData_RAF.html?RAF"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "blink_perf.canvas/docs-paper.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.canvas/docs-paper_RAF.html?RAF"
     },
     {
-        "duration": "25.0",
+        "duration": "48.0",
         "name": "blink_perf.canvas/docs-resume.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.canvas/docs-resume_RAF.html?RAF"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "blink_perf.canvas/docs-table.html"
     },
     {
-        "duration": "28.0",
+        "duration": "22.0",
         "name": "blink_perf.canvas/docs-table_RAF.html?RAF"
     },
     {
-        "duration": "31.0",
+        "duration": "30.0",
         "name": "blink_perf.canvas/draw-dynamic-canvas-2d-to-hw-accelerated-canvas-2d.html"
     },
     {
-        "duration": "23.0",
+        "duration": "32.0",
         "name": "blink_perf.canvas/draw-dynamic-canvas-2d-to-hw-accelerated-canvas-2d_RAF.html?RAF"
     },
     {
@@ -264,31 +264,31 @@
         "name": "blink_perf.canvas/draw-dynamic-webgl-to-hw-accelerated-canvas-2d.html"
     },
     {
-        "duration": "24.0",
+        "duration": "28.0",
         "name": "blink_perf.canvas/draw-dynamic-webgl-to-hw-accelerated-canvas-2d_RAF.html?RAF"
     },
     {
-        "duration": "19.0",
+        "duration": "18.0",
         "name": "blink_perf.canvas/draw-hw-accelerated-canvas-2d-to-sw-canvas-2d.html"
     },
     {
-        "duration": "30.0",
+        "duration": "22.0",
         "name": "blink_perf.canvas/draw-hw-accelerated-canvas-2d-to-sw-canvas-2d_RAF.html?RAF"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.canvas/draw-static-canvas-2d-to-hw-accelerated-canvas-2d.html"
     },
     {
-        "duration": "21.0",
+        "duration": "22.0",
         "name": "blink_perf.canvas/draw-static-canvas-2d-to-hw-accelerated-canvas-2d_RAF.html?RAF"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.canvas/draw-static-webgl-to-hw-accelerated-canvas-2d.html"
     },
     {
-        "duration": "21.0",
+        "duration": "22.0",
         "name": "blink_perf.canvas/draw-static-webgl-to-hw-accelerated-canvas-2d_RAF.html?RAF"
     },
     {
@@ -296,47 +296,47 @@
         "name": "blink_perf.canvas/draw-video-to-hw-accelerated-canvas-2d.html"
     },
     {
-        "duration": "20.0",
+        "duration": "24.0",
         "name": "blink_perf.canvas/draw-video-to-hw-accelerated-canvas-2d_RAF.html?RAF"
     },
     {
-        "duration": "24.0",
+        "duration": "30.0",
         "name": "blink_perf.canvas/drawimage-not-pixelaligned.html"
     },
     {
-        "duration": "42.0",
+        "duration": "38.0",
         "name": "blink_perf.canvas/drawimage-not-pixelaligned_RAF.html?RAF"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "blink_perf.canvas/drawimage.html"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "blink_perf.canvas/drawimage_RAF.html?RAF"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.canvas/getImageData.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.canvas/getImageDataColorManaged.html"
     },
     {
-        "duration": "42.0",
+        "duration": "30.0",
         "name": "blink_perf.canvas/getImageDataColorManaged_RAF.html?RAF"
     },
     {
-        "duration": "42.0",
+        "duration": "28.0",
         "name": "blink_perf.canvas/getImageData_RAF.html?RAF"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.canvas/gpu-bound-shader.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.canvas/gpu-bound-shader_RAF.html?RAF"
     },
     {
@@ -348,267 +348,271 @@
         "name": "blink_perf.canvas/putImageData_RAF.html?RAF"
     },
     {
-        "duration": "69.0",
+        "duration": "68.0",
         "name": "blink_perf.canvas/sheets-render.html"
     },
     {
-        "duration": "12.0",
+        "duration": "22.0",
         "name": "blink_perf.canvas/sheets-render_RAF.html?RAF"
     },
     {
-        "duration": "32.0",
+        "duration": "28.0",
         "name": "blink_perf.canvas/toBlob_duration.html"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "blink_perf.canvas/toBlob_duration_RAF.html?RAF"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "blink_perf.canvas/toBlob_duration_jpeg.html"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "blink_perf.canvas/toBlob_duration_jpeg_RAF.html?RAF"
     },
     {
-        "duration": "22.0",
+        "duration": "48.0",
         "name": "blink_perf.canvas/transferFromImageBitmap.html"
     },
     {
-        "duration": "36.0",
+        "duration": "56.0",
         "name": "blink_perf.canvas/transferFromImageBitmap_RAF.html?RAF"
     },
     {
-        "duration": "21.0",
+        "duration": "24.0",
         "name": "blink_perf.canvas/upload-canvas-2d-to-texture.html"
     },
     {
-        "duration": "33.0",
+        "duration": "30.0",
         "name": "blink_perf.canvas/upload-canvas-2d-to-texture_RAF.html?RAF"
     },
     {
-        "duration": "25.0",
+        "duration": "34.0",
         "name": "blink_perf.canvas/upload-video-to-sub-texture.html"
     },
     {
-        "duration": "21.0",
+        "duration": "22.0",
         "name": "blink_perf.canvas/upload-video-to-sub-texture_RAF.html?RAF"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.canvas/upload-video-to-texture.html"
     },
     {
-        "duration": "22.0",
+        "duration": "26.0",
         "name": "blink_perf.canvas/upload-video-to-texture_RAF.html?RAF"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.canvas/upload-webgl-to-texture.html"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "blink_perf.canvas/upload-webgl-to-texture_RAF.html?RAF"
     },
     {
-        "duration": "3269.0",
+        "duration": "46.0",
         "name": "blink_perf.css/AttributeDescendantSelector.html"
     },
     {
-        "duration": "16.0",
+        "duration": "42.0",
         "name": "blink_perf.css/CSSPropertySetterGetter.html"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "blink_perf.css/CSSPropertySetterGetterMethods.html"
     },
     {
-        "duration": "26.0",
+        "duration": "34.0",
         "name": "blink_perf.css/CSSPropertyUpdateValue.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.css/ChangeStyleChildClassSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.css/ChangeStyleChildElementSelectors.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.css/ChangeStyleElementSelector.html"
     },
     {
-        "duration": "218.0",
+        "duration": "22.0",
         "name": "blink_perf.css/ChangeStyleGrandChildElementSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.css/ChangeStyleMultipleClassSelector.html"
     },
     {
-        "duration": "19.0",
+        "duration": "22.0",
         "name": "blink_perf.css/ChangeStyleMultipleQualifiedDataAttributesWithValuesSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.css/ChangeStyleNestedPseudoSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.css/ChangeStylePairOfNthChildSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.css/ChangeStylePartialAttributeMatchingSelector.html"
     },
     {
-        "duration": "191.0",
+        "duration": "22.0",
         "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeWithValueSelector.html"
     },
     {
-        "duration": "183.0",
+        "duration": "24.0",
         "name": "blink_perf.css/ChangeStyleShallowTree.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.css/ChangeStyleSingleClassSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.css/ChangeStyleSingleNthChildSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.css/ChangeStyleSinglePseudoSelector.html"
     },
     {
-        "duration": "19.0",
+        "duration": "22.0",
         "name": "blink_perf.css/ChangeStyleUniversalSelector.html"
     },
     {
-        "duration": "191.0",
+        "duration": "22.0",
         "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeSelector.html"
     },
     {
-        "duration": "200.0",
+        "duration": "22.0",
         "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeWithValueSelector.html"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "blink_perf.css/ClassDescendantSelector.html"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "blink_perf.css/ClassInvalidation.html"
     },
     {
-        "duration": "408.0",
+        "duration": "28.0",
         "name": "blink_perf.css/CustomPropertiesCascade.html"
     },
     {
-        "duration": "29.0",
+        "duration": "20.0",
         "name": "blink_perf.css/CustomPropertiesNonRootInheritance.html"
     },
     {
+        "duration": "24.0",
+        "name": "blink_perf.css/CustomPropertiesPendingSubstitution.html"
+    },
+    {
         "duration": "20.0",
         "name": "blink_perf.css/CustomPropertiesRootInheritance.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.css/CustomPropertiesVarAlias.html"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "blink_perf.css/FocusUpdate.html"
     },
     {
-        "duration": "173.0",
+        "duration": "20.0",
         "name": "blink_perf.css/LoadBootstrapBlog.html"
     },
     {
-        "duration": "56.0",
+        "duration": "20.0",
         "name": "blink_perf.css/LoadMaterializeStarterPage.html"
     },
     {
-        "duration": "12.0",
+        "duration": "22.0",
         "name": "blink_perf.css/LoadSemanticPageExample.html"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "blink_perf.css/PseudoClassSelectors.html"
     },
     {
-        "duration": "21.0",
+        "duration": "40.0",
         "name": "blink_perf.css/SelectorCountScaling.html"
     },
     {
-        "duration": "44.0",
+        "duration": "88.0",
         "name": "blink_perf.dom/custom-element-default-style-with-shadow.html"
     },
     {
-        "duration": "36.0",
+        "duration": "72.0",
         "name": "blink_perf.dom/custom-element-default-style.html"
     },
     {
-        "duration": "22.0",
+        "duration": "42.0",
         "name": "blink_perf.dom/long-sibling-list.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.dom/modify-element-classname.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.dom/modify-element-id.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.dom/modify-element-title.html"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "blink_perf.dom/select-multiple-add.html"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "blink_perf.dom/select-single-add.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.dom/select-single-remove.html"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "blink_perf.events/EventsDispatching.html"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "blink_perf.events/EventsDispatchingInDeeplyNestedV0ShadowTrees.html"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "blink_perf.events/EventsDispatchingInDeeplyNestedV1ShadowTrees.html"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "blink_perf.events/EventsDispatchingInV0ShadowTrees.html"
     },
     {
-        "duration": "37.0",
+        "duration": "54.0",
         "name": "blink_perf.events/EventsDispatchingInV1ShadowTrees.html"
     },
     {
-        "duration": "100.0",
+        "duration": "52.0",
         "name": "blink_perf.events/hit-test-lots-of-layers.html"
     },
     {
-        "duration": "29.0",
+        "duration": "38.0",
         "name": "blink_perf.events/is-input-pending-all-events.html"
     },
     {
@@ -616,263 +620,263 @@
         "name": "blink_perf.events/is-input-pending-default-events.html"
     },
     {
-        "duration": "56.0",
+        "duration": "110.0",
         "name": "blink_perf.image_decoder/decode-gif.html"
     },
     {
-        "duration": "39.0",
+        "duration": "48.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h1v1.html"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h1v2.html"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h2v1.html"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h2v2.html"
     },
     {
-        "duration": "61.0",
+        "duration": "122.0",
         "name": "blink_perf.image_decoder/decode-lossless-webp.html"
     },
     {
-        "duration": "23.0",
+        "duration": "30.0",
         "name": "blink_perf.image_decoder/decode-lossy-webp.html"
     },
     {
-        "duration": "41.0",
+        "duration": "80.0",
         "name": "blink_perf.image_decoder/decode-png-palette-opaque.html"
     },
     {
-        "duration": "26.0",
+        "duration": "48.0",
         "name": "blink_perf.image_decoder/decode-png-palette.html"
     },
     {
-        "duration": "70.0",
+        "duration": "132.0",
         "name": "blink_perf.image_decoder/decode-png.html"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "blink_perf.layout/ArabicLineLayout.html"
     },
     {
-        "duration": "10.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/Shapes/MultipleShapes.html"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "blink_perf.layout/SimpleTextPathLineLayout.html"
     },
     {
-        "duration": "15.0",
+        "duration": "40.0",
         "name": "blink_perf.layout/add-remove-inline-floats.html"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/animate-abspos-deep.html"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "blink_perf.layout/attach-inlines-2.html"
     },
     {
-        "duration": "14.0",
+        "duration": "26.0",
         "name": "blink_perf.layout/attach-inlines.html"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "blink_perf.layout/auto-grid-lots-of-data.html"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "blink_perf.layout/auto-grid-lots-of-spanning-data.html"
     },
     {
-        "duration": "48.0",
+        "duration": "38.0",
         "name": "blink_perf.layout/change-text-css-contain.html"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "blink_perf.layout/chapter-reflow-once-random.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.layout/chapter-reflow-once.html"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "blink_perf.layout/chapter-reflow-thrice.html"
     },
     {
-        "duration": "17.0",
+        "duration": "32.0",
         "name": "blink_perf.layout/chapter-reflow-twice.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.layout/chapter-reflow.html"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "blink_perf.layout/character_fallback.html"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "blink_perf.layout/contain-content-style-change.html"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "blink_perf.layout/editing_append.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.layout/editing_append_single_line.html"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "blink_perf.layout/editing_delete.html"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "blink_perf.layout/editing_insert.html"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "blink_perf.layout/editing_prepend.html"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "blink_perf.layout/fit-content-change-available-size-blocks.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.layout/fit-content-change-available-size-text.html"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "blink_perf.layout/fixed-grid-lots-of-data.html"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "blink_perf.layout/fixed-grid-lots-of-stretched-data.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.layout/flexbox-column-nowrap.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.layout/flexbox-column-wrap.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.layout/flexbox-deeply-nested-column-flow.html"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "blink_perf.layout/flexbox-lots-of-data.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.layout/flexbox-row-nowrap.html"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "blink_perf.layout/flexbox-row-stretch-height-definite.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.layout/flexbox-row-wrap.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.layout/flexbox-with-stretch-layout.html"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "blink_perf.layout/flexbox_with_list_item.html"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "blink_perf.layout/floats_100_100.html"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "blink_perf.layout/floats_100_100_nested.html"
     },
     {
-        "duration": "23.0",
+        "duration": "32.0",
         "name": "blink_perf.layout/floats_10_1000.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.layout/floats_20_100.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.layout/floats_20_100_nested.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.layout/floats_2_100.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/floats_2_100_nested.html"
     },
     {
-        "duration": "20.0",
+        "duration": "24.0",
         "name": "blink_perf.layout/floats_50_100.html"
     },
     {
-        "duration": "13.0",
+        "duration": "24.0",
         "name": "blink_perf.layout/floats_50_100_nested.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.layout/hindi-line-layout.html"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "blink_perf.layout/japanese-kokoro-insert.html"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "blink_perf.layout/large-grid.html"
     },
     {
-        "duration": "23.0",
+        "duration": "30.0",
         "name": "blink_perf.layout/large-spanning-grid-item.html"
     },
     {
-        "duration": "24.0",
+        "duration": "46.0",
         "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans-wider-than-table.html"
     },
     {
-        "duration": "23.0",
+        "duration": "44.0",
         "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans.html"
     },
     {
-        "duration": "30.0",
+        "duration": "44.0",
         "name": "blink_perf.layout/large-table-with-collapsed-borders-and-no-colspans.html"
     },
     {
-        "duration": "31.0",
+        "duration": "62.0",
         "name": "blink_perf.layout/latin-ebook-resize.html"
     },
     {
-        "duration": "21.0",
+        "duration": "28.0",
         "name": "blink_perf.layout/latin-ebook.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.layout/layers_overlap_2d.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.layout/layers_overlap_3d.html"
     },
     {
@@ -884,239 +888,239 @@
         "name": "blink_perf.layout/line-layout-fit-content.html"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "blink_perf.layout/line-layout-line-height.html"
     },
     {
-        "duration": "23.0",
+        "duration": "30.0",
         "name": "blink_perf.layout/line-layout-repeat-append-select.html"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "blink_perf.layout/line-layout-repeat-append.html"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "blink_perf.layout/line-layout.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/long-line-nowrap-collapse.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/long-line-nowrap-spans-collapse.html"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "blink_perf.layout/long-line-nowrap.html"
     },
     {
-        "duration": "18.0",
+        "duration": "30.0",
         "name": "blink_perf.layout/many-block-children-auto-inline-size.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.layout/many-block-children-fixed-inline-size.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.layout/multicol/balance-forced-breaks.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.layout/multicol/deeply-nested-tables.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.layout/multicol/fixed-height-with-spanner-and-nested-tables.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.layout/multicol/lots-of-small-nested-unbreakable-blocks-autofill.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.layout/multicol/lots-of-small-unbreakable-blocks-autofill.html"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "blink_perf.layout/multicol/lots-of-text-autofill.html"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "blink_perf.layout/multicol/lots-of-text-balanced-orphans-widows.html"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "blink_perf.layout/multicol/lots-of-text-balanced.html"
     },
     {
-        "duration": "51.0",
+        "duration": "100.0",
         "name": "blink_perf.layout/multicol/nested-forced-breaks.html"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "blink_perf.layout/multicol/tall-content-short-columns-realistic.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.layout/multicol/tall-content-short-columns.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.layout/nested-blocks-with-percent-height-and-max-height.html"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "blink_perf.layout/nested-grid.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.layout/nested-percent-height-tables.html"
     },
     {
-        "duration": "81.0",
+        "duration": "156.0",
         "name": "blink_perf.layout/subtree-detaching.html"
     },
     {
-        "duration": "302.0",
+        "duration": "28.0",
         "name": "blink_perf.layout/vertical-japanese-kokoro-insert.html"
     },
     {
-        "duration": "21.0",
+        "duration": "48.0",
         "name": "blink_perf.layout/word-break-break-all.html"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "blink_perf.layout/word-break-break-word.html"
     },
     {
-        "duration": "157.0",
+        "duration": "42.0",
         "name": "blink_perf.layout/word-wrap-break-word.html"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "blink_perf.owp_storage/blob-perf-files.html"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "blink_perf.owp_storage/blob-perf-ipc.html"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "blink_perf.owp_storage/blob-perf-shm.html"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "blink_perf.owp_storage/blob-perf-tiny.html"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "blink_perf.owp_storage/idb-load-docs.html"
     },
     {
-        "duration": "33.0",
+        "duration": "36.0",
         "name": "blink_perf.paint/appending-text.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.paint/color-changes.html"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "blink_perf.paint/complex-content-slow-scroll.html"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "blink_perf.paint/complex-iframe-filtered.html"
     },
     {
-        "duration": "56.0",
+        "duration": "110.0",
         "name": "blink_perf.paint/contain-update-layer-tree.html"
     },
     {
-        "duration": "55.0",
+        "duration": "54.0",
         "name": "blink_perf.paint/containment-resize.html"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "blink_perf.paint/fixed-and-many-layers-scroll.html"
     },
     {
-        "duration": "33.0",
+        "duration": "50.0",
         "name": "blink_perf.paint/large-table-background-change-with-invisible-collapsed-borders.html"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "blink_perf.paint/large-table-background-change-with-visible-collapsed-borders.html"
     },
     {
-        "duration": "34.0",
+        "duration": "52.0",
         "name": "blink_perf.paint/large-table-background-change-with-zero-width-collapsed-borders.html"
     },
     {
-        "duration": "34.0",
+        "duration": "40.0",
         "name": "blink_perf.paint/large-table-collapsed-border-change-with-backgrounds.html"
     },
     {
-        "duration": "39.0",
+        "duration": "50.0",
         "name": "blink_perf.paint/large-table-collapsed-border-change-with-text.html"
     },
     {
-        "duration": "25.0",
+        "duration": "34.0",
         "name": "blink_perf.paint/large-table-collapsed-border-change.html"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "blink_perf.paint/large-table-repaint.html"
     },
     {
-        "duration": "32.0",
+        "duration": "50.0",
         "name": "blink_perf.paint/move-text-with-mask.html"
     },
     {
-        "duration": "33.0",
+        "duration": "36.0",
         "name": "blink_perf.paint/paint-offset-changes.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.paint/select-all-words.html"
     },
     {
-        "duration": "46.0",
+        "duration": "62.0",
         "name": "blink_perf.paint/transform-changes.html"
     },
     {
-        "duration": "48.0",
+        "duration": "38.0",
         "name": "blink_perf.parser/css-parser-yui.html"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "blink_perf.parser/html-parser-threaded.html"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "blink_perf.parser/html-parser.html"
     },
     {
-        "duration": "103.0",
+        "duration": "204.0",
         "name": "blink_perf.parser/html5-full-render.html"
     },
     {
-        "duration": "87.0",
+        "duration": "32.0",
         "name": "blink_perf.parser/iframe-append-remove.html"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "blink_perf.parser/innerHTML-setter-siblings.html"
     },
     {
-        "duration": "22.0",
+        "duration": "30.0",
         "name": "blink_perf.parser/innerHTML-setter.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.parser/query-selector-all-attribute-complex.html"
     },
     {
@@ -1128,15 +1132,15 @@
         "name": "blink_perf.parser/query-selector-all-class-deep.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.parser/query-selector-all-class-first.html"
     },
     {
-        "duration": "37.0",
+        "duration": "32.0",
         "name": "blink_perf.parser/query-selector-all-class-last.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.parser/query-selector-all-class.html"
     },
     {
@@ -1144,7 +1148,7 @@
         "name": "blink_perf.parser/query-selector-all-deep.html"
     },
     {
-        "duration": "29.0",
+        "duration": "30.0",
         "name": "blink_perf.parser/query-selector-all-first.html"
     },
     {
@@ -1152,251 +1156,251 @@
         "name": "blink_perf.parser/query-selector-all-id-deep.html"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "blink_perf.parser/query-selector-all-id-first.html"
     },
     {
-        "duration": "23.0",
+        "duration": "32.0",
         "name": "blink_perf.parser/query-selector-all-id-last.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.parser/query-selector-all-last.html"
     },
     {
-        "duration": "30.0",
+        "duration": "32.0",
         "name": "blink_perf.parser/query-selector-deep.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.parser/query-selector-first.html"
     },
     {
-        "duration": "22.0",
+        "duration": "30.0",
         "name": "blink_perf.parser/query-selector-id-deep.html"
     },
     {
-        "duration": "23.0",
+        "duration": "32.0",
         "name": "blink_perf.parser/query-selector-id-last.html"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "blink_perf.parser/query-selector-last.html"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "blink_perf.parser/simple-url.html"
     },
     {
-        "duration": "37.0",
+        "duration": "32.0",
         "name": "blink_perf.parser/textarea-parsing.html"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "blink_perf.parser/tiny-innerHTML.html"
     },
     {
-        "duration": "25.0",
+        "duration": "34.0",
         "name": "blink_perf.parser/url-parser.html"
     },
     {
-        "duration": "22.0",
+        "duration": "30.0",
         "name": "blink_perf.parser/xml-parser.html"
     },
     {
-        "duration": "265.0",
+        "duration": "26.0",
         "name": "blink_perf.shadow_dom/declarative-api.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/imperative-api-appendchild.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/imperative-api-assign.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/imperative-api-assigned-elements.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/imperative-api-assigned-slot.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/imperative-api-custom-detail-summary-large.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/imperative-api-custom-detail-summary.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/imperative-api-detail-summary-large.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/imperative-api-detail-summary.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/imperative-api-insertbefore.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/imperative-api.html"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "blink_perf.shadow_dom/shadow-style-share-attr-selectors.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.shadow_dom/shadow-style-share-media-query.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.shadow_dom/shadow-style-share-with-distribution.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/shadow-style-share.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.shadow_dom/style-sheet-insert.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.shadow_dom/v0-changing-classname-with-shadow-dom.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.shadow_dom/v0-changing-classname-without-shadow-dom.html"
     },
     {
-        "duration": "23.0",
+        "duration": "32.0",
         "name": "blink_perf.shadow_dom/v0-changing-select-with-shadow-dom.html"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "blink_perf.shadow_dom/v0-changing-select-without-shadow-dom.html"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/v0-content-reprojection.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/v0-large-distribution-without-layout.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/v0-multiple-insertion-points.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/v0-shadow-reprojection.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/v0-small-distribution-with-layout.html"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "blink_perf.shadow_dom/v1-distribution-disconnected-and-reconnected.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/v1-distribution.html"
     },
     {
-        "duration": "23.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/v1-host-child-append.html"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "blink_perf.shadow_dom/v1-large-deep-distribution.html"
     },
     {
-        "duration": "29.0",
+        "duration": "42.0",
         "name": "blink_perf.shadow_dom/v1-large-deep-layout.html"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-append-layout.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-distribution.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-layout.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-prepend-layout.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-re-layout.html"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-slot-assigned-nodes.html"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-slot-flatten.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-re-layout.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-assigned-nodes.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-flatten.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/v1-slot-append.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.shadow_dom/v1-small-deep-distribution.html"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "blink_perf.shadow_dom/v1-small-deep-layout.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/v1-small-shallow-distribution.html"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "blink_perf.shadow_dom/v1-small-shallow-layout.html"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "blink_perf.svg/AzLizardBenjiPark.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.svg/Bamboo.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.svg/Cactus.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.svg/Cowboy.html"
     },
     {
@@ -1404,51 +1408,51 @@
         "name": "blink_perf.svg/Cowboy_transform.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.svg/CrawFishGanson.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.svg/Debian.html"
     },
     {
-        "duration": "10.0",
+        "duration": "18.0",
         "name": "blink_perf.svg/DropsOnABlade.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.svg/FlowerFromMyGarden.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.svg/FoodLeifLodahl.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.svg/France.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.svg/FrancoBolloGnomeEzechi.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.svg/GearFlowers.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.svg/HarveyRayner.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.svg/HereGear.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.svg/MtSaintHelens.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.svg/Samurai.html"
     },
     {
@@ -1456,31 +1460,31 @@
         "name": "blink_perf.svg/SierpinskiCarpet.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.svg/SvgCubics.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.svg/SvgHitTesting.html"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "blink_perf.svg/SvgNestedUse.html"
     },
     {
-        "duration": "10.0",
+        "duration": "18.0",
         "name": "blink_perf.svg/UnderTheSee.html"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "blink_perf.svg/WorldIso.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.svg/Worldcup.html"
     },
     {
-        "duration": "64.0",
+        "duration": "86.0",
         "name": "dromaeo/http://dromaeo.com?dom-attr"
     },
     {
@@ -1488,19 +1492,19 @@
         "name": "dromaeo/http://dromaeo.com?dom-modify"
     },
     {
-        "duration": "54.0",
+        "duration": "108.0",
         "name": "dromaeo/http://dromaeo.com?dom-query"
     },
     {
-        "duration": "57.0",
+        "duration": "70.0",
         "name": "dromaeo/http://dromaeo.com?dom-traverse"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "dummy_benchmark.noisy_benchmark_1/dummy_page.html"
     },
     {
-        "duration": "112.0",
+        "duration": "22.0",
         "name": "dummy_benchmark.stable_benchmark_1/dummy_page.html"
     },
     {
@@ -1508,523 +1512,523 @@
         "name": "jetstream/JetStream"
     },
     {
-        "duration": "532.0",
+        "duration": "1004.0",
         "name": "jetstream2/JetStream2"
     },
     {
-        "duration": "61.0",
+        "duration": "122.0",
         "name": "kraken/http://krakenbenchmark.mozilla.org/kraken-1.1/driver.html"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "loading.mobile/58Pic"
     },
     {
-        "duration": "28.0",
+        "duration": "50.0",
         "name": "loading.mobile/58Pic_3g"
     },
     {
-        "duration": "17.0",
+        "duration": "38.0",
         "name": "loading.mobile/Amazon"
     },
     {
-        "duration": "32.0",
+        "duration": "68.0",
         "name": "loading.mobile/Amazon_3g"
     },
     {
-        "duration": "17.0",
+        "duration": "38.0",
         "name": "loading.mobile/BOLNoticias"
     },
     {
-        "duration": "27.0",
+        "duration": "56.0",
         "name": "loading.mobile/BOLNoticias_3g"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "loading.mobile/Baidu"
     },
     {
-        "duration": "24.0",
+        "duration": "50.0",
         "name": "loading.mobile/Baidu_3g"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "loading.mobile/Bradesco"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "loading.mobile/Bradesco_3g"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "loading.mobile/Dailymotion"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "loading.mobile/Dailymotion_3g"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "loading.mobile/Dawn"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "loading.mobile/Dawn_3g"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "loading.mobile/DevOpera_cold"
     },
     {
-        "duration": "20.0",
+        "duration": "42.0",
         "name": "loading.mobile/DevOpera_cold_3g"
     },
     {
-        "duration": "20.0",
+        "duration": "42.0",
         "name": "loading.mobile/DevOpera_hot"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "loading.mobile/DevOpera_hot_3g"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "loading.mobile/DevOpera_warm"
     },
     {
-        "duration": "119.0",
+        "duration": "38.0",
         "name": "loading.mobile/DevOpera_warm_3g"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "loading.mobile/Dramaq"
     },
     {
-        "duration": "54.0",
+        "duration": "106.0",
         "name": "loading.mobile/Dramaq_3g"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "loading.mobile/EnquiryIndianRail"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "loading.mobile/EnquiryIndianRail_3g"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "loading.mobile/Facebook"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "loading.mobile/Facebook_3g"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "loading.mobile/FlipBoard_cold"
     },
     {
-        "duration": "40.0",
+        "duration": "82.0",
         "name": "loading.mobile/FlipBoard_cold_3g"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "loading.mobile/FlipBoard_hot"
     },
     {
-        "duration": "26.0",
+        "duration": "46.0",
         "name": "loading.mobile/FlipBoard_hot_3g"
     },
     {
-        "duration": "227.0",
+        "duration": "38.0",
         "name": "loading.mobile/FlipBoard_warm"
     },
     {
-        "duration": "20.0",
+        "duration": "48.0",
         "name": "loading.mobile/FlipBoard_warm_3g"
     },
     {
-        "duration": "16.0",
+        "duration": "36.0",
         "name": "loading.mobile/FlipKart_cold"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "loading.mobile/FlipKart_cold_3g"
     },
     {
-        "duration": "229.0",
+        "duration": "46.0",
         "name": "loading.mobile/FlipKart_hot"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "loading.mobile/FlipKart_hot_3g"
     },
     {
-        "duration": "20.0",
+        "duration": "38.0",
         "name": "loading.mobile/FlipKart_warm"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "loading.mobile/FlipKart_warm_3g"
     },
     {
-        "duration": "17.0",
+        "duration": "32.0",
         "name": "loading.mobile/FranceTVInfo"
     },
     {
-        "duration": "25.0",
+        "duration": "48.0",
         "name": "loading.mobile/FranceTVInfo_3g"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "loading.mobile/G1"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "loading.mobile/G1_3g"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "loading.mobile/GSShop"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "loading.mobile/GSShop_3g"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "loading.mobile/GoogleBrazil"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "loading.mobile/GoogleBrazil_3g"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "loading.mobile/GoogleIndia"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "loading.mobile/GoogleIndia_3g"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "loading.mobile/GoogleIndonesia"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "loading.mobile/GoogleIndonesia_3g"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "loading.mobile/GoogleRedirectToGoogleJapan"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "loading.mobile/GoogleRedirectToGoogleJapan_3g"
     },
     {
-        "duration": "18.0",
+        "duration": "34.0",
         "name": "loading.mobile/Hongkiat"
     },
     {
-        "duration": "31.0",
+        "duration": "64.0",
         "name": "loading.mobile/Hongkiat_3g"
     },
     {
-        "duration": "17.0",
+        "duration": "38.0",
         "name": "loading.mobile/KapanLagi"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "loading.mobile/KapanLagi_3g"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "loading.mobile/Kaskus"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "loading.mobile/Kaskus_3g"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "loading.mobile/LocalMoxie"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "loading.mobile/LocalMoxie_3g"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "loading.mobile/Locanto"
     },
     {
-        "duration": "18.0",
+        "duration": "34.0",
         "name": "loading.mobile/Locanto_3g"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "loading.mobile/OLX"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "loading.mobile/OLX_3g"
     },
     {
-        "duration": "14.0",
+        "duration": "32.0",
         "name": "loading.mobile/QQNews"
     },
     {
-        "duration": "24.0",
+        "duration": "50.0",
         "name": "loading.mobile/QQNews_3g"
     },
     {
-        "duration": "274.0",
+        "duration": "30.0",
         "name": "loading.mobile/SlideShare"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "loading.mobile/SlideShare_3g"
     },
     {
-        "duration": "19.0",
+        "duration": "32.0",
         "name": "loading.mobile/Suumo_cold"
     },
     {
-        "duration": "23.0",
+        "duration": "32.0",
         "name": "loading.mobile/Suumo_cold_3g"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "loading.mobile/Suumo_hot"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "loading.mobile/Suumo_hot_3g"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "loading.mobile/Suumo_warm"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "loading.mobile/Suumo_warm_3g"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "loading.mobile/Thairath"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "loading.mobile/Thairath_3g"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "loading.mobile/TheStar"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "loading.mobile/TheStar_3g"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "loading.mobile/TribunNews"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "loading.mobile/TribunNews_3g"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "loading.mobile/Twitter"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "loading.mobile/Twitter_3g"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "loading.mobile/VoiceMemos_cold"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "loading.mobile/VoiceMemos_cold_3g"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "loading.mobile/VoiceMemos_hot"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "loading.mobile/VoiceMemos_hot_3g"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "loading.mobile/VoiceMemos_warm"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "loading.mobile/VoiceMemos_warm_3g"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "loading.mobile/Wikipedia"
     },
     {
-        "duration": "18.0",
+        "duration": "40.0",
         "name": "loading.mobile/Wikipedia_3g"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "loading.mobile/YahooNews"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "loading.mobile/YahooNews_3g"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "loading.mobile/Youtube"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "loading.mobile/Youtube_3g"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "media.mobile/mse.html?media=aac_audio.mp4"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "media.mobile/mse.html?media=aac_audio.mp4,h264_video.mp4"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "media.mobile/mse.html?media=h264_video.mp4"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "media.mobile/mse.html?media=tulip2.vp9.webm"
     },
     {
-        "duration": "31.0",
+        "duration": "68.0",
         "name": "media.mobile/video.html?src=tulip2.m4a&type=audio"
     },
     {
-        "duration": "30.0",
+        "duration": "64.0",
         "name": "media.mobile/video.html?src=tulip2.mp3&type=audio"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "media.mobile/video.html?src=tulip2.mp3&type=audio&seek"
     },
     {
-        "duration": "31.0",
+        "duration": "62.0",
         "name": "media.mobile/video.html?src=tulip2.mp4"
     },
     {
-        "duration": "31.0",
+        "duration": "62.0",
         "name": "media.mobile/video.html?src=tulip2.mp4&busyjs"
     },
     {
-        "duration": "34.0",
+        "duration": "72.0",
         "name": "media.mobile/video.html?src=tulip2.ogg&type=audio"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "media.mobile/video.html?src=tulip2.ogg&type=audio&seek"
     },
     {
-        "duration": "31.0",
+        "duration": "62.0",
         "name": "media.mobile/video.html?src=tulip2.vp9.webm"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "media.mobile/video.html?src=tulip2.vp9.webm&background"
     },
     {
-        "duration": "33.0",
+        "duration": "66.0",
         "name": "media.mobile/video.html?src=tulip2.vp9.webm_WiFi"
     },
     {
-        "duration": "61.0",
+        "duration": "120.0",
         "name": "octane/Octane"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rasterize_and_record_micro.partial_invalidation/800_relpos_divs.html"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/amazon.html"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/blogger.html"
     },
     {
-        "duration": "27.0",
+        "duration": "52.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/booking.html"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/cnn.html"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/ebay.html"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/espn.html"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/facebook.html"
     },
     {
-        "duration": "41.0",
+        "duration": "82.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/gmail.html"
     },
     {
-        "duration": "33.0",
+        "duration": "66.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/google.html"
     },
     {
-        "duration": "32.0",
+        "duration": "62.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googlecalendar.html"
     },
     {
-        "duration": "26.0",
+        "duration": "50.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googledocs.html"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleimagesearch.html"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleplus.html"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/linkedin.html"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/pinterest.html"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/techcrunch.html"
     },
     {
-        "duration": "33.0",
+        "duration": "66.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/twitter.html"
     },
     {
-        "duration": "22.0",
+        "duration": "36.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/weather.html"
     },
     {
@@ -2032,15 +2036,15 @@
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/wikipedia.html"
     },
     {
-        "duration": "17.0",
+        "duration": "32.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/wordpress.html"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahooanswers.html"
     },
     {
-        "duration": "66.0",
+        "duration": "136.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoogames.html"
     },
     {
@@ -2048,1323 +2052,1323 @@
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoonews.html"
     },
     {
-        "duration": "87.0",
+        "duration": "172.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoosports.html"
     },
     {
-        "duration": "38.0",
+        "duration": "76.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/youtube.html"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "rendering.mobile/accu_weather_2018"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "rendering.mobile/accu_weather_mobile_pinch_2018"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "rendering.mobile/amazon_2018"
     },
     {
-        "duration": "30.0",
+        "duration": "54.0",
         "name": "rendering.mobile/amazon_mobile_2018"
     },
     {
-        "duration": "27.0",
+        "duration": "52.0",
         "name": "rendering.mobile/analog_clock_svg"
     },
     {
-        "duration": "27.0",
+        "duration": "52.0",
         "name": "rendering.mobile/androidpolice_mobile_2018"
     },
     {
-        "duration": "29.0",
+        "duration": "60.0",
         "name": "rendering.mobile/animometer_webgl"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "rendering.mobile/animometer_webgl_attrib_arrays"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "rendering.mobile/animometer_webgl_multi_draw"
     },
     {
-        "duration": "31.0",
+        "duration": "62.0",
         "name": "rendering.mobile/aquarium"
     },
     {
-        "duration": "3.0",
+        "duration": "8.0",
         "name": "rendering.mobile/aquarium_20k"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/background_color_animation"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "rendering.mobile/background_color_animation_with_gradient"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "rendering.mobile/baidu_mobile_2018"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "rendering.mobile/balls_css_key_frame_animations"
     },
     {
-        "duration": "3.0",
+        "duration": "8.0",
         "name": "rendering.mobile/balls_css_key_frame_animations_composited_transform"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/balls_css_transition_2_properties"
     },
     {
-        "duration": "26.0",
+        "duration": "50.0",
         "name": "rendering.mobile/balls_css_transition_40_properties"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "rendering.mobile/balls_css_transition_all_properties"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "rendering.mobile/balls_javascript_canvas"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/balls_javascript_css"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "rendering.mobile/balls_svg_animations"
     },
     {
-        "duration": "215.0",
+        "duration": "54.0",
         "name": "rendering.mobile/basic_stream"
     },
     {
-        "duration": "34.0",
+        "duration": "82.0",
         "name": "rendering.mobile/bing_mobile_2018"
     },
     {
-        "duration": "28.0",
+        "duration": "60.0",
         "name": "rendering.mobile/blob"
     },
     {
-        "duration": "20.0",
+        "duration": "50.0",
         "name": "rendering.mobile/blogspot_2018"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rendering.mobile/blogspot_mobile_2018"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "rendering.mobile/blur_rotating_background"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "rendering.mobile/boingboing_mobile_2018"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.mobile/booking.com_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "38.0",
         "name": "rendering.mobile/booking.com_mobile_2018"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "rendering.mobile/bouncing_balls_15"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "rendering.mobile/bouncing_balls_shadow"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/bouncing_clipped_rectangles"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "rendering.mobile/bouncing_gradient_circles"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "rendering.mobile/bouncing_png_images"
     },
     {
-        "duration": "30.0",
+        "duration": "56.0",
         "name": "rendering.mobile/bouncing_svg_images"
     },
     {
-        "duration": "33.0",
+        "duration": "62.0",
         "name": "rendering.mobile/camera_to_webgl"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.mobile/canvas_05000_pixels_per_second"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.mobile/canvas_10000_pixels_per_second"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.mobile/canvas_20000_pixels_per_second"
     },
     {
-        "duration": "23.0",
+        "duration": "44.0",
         "name": "rendering.mobile/canvas_40000_pixels_per_second"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "rendering.mobile/canvas_60000_pixels_per_second"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "rendering.mobile/canvas_75000_pixels_per_second"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "rendering.mobile/canvas_90000_pixels_per_second"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "rendering.mobile/canvas_animation_no_clear"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/canvas_arcs"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/canvas_font_cycler"
     },
     {
-        "duration": "27.0",
+        "duration": "52.0",
         "name": "rendering.mobile/canvas_lines"
     },
     {
-        "duration": "27.0",
+        "duration": "52.0",
         "name": "rendering.mobile/canvas_to_blob"
     },
     {
-        "duration": "32.0",
+        "duration": "52.0",
         "name": "rendering.mobile/capitolvolkswagen_mobile_2018"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "rendering.mobile/card_expansion"
     },
     {
-        "duration": "85.0",
+        "duration": "40.0",
         "name": "rendering.mobile/card_expansion_animated"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.mobile/card_expansion_images_text"
     },
     {
-        "duration": "27.0",
+        "duration": "40.0",
         "name": "rendering.mobile/card_flying"
     },
     {
-        "duration": "120.0",
+        "duration": "34.0",
         "name": "rendering.mobile/cats_unscaled"
     },
     {
-        "duration": "67.0",
+        "duration": "32.0",
         "name": "rendering.mobile/cats_viewport_width"
     },
     {
-        "duration": "31.0",
+        "duration": "60.0",
         "name": "rendering.mobile/cc_poster_circle"
     },
     {
-        "duration": "29.0",
+        "duration": "56.0",
         "name": "rendering.mobile/cc_scroll_text_only"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "rendering.mobile/chip_tune"
     },
     {
-        "duration": "26.0",
+        "duration": "42.0",
         "name": "rendering.mobile/cnn_2018"
     },
     {
-        "duration": "23.0",
+        "duration": "44.0",
         "name": "rendering.mobile/cnn_article_mobile_2018"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.mobile/cnn_mobile_2018"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "rendering.mobile/cnn_mobile_pinch_2018"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "rendering.mobile/cnn_pathological_2018"
     },
     {
-        "duration": "27.0",
+        "duration": "52.0",
         "name": "rendering.mobile/compositor_heavy_animation"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.mobile/coordinated_animation"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "rendering.mobile/core_scroll_header_panel"
     },
     {
-        "duration": "27.0",
+        "duration": "52.0",
         "name": "rendering.mobile/crafty_mind"
     },
     {
-        "duration": "28.0",
+        "duration": "54.0",
         "name": "rendering.mobile/css_animations_many_keyframes"
     },
     {
-        "duration": "27.0",
+        "duration": "52.0",
         "name": "rendering.mobile/css_animations_simultaneous_inline_style"
     },
     {
-        "duration": "27.0",
+        "duration": "52.0",
         "name": "rendering.mobile/css_animations_simultaneous_new_element"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/css_animations_simultaneous_style_element"
     },
     {
-        "duration": "27.0",
+        "duration": "52.0",
         "name": "rendering.mobile/css_animations_simultaneous_updating_class"
     },
     {
-        "duration": "27.0",
+        "duration": "52.0",
         "name": "rendering.mobile/css_animations_staggered_infinite_iterations"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "rendering.mobile/css_animations_staggered_inline_style"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "rendering.mobile/css_animations_staggered_new_element"
     },
     {
-        "duration": "28.0",
+        "duration": "54.0",
         "name": "rendering.mobile/css_animations_staggered_style_element"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "rendering.mobile/css_animations_staggered_updating_class"
     },
     {
-        "duration": "28.0",
+        "duration": "54.0",
         "name": "rendering.mobile/css_animations_triggered_inline_style"
     },
     {
-        "duration": "28.0",
+        "duration": "54.0",
         "name": "rendering.mobile/css_animations_triggered_new_element"
     },
     {
-        "duration": "27.0",
+        "duration": "52.0",
         "name": "rendering.mobile/css_animations_triggered_style_element"
     },
     {
-        "duration": "28.0",
+        "duration": "54.0",
         "name": "rendering.mobile/css_animations_triggered_updating_class"
     },
     {
-        "duration": "30.0",
+        "duration": "58.0",
         "name": "rendering.mobile/css_opacity_plus_n_layers_0"
     },
     {
-        "duration": "30.0",
+        "duration": "58.0",
         "name": "rendering.mobile/css_opacity_plus_n_layers_75"
     },
     {
-        "duration": "30.0",
+        "duration": "58.0",
         "name": "rendering.mobile/css_opacity_plus_n_layers_99"
     },
     {
-        "duration": "27.0",
+        "duration": "52.0",
         "name": "rendering.mobile/css_transitions_inline_style"
     },
     {
-        "duration": "27.0",
+        "duration": "52.0",
         "name": "rendering.mobile/css_transitions_new_element"
     },
     {
-        "duration": "27.0",
+        "duration": "52.0",
         "name": "rendering.mobile/css_transitions_staggered_inline_style"
     },
     {
-        "duration": "27.0",
+        "duration": "52.0",
         "name": "rendering.mobile/css_transitions_staggered_new_element"
     },
     {
-        "duration": "27.0",
+        "duration": "52.0",
         "name": "rendering.mobile/css_transitions_staggered_style_element"
     },
     {
-        "duration": "27.0",
+        "duration": "52.0",
         "name": "rendering.mobile/css_transitions_staggered_updating_class"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/css_transitions_style_element"
     },
     {
-        "duration": "27.0",
+        "duration": "52.0",
         "name": "rendering.mobile/css_transitions_triggered_inline_style"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "rendering.mobile/css_transitions_triggered_new_element"
     },
     {
-        "duration": "27.0",
+        "duration": "52.0",
         "name": "rendering.mobile/css_transitions_triggered_style_element"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/css_transitions_triggered_updating_class"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/css_transitions_updating_class"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/css_value_type_color"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/css_value_type_filter"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/css_value_type_length"
     },
     {
-        "duration": "27.0",
+        "duration": "52.0",
         "name": "rendering.mobile/css_value_type_length_complex"
     },
     {
-        "duration": "27.0",
+        "duration": "52.0",
         "name": "rendering.mobile/css_value_type_length_simple"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/css_value_type_path"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/css_value_type_shadow"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/css_value_type_transform_complex"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/css_value_type_transform_simple"
     },
     {
-        "duration": "31.0",
+        "duration": "62.0",
         "name": "rendering.mobile/deviantart_mobile_2018"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.mobile/digg_mobile_2018"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.mobile/dynamic_cube_map"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.mobile/earth"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.mobile/ebay_2018"
     },
     {
-        "duration": "20.0",
+        "duration": "42.0",
         "name": "rendering.mobile/ebay_mobile_2018"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "rendering.mobile/ebay_mobile_pinch_2018"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "rendering.mobile/ebay_scroll_2018"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "rendering.mobile/effect_games"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "rendering.mobile/espn_2018"
     },
     {
-        "duration": "21.0",
+        "duration": "40.0",
         "name": "rendering.mobile/espn_mobile_2018"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.mobile/espn_pathological_2018"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "rendering.mobile/extra_large_texture_uploads"
     },
     {
-        "duration": "23.0",
+        "duration": "44.0",
         "name": "rendering.mobile/facebook_2018"
     },
     {
-        "duration": "26.0",
+        "duration": "50.0",
         "name": "rendering.mobile/facebook_mobile_2018"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "rendering.mobile/famo_us_twitter_demo"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/fill_shapes"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "rendering.mobile/filter_terrain_svg"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "rendering.mobile/flickr_scroll_2018"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.mobile/font_wipe"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "rendering.mobile/forecast.io_mobile_2018"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/geo_apis"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.mobile/gmail_2018"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.mobile/google_calendar_2018"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/google_docs_2018"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "rendering.mobile/google_image_search_2018"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "rendering.mobile/google_image_search_mobile_2018"
     },
     {
-        "duration": "159.0",
+        "duration": "44.0",
         "name": "rendering.mobile/google_news_ios"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "rendering.mobile/google_news_mobile_2018"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "rendering.mobile/google_plus_2018"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "rendering.mobile/google_plus_mobile_2018"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.mobile/google_search_mobile_pinch_2018"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.mobile/google_web_search_2018"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "rendering.mobile/google_web_search_mobile_2018"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "rendering.mobile/gsp.ro_mobile_2018"
     },
     {
-        "duration": "24.0",
+        "duration": "50.0",
         "name": "rendering.mobile/guardian_pathological_2018"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "rendering.mobile/guimark_vector_chart"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "rendering.mobile/gws_boogie_expansion"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "rendering.mobile/gws_google_expansion"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "rendering.mobile/hakim"
     },
     {
-        "duration": "35.0",
+        "duration": "42.0",
         "name": "rendering.mobile/horizontal_vertical_expansion"
     },
     {
-        "duration": "43.0",
+        "duration": "86.0",
         "name": "rendering.mobile/idle_power_animated_gif"
     },
     {
-        "duration": "38.0",
+        "duration": "80.0",
         "name": "rendering.mobile/idle_power_blank"
     },
     {
-        "duration": "42.0",
+        "duration": "84.0",
         "name": "rendering.mobile/idle_power_css_animation"
     },
     {
-        "duration": "41.0",
+        "duration": "82.0",
         "name": "rendering.mobile/idle_power_request_animation_frame"
     },
     {
-        "duration": "111.0",
+        "duration": "222.0",
         "name": "rendering.mobile/idle_power_set_timeout_long"
     },
     {
-        "duration": "42.0",
+        "duration": "82.0",
         "name": "rendering.mobile/idle_power_set_timetout"
     },
     {
-        "duration": "37.0",
+        "duration": "74.0",
         "name": "rendering.mobile/ie_chalkboard"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "rendering.mobile/ie_pirate_mark"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.mobile/infinite_scroll_element_n_layers_0"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "rendering.mobile/infinite_scroll_element_n_layers_75"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "rendering.mobile/infinite_scroll_element_n_layers_99"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "rendering.mobile/infinite_scroll_root_fixed_n_layers_0"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.mobile/infinite_scroll_root_fixed_n_layers_75"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.mobile/infinite_scroll_root_fixed_n_layers_99"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.mobile/infinite_scroll_root_n_layers_0"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.mobile/infinite_scroll_root_n_layers_75"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.mobile/infinite_scroll_root_n_layers_99"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "rendering.mobile/infinite_scrolling"
     },
     {
-        "duration": "30.0",
+        "duration": "58.0",
         "name": "rendering.mobile/jarro_doverson"
     },
     {
-        "duration": "20.0",
+        "duration": "42.0",
         "name": "rendering.mobile/jpeg_decoding_rgb_and_gpu_rasterization"
     },
     {
-        "duration": "20.0",
+        "duration": "42.0",
         "name": "rendering.mobile/jpeg_decoding_yuv_and_gpu_rasterization"
     },
     {
-        "duration": "29.0",
+        "duration": "62.0",
         "name": "rendering.mobile/js_full_screen_invalidation"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.mobile/js_opacity_plus_n_layers_0"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.mobile/js_opacity_plus_n_layers_75"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.mobile/js_opacity_plus_n_layers_99"
     },
     {
-        "duration": "28.0",
+        "duration": "60.0",
         "name": "rendering.mobile/js_paint_plus_n_layers_0"
     },
     {
-        "duration": "28.0",
+        "duration": "60.0",
         "name": "rendering.mobile/js_paint_plus_n_layers_75"
     },
     {
-        "duration": "29.0",
+        "duration": "62.0",
         "name": "rendering.mobile/js_paint_plus_n_layers_99"
     },
     {
-        "duration": "28.0",
+        "duration": "60.0",
         "name": "rendering.mobile/js_poster_circle"
     },
     {
-        "duration": "20.0",
+        "duration": "42.0",
         "name": "rendering.mobile/js_scroll_text_only"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "rendering.mobile/kevs_3d"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "rendering.mobile/keyframed_animations"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "rendering.mobile/large_texture_uploads"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "rendering.mobile/latimes_pathological_2018"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "rendering.mobile/linkedin_2018"
     },
     {
-        "duration": "40.0",
+        "duration": "84.0",
         "name": "rendering.mobile/linkedin_mobile_2018"
     },
     {
-        "duration": "38.0",
+        "duration": "76.0",
         "name": "rendering.mobile/linkedin_mobile_pinch_2018"
     },
     {
-        "duration": "34.0",
+        "duration": "70.0",
         "name": "rendering.mobile/linkedin_pathological_2018"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rendering.mobile/list_animation_simple"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "rendering.mobile/list_recycle_transform"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "rendering.mobile/main_0fps_impl_60fps"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/main_0fps_impl_60fps_no_update"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "rendering.mobile/main_0fps_impl_60fps_no_update_jank"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/main_0fps_with_jank_impl_0fps"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/main_15fps_impl_0fps"
     },
     {
-        "duration": "25.0",
+        "duration": "54.0",
         "name": "rendering.mobile/main_15fps_with_jank_impl_0fps"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "rendering.mobile/main_30fps_impl_0fps"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "rendering.mobile/main_30fps_impl_60fps"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "rendering.mobile/main_60fps_impl_0fps"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "rendering.mobile/main_60fps_impl_60fps"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/main_60fps_impl_60fps_no_update"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/main_60fps_impl_60fps_no_update_jank"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "rendering.mobile/main_60fps_with_jank_impl_0fps"
     },
     {
-        "duration": "29.0",
+        "duration": "52.0",
         "name": "rendering.mobile/man_in_blue"
     },
     {
-        "duration": "34.0",
+        "duration": "66.0",
         "name": "rendering.mobile/many_images"
     },
     {
-        "duration": "29.0",
+        "duration": "56.0",
         "name": "rendering.mobile/many_planets_deep"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "rendering.mobile/maps_perf_test"
     },
     {
-        "duration": "35.0",
+        "duration": "42.0",
         "name": "rendering.mobile/mask_transition_animation"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "rendering.mobile/masonry"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/medium_texture_uploads"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/megi_dish"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "rendering.mobile/microsoft_asteroid_belt"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "rendering.mobile/microsoft_fireflies"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/microsoft_fish_ie_tank"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "rendering.mobile/microsoft_performance"
     },
     {
-        "duration": "27.0",
+        "duration": "52.0",
         "name": "rendering.mobile/microsoft_snow"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "rendering.mobile/microsoft_speed_reading"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/microsoft_tweet_map"
     },
     {
-        "duration": "28.0",
+        "duration": "54.0",
         "name": "rendering.mobile/microsoft_video_city"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/microsoft_worker_fountains"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/mix_10k"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/mix_blend_mode_animation_difference"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/mix_blend_mode_animation_hue"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/mix_blend_mode_animation_propagating_isolation"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "rendering.mobile/mix_blend_mode_animation_screen"
     },
     {
-        "duration": "31.0",
+        "duration": "64.0",
         "name": "rendering.mobile/mlb_mobile_2018"
     },
     {
-        "duration": "34.0",
+        "duration": "38.0",
         "name": "rendering.mobile/mobile_news_sandbox"
     },
     {
-        "duration": "27.0",
+        "duration": "56.0",
         "name": "rendering.mobile/motion_mark_canvas_fill_shapes"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/motion_mark_canvas_stroke_shapes"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "rendering.mobile/motionmark_anim_design_15"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "rendering.mobile/motionmark_anim_focus_25"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "rendering.mobile/motionmark_anim_images_50"
     },
     {
-        "duration": "24.0",
+        "duration": "50.0",
         "name": "rendering.mobile/motionmark_anim_leaves_250"
     },
     {
-        "duration": "24.0",
+        "duration": "50.0",
         "name": "rendering.mobile/motionmark_anim_multiply_175"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "rendering.mobile/motionmark_anim_suits_125"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "rendering.mobile/motionmark_html_composited_transforms_125"
     },
     {
-        "duration": "32.0",
+        "duration": "50.0",
         "name": "rendering.mobile/motionmark_html_css_bouncing_blend_circles_25"
     },
     {
-        "duration": "24.0",
+        "duration": "50.0",
         "name": "rendering.mobile/motionmark_html_css_bouncing_circles_250"
     },
     {
-        "duration": "24.0",
+        "duration": "50.0",
         "name": "rendering.mobile/motionmark_html_css_bouncing_clipped_rects_100"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "rendering.mobile/motionmark_html_css_bouncing_filter_circles_15"
     },
     {
-        "duration": "25.0",
+        "duration": "46.0",
         "name": "rendering.mobile/motionmark_html_css_bouncing_gradient_circles_250"
     },
     {
-        "duration": "25.0",
+        "duration": "46.0",
         "name": "rendering.mobile/motionmark_html_css_bouncing_svg_images_50"
     },
     {
-        "duration": "25.0",
+        "duration": "48.0",
         "name": "rendering.mobile/motionmark_html_css_bouncing_tagged_images_225"
     },
     {
-        "duration": "25.0",
+        "duration": "46.0",
         "name": "rendering.mobile/motionmark_html_dom_particles_svg_masks_25"
     },
     {
-        "duration": "32.0",
+        "duration": "46.0",
         "name": "rendering.mobile/motionmark_html_focus_20_15"
     },
     {
-        "duration": "25.0",
+        "duration": "46.0",
         "name": "rendering.mobile/motionmark_html_leaves_20_50"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "rendering.mobile/motionmark_svg_bouncing_circles_250"
     },
     {
-        "duration": "32.0",
+        "duration": "46.0",
         "name": "rendering.mobile/motionmark_svg_bouncing_clipped_rects_100"
     },
     {
-        "duration": "25.0",
+        "duration": "48.0",
         "name": "rendering.mobile/motionmark_svg_bouncing_gradient_circles_200"
     },
     {
-        "duration": "25.0",
+        "duration": "46.0",
         "name": "rendering.mobile/motionmark_svg_bouncing_png_images_200"
     },
     {
-        "duration": "25.0",
+        "duration": "48.0",
         "name": "rendering.mobile/motionmark_svg_bouncing_svg_images_50"
     },
     {
-        "duration": "30.0",
+        "duration": "58.0",
         "name": "rendering.mobile/new_tilings"
     },
     {
-        "duration": "25.0",
+        "duration": "48.0",
         "name": "rendering.mobile/no_op_raf"
     },
     {
-        "duration": "23.0",
+        "duration": "44.0",
         "name": "rendering.mobile/no_op_scroll"
     },
     {
-        "duration": "22.0",
+        "duration": "42.0",
         "name": "rendering.mobile/no_op_settimeout"
     },
     {
-        "duration": "23.0",
+        "duration": "44.0",
         "name": "rendering.mobile/no_op_touch_handler"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "rendering.mobile/nvidia_vertex_buffer_object"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "rendering.mobile/nyc_gov_scroll_2018"
     },
     {
-        "duration": "33.0",
+        "duration": "62.0",
         "name": "rendering.mobile/nytimes_mobile_2018"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.mobile/nytimes_scroll_2018"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "rendering.mobile/off_screen_main_60fps"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "rendering.mobile/off_screen_main_60fps_jank"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/overlay_background_color_css_transitions_page"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "rendering.mobile/paper_button"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "rendering.mobile/paper_calculator"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "rendering.mobile/paper_calculator_hit_test"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "rendering.mobile/paper_checkbox"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "rendering.mobile/paper_fab"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "rendering.mobile/paper_icon_button"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "rendering.mobile/paper_shadow"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "rendering.mobile/paper_tabs"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "rendering.mobile/paper_toggle_button"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.mobile/parallax_effect"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.mobile/particles"
     },
     {
-        "duration": "36.0",
+        "duration": "44.0",
         "name": "rendering.mobile/pbs_pathological_2018"
     },
     {
-        "duration": "40.0",
+        "duration": "36.0",
         "name": "rendering.mobile/physical_simulation"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "rendering.mobile/pinterest_2018"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "rendering.mobile/pinterest_mobile_2018"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "rendering.mobile/polymer_topeka"
     },
     {
-        "duration": "25.0",
+        "duration": "54.0",
         "name": "rendering.mobile/put_get_image_data"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "rendering.mobile/raf"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.mobile/raf_animation"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "rendering.mobile/raf_canvas"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.mobile/raf_touch_animation"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "rendering.mobile/recode_pathological_2018"
     },
     {
-        "duration": "24.0",
+        "duration": "50.0",
         "name": "rendering.mobile/reddit_mobile_2018"
     },
     {
-        "duration": "47.0",
+        "duration": "52.0",
         "name": "rendering.mobile/runway_2019"
     },
     {
-        "duration": "92.0",
+        "duration": "56.0",
         "name": "rendering.mobile/san_angeles"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.mobile/second_batch_js_heavy"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "rendering.mobile/second_batch_js_light"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.mobile/second_batch_js_medium"
     },
     {
-        "duration": "24.0",
+        "duration": "50.0",
         "name": "rendering.mobile/sfgate_mobile_2018"
     },
     {
-        "duration": "28.0",
+        "duration": "54.0",
         "name": "rendering.mobile/silk_finance"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.mobile/simple_text_page"
     },
     {
-        "duration": "20.0",
+        "duration": "36.0",
         "name": "rendering.mobile/simple_touch_drag"
     },
     {
-        "duration": "27.0",
+        "duration": "42.0",
         "name": "rendering.mobile/slashdot_mobile_2018"
     },
     {
-        "duration": "21.0",
+        "duration": "40.0",
         "name": "rendering.mobile/slide_drawer"
     },
     {
-        "duration": "25.0",
+        "duration": "54.0",
         "name": "rendering.mobile/small_texture_uploads"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "rendering.mobile/smash_cat"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "rendering.mobile/spielzeugz"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rendering.mobile/sticky_using_webkit"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "rendering.mobile/stress_hidey_bars"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/stroke_shapes"
     },
     {
-        "duration": "124.0",
+        "duration": "62.0",
         "name": "rendering.mobile/svg_icon_raster"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.mobile/swipe_action"
     },
     {
-        "duration": "63.0",
+        "duration": "40.0",
         "name": "rendering.mobile/swipe_to_dismiss"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.mobile/sync_scroll_offset"
     },
     {
-        "duration": "46.0",
+        "duration": "60.0",
         "name": "rendering.mobile/techcrunch_2018"
     },
     {
-        "duration": "40.0",
+        "duration": "62.0",
         "name": "rendering.mobile/techcrunch_mobile_2018"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "rendering.mobile/text_05000_pixels_per_second"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.mobile/text_10000_pixels_per_second"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.mobile/text_20000_pixels_per_second"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "rendering.mobile/text_40000_pixels_per_second"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "rendering.mobile/text_60000_pixels_per_second"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "rendering.mobile/text_75000_pixels_per_second"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.mobile/text_90000_pixels_per_second"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.mobile/text_constant_full_page_raster_05000_pixels_per_second"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.mobile/text_constant_full_page_raster_10000_pixels_per_second"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.mobile/text_constant_full_page_raster_20000_pixels_per_second"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "rendering.mobile/text_constant_full_page_raster_40000_pixels_per_second"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "rendering.mobile/text_constant_full_page_raster_60000_pixels_per_second"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rendering.mobile/text_constant_full_page_raster_75000_pixels_per_second"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "rendering.mobile/text_constant_full_page_raster_90000_pixels_per_second"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.mobile/text_hover_05000_pixels_per_second"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.mobile/text_hover_10000_pixels_per_second"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.mobile/text_hover_20000_pixels_per_second"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.mobile/text_hover_40000_pixels_per_second"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rendering.mobile/text_hover_60000_pixels_per_second"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "rendering.mobile/text_hover_75000_pixels_per_second"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.mobile/text_hover_90000_pixels_per_second"
     },
     {
@@ -3372,139 +3376,139 @@
         "name": "rendering.mobile/theverge_article_mobile_2018"
     },
     {
-        "duration": "49.0",
+        "duration": "48.0",
         "name": "rendering.mobile/theverge_mobile_2018"
     },
     {
-        "duration": "26.0",
+        "duration": "50.0",
         "name": "rendering.mobile/toggle_drawer"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.mobile/touch_handler_scrolling"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "rendering.mobile/transform_transitions"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/transform_transitions_js_block"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "rendering.mobile/twitch_2018"
     },
     {
-        "duration": "85.0",
+        "duration": "50.0",
         "name": "rendering.mobile/twitch_mobile_pinch_2018"
     },
     {
-        "duration": "59.0",
+        "duration": "50.0",
         "name": "rendering.mobile/twitter_2018"
     },
     {
-        "duration": "87.0",
+        "duration": "44.0",
         "name": "rendering.mobile/twitter_mobile_2018"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.mobile/update_history_state"
     },
     {
-        "duration": "26.0",
+        "duration": "34.0",
         "name": "rendering.mobile/usatoday_mobile_2018"
     },
     {
-        "duration": "29.0",
+        "duration": "42.0",
         "name": "rendering.mobile/vertical_expansion"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "rendering.mobile/web_animation_value_type_color"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "rendering.mobile/web_animation_value_type_length_3d"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "rendering.mobile/web_animation_value_type_length_complex"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.mobile/web_animation_value_type_length_simple"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "rendering.mobile/web_animation_value_type_path"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "rendering.mobile/web_animation_value_type_shadow"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "rendering.mobile/web_animation_value_type_transform_complex"
     },
     {
-        "duration": "823.0",
+        "duration": "50.0",
         "name": "rendering.mobile/web_animation_value_type_transform_simple"
     },
     {
-        "duration": "27.0",
+        "duration": "60.0",
         "name": "rendering.mobile/web_animations_many_keyframes"
     },
     {
-        "duration": "59.0",
+        "duration": "50.0",
         "name": "rendering.mobile/web_animations_set_current_time"
     },
     {
-        "duration": "68.0",
+        "duration": "50.0",
         "name": "rendering.mobile/web_animations_simultaneous"
     },
     {
-        "duration": "69.0",
+        "duration": "52.0",
         "name": "rendering.mobile/web_animations_staggered_chaining"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "rendering.mobile/web_animations_staggered_infinite_iterations"
     },
     {
-        "duration": "69.0",
+        "duration": "52.0",
         "name": "rendering.mobile/web_animations_staggered_triggering_page"
     },
     {
-        "duration": "37.0",
+        "duration": "40.0",
         "name": "rendering.mobile/webp_decoding_rgb_and_gpu_rasterization"
     },
     {
-        "duration": "71.0",
+        "duration": "40.0",
         "name": "rendering.mobile/webp_decoding_yuv_and_gpu_rasterization"
     },
     {
-        "duration": "60.0",
+        "duration": "62.0",
         "name": "rendering.mobile/wikipedia_2018"
     },
     {
-        "duration": "93.0",
+        "duration": "62.0",
         "name": "rendering.mobile/wikipedia_delayed_scroll_start_2018"
     },
     {
-        "duration": "75.0",
+        "duration": "48.0",
         "name": "rendering.mobile/wikipedia_mobile_2018"
     },
     {
-        "duration": "42.0",
+        "duration": "50.0",
         "name": "rendering.mobile/wordpress_2018"
     },
     {
-        "duration": "49.0",
+        "duration": "46.0",
         "name": "rendering.mobile/wordpress_mobile_2018"
     },
     {
-        "duration": "49.0",
+        "duration": "48.0",
         "name": "rendering.mobile/worldjournal_mobile_2018"
     },
     {
@@ -3512,951 +3516,951 @@
         "name": "rendering.mobile/wow_wiki_pathological_2018"
     },
     {
-        "duration": "60.0",
+        "duration": "68.0",
         "name": "rendering.mobile/wowwiki_mobile_2018"
     },
     {
-        "duration": "42.0",
+        "duration": "50.0",
         "name": "rendering.mobile/wsj_mobile_2018"
     },
     {
-        "duration": "96.0",
+        "duration": "38.0",
         "name": "rendering.mobile/yahoo_answers_2018"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "rendering.mobile/yahoo_answers_mobile_2018"
     },
     {
-        "duration": "75.0",
+        "duration": "42.0",
         "name": "rendering.mobile/yahoo_news_2018"
     },
     {
-        "duration": "84.0",
+        "duration": "48.0",
         "name": "rendering.mobile/yahoo_news_mobile_2018"
     },
     {
-        "duration": "49.0",
+        "duration": "46.0",
         "name": "rendering.mobile/yahoo_sports_2018"
     },
     {
-        "duration": "27.0",
+        "duration": "38.0",
         "name": "rendering.mobile/yahoo_sports_pathological_2018"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "rendering.mobile/youtube_2018"
     },
     {
-        "duration": "60.0",
+        "duration": "34.0",
         "name": "rendering.mobile/youtube_mobile_2018"
     },
     {
-        "duration": "40.0",
+        "duration": "70.0",
         "name": "rendering.mobile/zdnet_pathological_2018"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "rendering.mobile/zoom_in_animation"
     },
     {
-        "duration": "35.0",
+        "duration": "70.0",
         "name": "speedometer-future/http://browserbench.org/Speedometer/"
     },
     {
-        "duration": "35.0",
+        "duration": "68.0",
         "name": "speedometer/http://browserbench.org/Speedometer/"
     },
     {
-        "duration": "56.0",
+        "duration": "112.0",
         "name": "speedometer2-future/Speedometer2"
     },
     {
-        "duration": "56.0",
+        "duration": "110.0",
         "name": "speedometer2/Speedometer2"
     },
     {
-        "duration": "263.0",
+        "duration": "194.0",
         "name": "startup.mobile/cct:coldish:bbc"
     },
     {
-        "duration": "3000.0",
+        "duration": "238.0",
         "name": "startup.mobile/intent:coldish:bbc"
     },
     {
-        "duration": "307.0",
+        "duration": "168.0",
         "name": "startup.mobile/intent:warm:bbc"
     },
     {
-        "duration": "171.0",
+        "duration": "122.0",
         "name": "startup.mobile/maps_pwa:with_http_cache"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "system_health.common_mobile/background:media:imgur:2019"
     },
     {
-        "duration": "47.0",
+        "duration": "94.0",
         "name": "system_health.common_mobile/background:news:nytimes:2019"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "system_health.common_mobile/background:search:google:2019"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "system_health.common_mobile/background:social:facebook:2019"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "system_health.common_mobile/background:tools:gmail:2019"
     },
     {
-        "duration": "57.0",
+        "duration": "116.0",
         "name": "system_health.common_mobile/browse:chrome:newtab:2019"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "system_health.common_mobile/browse:chrome:omnibox:2019"
     },
     {
-        "duration": "90.0",
+        "duration": "152.0",
         "name": "system_health.common_mobile/browse:media:facebook_photos:2019"
     },
     {
-        "duration": "51.0",
+        "duration": "98.0",
         "name": "system_health.common_mobile/browse:media:flickr_infinite_scroll:2019"
     },
     {
-        "duration": "44.0",
+        "duration": "88.0",
         "name": "system_health.common_mobile/browse:media:googleplaystore:2019"
     },
     {
-        "duration": "74.0",
+        "duration": "146.0",
         "name": "system_health.common_mobile/browse:media:imgur:2019"
     },
     {
-        "duration": "57.0",
+        "duration": "116.0",
         "name": "system_health.common_mobile/browse:media:youtube:2019"
     },
     {
-        "duration": "54.0",
+        "duration": "108.0",
         "name": "system_health.common_mobile/browse:news:cnn:2018"
     },
     {
-        "duration": "51.0",
+        "duration": "102.0",
         "name": "system_health.common_mobile/browse:news:cricbuzz:2019"
     },
     {
-        "duration": "48.0",
+        "duration": "96.0",
         "name": "system_health.common_mobile/browse:news:globo:2019"
     },
     {
-        "duration": "78.0",
+        "duration": "126.0",
         "name": "system_health.common_mobile/browse:news:nytimes:2019"
     },
     {
-        "duration": "39.0",
+        "duration": "78.0",
         "name": "system_health.common_mobile/browse:news:qq:2019"
     },
     {
-        "duration": "53.0",
+        "duration": "112.0",
         "name": "system_health.common_mobile/browse:news:reddit:2019"
     },
     {
-        "duration": "55.0",
+        "duration": "110.0",
         "name": "system_health.common_mobile/browse:news:toi:2019"
     },
     {
-        "duration": "60.0",
+        "duration": "120.0",
         "name": "system_health.common_mobile/browse:news:washingtonpost:2019"
     },
     {
-        "duration": "28.0",
+        "duration": "52.0",
         "name": "system_health.common_mobile/browse:search:amp:2018"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "system_health.common_mobile/browse:search:amp:sxg:2019"
     },
     {
-        "duration": "56.0",
+        "duration": "112.0",
         "name": "system_health.common_mobile/browse:shopping:amazon:2019"
     },
     {
-        "duration": "62.0",
+        "duration": "110.0",
         "name": "system_health.common_mobile/browse:shopping:avito:2019"
     },
     {
-        "duration": "55.0",
+        "duration": "110.0",
         "name": "system_health.common_mobile/browse:shopping:flipkart:2019"
     },
     {
-        "duration": "61.0",
+        "duration": "124.0",
         "name": "system_health.common_mobile/browse:shopping:lazada:2019"
     },
     {
-        "duration": "63.0",
+        "duration": "126.0",
         "name": "system_health.common_mobile/browse:social:facebook:2019"
     },
     {
-        "duration": "75.0",
+        "duration": "150.0",
         "name": "system_health.common_mobile/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "80.0",
+        "duration": "160.0",
         "name": "system_health.common_mobile/browse:social:instagram:2019"
     },
     {
-        "duration": "35.0",
+        "duration": "6.0",
         "name": "system_health.common_mobile/browse:social:pinterest_infinite_scroll:2019"
     },
     {
-        "duration": "66.0",
+        "duration": "134.0",
         "name": "system_health.common_mobile/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "73.0",
+        "duration": "136.0",
         "name": "system_health.common_mobile/browse:social:twitter:2019"
     },
     {
-        "duration": "73.0",
+        "duration": "144.0",
         "name": "system_health.common_mobile/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "45.0",
+        "duration": "88.0",
         "name": "system_health.common_mobile/browse:tools:maps:2019"
     },
     {
-        "duration": "26.0",
+        "duration": "50.0",
         "name": "system_health.common_mobile/load:chrome:blank"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "system_health.common_mobile/load:games:bubbles:2019"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "system_health.common_mobile/load:games:lazors"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "system_health.common_mobile/load:games:spychase:2018"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "system_health.common_mobile/load:media:dailymotion:2019"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "system_health.common_mobile/load:media:facebook_photos:2019"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "system_health.common_mobile/load:media:flickr:2018"
     },
     {
-        "duration": "24.0",
+        "duration": "46.0",
         "name": "system_health.common_mobile/load:media:google_images:2018"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "system_health.common_mobile/load:media:imgur:2018"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "system_health.common_mobile/load:media:soundcloud:2018"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "system_health.common_mobile/load:media:youtube:2018"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "system_health.common_mobile/load:news:bbc:2019"
     },
     {
-        "duration": "28.0",
+        "duration": "54.0",
         "name": "system_health.common_mobile/load:news:cnn:2018"
     },
     {
-        "duration": "25.0",
+        "duration": "48.0",
         "name": "system_health.common_mobile/load:news:irctc:2019"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "system_health.common_mobile/load:news:nytimes:2019"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "system_health.common_mobile/load:news:qq:2019"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "system_health.common_mobile/load:news:reddit:2019"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "system_health.common_mobile/load:news:washingtonpost:2019"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "system_health.common_mobile/load:news:wikipedia:2018"
     },
     {
-        "duration": "24.0",
+        "duration": "50.0",
         "name": "system_health.common_mobile/load:search:amazon:2019"
     },
     {
-        "duration": "27.0",
+        "duration": "50.0",
         "name": "system_health.common_mobile/load:search:baidu:2018"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "system_health.common_mobile/load:search:ebay:2018"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "system_health.common_mobile/load:search:google:2018"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "system_health.common_mobile/load:search:taobao:2019"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "system_health.common_mobile/load:search:yahoo:2018"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "system_health.common_mobile/load:search:yandex:2018"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "system_health.common_mobile/load:social:instagram:2019"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "system_health.common_mobile/load:social:pinterest:2019"
     },
     {
-        "duration": "573.0",
+        "duration": "48.0",
         "name": "system_health.common_mobile/load:social:twitter:2019"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "system_health.common_mobile/load:tools:docs:2019"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "system_health.common_mobile/load:tools:drive:2019"
     },
     {
-        "duration": "35.0",
+        "duration": "70.0",
         "name": "system_health.common_mobile/load:tools:dropbox:2019"
     },
     {
-        "duration": "34.0",
+        "duration": "68.0",
         "name": "system_health.common_mobile/load:tools:gmail:2019"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "system_health.common_mobile/load:tools:stackoverflow:2018"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "system_health.common_mobile/load:tools:weather:2019"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "system_health.common_mobile/long_running:tools:gmail-background"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "system_health.common_mobile/long_running:tools:gmail-foreground"
     },
     {
-        "duration": "32.0",
+        "duration": "62.0",
         "name": "system_health.memory_mobile/background:media:imgur:2019"
     },
     {
-        "duration": "48.0",
+        "duration": "96.0",
         "name": "system_health.memory_mobile/background:news:nytimes:2019"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "system_health.memory_mobile/background:search:google:2019"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "system_health.memory_mobile/background:social:facebook:2019"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "system_health.memory_mobile/background:tools:gmail:2019"
     },
     {
-        "duration": "59.0",
+        "duration": "120.0",
         "name": "system_health.memory_mobile/browse:chrome:newtab:2019"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "system_health.memory_mobile/browse:chrome:omnibox:2019"
     },
     {
-        "duration": "78.0",
+        "duration": "154.0",
         "name": "system_health.memory_mobile/browse:media:facebook_photos:2019"
     },
     {
-        "duration": "53.0",
+        "duration": "104.0",
         "name": "system_health.memory_mobile/browse:media:flickr_infinite_scroll:2019"
     },
     {
-        "duration": "48.0",
+        "duration": "96.0",
         "name": "system_health.memory_mobile/browse:media:googleplaystore:2019"
     },
     {
-        "duration": "162.0",
+        "duration": "148.0",
         "name": "system_health.memory_mobile/browse:media:imgur:2019"
     },
     {
-        "duration": "60.0",
+        "duration": "118.0",
         "name": "system_health.memory_mobile/browse:media:youtube:2019"
     },
     {
-        "duration": "55.0",
+        "duration": "112.0",
         "name": "system_health.memory_mobile/browse:news:cnn:2018"
     },
     {
-        "duration": "52.0",
+        "duration": "102.0",
         "name": "system_health.memory_mobile/browse:news:cricbuzz:2019"
     },
     {
-        "duration": "50.0",
+        "duration": "96.0",
         "name": "system_health.memory_mobile/browse:news:globo:2019"
     },
     {
-        "duration": "74.0",
+        "duration": "128.0",
         "name": "system_health.memory_mobile/browse:news:nytimes:2019"
     },
     {
-        "duration": "42.0",
+        "duration": "82.0",
         "name": "system_health.memory_mobile/browse:news:qq:2019"
     },
     {
-        "duration": "55.0",
+        "duration": "110.0",
         "name": "system_health.memory_mobile/browse:news:reddit:2019"
     },
     {
-        "duration": "56.0",
+        "duration": "108.0",
         "name": "system_health.memory_mobile/browse:news:toi:2019"
     },
     {
-        "duration": "62.0",
+        "duration": "122.0",
         "name": "system_health.memory_mobile/browse:news:washingtonpost:2019"
     },
     {
-        "duration": "31.0",
+        "duration": "60.0",
         "name": "system_health.memory_mobile/browse:search:amp:2018"
     },
     {
-        "duration": "272.0",
+        "duration": "64.0",
         "name": "system_health.memory_mobile/browse:search:amp:sxg:2019"
     },
     {
-        "duration": "57.0",
+        "duration": "112.0",
         "name": "system_health.memory_mobile/browse:shopping:amazon:2019"
     },
     {
-        "duration": "56.0",
+        "duration": "110.0",
         "name": "system_health.memory_mobile/browse:shopping:avito:2019"
     },
     {
-        "duration": "58.0",
+        "duration": "114.0",
         "name": "system_health.memory_mobile/browse:shopping:flipkart:2019"
     },
     {
-        "duration": "62.0",
+        "duration": "122.0",
         "name": "system_health.memory_mobile/browse:shopping:lazada:2019"
     },
     {
-        "duration": "64.0",
+        "duration": "126.0",
         "name": "system_health.memory_mobile/browse:social:facebook:2019"
     },
     {
-        "duration": "76.0",
+        "duration": "150.0",
         "name": "system_health.memory_mobile/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "83.0",
+        "duration": "168.0",
         "name": "system_health.memory_mobile/browse:social:instagram:2019"
     },
     {
-        "duration": "82.0",
+        "duration": "164.0",
         "name": "system_health.memory_mobile/browse:social:pinterest_infinite_scroll:2019"
     },
     {
-        "duration": "67.0",
+        "duration": "134.0",
         "name": "system_health.memory_mobile/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "77.0",
+        "duration": "152.0",
         "name": "system_health.memory_mobile/browse:social:twitter:2019"
     },
     {
-        "duration": "73.0",
+        "duration": "144.0",
         "name": "system_health.memory_mobile/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "47.0",
+        "duration": "94.0",
         "name": "system_health.memory_mobile/browse:tools:maps:2019"
     },
     {
-        "duration": "28.0",
+        "duration": "54.0",
         "name": "system_health.memory_mobile/load:chrome:blank"
     },
     {
-        "duration": "27.0",
+        "duration": "56.0",
         "name": "system_health.memory_mobile/load:games:bubbles:2019"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "system_health.memory_mobile/load:games:lazors"
     },
     {
-        "duration": "32.0",
+        "duration": "64.0",
         "name": "system_health.memory_mobile/load:games:spychase:2018"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "system_health.memory_mobile/load:media:dailymotion:2019"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "system_health.memory_mobile/load:media:facebook_photos:2019"
     },
     {
-        "duration": "29.0",
+        "duration": "60.0",
         "name": "system_health.memory_mobile/load:media:flickr:2018"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "system_health.memory_mobile/load:media:google_images:2018"
     },
     {
-        "duration": "108.0",
+        "duration": "58.0",
         "name": "system_health.memory_mobile/load:media:imgur:2018"
     },
     {
-        "duration": "27.0",
+        "duration": "56.0",
         "name": "system_health.memory_mobile/load:media:soundcloud:2018"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "system_health.memory_mobile/load:media:youtube:2018"
     },
     {
-        "duration": "30.0",
+        "duration": "58.0",
         "name": "system_health.memory_mobile/load:news:bbc:2019"
     },
     {
-        "duration": "31.0",
+        "duration": "64.0",
         "name": "system_health.memory_mobile/load:news:cnn:2018"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "system_health.memory_mobile/load:news:irctc:2019"
     },
     {
-        "duration": "32.0",
+        "duration": "66.0",
         "name": "system_health.memory_mobile/load:news:nytimes:2019"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "system_health.memory_mobile/load:news:qq:2019"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "system_health.memory_mobile/load:news:reddit:2019"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "system_health.memory_mobile/load:news:washingtonpost:2019"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "system_health.memory_mobile/load:news:wikipedia:2018"
     },
     {
-        "duration": "77.0",
+        "duration": "60.0",
         "name": "system_health.memory_mobile/load:search:amazon:2019"
     },
     {
-        "duration": "31.0",
+        "duration": "64.0",
         "name": "system_health.memory_mobile/load:search:baidu:2018"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "system_health.memory_mobile/load:search:ebay:2018"
     },
     {
-        "duration": "29.0",
+        "duration": "56.0",
         "name": "system_health.memory_mobile/load:search:google:2018"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "system_health.memory_mobile/load:search:taobao:2019"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "system_health.memory_mobile/load:search:yahoo:2018"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "system_health.memory_mobile/load:search:yandex:2018"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "system_health.memory_mobile/load:social:instagram:2019"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "system_health.memory_mobile/load:social:pinterest:2019"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "system_health.memory_mobile/load:social:twitter:2019"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "system_health.memory_mobile/load:tools:docs:2019"
     },
     {
-        "duration": "27.0",
+        "duration": "58.0",
         "name": "system_health.memory_mobile/load:tools:drive:2019"
     },
     {
-        "duration": "38.0",
+        "duration": "80.0",
         "name": "system_health.memory_mobile/load:tools:dropbox:2019"
     },
     {
-        "duration": "36.0",
+        "duration": "74.0",
         "name": "system_health.memory_mobile/load:tools:gmail:2019"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "system_health.memory_mobile/load:tools:stackoverflow:2018"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "system_health.memory_mobile/load:tools:weather:2019"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "system_health.memory_mobile/long_running:tools:gmail-background"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "system_health.memory_mobile/long_running:tools:gmail-foreground"
     },
     {
-        "duration": "13.0",
+        "duration": "28.0",
         "name": "tracing.tracing_with_background_memory_infra/Facebook"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "tracing.tracing_with_background_memory_infra/Wikipedia"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.amazon.com"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.ask.com/"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.bing.com/"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.yahoo.com/"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.youtube.com"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/#hl=en&q=barack+obama"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/calendar/"
     },
     {
-        "duration": "63.0",
+        "duration": "128.0",
         "name": "v8.browsing_mobile-future/browse:chrome:newtab:2019"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "v8.browsing_mobile-future/browse:chrome:omnibox:2019"
     },
     {
-        "duration": "111.0",
+        "duration": "168.0",
         "name": "v8.browsing_mobile-future/browse:media:facebook_photos:2019"
     },
     {
-        "duration": "60.0",
+        "duration": "124.0",
         "name": "v8.browsing_mobile-future/browse:media:flickr_infinite_scroll:2019"
     },
     {
-        "duration": "53.0",
+        "duration": "108.0",
         "name": "v8.browsing_mobile-future/browse:media:googleplaystore:2019"
     },
     {
-        "duration": "87.0",
+        "duration": "176.0",
         "name": "v8.browsing_mobile-future/browse:media:imgur:2019"
     },
     {
-        "duration": "65.0",
+        "duration": "132.0",
         "name": "v8.browsing_mobile-future/browse:media:youtube:2019"
     },
     {
-        "duration": "67.0",
+        "duration": "146.0",
         "name": "v8.browsing_mobile-future/browse:news:cnn:2018"
     },
     {
-        "duration": "66.0",
+        "duration": "122.0",
         "name": "v8.browsing_mobile-future/browse:news:cricbuzz:2019"
     },
     {
-        "duration": "55.0",
+        "duration": "114.0",
         "name": "v8.browsing_mobile-future/browse:news:globo:2019"
     },
     {
-        "duration": "105.0",
+        "duration": "180.0",
         "name": "v8.browsing_mobile-future/browse:news:nytimes:2019"
     },
     {
-        "duration": "46.0",
+        "duration": "92.0",
         "name": "v8.browsing_mobile-future/browse:news:qq:2019"
     },
     {
-        "duration": "65.0",
+        "duration": "132.0",
         "name": "v8.browsing_mobile-future/browse:news:reddit:2019"
     },
     {
-        "duration": "66.0",
+        "duration": "138.0",
         "name": "v8.browsing_mobile-future/browse:news:toi:2019"
     },
     {
-        "duration": "74.0",
+        "duration": "150.0",
         "name": "v8.browsing_mobile-future/browse:news:washingtonpost:2019"
     },
     {
-        "duration": "33.0",
+        "duration": "68.0",
         "name": "v8.browsing_mobile-future/browse:search:amp:2018"
     },
     {
-        "duration": "34.0",
+        "duration": "70.0",
         "name": "v8.browsing_mobile-future/browse:search:amp:sxg:2019"
     },
     {
-        "duration": "64.0",
+        "duration": "130.0",
         "name": "v8.browsing_mobile-future/browse:shopping:amazon:2019"
     },
     {
-        "duration": "63.0",
+        "duration": "130.0",
         "name": "v8.browsing_mobile-future/browse:shopping:avito:2019"
     },
     {
-        "duration": "65.0",
+        "duration": "136.0",
         "name": "v8.browsing_mobile-future/browse:shopping:flipkart:2019"
     },
     {
-        "duration": "71.0",
+        "duration": "146.0",
         "name": "v8.browsing_mobile-future/browse:shopping:lazada:2019"
     },
     {
-        "duration": "77.0",
+        "duration": "154.0",
         "name": "v8.browsing_mobile-future/browse:social:facebook:2019"
     },
     {
-        "duration": "85.0",
+        "duration": "172.0",
         "name": "v8.browsing_mobile-future/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "92.0",
+        "duration": "186.0",
         "name": "v8.browsing_mobile-future/browse:social:instagram:2019"
     },
     {
-        "duration": "96.0",
+        "duration": "192.0",
         "name": "v8.browsing_mobile-future/browse:social:pinterest_infinite_scroll:2019"
     },
     {
-        "duration": "77.0",
+        "duration": "158.0",
         "name": "v8.browsing_mobile-future/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "73.0",
+        "duration": "150.0",
         "name": "v8.browsing_mobile-future/browse:social:twitter:2019"
     },
     {
-        "duration": "82.0",
+        "duration": "168.0",
         "name": "v8.browsing_mobile-future/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "52.0",
+        "duration": "106.0",
         "name": "v8.browsing_mobile-future/browse:tools:maps:2019"
     },
     {
-        "duration": "64.0",
+        "duration": "144.0",
         "name": "v8.browsing_mobile/browse:chrome:newtab:2019"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "v8.browsing_mobile/browse:chrome:omnibox:2019"
     },
     {
-        "duration": "99.0",
+        "duration": "170.0",
         "name": "v8.browsing_mobile/browse:media:facebook_photos:2019"
     },
     {
-        "duration": "61.0",
+        "duration": "124.0",
         "name": "v8.browsing_mobile/browse:media:flickr_infinite_scroll:2019"
     },
     {
-        "duration": "83.0",
+        "duration": "110.0",
         "name": "v8.browsing_mobile/browse:media:googleplaystore:2019"
     },
     {
-        "duration": "89.0",
+        "duration": "180.0",
         "name": "v8.browsing_mobile/browse:media:imgur:2019"
     },
     {
-        "duration": "237.0",
+        "duration": "132.0",
         "name": "v8.browsing_mobile/browse:media:youtube:2019"
     },
     {
-        "duration": "68.0",
+        "duration": "138.0",
         "name": "v8.browsing_mobile/browse:news:cnn:2018"
     },
     {
-        "duration": "277.0",
+        "duration": "122.0",
         "name": "v8.browsing_mobile/browse:news:cricbuzz:2019"
     },
     {
-        "duration": "56.0",
+        "duration": "112.0",
         "name": "v8.browsing_mobile/browse:news:globo:2019"
     },
     {
-        "duration": "110.0",
+        "duration": "190.0",
         "name": "v8.browsing_mobile/browse:news:nytimes:2019"
     },
     {
-        "duration": "46.0",
+        "duration": "92.0",
         "name": "v8.browsing_mobile/browse:news:qq:2019"
     },
     {
-        "duration": "68.0",
+        "duration": "134.0",
         "name": "v8.browsing_mobile/browse:news:reddit:2019"
     },
     {
-        "duration": "68.0",
+        "duration": "142.0",
         "name": "v8.browsing_mobile/browse:news:toi:2019"
     },
     {
-        "duration": "75.0",
+        "duration": "150.0",
         "name": "v8.browsing_mobile/browse:news:washingtonpost:2019"
     },
     {
-        "duration": "34.0",
+        "duration": "70.0",
         "name": "v8.browsing_mobile/browse:search:amp:2018"
     },
     {
-        "duration": "86.0",
+        "duration": "72.0",
         "name": "v8.browsing_mobile/browse:search:amp:sxg:2019"
     },
     {
-        "duration": "64.0",
+        "duration": "130.0",
         "name": "v8.browsing_mobile/browse:shopping:amazon:2019"
     },
     {
-        "duration": "65.0",
+        "duration": "130.0",
         "name": "v8.browsing_mobile/browse:shopping:avito:2019"
     },
     {
-        "duration": "67.0",
+        "duration": "134.0",
         "name": "v8.browsing_mobile/browse:shopping:flipkart:2019"
     },
     {
-        "duration": "87.0",
+        "duration": "144.0",
         "name": "v8.browsing_mobile/browse:shopping:lazada:2019"
     },
     {
-        "duration": "99.0",
+        "duration": "158.0",
         "name": "v8.browsing_mobile/browse:social:facebook:2019"
     },
     {
-        "duration": "86.0",
+        "duration": "174.0",
         "name": "v8.browsing_mobile/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "3184.0",
+        "duration": "234.0",
         "name": "v8.browsing_mobile/browse:social:instagram:2019"
     },
     {
-        "duration": "1123.0",
+        "duration": "202.0",
         "name": "v8.browsing_mobile/browse:social:pinterest_infinite_scroll:2019"
     },
     {
-        "duration": "79.0",
+        "duration": "158.0",
         "name": "v8.browsing_mobile/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "76.0",
+        "duration": "148.0",
         "name": "v8.browsing_mobile/browse:social:twitter:2019"
     },
     {
-        "duration": "84.0",
+        "duration": "168.0",
         "name": "v8.browsing_mobile/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "53.0",
+        "duration": "108.0",
         "name": "v8.browsing_mobile/browse:tools:maps:2019"
     },
     {
-        "duration": "22.0",
+        "duration": "42.0",
         "name": "webrtc/10s_datachannel_transfer"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "webrtc/canvas_capture_peer_connection"
     },
     {
-        "duration": "32.0",
+        "duration": "64.0",
         "name": "webrtc/codec_constraints_h264"
     },
     {
-        "duration": "32.0",
+        "duration": "64.0",
         "name": "webrtc/codec_constraints_vp8"
     },
     {
-        "duration": "32.0",
+        "duration": "64.0",
         "name": "webrtc/codec_constraints_vp9"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "webrtc/hd_local_stream_10s"
     },
     {
-        "duration": "33.0",
+        "duration": "64.0",
         "name": "webrtc/multiple_peerconnections"
     },
     {
-        "duration": "36.0",
+        "duration": "70.0",
         "name": "webrtc/pause_play_peerconnections"
     },
     {
diff --git a/tools/perf/core/shard_maps/timing_data/android-pixel2_weblayer-perf_timing.json b/tools/perf/core/shard_maps/timing_data/android-pixel2_weblayer-perf_timing.json
index 785059c..d32788d 100644
--- a/tools/perf/core/shard_maps/timing_data/android-pixel2_weblayer-perf_timing.json
+++ b/tools/perf/core/shard_maps/timing_data/android-pixel2_weblayer-perf_timing.json
@@ -1,34 +1,74 @@
 [
     {
-        "duration": "117.0",
+        "duration": "114.0",
         "name": "startup.mobile/cct:coldish:bbc"
     },
     {
-        "duration": "119.0",
+        "duration": "116.0",
         "name": "startup.mobile/intent:coldish:bbc"
     },
     {
-        "duration": "73.0",
+        "duration": "70.0",
         "name": "startup.mobile/intent:warm:bbc"
     },
     {
-        "duration": "12.0",
+        "duration": "10.0",
         "name": "startup.mobile/maps_pwa:with_http_cache"
     },
     {
+        "duration": "20.0",
+        "name": "system_health.common_mobile/background:social:facebook:2019"
+    },
+    {
         "duration": "3.0",
         "name": "system_health.common_mobile/background:tools:gmail:2019"
     },
     {
-        "duration": "49.0",
+        "duration": "50.0",
         "name": "system_health.common_mobile/browse:news:cnn:2018"
     },
     {
+        "duration": "49.0",
+        "name": "system_health.common_mobile/browse:news:reddit:2019"
+    },
+    {
+        "duration": "3.0",
+        "name": "system_health.common_mobile/browse:social:pinterest_infinite_scroll:2019"
+    },
+    {
+        "duration": "63.0",
+        "name": "system_health.common_mobile/browse:social:tumblr_infinite_scroll:2018"
+    },
+    {
+        "duration": "71.0",
+        "name": "system_health.common_mobile/browse:social:twitter:2019"
+    },
+    {
+        "duration": "41.0",
+        "name": "system_health.common_mobile/browse:tools:maps:2019"
+    },
+    {
         "duration": "20.0",
         "name": "system_health.common_mobile/load:media:youtube:2018"
     },
     {
-        "duration": "0.0",
+        "duration": "24.0",
+        "name": "system_health.common_mobile/load:news:cnn:2018"
+    },
+    {
+        "duration": "29.0",
+        "name": "system_health.common_mobile/load:tools:gmail:2019"
+    },
+    {
+        "duration": "20.0",
+        "name": "system_health.common_mobile/load:tools:weather:2019"
+    },
+    {
+        "duration": "24.0",
+        "name": "system_health.memory_mobile/background:social:facebook:2019"
+    },
+    {
+        "duration": "2.0",
         "name": "system_health.memory_mobile/background:tools:gmail:2019"
     },
     {
@@ -36,7 +76,39 @@
         "name": "system_health.memory_mobile/browse:news:cnn:2018"
     },
     {
-        "duration": "24.0",
+        "duration": "52.0",
+        "name": "system_health.memory_mobile/browse:news:reddit:2019"
+    },
+    {
+        "duration": "2.0",
+        "name": "system_health.memory_mobile/browse:social:pinterest_infinite_scroll:2019"
+    },
+    {
+        "duration": "64.0",
+        "name": "system_health.memory_mobile/browse:social:tumblr_infinite_scroll:2018"
+    },
+    {
+        "duration": "73.0",
+        "name": "system_health.memory_mobile/browse:social:twitter:2019"
+    },
+    {
+        "duration": "43.0",
+        "name": "system_health.memory_mobile/browse:tools:maps:2019"
+    },
+    {
+        "duration": "23.0",
         "name": "system_health.memory_mobile/load:media:youtube:2018"
+    },
+    {
+        "duration": "27.0",
+        "name": "system_health.memory_mobile/load:news:cnn:2018"
+    },
+    {
+        "duration": "31.0",
+        "name": "system_health.memory_mobile/load:tools:gmail:2019"
+    },
+    {
+        "duration": "24.0",
+        "name": "system_health.memory_mobile/load:tools:weather:2019"
     }
 ]
\ No newline at end of file
diff --git a/tools/perf/core/shard_maps/timing_data/android-pixel2_webview-perf_timing.json b/tools/perf/core/shard_maps/timing_data/android-pixel2_webview-perf_timing.json
index bb8e746..3f2d25c 100644
--- a/tools/perf/core/shard_maps/timing_data/android-pixel2_webview-perf_timing.json
+++ b/tools/perf/core/shard_maps/timing_data/android-pixel2_webview-perf_timing.json
@@ -8,11 +8,11 @@
         "name": "blink_perf.accessibility/textarea-append.html"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/append-child.html"
     },
     {
-        "duration": "13.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/create-element.html"
     },
     {
@@ -36,7 +36,7 @@
         "name": "blink_perf.bindings/gc-mini-tree.html"
     },
     {
-        "duration": "27.0",
+        "duration": "26.0",
         "name": "blink_perf.bindings/gc-tree.html"
     },
     {
@@ -112,7 +112,7 @@
         "name": "blink_perf.bindings/serialize-nested-array.html"
     },
     {
-        "duration": "12.0",
+        "duration": "11.0",
         "name": "blink_perf.bindings/set-attribute-rare.html"
     },
     {
@@ -136,11 +136,11 @@
         "name": "blink_perf.bindings/structured-clone-long-string-serialize.html"
     },
     {
-        "duration": "13.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/typed-array-construct-from-array.html"
     },
     {
-        "duration": "13.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/typed-array-construct-from-same-type.html"
     },
     {
@@ -156,11 +156,11 @@
         "name": "blink_perf.bindings/undefined-first-child.html"
     },
     {
-        "duration": "12.0",
+        "duration": "11.0",
         "name": "blink_perf.bindings/undefined-get-element-by-id.html"
     },
     {
-        "duration": "13.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/undefined-id-getter.html"
     },
     {
@@ -168,15 +168,15 @@
         "name": "blink_perf.bindings/worker-structured-clone-different-payloads.html"
     },
     {
-        "duration": "34.0",
+        "duration": "30.0",
         "name": "blink_perf.bindings/worker-structured-clone-json-from-worker.html"
     },
     {
-        "duration": "34.0",
+        "duration": "31.0",
         "name": "blink_perf.bindings/worker-structured-clone-json-roundtrip.html"
     },
     {
-        "duration": "34.0",
+        "duration": "30.0",
         "name": "blink_perf.bindings/worker-structured-clone-json-to-worker.html"
     },
     {
@@ -200,19 +200,19 @@
         "name": "blink_perf.bindings/worker-text-encoded-transferable-to-worker.html"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "blink_perf.bindings/worker-transferable-from-worker.html"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "blink_perf.bindings/worker-transferable-roundtrip.html"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "blink_perf.bindings/worker-transferable-to-worker.html"
     },
     {
-        "duration": "32.0",
+        "duration": "34.0",
         "name": "blink_perf.canvas/canvas-to-canvas-draw.html"
     },
     {
@@ -220,11 +220,11 @@
         "name": "blink_perf.canvas/canvas-to-canvas-draw_RAF.html?RAF"
     },
     {
-        "duration": "15.0",
+        "duration": "12.0",
         "name": "blink_perf.canvas/createImageBitmapFromImageData.html"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "blink_perf.canvas/createImageBitmapFromImageData_RAF.html?RAF"
     },
     {
@@ -236,7 +236,7 @@
         "name": "blink_perf.canvas/docs-paper_RAF.html?RAF"
     },
     {
-        "duration": "22.0",
+        "duration": "21.0",
         "name": "blink_perf.canvas/docs-resume.html"
     },
     {
@@ -272,7 +272,7 @@
         "name": "blink_perf.canvas/draw-hw-accelerated-canvas-2d-to-sw-canvas-2d.html"
     },
     {
-        "duration": "9.0",
+        "duration": "8.0",
         "name": "blink_perf.canvas/draw-hw-accelerated-canvas-2d-to-sw-canvas-2d_RAF.html?RAF"
     },
     {
@@ -308,11 +308,11 @@
         "name": "blink_perf.canvas/drawimage-not-pixelaligned_RAF.html?RAF"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "blink_perf.canvas/drawimage.html"
     },
     {
-        "duration": "14.0",
+        "duration": "16.0",
         "name": "blink_perf.canvas/drawimage_RAF.html?RAF"
     },
     {
@@ -324,11 +324,11 @@
         "name": "blink_perf.canvas/getImageDataColorManaged.html"
     },
     {
-        "duration": "11.0",
+        "duration": "12.0",
         "name": "blink_perf.canvas/getImageDataColorManaged_RAF.html?RAF"
     },
     {
-        "duration": "11.0",
+        "duration": "12.0",
         "name": "blink_perf.canvas/getImageData_RAF.html?RAF"
     },
     {
@@ -348,7 +348,7 @@
         "name": "blink_perf.canvas/putImageData_RAF.html?RAF"
     },
     {
-        "duration": "30.0",
+        "duration": "31.0",
         "name": "blink_perf.canvas/sheets-render.html"
     },
     {
@@ -356,7 +356,7 @@
         "name": "blink_perf.canvas/sheets-render_RAF.html?RAF"
     },
     {
-        "duration": "11.0",
+        "duration": "12.0",
         "name": "blink_perf.canvas/toBlob_duration.html"
     },
     {
@@ -364,7 +364,7 @@
         "name": "blink_perf.canvas/toBlob_duration_RAF.html?RAF"
     },
     {
-        "duration": "9.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/toBlob_duration_jpeg.html"
     },
     {
@@ -384,7 +384,7 @@
         "name": "blink_perf.canvas/upload-canvas-2d-to-texture.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.canvas/upload-canvas-2d-to-texture_RAF.html?RAF"
     },
     {
@@ -408,15 +408,15 @@
         "name": "blink_perf.canvas/upload-webgl-to-texture.html"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "blink_perf.canvas/upload-webgl-to-texture_RAF.html?RAF"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "blink_perf.css/AttributeDescendantSelector.html"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "blink_perf.css/CSSPropertySetterGetter.html"
     },
     {
@@ -428,75 +428,75 @@
         "name": "blink_perf.css/CSSPropertyUpdateValue.html"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "blink_perf.css/ChangeStyleChildClassSelector.html"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "blink_perf.css/ChangeStyleChildElementSelectors.html"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "blink_perf.css/ChangeStyleElementSelector.html"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "blink_perf.css/ChangeStyleGrandChildElementSelector.html"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "blink_perf.css/ChangeStyleMultipleClassSelector.html"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "blink_perf.css/ChangeStyleMultipleQualifiedDataAttributesWithValuesSelector.html"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "blink_perf.css/ChangeStyleNestedPseudoSelector.html"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "blink_perf.css/ChangeStylePairOfNthChildSelector.html"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "blink_perf.css/ChangeStylePartialAttributeMatchingSelector.html"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeSelector.html"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeWithValueSelector.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.css/ChangeStyleShallowTree.html"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "blink_perf.css/ChangeStyleSingleClassSelector.html"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "blink_perf.css/ChangeStyleSingleNthChildSelector.html"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "blink_perf.css/ChangeStyleSinglePseudoSelector.html"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "blink_perf.css/ChangeStyleUniversalSelector.html"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeSelector.html"
     },
     {
-        "duration": "7.0",
+        "duration": "11.0",
         "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeWithValueSelector.html"
     },
     {
@@ -508,15 +508,19 @@
         "name": "blink_perf.css/ClassInvalidation.html"
     },
     {
-        "duration": "8.0",
+        "duration": "7.0",
         "name": "blink_perf.css/CustomPropertiesCascade.html"
     },
     {
-        "duration": "8.0",
+        "duration": "7.0",
         "name": "blink_perf.css/CustomPropertiesNonRootInheritance.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
+        "name": "blink_perf.css/CustomPropertiesPendingSubstitution.html"
+    },
+    {
+        "duration": "7.0",
         "name": "blink_perf.css/CustomPropertiesRootInheritance.html"
     },
     {
@@ -528,11 +532,11 @@
         "name": "blink_perf.css/FocusUpdate.html"
     },
     {
-        "duration": "8.0",
+        "duration": "7.0",
         "name": "blink_perf.css/LoadBootstrapBlog.html"
     },
     {
-        "duration": "8.0",
+        "duration": "7.0",
         "name": "blink_perf.css/LoadMaterializeStarterPage.html"
     },
     {
@@ -556,7 +560,7 @@
         "name": "blink_perf.dom/custom-element-default-style.html"
     },
     {
-        "duration": "22.0",
+        "duration": "17.0",
         "name": "blink_perf.dom/long-sibling-list.html"
     },
     {
@@ -564,11 +568,11 @@
         "name": "blink_perf.dom/modify-element-classname.html"
     },
     {
-        "duration": "8.0",
+        "duration": "7.0",
         "name": "blink_perf.dom/modify-element-id.html"
     },
     {
-        "duration": "8.0",
+        "duration": "7.0",
         "name": "blink_perf.dom/modify-element-title.html"
     },
     {
@@ -576,7 +580,7 @@
         "name": "blink_perf.dom/select-multiple-add.html"
     },
     {
-        "duration": "13.0",
+        "duration": "12.0",
         "name": "blink_perf.dom/select-single-add.html"
     },
     {
@@ -584,7 +588,7 @@
         "name": "blink_perf.dom/select-single-remove.html"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "blink_perf.events/EventsDispatching.html"
     },
     {
@@ -604,15 +608,15 @@
         "name": "blink_perf.events/EventsDispatchingInV1ShadowTrees.html"
     },
     {
-        "duration": "25.0",
+        "duration": "23.0",
         "name": "blink_perf.events/hit-test-lots-of-layers.html"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "blink_perf.events/is-input-pending-all-events.html"
     },
     {
-        "duration": "18.0",
+        "duration": "28.0",
         "name": "blink_perf.events/is-input-pending-default-events.html"
     },
     {
@@ -668,7 +672,7 @@
         "name": "blink_perf.layout/SimpleTextPathLineLayout.html"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "blink_perf.layout/add-remove-inline-floats.html"
     },
     {
@@ -688,11 +692,11 @@
         "name": "blink_perf.layout/auto-grid-lots-of-data.html"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "blink_perf.layout/auto-grid-lots-of-spanning-data.html"
     },
     {
-        "duration": "14.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/change-text-css-contain.html"
     },
     {
@@ -712,7 +716,7 @@
         "name": "blink_perf.layout/chapter-reflow-twice.html"
     },
     {
-        "duration": "11.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/chapter-reflow.html"
     },
     {
@@ -720,7 +724,7 @@
         "name": "blink_perf.layout/character_fallback.html"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "blink_perf.layout/contain-content-style-change.html"
     },
     {
@@ -744,7 +748,7 @@
         "name": "blink_perf.layout/editing_prepend.html"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/fit-content-change-available-size-blocks.html"
     },
     {
@@ -780,7 +784,7 @@
         "name": "blink_perf.layout/flexbox-row-nowrap.html"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "blink_perf.layout/flexbox-row-stretch-height-definite.html"
     },
     {
@@ -792,7 +796,7 @@
         "name": "blink_perf.layout/flexbox-with-stretch-layout.html"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/flexbox_with_list_item.html"
     },
     {
@@ -832,47 +836,47 @@
         "name": "blink_perf.layout/floats_50_100_nested.html"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "blink_perf.layout/hindi-line-layout.html"
     },
     {
-        "duration": "10.0",
+        "duration": "9.0",
         "name": "blink_perf.layout/japanese-kokoro-insert.html"
     },
     {
-        "duration": "16.0",
+        "duration": "15.0",
         "name": "blink_perf.layout/large-grid.html"
     },
     {
-        "duration": "13.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/large-spanning-grid-item.html"
     },
     {
-        "duration": "21.0",
+        "duration": "19.0",
         "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans-wider-than-table.html"
     },
     {
-        "duration": "21.0",
+        "duration": "19.0",
         "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans.html"
     },
     {
-        "duration": "21.0",
+        "duration": "19.0",
         "name": "blink_perf.layout/large-table-with-collapsed-borders-and-no-colspans.html"
     },
     {
-        "duration": "22.0",
+        "duration": "21.0",
         "name": "blink_perf.layout/latin-ebook-resize.html"
     },
     {
-        "duration": "14.0",
+        "duration": "13.0",
         "name": "blink_perf.layout/latin-ebook.html"
     },
     {
-        "duration": "8.0",
+        "duration": "7.0",
         "name": "blink_perf.layout/layers_overlap_2d.html"
     },
     {
-        "duration": "8.0",
+        "duration": "7.0",
         "name": "blink_perf.layout/layers_overlap_3d.html"
     },
     {
@@ -888,11 +892,11 @@
         "name": "blink_perf.layout/line-layout-line-height.html"
     },
     {
-        "duration": "14.0",
+        "duration": "13.0",
         "name": "blink_perf.layout/line-layout-repeat-append-select.html"
     },
     {
-        "duration": "12.0",
+        "duration": "11.0",
         "name": "blink_perf.layout/line-layout-repeat-append.html"
     },
     {
@@ -900,11 +904,11 @@
         "name": "blink_perf.layout/line-layout.html"
     },
     {
-        "duration": "7.0",
+        "duration": "6.0",
         "name": "blink_perf.layout/long-line-nowrap-collapse.html"
     },
     {
-        "duration": "7.0",
+        "duration": "6.0",
         "name": "blink_perf.layout/long-line-nowrap-spans-collapse.html"
     },
     {
@@ -912,7 +916,7 @@
         "name": "blink_perf.layout/long-line-nowrap.html"
     },
     {
-        "duration": "12.0",
+        "duration": "11.0",
         "name": "blink_perf.layout/many-block-children-auto-inline-size.html"
     },
     {
@@ -928,15 +932,15 @@
         "name": "blink_perf.layout/multicol/deeply-nested-tables.html"
     },
     {
-        "duration": "12.0",
+        "duration": "11.0",
         "name": "blink_perf.layout/multicol/fixed-height-with-spanner-and-nested-tables.html"
     },
     {
-        "duration": "16.0",
+        "duration": "11.0",
         "name": "blink_perf.layout/multicol/lots-of-small-nested-unbreakable-blocks-autofill.html"
     },
     {
-        "duration": "12.0",
+        "duration": "11.0",
         "name": "blink_perf.layout/multicol/lots-of-small-unbreakable-blocks-autofill.html"
     },
     {
@@ -952,7 +956,7 @@
         "name": "blink_perf.layout/multicol/lots-of-text-balanced.html"
     },
     {
-        "duration": "42.0",
+        "duration": "41.0",
         "name": "blink_perf.layout/multicol/nested-forced-breaks.html"
     },
     {
@@ -976,11 +980,11 @@
         "name": "blink_perf.layout/nested-percent-height-tables.html"
     },
     {
-        "duration": "76.0",
+        "duration": "72.0",
         "name": "blink_perf.layout/subtree-detaching.html"
     },
     {
-        "duration": "10.0",
+        "duration": "9.0",
         "name": "blink_perf.layout/vertical-japanese-kokoro-insert.html"
     },
     {
@@ -1004,7 +1008,7 @@
         "name": "blink_perf.owp_storage/blob-perf-ipc.html"
     },
     {
-        "duration": "10.0",
+        "duration": "9.0",
         "name": "blink_perf.owp_storage/blob-perf-shm.html"
     },
     {
@@ -1016,75 +1020,75 @@
         "name": "blink_perf.owp_storage/idb-load-docs.html"
     },
     {
-        "duration": "15.0",
+        "duration": "14.0",
         "name": "blink_perf.paint/appending-text.html"
     },
     {
-        "duration": "3.0",
+        "duration": "2.0",
         "name": "blink_perf.paint/color-changes.html"
     },
     {
-        "duration": "21.0",
+        "duration": "20.0",
         "name": "blink_perf.paint/complex-content-slow-scroll.html"
     },
     {
-        "duration": "21.0",
+        "duration": "20.0",
         "name": "blink_perf.paint/complex-iframe-filtered.html"
     },
     {
-        "duration": "52.0",
+        "duration": "50.0",
         "name": "blink_perf.paint/contain-update-layer-tree.html"
     },
     {
-        "duration": "29.0",
+        "duration": "28.0",
         "name": "blink_perf.paint/containment-resize.html"
     },
     {
-        "duration": "17.0",
+        "duration": "15.0",
         "name": "blink_perf.paint/fixed-and-many-layers-scroll.html"
     },
     {
-        "duration": "24.0",
+        "duration": "22.0",
         "name": "blink_perf.paint/large-table-background-change-with-invisible-collapsed-borders.html"
     },
     {
-        "duration": "18.0",
+        "duration": "16.0",
         "name": "blink_perf.paint/large-table-background-change-with-visible-collapsed-borders.html"
     },
     {
-        "duration": "26.0",
+        "duration": "23.0",
         "name": "blink_perf.paint/large-table-background-change-with-zero-width-collapsed-borders.html"
     },
     {
-        "duration": "19.0",
+        "duration": "17.0",
         "name": "blink_perf.paint/large-table-collapsed-border-change-with-backgrounds.html"
     },
     {
-        "duration": "23.0",
+        "duration": "22.0",
         "name": "blink_perf.paint/large-table-collapsed-border-change-with-text.html"
     },
     {
-        "duration": "16.0",
+        "duration": "15.0",
         "name": "blink_perf.paint/large-table-collapsed-border-change.html"
     },
     {
-        "duration": "22.0",
+        "duration": "20.0",
         "name": "blink_perf.paint/large-table-repaint.html"
     },
     {
-        "duration": "24.0",
+        "duration": "22.0",
         "name": "blink_perf.paint/move-text-with-mask.html"
     },
     {
-        "duration": "3.0",
+        "duration": "2.0",
         "name": "blink_perf.paint/paint-offset-changes.html"
     },
     {
-        "duration": "3.0",
+        "duration": "2.0",
         "name": "blink_perf.paint/select-all-words.html"
     },
     {
-        "duration": "28.0",
+        "duration": "27.0",
         "name": "blink_perf.paint/transform-changes.html"
     },
     {
@@ -1100,7 +1104,7 @@
         "name": "blink_perf.parser/html-parser.html"
     },
     {
-        "duration": "92.0",
+        "duration": "91.0",
         "name": "blink_perf.parser/html5-full-render.html"
     },
     {
@@ -1116,11 +1120,11 @@
         "name": "blink_perf.parser/innerHTML-setter.html"
     },
     {
-        "duration": "12.0",
+        "duration": "11.0",
         "name": "blink_perf.parser/query-selector-all-attribute-complex.html"
     },
     {
-        "duration": "12.0",
+        "duration": "11.0",
         "name": "blink_perf.parser/query-selector-all-attribute.html"
     },
     {
@@ -1132,7 +1136,7 @@
         "name": "blink_perf.parser/query-selector-all-class-first.html"
     },
     {
-        "duration": "13.0",
+        "duration": "12.0",
         "name": "blink_perf.parser/query-selector-all-class-last.html"
     },
     {
@@ -1160,7 +1164,7 @@
         "name": "blink_perf.parser/query-selector-all-id-last.html"
     },
     {
-        "duration": "12.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/query-selector-all-last.html"
     },
     {
@@ -1184,7 +1188,7 @@
         "name": "blink_perf.parser/query-selector-last.html"
     },
     {
-        "duration": "11.0",
+        "duration": "12.0",
         "name": "blink_perf.parser/simple-url.html"
     },
     {
@@ -1192,11 +1196,11 @@
         "name": "blink_perf.parser/textarea-parsing.html"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "blink_perf.parser/tiny-innerHTML.html"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "blink_perf.parser/url-parser.html"
     },
     {
@@ -1204,31 +1208,31 @@
         "name": "blink_perf.parser/xml-parser.html"
     },
     {
-        "duration": "9.0",
+        "duration": "10.0",
         "name": "blink_perf.shadow_dom/declarative-api.html"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/imperative-api-appendchild.html"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/imperative-api-assign.html"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/imperative-api-assigned-elements.html"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/imperative-api-assigned-slot.html"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/imperative-api-custom-detail-summary-large.html"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/imperative-api-custom-detail-summary.html"
     },
     {
@@ -1240,11 +1244,11 @@
         "name": "blink_perf.shadow_dom/imperative-api-detail-summary.html"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/imperative-api-insertbefore.html"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/imperative-api.html"
     },
     {
@@ -1252,15 +1256,15 @@
         "name": "blink_perf.shadow_dom/shadow-style-share-attr-selectors.html"
     },
     {
-        "duration": "6.0",
+        "duration": "7.0",
         "name": "blink_perf.shadow_dom/shadow-style-share-media-query.html"
     },
     {
-        "duration": "6.0",
+        "duration": "7.0",
         "name": "blink_perf.shadow_dom/shadow-style-share-with-distribution.html"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/shadow-style-share.html"
     },
     {
@@ -1268,7 +1272,7 @@
         "name": "blink_perf.shadow_dom/style-sheet-insert.html"
     },
     {
-        "duration": "6.0",
+        "duration": "7.0",
         "name": "blink_perf.shadow_dom/v0-changing-classname-with-shadow-dom.html"
     },
     {
@@ -1276,7 +1280,7 @@
         "name": "blink_perf.shadow_dom/v0-changing-classname-without-shadow-dom.html"
     },
     {
-        "duration": "11.0",
+        "duration": "12.0",
         "name": "blink_perf.shadow_dom/v0-changing-select-with-shadow-dom.html"
     },
     {
@@ -1288,7 +1292,7 @@
         "name": "blink_perf.shadow_dom/v0-content-reprojection.html"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v0-large-distribution-without-layout.html"
     },
     {
@@ -1304,19 +1308,19 @@
         "name": "blink_perf.shadow_dom/v0-small-distribution-with-layout.html"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "blink_perf.shadow_dom/v1-distribution-disconnected-and-reconnected.html"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v1-distribution.html"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v1-host-child-append.html"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "blink_perf.shadow_dom/v1-large-deep-distribution.html"
     },
     {
@@ -1324,19 +1328,19 @@
         "name": "blink_perf.shadow_dom/v1-large-deep-layout.html"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-append-layout.html"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-distribution.html"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-layout.html"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-prepend-layout.html"
     },
     {
@@ -1348,7 +1352,7 @@
         "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-slot-assigned-nodes.html"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-slot-flatten.html"
     },
     {
@@ -1356,11 +1360,11 @@
         "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-re-layout.html"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-assigned-nodes.html"
     },
     {
-        "duration": "9.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-flatten.html"
     },
     {
@@ -1500,7 +1504,7 @@
         "name": "dummy_benchmark.noisy_benchmark_1/dummy_page.html"
     },
     {
-        "duration": "8.0",
+        "duration": "7.0",
         "name": "dummy_benchmark.stable_benchmark_1/dummy_page.html"
     },
     {
@@ -1508,43 +1512,43 @@
         "name": "jetstream/JetStream"
     },
     {
-        "duration": "56.0",
+        "duration": "57.0",
         "name": "kraken/http://krakenbenchmark.mozilla.org/kraken-1.1/driver.html"
     },
     {
-        "duration": "12.0",
+        "duration": "16.0",
         "name": "loading.mobile/58Pic"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "loading.mobile/58Pic_3g"
     },
     {
-        "duration": "13.0",
+        "duration": "12.0",
         "name": "loading.mobile/Amazon"
     },
     {
-        "duration": "31.0",
+        "duration": "28.0",
         "name": "loading.mobile/Amazon_3g"
     },
     {
-        "duration": "14.0",
+        "duration": "13.0",
         "name": "loading.mobile/BOLNoticias"
     },
     {
-        "duration": "3.0",
+        "duration": "2.0",
         "name": "loading.mobile/BOLNoticias_3g"
     },
     {
-        "duration": "12.0",
+        "duration": "11.0",
         "name": "loading.mobile/Baidu"
     },
     {
-        "duration": "22.0",
+        "duration": "21.0",
         "name": "loading.mobile/Baidu_3g"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "loading.mobile/Bradesco"
     },
     {
@@ -1552,7 +1556,7 @@
         "name": "loading.mobile/Bradesco_3g"
     },
     {
-        "duration": "14.0",
+        "duration": "13.0",
         "name": "loading.mobile/Dailymotion"
     },
     {
@@ -1560,7 +1564,7 @@
         "name": "loading.mobile/Dailymotion_3g"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "loading.mobile/Dawn"
     },
     {
@@ -1592,11 +1596,11 @@
         "name": "loading.mobile/DevOpera_warm_3g"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "loading.mobile/Dramaq"
     },
     {
-        "duration": "48.0",
+        "duration": "49.0",
         "name": "loading.mobile/Dramaq_3g"
     },
     {
@@ -1608,15 +1612,15 @@
         "name": "loading.mobile/EnquiryIndianRail_3g"
     },
     {
-        "duration": "11.0",
+        "duration": "10.0",
         "name": "loading.mobile/Facebook"
     },
     {
-        "duration": "3.0",
+        "duration": "2.0",
         "name": "loading.mobile/Facebook_3g"
     },
     {
-        "duration": "14.0",
+        "duration": "13.0",
         "name": "loading.mobile/FlipBoard_cold"
     },
     {
@@ -1624,11 +1628,11 @@
         "name": "loading.mobile/FlipBoard_cold_3g"
     },
     {
-        "duration": "18.0",
+        "duration": "17.0",
         "name": "loading.mobile/FlipBoard_hot"
     },
     {
-        "duration": "21.0",
+        "duration": "20.0",
         "name": "loading.mobile/FlipBoard_hot_3g"
     },
     {
@@ -1652,7 +1656,7 @@
         "name": "loading.mobile/FlipKart_hot"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "loading.mobile/FlipKart_hot_3g"
     },
     {
@@ -1664,19 +1668,19 @@
         "name": "loading.mobile/FlipKart_warm_3g"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "loading.mobile/FranceTVInfo"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "loading.mobile/FranceTVInfo_3g"
     },
     {
-        "duration": "3.0",
+        "duration": "2.0",
         "name": "loading.mobile/G1"
     },
     {
-        "duration": "3.0",
+        "duration": "2.0",
         "name": "loading.mobile/G1_3g"
     },
     {
@@ -1688,43 +1692,43 @@
         "name": "loading.mobile/GSShop_3g"
     },
     {
-        "duration": "11.0",
+        "duration": "10.0",
         "name": "loading.mobile/GoogleBrazil"
     },
     {
-        "duration": "3.0",
+        "duration": "2.0",
         "name": "loading.mobile/GoogleBrazil_3g"
     },
     {
-        "duration": "11.0",
+        "duration": "10.0",
         "name": "loading.mobile/GoogleIndia"
     },
     {
-        "duration": "3.0",
+        "duration": "2.0",
         "name": "loading.mobile/GoogleIndia_3g"
     },
     {
-        "duration": "11.0",
+        "duration": "10.0",
         "name": "loading.mobile/GoogleIndonesia"
     },
     {
-        "duration": "3.0",
+        "duration": "2.0",
         "name": "loading.mobile/GoogleIndonesia_3g"
     },
     {
-        "duration": "15.0",
+        "duration": "13.0",
         "name": "loading.mobile/GoogleRedirectToGoogleJapan"
     },
     {
-        "duration": "3.0",
+        "duration": "2.0",
         "name": "loading.mobile/GoogleRedirectToGoogleJapan_3g"
     },
     {
-        "duration": "14.0",
+        "duration": "16.0",
         "name": "loading.mobile/Hongkiat"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "loading.mobile/Hongkiat_3g"
     },
     {
@@ -1736,7 +1740,7 @@
         "name": "loading.mobile/KapanLagi_3g"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "loading.mobile/Kaskus"
     },
     {
@@ -1744,7 +1748,7 @@
         "name": "loading.mobile/Kaskus_3g"
     },
     {
-        "duration": "15.0",
+        "duration": "13.0",
         "name": "loading.mobile/LocalMoxie"
     },
     {
@@ -1752,11 +1756,11 @@
         "name": "loading.mobile/LocalMoxie_3g"
     },
     {
-        "duration": "12.0",
+        "duration": "14.0",
         "name": "loading.mobile/Locanto"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "loading.mobile/Locanto_3g"
     },
     {
@@ -1768,7 +1772,7 @@
         "name": "loading.mobile/OLX_3g"
     },
     {
-        "duration": "11.0",
+        "duration": "16.0",
         "name": "loading.mobile/QQNews"
     },
     {
@@ -1792,7 +1796,7 @@
         "name": "loading.mobile/Suumo_cold_3g"
     },
     {
-        "duration": "19.0",
+        "duration": "17.0",
         "name": "loading.mobile/Suumo_hot"
     },
     {
@@ -1804,7 +1808,7 @@
         "name": "loading.mobile/Suumo_warm"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "loading.mobile/Suumo_warm_3g"
     },
     {
@@ -1824,11 +1828,11 @@
         "name": "loading.mobile/TheStar_3g"
     },
     {
-        "duration": "14.0",
+        "duration": "13.0",
         "name": "loading.mobile/TribunNews"
     },
     {
-        "duration": "3.0",
+        "duration": "2.0",
         "name": "loading.mobile/TribunNews_3g"
     },
     {
@@ -1836,7 +1840,7 @@
         "name": "loading.mobile/Twitter"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "loading.mobile/Twitter_3g"
     },
     {
@@ -1864,27 +1868,27 @@
         "name": "loading.mobile/VoiceMemos_warm_3g"
     },
     {
-        "duration": "11.0",
+        "duration": "10.0",
         "name": "loading.mobile/Wikipedia"
     },
     {
-        "duration": "16.0",
+        "duration": "15.0",
         "name": "loading.mobile/Wikipedia_3g"
     },
     {
-        "duration": "14.0",
+        "duration": "13.0",
         "name": "loading.mobile/YahooNews"
     },
     {
-        "duration": "3.0",
+        "duration": "2.0",
         "name": "loading.mobile/YahooNews_3g"
     },
     {
-        "duration": "11.0",
+        "duration": "10.0",
         "name": "loading.mobile/Youtube"
     },
     {
-        "duration": "3.0",
+        "duration": "2.0",
         "name": "loading.mobile/Youtube_3g"
     },
     {
@@ -1892,11 +1896,11 @@
         "name": "octane/Octane"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rasterize_and_record_micro.partial_invalidation/800_relpos_divs.html"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/amazon.html"
     },
     {
@@ -1912,7 +1916,7 @@
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/cnn.html"
     },
     {
-        "duration": "11.0",
+        "duration": "12.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/ebay.html"
     },
     {
@@ -1932,7 +1936,7 @@
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/google.html"
     },
     {
-        "duration": "28.0",
+        "duration": "29.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googlecalendar.html"
     },
     {
@@ -1952,7 +1956,7 @@
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/linkedin.html"
     },
     {
-        "duration": "16.0",
+        "duration": "11.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/pinterest.html"
     },
     {
@@ -1964,7 +1968,7 @@
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/twitter.html"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/weather.html"
     },
     {
@@ -1980,7 +1984,7 @@
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahooanswers.html"
     },
     {
-        "duration": "61.0",
+        "duration": "62.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoogames.html"
     },
     {
@@ -1996,43 +2000,43 @@
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/youtube.html"
     },
     {
-        "duration": "29.0",
+        "duration": "27.0",
         "name": "rendering.mobile/accu_weather_2018"
     },
     {
-        "duration": "39.0",
+        "duration": "25.0",
         "name": "rendering.mobile/accu_weather_mobile_pinch_2018"
     },
     {
-        "duration": "22.0",
+        "duration": "21.0",
         "name": "rendering.mobile/amazon_2018"
     },
     {
-        "duration": "23.0",
+        "duration": "25.0",
         "name": "rendering.mobile/amazon_mobile_2018"
     },
     {
-        "duration": "26.0",
+        "duration": "25.0",
         "name": "rendering.mobile/analog_clock_svg"
     },
     {
-        "duration": "23.0",
+        "duration": "28.0",
         "name": "rendering.mobile/androidpolice_mobile_2018"
     },
     {
-        "duration": "32.0",
+        "duration": "27.0",
         "name": "rendering.mobile/animometer_webgl"
     },
     {
-        "duration": "38.0",
+        "duration": "27.0",
         "name": "rendering.mobile/animometer_webgl_attrib_arrays"
     },
     {
-        "duration": "32.0",
+        "duration": "27.0",
         "name": "rendering.mobile/animometer_webgl_multi_draw"
     },
     {
-        "duration": "30.0",
+        "duration": "27.0",
         "name": "rendering.mobile/aquarium"
     },
     {
@@ -2044,7 +2048,7 @@
         "name": "rendering.mobile/background_color_animation"
     },
     {
-        "duration": "24.0",
+        "duration": "23.0",
         "name": "rendering.mobile/background_color_animation_with_gradient"
     },
     {
@@ -2084,7 +2088,7 @@
         "name": "rendering.mobile/balls_svg_animations"
     },
     {
-        "duration": "24.0",
+        "duration": "23.0",
         "name": "rendering.mobile/basic_stream"
     },
     {
@@ -2096,7 +2100,7 @@
         "name": "rendering.mobile/blob"
     },
     {
-        "duration": "16.0",
+        "duration": "20.0",
         "name": "rendering.mobile/blogspot_2018"
     },
     {
@@ -2104,7 +2108,7 @@
         "name": "rendering.mobile/blogspot_mobile_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.mobile/blur_rotating_background"
     },
     {
@@ -2112,11 +2116,11 @@
         "name": "rendering.mobile/boingboing_mobile_2018"
     },
     {
-        "duration": "18.0",
+        "duration": "17.0",
         "name": "rendering.mobile/booking.com_2018"
     },
     {
-        "duration": "15.0",
+        "duration": "13.0",
         "name": "rendering.mobile/booking.com_mobile_2018"
     },
     {
@@ -2132,7 +2136,7 @@
         "name": "rendering.mobile/bouncing_clipped_rectangles"
     },
     {
-        "duration": "22.0",
+        "duration": "21.0",
         "name": "rendering.mobile/bouncing_gradient_circles"
     },
     {
@@ -2144,35 +2148,35 @@
         "name": "rendering.mobile/bouncing_svg_images"
     },
     {
-        "duration": "30.0",
+        "duration": "26.0",
         "name": "rendering.mobile/camera_to_webgl"
     },
     {
-        "duration": "19.0",
+        "duration": "18.0",
         "name": "rendering.mobile/canvas_05000_pixels_per_second"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "rendering.mobile/canvas_10000_pixels_per_second"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "rendering.mobile/canvas_20000_pixels_per_second"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "rendering.mobile/canvas_40000_pixels_per_second"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "rendering.mobile/canvas_60000_pixels_per_second"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "rendering.mobile/canvas_75000_pixels_per_second"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "rendering.mobile/canvas_90000_pixels_per_second"
     },
     {
@@ -2184,11 +2188,11 @@
         "name": "rendering.mobile/canvas_arcs"
     },
     {
-        "duration": "22.0",
+        "duration": "21.0",
         "name": "rendering.mobile/canvas_font_cycler"
     },
     {
-        "duration": "22.0",
+        "duration": "21.0",
         "name": "rendering.mobile/canvas_lines"
     },
     {
@@ -2196,31 +2200,31 @@
         "name": "rendering.mobile/canvas_to_blob"
     },
     {
-        "duration": "27.0",
+        "duration": "21.0",
         "name": "rendering.mobile/capitolvolkswagen_mobile_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "16.0",
         "name": "rendering.mobile/card_expansion"
     },
     {
-        "duration": "18.0",
+        "duration": "17.0",
         "name": "rendering.mobile/card_expansion_animated"
     },
     {
-        "duration": "18.0",
+        "duration": "17.0",
         "name": "rendering.mobile/card_expansion_images_text"
     },
     {
-        "duration": "17.0",
+        "duration": "16.0",
         "name": "rendering.mobile/card_flying"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "rendering.mobile/cats_unscaled"
     },
     {
-        "duration": "11.0",
+        "duration": "13.0",
         "name": "rendering.mobile/cats_viewport_width"
     },
     {
@@ -2228,7 +2232,7 @@
         "name": "rendering.mobile/cc_poster_circle"
     },
     {
-        "duration": "22.0",
+        "duration": "18.0",
         "name": "rendering.mobile/cc_scroll_text_only"
     },
     {
@@ -2236,11 +2240,11 @@
         "name": "rendering.mobile/chip_tune"
     },
     {
-        "duration": "20.0",
+        "duration": "17.0",
         "name": "rendering.mobile/cnn_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "rendering.mobile/cnn_article_mobile_2018"
     },
     {
@@ -2248,31 +2252,31 @@
         "name": "rendering.mobile/cnn_mobile_2018"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "rendering.mobile/cnn_mobile_pinch_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "rendering.mobile/cnn_pathological_2018"
     },
     {
-        "duration": "23.0",
+        "duration": "21.0",
         "name": "rendering.mobile/compositor_heavy_animation"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "rendering.mobile/coordinated_animation"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "rendering.mobile/core_scroll_header_panel"
     },
     {
-        "duration": "21.0",
+        "duration": "22.0",
         "name": "rendering.mobile/crafty_mind"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "rendering.mobile/css_animations_many_keyframes"
     },
     {
@@ -2292,47 +2296,47 @@
         "name": "rendering.mobile/css_animations_simultaneous_updating_class"
     },
     {
-        "duration": "21.0",
+        "duration": "25.0",
         "name": "rendering.mobile/css_animations_staggered_infinite_iterations"
     },
     {
-        "duration": "22.0",
+        "duration": "24.0",
         "name": "rendering.mobile/css_animations_staggered_inline_style"
     },
     {
-        "duration": "23.0",
+        "duration": "24.0",
         "name": "rendering.mobile/css_animations_staggered_new_element"
     },
     {
-        "duration": "22.0",
+        "duration": "24.0",
         "name": "rendering.mobile/css_animations_staggered_style_element"
     },
     {
-        "duration": "22.0",
+        "duration": "24.0",
         "name": "rendering.mobile/css_animations_staggered_updating_class"
     },
     {
-        "duration": "22.0",
+        "duration": "24.0",
         "name": "rendering.mobile/css_animations_triggered_inline_style"
     },
     {
-        "duration": "23.0",
+        "duration": "24.0",
         "name": "rendering.mobile/css_animations_triggered_new_element"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/css_animations_triggered_style_element"
     },
     {
-        "duration": "22.0",
+        "duration": "24.0",
         "name": "rendering.mobile/css_animations_triggered_updating_class"
     },
     {
-        "duration": "25.0",
+        "duration": "24.0",
         "name": "rendering.mobile/css_opacity_plus_n_layers_0"
     },
     {
-        "duration": "25.0",
+        "duration": "24.0",
         "name": "rendering.mobile/css_opacity_plus_n_layers_75"
     },
     {
@@ -2340,183 +2344,183 @@
         "name": "rendering.mobile/css_opacity_plus_n_layers_99"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/css_transitions_inline_style"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/css_transitions_new_element"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/css_transitions_staggered_inline_style"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/css_transitions_staggered_new_element"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/css_transitions_staggered_style_element"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/css_transitions_staggered_updating_class"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/css_transitions_style_element"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/css_transitions_triggered_inline_style"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/css_transitions_triggered_new_element"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/css_transitions_triggered_style_element"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/css_transitions_triggered_updating_class"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/css_transitions_updating_class"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/css_value_type_color"
     },
     {
-        "duration": "24.0",
+        "duration": "23.0",
         "name": "rendering.mobile/css_value_type_filter"
     },
     {
-        "duration": "21.0",
+        "duration": "22.0",
         "name": "rendering.mobile/css_value_type_length"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/css_value_type_length_complex"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/css_value_type_length_simple"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/css_value_type_path"
     },
     {
-        "duration": "23.0",
+        "duration": "24.0",
         "name": "rendering.mobile/css_value_type_shadow"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/css_value_type_transform_complex"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/css_value_type_transform_simple"
     },
     {
-        "duration": "19.0",
+        "duration": "27.0",
         "name": "rendering.mobile/deviantart_mobile_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.mobile/digg_mobile_2018"
     },
     {
-        "duration": "25.0",
+        "duration": "27.0",
         "name": "rendering.mobile/dynamic_cube_map"
     },
     {
-        "duration": "24.0",
+        "duration": "25.0",
         "name": "rendering.mobile/earth"
     },
     {
-        "duration": "18.0",
+        "duration": "19.0",
         "name": "rendering.mobile/ebay_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "16.0",
         "name": "rendering.mobile/ebay_mobile_2018"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "rendering.mobile/ebay_mobile_pinch_2018"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "rendering.mobile/ebay_scroll_2018"
     },
     {
-        "duration": "3.0",
+        "duration": "5.0",
         "name": "rendering.mobile/effect_games"
     },
     {
-        "duration": "24.0",
+        "duration": "25.0",
         "name": "rendering.mobile/espn_2018"
     },
     {
-        "duration": "15.0",
+        "duration": "17.0",
         "name": "rendering.mobile/espn_mobile_2018"
     },
     {
-        "duration": "15.0",
+        "duration": "18.0",
         "name": "rendering.mobile/espn_pathological_2018"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "rendering.mobile/extra_large_texture_uploads"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "rendering.mobile/facebook_2018"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "rendering.mobile/facebook_mobile_2018"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "rendering.mobile/famo_us_twitter_demo"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/fill_shapes"
     },
     {
-        "duration": "23.0",
+        "duration": "24.0",
         "name": "rendering.mobile/filter_terrain_svg"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "rendering.mobile/flickr_scroll_2018"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "rendering.mobile/font_wipe"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "rendering.mobile/forecast.io_mobile_2018"
     },
     {
-        "duration": "40.0",
+        "duration": "25.0",
         "name": "rendering.mobile/geo_apis"
     },
     {
-        "duration": "24.0",
+        "duration": "19.0",
         "name": "rendering.mobile/gmail_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "rendering.mobile/google_calendar_2018"
     },
     {
@@ -2524,59 +2528,59 @@
         "name": "rendering.mobile/google_docs_2018"
     },
     {
-        "duration": "45.0",
+        "duration": "19.0",
         "name": "rendering.mobile/google_image_search_2018"
     },
     {
-        "duration": "20.0",
+        "duration": "21.0",
         "name": "rendering.mobile/google_image_search_mobile_2018"
     },
     {
-        "duration": "19.0",
+        "duration": "18.0",
         "name": "rendering.mobile/google_news_ios"
     },
     {
-        "duration": "4.0",
+        "duration": "5.0",
         "name": "rendering.mobile/google_news_mobile_2018"
     },
     {
-        "duration": "25.0",
+        "duration": "22.0",
         "name": "rendering.mobile/google_plus_2018"
     },
     {
-        "duration": "43.0",
+        "duration": "21.0",
         "name": "rendering.mobile/google_plus_mobile_2018"
     },
     {
-        "duration": "52.0",
+        "duration": "18.0",
         "name": "rendering.mobile/google_search_mobile_pinch_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "21.0",
         "name": "rendering.mobile/google_web_search_2018"
     },
     {
-        "duration": "25.0",
+        "duration": "20.0",
         "name": "rendering.mobile/google_web_search_mobile_2018"
     },
     {
-        "duration": "20.0",
+        "duration": "21.0",
         "name": "rendering.mobile/gsp.ro_mobile_2018"
     },
     {
-        "duration": "25.0",
+        "duration": "23.0",
         "name": "rendering.mobile/guardian_pathological_2018"
     },
     {
-        "duration": "21.0",
+        "duration": "24.0",
         "name": "rendering.mobile/guimark_vector_chart"
     },
     {
-        "duration": "42.0",
+        "duration": "20.0",
         "name": "rendering.mobile/gws_boogie_expansion"
     },
     {
-        "duration": "39.0",
+        "duration": "21.0",
         "name": "rendering.mobile/gws_google_expansion"
     },
     {
@@ -2584,7 +2588,7 @@
         "name": "rendering.mobile/hakim"
     },
     {
-        "duration": "18.0",
+        "duration": "17.0",
         "name": "rendering.mobile/horizontal_vertical_expansion"
     },
     {
@@ -2596,19 +2600,19 @@
         "name": "rendering.mobile/idle_power_blank"
     },
     {
-        "duration": "37.0",
+        "duration": "38.0",
         "name": "rendering.mobile/idle_power_css_animation"
     },
     {
-        "duration": "38.0",
+        "duration": "37.0",
         "name": "rendering.mobile/idle_power_request_animation_frame"
     },
     {
-        "duration": "110.0",
+        "duration": "109.0",
         "name": "rendering.mobile/idle_power_set_timeout_long"
     },
     {
-        "duration": "38.0",
+        "duration": "37.0",
         "name": "rendering.mobile/idle_power_set_timetout"
     },
     {
@@ -2624,11 +2628,11 @@
         "name": "rendering.mobile/infinite_scroll_element_n_layers_0"
     },
     {
-        "duration": "24.0",
+        "duration": "25.0",
         "name": "rendering.mobile/infinite_scroll_element_n_layers_75"
     },
     {
-        "duration": "24.0",
+        "duration": "25.0",
         "name": "rendering.mobile/infinite_scroll_element_n_layers_99"
     },
     {
@@ -2636,11 +2640,11 @@
         "name": "rendering.mobile/infinite_scroll_root_fixed_n_layers_0"
     },
     {
-        "duration": "24.0",
+        "duration": "25.0",
         "name": "rendering.mobile/infinite_scroll_root_fixed_n_layers_75"
     },
     {
-        "duration": "24.0",
+        "duration": "25.0",
         "name": "rendering.mobile/infinite_scroll_root_fixed_n_layers_99"
     },
     {
@@ -2648,19 +2652,19 @@
         "name": "rendering.mobile/infinite_scroll_root_n_layers_0"
     },
     {
-        "duration": "24.0",
+        "duration": "25.0",
         "name": "rendering.mobile/infinite_scroll_root_n_layers_75"
     },
     {
-        "duration": "24.0",
+        "duration": "25.0",
         "name": "rendering.mobile/infinite_scroll_root_n_layers_99"
     },
     {
-        "duration": "21.0",
+        "duration": "20.0",
         "name": "rendering.mobile/infinite_scrolling"
     },
     {
-        "duration": "25.0",
+        "duration": "24.0",
         "name": "rendering.mobile/jarro_doverson"
     },
     {
@@ -2672,7 +2676,7 @@
         "name": "rendering.mobile/jpeg_decoding_yuv_and_gpu_rasterization"
     },
     {
-        "duration": "39.0",
+        "duration": "27.0",
         "name": "rendering.mobile/js_full_screen_invalidation"
     },
     {
@@ -2680,7 +2684,7 @@
         "name": "rendering.mobile/js_opacity_plus_n_layers_0"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "rendering.mobile/js_opacity_plus_n_layers_75"
     },
     {
@@ -2688,27 +2692,27 @@
         "name": "rendering.mobile/js_opacity_plus_n_layers_99"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "rendering.mobile/js_paint_plus_n_layers_0"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "rendering.mobile/js_paint_plus_n_layers_75"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "rendering.mobile/js_paint_plus_n_layers_99"
     },
     {
-        "duration": "67.0",
+        "duration": "26.0",
         "name": "rendering.mobile/js_poster_circle"
     },
     {
-        "duration": "28.0",
+        "duration": "17.0",
         "name": "rendering.mobile/js_scroll_text_only"
     },
     {
-        "duration": "4.0",
+        "duration": "5.0",
         "name": "rendering.mobile/kevs_3d"
     },
     {
@@ -2720,35 +2724,35 @@
         "name": "rendering.mobile/large_texture_uploads"
     },
     {
-        "duration": "24.0",
+        "duration": "21.0",
         "name": "rendering.mobile/latimes_pathological_2018"
     },
     {
-        "duration": "32.0",
+        "duration": "20.0",
         "name": "rendering.mobile/linkedin_2018"
     },
     {
-        "duration": "64.0",
+        "duration": "39.0",
         "name": "rendering.mobile/linkedin_mobile_2018"
     },
     {
-        "duration": "60.0",
+        "duration": "34.0",
         "name": "rendering.mobile/linkedin_mobile_pinch_2018"
     },
     {
-        "duration": "39.0",
+        "duration": "32.0",
         "name": "rendering.mobile/linkedin_pathological_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "15.0",
         "name": "rendering.mobile/list_animation_simple"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "rendering.mobile/list_recycle_transform"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "rendering.mobile/main_0fps_impl_60fps"
     },
     {
@@ -2756,35 +2760,35 @@
         "name": "rendering.mobile/main_0fps_impl_60fps_no_update"
     },
     {
-        "duration": "22.0",
+        "duration": "25.0",
         "name": "rendering.mobile/main_0fps_impl_60fps_no_update_jank"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "rendering.mobile/main_0fps_with_jank_impl_0fps"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "rendering.mobile/main_15fps_impl_0fps"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "rendering.mobile/main_15fps_with_jank_impl_0fps"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "rendering.mobile/main_30fps_impl_0fps"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "rendering.mobile/main_30fps_impl_60fps"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "rendering.mobile/main_60fps_impl_0fps"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "rendering.mobile/main_60fps_impl_60fps"
     },
     {
@@ -2792,7 +2796,7 @@
         "name": "rendering.mobile/main_60fps_impl_60fps_no_update"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "rendering.mobile/main_60fps_impl_60fps_no_update_jank"
     },
     {
@@ -2800,75 +2804,75 @@
         "name": "rendering.mobile/main_60fps_with_jank_impl_0fps"
     },
     {
-        "duration": "36.0",
+        "duration": "26.0",
         "name": "rendering.mobile/man_in_blue"
     },
     {
-        "duration": "30.0",
+        "duration": "31.0",
         "name": "rendering.mobile/many_images"
     },
     {
-        "duration": "43.0",
+        "duration": "27.0",
         "name": "rendering.mobile/many_planets_deep"
     },
     {
-        "duration": "4.0",
+        "duration": "5.0",
         "name": "rendering.mobile/maps_perf_test"
     },
     {
-        "duration": "17.0",
+        "duration": "19.0",
         "name": "rendering.mobile/mask_transition_animation"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.mobile/masonry"
     },
     {
-        "duration": "24.0",
+        "duration": "23.0",
         "name": "rendering.mobile/medium_texture_uploads"
     },
     {
-        "duration": "24.0",
+        "duration": "23.0",
         "name": "rendering.mobile/megi_dish"
     },
     {
-        "duration": "23.0",
+        "duration": "25.0",
         "name": "rendering.mobile/microsoft_asteroid_belt"
     },
     {
-        "duration": "4.0",
+        "duration": "5.0",
         "name": "rendering.mobile/microsoft_fireflies"
     },
     {
-        "duration": "22.0",
+        "duration": "24.0",
         "name": "rendering.mobile/microsoft_fish_ie_tank"
     },
     {
-        "duration": "22.0",
+        "duration": "24.0",
         "name": "rendering.mobile/microsoft_performance"
     },
     {
-        "duration": "22.0",
+        "duration": "24.0",
         "name": "rendering.mobile/microsoft_snow"
     },
     {
-        "duration": "22.0",
+        "duration": "24.0",
         "name": "rendering.mobile/microsoft_speed_reading"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "rendering.mobile/microsoft_tweet_map"
     },
     {
-        "duration": "4.0",
+        "duration": "5.0",
         "name": "rendering.mobile/microsoft_video_city"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "rendering.mobile/microsoft_worker_fountains"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "rendering.mobile/mix_10k"
     },
     {
@@ -2880,7 +2884,7 @@
         "name": "rendering.mobile/mix_blend_mode_animation_hue"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "rendering.mobile/mix_blend_mode_animation_propagating_isolation"
     },
     {
@@ -2888,7 +2892,7 @@
         "name": "rendering.mobile/mix_blend_mode_animation_screen"
     },
     {
-        "duration": "21.0",
+        "duration": "28.0",
         "name": "rendering.mobile/mlb_mobile_2018"
     },
     {
@@ -2896,187 +2900,187 @@
         "name": "rendering.mobile/mobile_news_sandbox"
     },
     {
-        "duration": "23.0",
+        "duration": "25.0",
         "name": "rendering.mobile/motion_mark_canvas_fill_shapes"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "rendering.mobile/motion_mark_canvas_stroke_shapes"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/motionmark_anim_design_15"
     },
     {
-        "duration": "21.0",
+        "duration": "22.0",
         "name": "rendering.mobile/motionmark_anim_focus_25"
     },
     {
-        "duration": "21.0",
+        "duration": "22.0",
         "name": "rendering.mobile/motionmark_anim_images_50"
     },
     {
-        "duration": "21.0",
+        "duration": "22.0",
         "name": "rendering.mobile/motionmark_anim_leaves_250"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "rendering.mobile/motionmark_anim_multiply_175"
     },
     {
-        "duration": "21.0",
+        "duration": "22.0",
         "name": "rendering.mobile/motionmark_anim_suits_125"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "rendering.mobile/motionmark_html_composited_transforms_125"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "rendering.mobile/motionmark_html_css_bouncing_blend_circles_25"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "rendering.mobile/motionmark_html_css_bouncing_circles_250"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "rendering.mobile/motionmark_html_css_bouncing_clipped_rects_100"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "rendering.mobile/motionmark_html_css_bouncing_filter_circles_15"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "rendering.mobile/motionmark_html_css_bouncing_gradient_circles_250"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "rendering.mobile/motionmark_html_css_bouncing_svg_images_50"
     },
     {
-        "duration": "21.0",
+        "duration": "22.0",
         "name": "rendering.mobile/motionmark_html_css_bouncing_tagged_images_225"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "rendering.mobile/motionmark_html_dom_particles_svg_masks_25"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "rendering.mobile/motionmark_html_focus_20_15"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "rendering.mobile/motionmark_html_leaves_20_50"
     },
     {
-        "duration": "21.0",
+        "duration": "22.0",
         "name": "rendering.mobile/motionmark_svg_bouncing_circles_250"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "rendering.mobile/motionmark_svg_bouncing_clipped_rects_100"
     },
     {
-        "duration": "21.0",
+        "duration": "22.0",
         "name": "rendering.mobile/motionmark_svg_bouncing_gradient_circles_200"
     },
     {
-        "duration": "21.0",
+        "duration": "22.0",
         "name": "rendering.mobile/motionmark_svg_bouncing_png_images_200"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "rendering.mobile/motionmark_svg_bouncing_svg_images_50"
     },
     {
-        "duration": "25.0",
+        "duration": "27.0",
         "name": "rendering.mobile/new_tilings"
     },
     {
-        "duration": "20.0",
+        "duration": "21.0",
         "name": "rendering.mobile/no_op_raf"
     },
     {
-        "duration": "19.0",
+        "duration": "21.0",
         "name": "rendering.mobile/no_op_scroll"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "rendering.mobile/no_op_settimeout"
     },
     {
-        "duration": "19.0",
+        "duration": "21.0",
         "name": "rendering.mobile/no_op_touch_handler"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "rendering.mobile/nvidia_vertex_buffer_object"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "rendering.mobile/nyc_gov_scroll_2018"
     },
     {
-        "duration": "29.0",
+        "duration": "30.0",
         "name": "rendering.mobile/nytimes_mobile_2018"
     },
     {
-        "duration": "24.0",
+        "duration": "26.0",
         "name": "rendering.mobile/nytimes_scroll_2018"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "rendering.mobile/off_screen_main_60fps"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "rendering.mobile/off_screen_main_60fps_jank"
     },
     {
-        "duration": "22.0",
+        "duration": "24.0",
         "name": "rendering.mobile/overlay_background_color_css_transitions_page"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "rendering.mobile/paper_button"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "rendering.mobile/paper_calculator"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "rendering.mobile/paper_calculator_hit_test"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "rendering.mobile/paper_checkbox"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "rendering.mobile/paper_fab"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "rendering.mobile/paper_icon_button"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "rendering.mobile/paper_shadow"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "rendering.mobile/paper_tabs"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "rendering.mobile/paper_toggle_button"
     },
     {
-        "duration": "17.0",
+        "duration": "19.0",
         "name": "rendering.mobile/parallax_effect"
     },
     {
@@ -3084,7 +3088,7 @@
         "name": "rendering.mobile/particles"
     },
     {
-        "duration": "19.0",
+        "duration": "18.0",
         "name": "rendering.mobile/pbs_pathological_2018"
     },
     {
@@ -3092,35 +3096,35 @@
         "name": "rendering.mobile/physical_simulation"
     },
     {
-        "duration": "24.0",
+        "duration": "23.0",
         "name": "rendering.mobile/pinterest_2018"
     },
     {
-        "duration": "19.0",
+        "duration": "18.0",
         "name": "rendering.mobile/pinterest_mobile_2018"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "rendering.mobile/polymer_topeka"
     },
     {
-        "duration": "24.0",
+        "duration": "21.0",
         "name": "rendering.mobile/put_get_image_data"
     },
     {
-        "duration": "19.0",
+        "duration": "18.0",
         "name": "rendering.mobile/raf"
     },
     {
-        "duration": "19.0",
+        "duration": "18.0",
         "name": "rendering.mobile/raf_animation"
     },
     {
-        "duration": "19.0",
+        "duration": "18.0",
         "name": "rendering.mobile/raf_canvas"
     },
     {
-        "duration": "19.0",
+        "duration": "18.0",
         "name": "rendering.mobile/raf_touch_animation"
     },
     {
@@ -3128,7 +3132,7 @@
         "name": "rendering.mobile/recode_pathological_2018"
     },
     {
-        "duration": "21.0",
+        "duration": "20.0",
         "name": "rendering.mobile/reddit_mobile_2018"
     },
     {
@@ -3136,27 +3140,27 @@
         "name": "rendering.mobile/runway_2019"
     },
     {
-        "duration": "24.0",
+        "duration": "23.0",
         "name": "rendering.mobile/san_angeles"
     },
     {
-        "duration": "13.0",
+        "duration": "12.0",
         "name": "rendering.mobile/second_batch_js_heavy"
     },
     {
-        "duration": "13.0",
+        "duration": "12.0",
         "name": "rendering.mobile/second_batch_js_light"
     },
     {
-        "duration": "13.0",
+        "duration": "12.0",
         "name": "rendering.mobile/second_batch_js_medium"
     },
     {
-        "duration": "21.0",
+        "duration": "20.0",
         "name": "rendering.mobile/sfgate_mobile_2018"
     },
     {
-        "duration": "24.0",
+        "duration": "27.0",
         "name": "rendering.mobile/silk_finance"
     },
     {
@@ -3168,23 +3172,23 @@
         "name": "rendering.mobile/simple_touch_drag"
     },
     {
-        "duration": "17.0",
+        "duration": "25.0",
         "name": "rendering.mobile/slashdot_mobile_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "16.0",
         "name": "rendering.mobile/slide_drawer"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "rendering.mobile/small_texture_uploads"
     },
     {
-        "duration": "4.0",
+        "duration": "5.0",
         "name": "rendering.mobile/smash_cat"
     },
     {
-        "duration": "24.0",
+        "duration": "25.0",
         "name": "rendering.mobile/spielzeugz"
     },
     {
@@ -3192,131 +3196,131 @@
         "name": "rendering.mobile/sticky_using_webkit"
     },
     {
-        "duration": "23.0",
+        "duration": "22.0",
         "name": "rendering.mobile/stress_hidey_bars"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "rendering.mobile/stroke_shapes"
     },
     {
-        "duration": "27.0",
+        "duration": "26.0",
         "name": "rendering.mobile/svg_icon_raster"
     },
     {
-        "duration": "14.0",
+        "duration": "13.0",
         "name": "rendering.mobile/swipe_action"
     },
     {
-        "duration": "17.0",
+        "duration": "16.0",
         "name": "rendering.mobile/swipe_to_dismiss"
     },
     {
-        "duration": "18.0",
+        "duration": "19.0",
         "name": "rendering.mobile/sync_scroll_offset"
     },
     {
-        "duration": "22.0",
+        "duration": "26.0",
         "name": "rendering.mobile/techcrunch_2018"
     },
     {
-        "duration": "21.0",
+        "duration": "22.0",
         "name": "rendering.mobile/techcrunch_mobile_2018"
     },
     {
-        "duration": "19.0",
+        "duration": "18.0",
         "name": "rendering.mobile/text_05000_pixels_per_second"
     },
     {
-        "duration": "19.0",
+        "duration": "18.0",
         "name": "rendering.mobile/text_10000_pixels_per_second"
     },
     {
-        "duration": "16.0",
+        "duration": "15.0",
         "name": "rendering.mobile/text_20000_pixels_per_second"
     },
     {
-        "duration": "14.0",
+        "duration": "13.0",
         "name": "rendering.mobile/text_40000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "12.0",
         "name": "rendering.mobile/text_60000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "12.0",
         "name": "rendering.mobile/text_75000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "12.0",
         "name": "rendering.mobile/text_90000_pixels_per_second"
     },
     {
-        "duration": "19.0",
+        "duration": "18.0",
         "name": "rendering.mobile/text_constant_full_page_raster_05000_pixels_per_second"
     },
     {
-        "duration": "19.0",
+        "duration": "18.0",
         "name": "rendering.mobile/text_constant_full_page_raster_10000_pixels_per_second"
     },
     {
-        "duration": "16.0",
+        "duration": "15.0",
         "name": "rendering.mobile/text_constant_full_page_raster_20000_pixels_per_second"
     },
     {
-        "duration": "14.0",
+        "duration": "13.0",
         "name": "rendering.mobile/text_constant_full_page_raster_40000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "12.0",
         "name": "rendering.mobile/text_constant_full_page_raster_60000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "12.0",
         "name": "rendering.mobile/text_constant_full_page_raster_75000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "12.0",
         "name": "rendering.mobile/text_constant_full_page_raster_90000_pixels_per_second"
     },
     {
-        "duration": "19.0",
+        "duration": "18.0",
         "name": "rendering.mobile/text_hover_05000_pixels_per_second"
     },
     {
-        "duration": "19.0",
+        "duration": "18.0",
         "name": "rendering.mobile/text_hover_10000_pixels_per_second"
     },
     {
-        "duration": "16.0",
+        "duration": "15.0",
         "name": "rendering.mobile/text_hover_20000_pixels_per_second"
     },
     {
-        "duration": "14.0",
+        "duration": "13.0",
         "name": "rendering.mobile/text_hover_40000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "12.0",
         "name": "rendering.mobile/text_hover_60000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "12.0",
         "name": "rendering.mobile/text_hover_75000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "12.0",
         "name": "rendering.mobile/text_hover_90000_pixels_per_second"
     },
     {
-        "duration": "21.0",
+        "duration": "22.0",
         "name": "rendering.mobile/theverge_article_mobile_2018"
     },
     {
-        "duration": "20.0",
+        "duration": "21.0",
         "name": "rendering.mobile/theverge_mobile_2018"
     },
     {
-        "duration": "22.0",
+        "duration": "21.0",
         "name": "rendering.mobile/toggle_drawer"
     },
     {
@@ -3324,131 +3328,131 @@
         "name": "rendering.mobile/touch_handler_scrolling"
     },
     {
-        "duration": "23.0",
+        "duration": "22.0",
         "name": "rendering.mobile/transform_transitions"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "rendering.mobile/transform_transitions_js_block"
     },
     {
-        "duration": "21.0",
+        "duration": "18.0",
         "name": "rendering.mobile/twitch_2018"
     },
     {
-        "duration": "19.0",
+        "duration": "22.0",
         "name": "rendering.mobile/twitch_mobile_pinch_2018"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "rendering.mobile/twitter_2018"
     },
     {
-        "duration": "20.0",
+        "duration": "15.0",
         "name": "rendering.mobile/twitter_mobile_2018"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "rendering.mobile/update_history_state"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "rendering.mobile/usatoday_mobile_2018"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "rendering.mobile/vertical_expansion"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/web_animation_value_type_color"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/web_animation_value_type_length_3d"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/web_animation_value_type_length_complex"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/web_animation_value_type_length_simple"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/web_animation_value_type_path"
     },
     {
-        "duration": "23.0",
+        "duration": "24.0",
         "name": "rendering.mobile/web_animation_value_type_shadow"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/web_animation_value_type_transform_complex"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/web_animation_value_type_transform_simple"
     },
     {
-        "duration": "23.0",
+        "duration": "25.0",
         "name": "rendering.mobile/web_animations_many_keyframes"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/web_animations_set_current_time"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/web_animations_simultaneous"
     },
     {
-        "duration": "22.0",
+        "duration": "24.0",
         "name": "rendering.mobile/web_animations_staggered_chaining"
     },
     {
-        "duration": "21.0",
+        "duration": "22.0",
         "name": "rendering.mobile/web_animations_staggered_infinite_iterations"
     },
     {
-        "duration": "22.0",
+        "duration": "24.0",
         "name": "rendering.mobile/web_animations_staggered_triggering_page"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.mobile/webp_decoding_rgb_and_gpu_rasterization"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.mobile/webp_decoding_yuv_and_gpu_rasterization"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.mobile/wikipedia_2018"
     },
     {
-        "duration": "20.0",
+        "duration": "21.0",
         "name": "rendering.mobile/wikipedia_delayed_scroll_start_2018"
     },
     {
-        "duration": "20.0",
+        "duration": "21.0",
         "name": "rendering.mobile/wikipedia_mobile_2018"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "rendering.mobile/wordpress_2018"
     },
     {
-        "duration": "20.0",
+        "duration": "21.0",
         "name": "rendering.mobile/wordpress_mobile_2018"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "rendering.mobile/worldjournal_mobile_2018"
     },
     {
-        "duration": "23.0",
+        "duration": "25.0",
         "name": "rendering.mobile/wow_wiki_pathological_2018"
     },
     {
@@ -3456,47 +3460,47 @@
         "name": "rendering.mobile/wowwiki_mobile_2018"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "rendering.mobile/wsj_mobile_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "16.0",
         "name": "rendering.mobile/yahoo_answers_2018"
     },
     {
-        "duration": "3.0",
+        "duration": "5.0",
         "name": "rendering.mobile/yahoo_answers_mobile_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.mobile/yahoo_news_2018"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "rendering.mobile/yahoo_news_mobile_2018"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "rendering.mobile/yahoo_sports_2018"
     },
     {
-        "duration": "15.0",
+        "duration": "17.0",
         "name": "rendering.mobile/yahoo_sports_pathological_2018"
     },
     {
-        "duration": "3.0",
+        "duration": "5.0",
         "name": "rendering.mobile/youtube_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "rendering.mobile/youtube_mobile_2018"
     },
     {
-        "duration": "19.0",
+        "duration": "21.0",
         "name": "rendering.mobile/zdnet_pathological_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "16.0",
         "name": "rendering.mobile/zoom_in_animation"
     },
     {
@@ -3512,151 +3516,151 @@
         "name": "speedometer2-future/Speedometer2"
     },
     {
-        "duration": "52.0",
+        "duration": "51.0",
         "name": "speedometer2/Speedometer2"
     },
     {
-        "duration": "24.0",
+        "duration": "27.0",
         "name": "system_health.common_mobile/background:media:imgur:2019"
     },
     {
-        "duration": "42.0",
+        "duration": "45.0",
         "name": "system_health.common_mobile/background:news:nytimes:2019"
     },
     {
-        "duration": "22.0",
+        "duration": "25.0",
         "name": "system_health.common_mobile/background:search:google:2019"
     },
     {
-        "duration": "21.0",
+        "duration": "24.0",
         "name": "system_health.common_mobile/background:social:facebook:2019"
     },
     {
-        "duration": "4.0",
+        "duration": "6.0",
         "name": "system_health.common_mobile/background:tools:gmail:2019"
     },
     {
-        "duration": "9.0",
+        "duration": "8.0",
         "name": "system_health.common_mobile/browse:chrome:newtab:2019"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "system_health.common_mobile/browse:chrome:omnibox:2019"
     },
     {
-        "duration": "71.0",
+        "duration": "74.0",
         "name": "system_health.common_mobile/browse:media:facebook_photos:2019"
     },
     {
-        "duration": "43.0",
+        "duration": "48.0",
         "name": "system_health.common_mobile/browse:media:flickr_infinite_scroll:2019"
     },
     {
-        "duration": "40.0",
+        "duration": "44.0",
         "name": "system_health.common_mobile/browse:media:googleplaystore:2019"
     },
     {
-        "duration": "67.0",
+        "duration": "72.0",
         "name": "system_health.common_mobile/browse:media:imgur:2019"
     },
     {
-        "duration": "55.0",
+        "duration": "53.0",
         "name": "system_health.common_mobile/browse:media:youtube:2019"
     },
     {
-        "duration": "51.0",
+        "duration": "53.0",
         "name": "system_health.common_mobile/browse:news:cnn:2018"
     },
     {
-        "duration": "46.0",
+        "duration": "48.0",
         "name": "system_health.common_mobile/browse:news:cricbuzz:2019"
     },
     {
-        "duration": "45.0",
+        "duration": "48.0",
         "name": "system_health.common_mobile/browse:news:globo:2019"
     },
     {
-        "duration": "71.0",
+        "duration": "60.0",
         "name": "system_health.common_mobile/browse:news:nytimes:2019"
     },
     {
-        "duration": "37.0",
+        "duration": "36.0",
         "name": "system_health.common_mobile/browse:news:qq:2019"
     },
     {
-        "duration": "52.0",
+        "duration": "49.0",
         "name": "system_health.common_mobile/browse:news:reddit:2019"
     },
     {
-        "duration": "50.0",
+        "duration": "53.0",
         "name": "system_health.common_mobile/browse:news:toi:2019"
     },
     {
-        "duration": "57.0",
+        "duration": "56.0",
         "name": "system_health.common_mobile/browse:news:washingtonpost:2019"
     },
     {
-        "duration": "22.0",
+        "duration": "26.0",
         "name": "system_health.common_mobile/browse:search:amp:2018"
     },
     {
-        "duration": "24.0",
+        "duration": "28.0",
         "name": "system_health.common_mobile/browse:search:amp:sxg:2019"
     },
     {
-        "duration": "51.0",
+        "duration": "54.0",
         "name": "system_health.common_mobile/browse:shopping:amazon:2019"
     },
     {
-        "duration": "49.0",
+        "duration": "53.0",
         "name": "system_health.common_mobile/browse:shopping:avito:2019"
     },
     {
-        "duration": "53.0",
+        "duration": "55.0",
         "name": "system_health.common_mobile/browse:shopping:flipkart:2019"
     },
     {
-        "duration": "4.0",
+        "duration": "6.0",
         "name": "system_health.common_mobile/browse:shopping:lazada:2019"
     },
     {
-        "duration": "58.0",
+        "duration": "60.0",
         "name": "system_health.common_mobile/browse:social:facebook:2019"
     },
     {
-        "duration": "69.0",
+        "duration": "74.0",
         "name": "system_health.common_mobile/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "system_health.common_mobile/browse:social:instagram:2019"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "system_health.common_mobile/browse:social:pinterest_infinite_scroll:2019"
     },
     {
-        "duration": "65.0",
+        "duration": "63.0",
         "name": "system_health.common_mobile/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "78.0",
+        "duration": "75.0",
         "name": "system_health.common_mobile/browse:social:twitter:2019"
     },
     {
-        "duration": "67.0",
+        "duration": "70.0",
         "name": "system_health.common_mobile/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "41.0",
+        "duration": "45.0",
         "name": "system_health.common_mobile/browse:tools:maps:2019"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "system_health.common_mobile/load:chrome:blank"
     },
     {
-        "duration": "19.0",
+        "duration": "23.0",
         "name": "system_health.common_mobile/load:games:bubbles:2019"
     },
     {
@@ -3664,23 +3668,23 @@
         "name": "system_health.common_mobile/load:games:lazors"
     },
     {
-        "duration": "3.0",
+        "duration": "25.0",
         "name": "system_health.common_mobile/load:games:spychase:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "25.0",
         "name": "system_health.common_mobile/load:media:dailymotion:2019"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "system_health.common_mobile/load:media:facebook_photos:2019"
     },
     {
-        "duration": "21.0",
+        "duration": "22.0",
         "name": "system_health.common_mobile/load:media:flickr:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "system_health.common_mobile/load:media:google_images:2018"
     },
     {
@@ -3692,27 +3696,27 @@
         "name": "system_health.common_mobile/load:media:soundcloud:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "system_health.common_mobile/load:media:youtube:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "25.0",
         "name": "system_health.common_mobile/load:news:bbc:2019"
     },
     {
-        "duration": "24.0",
+        "duration": "31.0",
         "name": "system_health.common_mobile/load:news:cnn:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "21.0",
         "name": "system_health.common_mobile/load:news:irctc:2019"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "system_health.common_mobile/load:news:nytimes:2019"
     },
     {
-        "duration": "20.0",
+        "duration": "21.0",
         "name": "system_health.common_mobile/load:news:qq:2019"
     },
     {
@@ -3720,19 +3724,19 @@
         "name": "system_health.common_mobile/load:news:reddit:2019"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "system_health.common_mobile/load:news:washingtonpost:2019"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "system_health.common_mobile/load:news:wikipedia:2018"
     },
     {
-        "duration": "21.0",
+        "duration": "25.0",
         "name": "system_health.common_mobile/load:search:amazon:2019"
     },
     {
-        "duration": "21.0",
+        "duration": "26.0",
         "name": "system_health.common_mobile/load:search:baidu:2018"
     },
     {
@@ -3740,15 +3744,15 @@
         "name": "system_health.common_mobile/load:search:ebay:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "system_health.common_mobile/load:search:google:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "system_health.common_mobile/load:search:taobao:2019"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "system_health.common_mobile/load:search:yahoo:2018"
     },
     {
@@ -3764,19 +3768,19 @@
         "name": "system_health.common_mobile/load:social:pinterest:2019"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "system_health.common_mobile/load:social:twitter:2019"
     },
     {
-        "duration": "19.0",
+        "duration": "23.0",
         "name": "system_health.common_mobile/load:tools:docs:2019"
     },
     {
-        "duration": "20.0",
+        "duration": "24.0",
         "name": "system_health.common_mobile/load:tools:drive:2019"
     },
     {
-        "duration": "30.0",
+        "duration": "31.0",
         "name": "system_health.common_mobile/load:tools:dropbox:2019"
     },
     {
@@ -3784,7 +3788,7 @@
         "name": "system_health.common_mobile/load:tools:gmail:2019"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "system_health.common_mobile/load:tools:stackoverflow:2018"
     },
     {
@@ -3800,19 +3804,19 @@
         "name": "system_health.common_mobile/long_running:tools:gmail-foreground"
     },
     {
-        "duration": "28.0",
+        "duration": "32.0",
         "name": "system_health.memory_mobile/background:media:imgur:2019"
     },
     {
-        "duration": "44.0",
+        "duration": "49.0",
         "name": "system_health.memory_mobile/background:news:nytimes:2019"
     },
     {
-        "duration": "26.0",
+        "duration": "27.0",
         "name": "system_health.memory_mobile/background:search:google:2019"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "system_health.memory_mobile/background:social:facebook:2019"
     },
     {
@@ -3828,11 +3832,11 @@
         "name": "system_health.memory_mobile/browse:chrome:omnibox:2019"
     },
     {
-        "duration": "73.0",
+        "duration": "76.0",
         "name": "system_health.memory_mobile/browse:media:facebook_photos:2019"
     },
     {
-        "duration": "49.0",
+        "duration": "51.0",
         "name": "system_health.memory_mobile/browse:media:flickr_infinite_scroll:2019"
     },
     {
@@ -3840,19 +3844,19 @@
         "name": "system_health.memory_mobile/browse:media:googleplaystore:2019"
     },
     {
-        "duration": "70.0",
+        "duration": "71.0",
         "name": "system_health.memory_mobile/browse:media:imgur:2019"
     },
     {
-        "duration": "56.0",
+        "duration": "57.0",
         "name": "system_health.memory_mobile/browse:media:youtube:2019"
     },
     {
-        "duration": "59.0",
+        "duration": "52.0",
         "name": "system_health.memory_mobile/browse:news:cnn:2018"
     },
     {
-        "duration": "47.0",
+        "duration": "49.0",
         "name": "system_health.memory_mobile/browse:news:cricbuzz:2019"
     },
     {
@@ -3860,7 +3864,7 @@
         "name": "system_health.memory_mobile/browse:news:globo:2019"
     },
     {
-        "duration": "72.0",
+        "duration": "64.0",
         "name": "system_health.memory_mobile/browse:news:nytimes:2019"
     },
     {
@@ -3868,15 +3872,15 @@
         "name": "system_health.memory_mobile/browse:news:qq:2019"
     },
     {
-        "duration": "53.0",
+        "duration": "54.0",
         "name": "system_health.memory_mobile/browse:news:reddit:2019"
     },
     {
-        "duration": "54.0",
+        "duration": "50.0",
         "name": "system_health.memory_mobile/browse:news:toi:2019"
     },
     {
-        "duration": "58.0",
+        "duration": "60.0",
         "name": "system_health.memory_mobile/browse:news:washingtonpost:2019"
     },
     {
@@ -3884,31 +3888,31 @@
         "name": "system_health.memory_mobile/browse:search:amp:2018"
     },
     {
-        "duration": "30.0",
+        "duration": "31.0",
         "name": "system_health.memory_mobile/browse:search:amp:sxg:2019"
     },
     {
-        "duration": "53.0",
+        "duration": "54.0",
         "name": "system_health.memory_mobile/browse:shopping:amazon:2019"
     },
     {
-        "duration": "51.0",
+        "duration": "53.0",
         "name": "system_health.memory_mobile/browse:shopping:avito:2019"
     },
     {
-        "duration": "55.0",
+        "duration": "56.0",
         "name": "system_health.memory_mobile/browse:shopping:flipkart:2019"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "system_health.memory_mobile/browse:shopping:lazada:2019"
     },
     {
-        "duration": "59.0",
+        "duration": "61.0",
         "name": "system_health.memory_mobile/browse:social:facebook:2019"
     },
     {
-        "duration": "73.0",
+        "duration": "76.0",
         "name": "system_health.memory_mobile/browse:social:facebook_infinite_scroll:2018"
     },
     {
@@ -3920,35 +3924,35 @@
         "name": "system_health.memory_mobile/browse:social:pinterest_infinite_scroll:2019"
     },
     {
-        "duration": "65.0",
+        "duration": "66.0",
         "name": "system_health.memory_mobile/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "82.0",
+        "duration": "80.0",
         "name": "system_health.memory_mobile/browse:social:twitter:2019"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "system_health.memory_mobile/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "46.0",
+        "duration": "47.0",
         "name": "system_health.memory_mobile/browse:tools:maps:2019"
     },
     {
-        "duration": "25.0",
+        "duration": "24.0",
         "name": "system_health.memory_mobile/load:chrome:blank"
     },
     {
-        "duration": "25.0",
+        "duration": "24.0",
         "name": "system_health.memory_mobile/load:games:bubbles:2019"
     },
     {
-        "duration": "26.0",
+        "duration": "27.0",
         "name": "system_health.memory_mobile/load:games:lazors"
     },
     {
-        "duration": "3.0",
+        "duration": "30.0",
         "name": "system_health.memory_mobile/load:games:spychase:2018"
     },
     {
@@ -3972,7 +3976,7 @@
         "name": "system_health.memory_mobile/load:media:imgur:2018"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "system_health.memory_mobile/load:media:soundcloud:2018"
     },
     {
@@ -3980,7 +3984,7 @@
         "name": "system_health.memory_mobile/load:media:youtube:2018"
     },
     {
-        "duration": "26.0",
+        "duration": "25.0",
         "name": "system_health.memory_mobile/load:news:bbc:2019"
     },
     {
@@ -3988,27 +3992,27 @@
         "name": "system_health.memory_mobile/load:news:cnn:2018"
     },
     {
-        "duration": "26.0",
+        "duration": "27.0",
         "name": "system_health.memory_mobile/load:news:irctc:2019"
     },
     {
-        "duration": "30.0",
+        "duration": "31.0",
         "name": "system_health.memory_mobile/load:news:nytimes:2019"
     },
     {
-        "duration": "25.0",
+        "duration": "27.0",
         "name": "system_health.memory_mobile/load:news:qq:2019"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "system_health.memory_mobile/load:news:reddit:2019"
     },
     {
-        "duration": "24.0",
+        "duration": "26.0",
         "name": "system_health.memory_mobile/load:news:washingtonpost:2019"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "system_health.memory_mobile/load:news:wikipedia:2018"
     },
     {
@@ -4016,7 +4020,7 @@
         "name": "system_health.memory_mobile/load:search:amazon:2019"
     },
     {
-        "duration": "29.0",
+        "duration": "28.0",
         "name": "system_health.memory_mobile/load:search:baidu:2018"
     },
     {
@@ -4024,7 +4028,7 @@
         "name": "system_health.memory_mobile/load:search:ebay:2018"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "system_health.memory_mobile/load:search:google:2018"
     },
     {
@@ -4036,7 +4040,7 @@
         "name": "system_health.memory_mobile/load:search:yahoo:2018"
     },
     {
-        "duration": "24.0",
+        "duration": "25.0",
         "name": "system_health.memory_mobile/load:search:yandex:2018"
     },
     {
@@ -4048,15 +4052,15 @@
         "name": "system_health.memory_mobile/load:social:pinterest:2019"
     },
     {
-        "duration": "24.0",
+        "duration": "26.0",
         "name": "system_health.memory_mobile/load:social:twitter:2019"
     },
     {
-        "duration": "25.0",
+        "duration": "24.0",
         "name": "system_health.memory_mobile/load:tools:docs:2019"
     },
     {
-        "duration": "26.0",
+        "duration": "25.0",
         "name": "system_health.memory_mobile/load:tools:drive:2019"
     },
     {
@@ -4068,11 +4072,11 @@
         "name": "system_health.memory_mobile/load:tools:gmail:2019"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "system_health.memory_mobile/load:tools:stackoverflow:2018"
     },
     {
-        "duration": "24.0",
+        "duration": "26.0",
         "name": "system_health.memory_mobile/load:tools:weather:2019"
     },
     {
@@ -4084,7 +4088,7 @@
         "name": "system_health.memory_mobile/long_running:tools:gmail-foreground"
     },
     {
-        "duration": "21.0",
+        "duration": "25.0",
         "name": "system_health.webview_startup/load:chrome:blank"
     },
     {
@@ -4120,11 +4124,11 @@
         "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/#hl=en&q=barack+obama"
     },
     {
-        "duration": "12.0",
+        "duration": "11.0",
         "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/calendar/"
     },
     {
-        "duration": "17.0",
+        "duration": "14.0",
         "name": "v8.browsing_mobile/browse:chrome:newtab:2019"
     },
     {
@@ -4132,23 +4136,23 @@
         "name": "v8.browsing_mobile/browse:chrome:omnibox:2019"
     },
     {
-        "duration": "82.0",
+        "duration": "79.0",
         "name": "v8.browsing_mobile/browse:media:facebook_photos:2019"
     },
     {
-        "duration": "58.0",
+        "duration": "56.0",
         "name": "v8.browsing_mobile/browse:media:flickr_infinite_scroll:2019"
     },
     {
-        "duration": "51.0",
+        "duration": "49.0",
         "name": "v8.browsing_mobile/browse:media:googleplaystore:2019"
     },
     {
-        "duration": "84.0",
+        "duration": "81.0",
         "name": "v8.browsing_mobile/browse:media:imgur:2019"
     },
     {
-        "duration": "61.0",
+        "duration": "62.0",
         "name": "v8.browsing_mobile/browse:media:youtube:2019"
     },
     {
@@ -4156,71 +4160,71 @@
         "name": "v8.browsing_mobile/browse:news:cnn:2018"
     },
     {
-        "duration": "56.0",
+        "duration": "53.0",
         "name": "v8.browsing_mobile/browse:news:cricbuzz:2019"
     },
     {
-        "duration": "56.0",
+        "duration": "53.0",
         "name": "v8.browsing_mobile/browse:news:globo:2019"
     },
     {
-        "duration": "102.0",
+        "duration": "85.0",
         "name": "v8.browsing_mobile/browse:news:nytimes:2019"
     },
     {
-        "duration": "46.0",
+        "duration": "43.0",
         "name": "v8.browsing_mobile/browse:news:qq:2019"
     },
     {
-        "duration": "64.0",
+        "duration": "61.0",
         "name": "v8.browsing_mobile/browse:news:reddit:2019"
     },
     {
-        "duration": "65.0",
+        "duration": "62.0",
         "name": "v8.browsing_mobile/browse:news:toi:2019"
     },
     {
-        "duration": "69.0",
+        "duration": "70.0",
         "name": "v8.browsing_mobile/browse:news:washingtonpost:2019"
     },
     {
-        "duration": "32.0",
+        "duration": "30.0",
         "name": "v8.browsing_mobile/browse:search:amp:2018"
     },
     {
-        "duration": "33.0",
+        "duration": "31.0",
         "name": "v8.browsing_mobile/browse:search:amp:sxg:2019"
     },
     {
-        "duration": "62.0",
+        "duration": "59.0",
         "name": "v8.browsing_mobile/browse:shopping:amazon:2019"
     },
     {
-        "duration": "61.0",
+        "duration": "58.0",
         "name": "v8.browsing_mobile/browse:shopping:avito:2019"
     },
     {
-        "duration": "68.0",
+        "duration": "65.0",
         "name": "v8.browsing_mobile/browse:shopping:flipkart:2019"
     },
     {
-        "duration": "11.0",
+        "duration": "8.0",
         "name": "v8.browsing_mobile/browse:shopping:lazada:2019"
     },
     {
-        "duration": "73.0",
+        "duration": "70.0",
         "name": "v8.browsing_mobile/browse:social:facebook:2019"
     },
     {
-        "duration": "83.0",
+        "duration": "80.0",
         "name": "v8.browsing_mobile/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "11.0",
+        "duration": "8.0",
         "name": "v8.browsing_mobile/browse:social:instagram:2019"
     },
     {
-        "duration": "11.0",
+        "duration": "8.0",
         "name": "v8.browsing_mobile/browse:social:pinterest_infinite_scroll:2019"
     },
     {
@@ -4232,43 +4236,43 @@
         "name": "v8.browsing_mobile/browse:social:twitter:2019"
     },
     {
-        "duration": "79.0",
+        "duration": "77.0",
         "name": "v8.browsing_mobile/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "52.0",
+        "duration": "49.0",
         "name": "v8.browsing_mobile/browse:tools:maps:2019"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "webrtc/10s_datachannel_transfer"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "webrtc/canvas_capture_peer_connection"
     },
     {
-        "duration": "29.0",
+        "duration": "30.0",
         "name": "webrtc/codec_constraints_h264"
     },
     {
-        "duration": "29.0",
+        "duration": "30.0",
         "name": "webrtc/codec_constraints_vp8"
     },
     {
-        "duration": "29.0",
+        "duration": "30.0",
         "name": "webrtc/codec_constraints_vp9"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "webrtc/hd_local_stream_10s"
     },
     {
-        "duration": "29.0",
+        "duration": "31.0",
         "name": "webrtc/multiple_peerconnections"
     },
     {
-        "duration": "33.0",
+        "duration": "35.0",
         "name": "webrtc/pause_play_peerconnections"
     }
 ]
\ No newline at end of file
diff --git a/tools/perf/core/shard_maps/timing_data/android_nexus5_perf_timing.json b/tools/perf/core/shard_maps/timing_data/android_nexus5_perf_timing.json
index f87bd05..11c937ac 100644
--- a/tools/perf/core/shard_maps/timing_data/android_nexus5_perf_timing.json
+++ b/tools/perf/core/shard_maps/timing_data/android_nexus5_perf_timing.json
@@ -1,65 +1,101 @@
 [
     {
-        "duration": "29.0",
+        "duration": "68.0",
         "name": "loading.mobile/Dramaq"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "loading.mobile/Facebook"
     },
     {
-        "duration": "25.0",
+        "duration": "48.0",
         "name": "loading.mobile/FranceTVInfo"
     },
     {
-        "duration": "23.0",
+        "duration": "54.0",
         "name": "loading.mobile/GoogleIndia"
     },
     {
-        "duration": "30.0",
+        "duration": "52.0",
         "name": "loading.mobile/Hongkiat"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "loading.mobile/LocalMoxie"
     },
     {
-        "duration": "144.0",
+        "duration": "320.0",
         "name": "startup.mobile/cct:coldish:bbc"
     },
     {
-        "duration": "222.0",
+        "duration": "446.0",
         "name": "startup.mobile/intent:coldish:bbc"
     },
     {
-        "duration": "183.0",
+        "duration": "394.0",
         "name": "startup.mobile/intent:warm:bbc"
     },
     {
-        "duration": "8.0",
+        "duration": "24.0",
         "name": "startup.mobile/maps_pwa:with_http_cache"
     },
     {
-        "duration": "52.0",
+        "duration": "98.0",
+        "name": "system_health.common_mobile/background:social:facebook:2019"
+    },
+    {
+        "duration": "108.0",
         "name": "system_health.common_mobile/background:tools:gmail:2019"
     },
     {
-        "duration": "135.0",
+        "duration": "290.0",
         "name": "system_health.common_mobile/browse:news:cnn:2018"
     },
     {
-        "duration": "32.0",
+        "duration": "200.0",
+        "name": "system_health.common_mobile/browse:news:reddit:2019"
+    },
+    {
+        "duration": "8.0",
+        "name": "system_health.common_mobile/browse:social:pinterest_infinite_scroll:2019"
+    },
+    {
+        "duration": "182.0",
+        "name": "system_health.common_mobile/browse:social:tumblr_infinite_scroll:2018"
+    },
+    {
+        "duration": "158.0",
+        "name": "system_health.common_mobile/browse:social:twitter:2019"
+    },
+    {
+        "duration": "122.0",
+        "name": "system_health.common_mobile/browse:tools:maps:2019"
+    },
+    {
+        "duration": "66.0",
         "name": "system_health.common_mobile/load:media:youtube:2018"
     },
     {
-        "duration": "110.0",
-        "name": "components_perftests/_gtest_"
+        "duration": "102.0",
+        "name": "system_health.common_mobile/load:news:cnn:2018"
+    },
+    {
+        "duration": "102.0",
+        "name": "system_health.common_mobile/load:tools:gmail:2019"
+    },
+    {
+        "duration": "70.0",
+        "name": "system_health.common_mobile/load:tools:weather:2019"
     },
     {
         "duration": "50.0",
         "name": "tracing_perftests/_gtest_"
     },
     {
+        "duration": "110.0",
+        "name": "components_perftests/_gtest_"
+    },
+    {
         "duration": "60.0",
         "name": "gpu_perftests/_gtest_"
     }
diff --git a/tools/perf/core/shard_maps/timing_data/android_nexus5x_webview_perf_timing.json b/tools/perf/core/shard_maps/timing_data/android_nexus5x_webview_perf_timing.json
index d19d7bf..1248651e 100644
--- a/tools/perf/core/shard_maps/timing_data/android_nexus5x_webview_perf_timing.json
+++ b/tools/perf/core/shard_maps/timing_data/android_nexus5x_webview_perf_timing.json
@@ -1,10 +1,10 @@
 [
     {
-        "duration": "26.0",
+        "duration": "28.0",
         "name": "blink_perf.accessibility/line-breaks.html"
     },
     {
-        "duration": "21.0",
+        "duration": "22.0",
         "name": "blink_perf.accessibility/textarea-append.html"
     },
     {
@@ -28,7 +28,7 @@
         "name": "blink_perf.bindings/first-child.html"
     },
     {
-        "duration": "21.0",
+        "duration": "22.0",
         "name": "blink_perf.bindings/gc-forest.html"
     },
     {
@@ -36,11 +36,11 @@
         "name": "blink_perf.bindings/gc-mini-tree.html"
     },
     {
-        "duration": "60.0",
+        "duration": "61.0",
         "name": "blink_perf.bindings/gc-tree.html"
     },
     {
-        "duration": "17.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/get-attribute-rare.html"
     },
     {
@@ -48,11 +48,11 @@
         "name": "blink_perf.bindings/get-attribute.html"
     },
     {
-        "duration": "16.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/get-element-by-id.html"
     },
     {
-        "duration": "13.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/get-elements-by-tag-name.html"
     },
     {
@@ -60,15 +60,15 @@
         "name": "blink_perf.bindings/id-getter.html"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "blink_perf.bindings/id-setter.html"
     },
     {
-        "duration": "14.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/indexed-getter.html"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/insert-before.html"
     },
     {
@@ -76,31 +76,31 @@
         "name": "blink_perf.bindings/named-property-enumerator.html"
     },
     {
-        "duration": "98.0",
+        "duration": "123.0",
         "name": "blink_perf.bindings/node-list-access.html"
     },
     {
-        "duration": "32.0",
+        "duration": "52.0",
         "name": "blink_perf.bindings/node-type.html"
     },
     {
-        "duration": "11.0",
+        "duration": "23.0",
         "name": "blink_perf.bindings/post-message.html"
     },
     {
-        "duration": "25.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/sequence-conversion-array.html"
     },
     {
-        "duration": "13.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/sequence-conversion-custom-iterator.html"
     },
     {
-        "duration": "8.0",
+        "duration": "10.0",
         "name": "blink_perf.bindings/serialize-array.html"
     },
     {
-        "duration": "7.0",
+        "duration": "10.0",
         "name": "blink_perf.bindings/serialize-long-string.html"
     },
     {
@@ -108,15 +108,15 @@
         "name": "blink_perf.bindings/serialize-map.html"
     },
     {
-        "duration": "7.0",
+        "duration": "9.0",
         "name": "blink_perf.bindings/serialize-nested-array.html"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "blink_perf.bindings/set-attribute-rare.html"
     },
     {
-        "duration": "20.0",
+        "duration": "15.0",
         "name": "blink_perf.bindings/set-attribute.html"
     },
     {
@@ -140,31 +140,31 @@
         "name": "blink_perf.bindings/typed-array-construct-from-array.html"
     },
     {
-        "duration": "17.0",
+        "duration": "13.0",
         "name": "blink_perf.bindings/typed-array-construct-from-same-type.html"
     },
     {
-        "duration": "16.0",
+        "duration": "15.0",
         "name": "blink_perf.bindings/typed-array-construct-from-typed.html"
     },
     {
-        "duration": "17.0",
+        "duration": "13.0",
         "name": "blink_perf.bindings/typed-array-set-from-typed.html"
     },
     {
-        "duration": "21.0",
+        "duration": "19.0",
         "name": "blink_perf.bindings/undefined-first-child.html"
     },
     {
-        "duration": "17.0",
+        "duration": "13.0",
         "name": "blink_perf.bindings/undefined-get-element-by-id.html"
     },
     {
-        "duration": "17.0",
+        "duration": "19.0",
         "name": "blink_perf.bindings/undefined-id-getter.html"
     },
     {
-        "duration": "11.0",
+        "duration": "9.0",
         "name": "blink_perf.bindings/worker-structured-clone-different-payloads.html"
     },
     {
@@ -192,23 +192,23 @@
         "name": "blink_perf.bindings/worker-text-encoded-transferable-from-worker.html"
     },
     {
-        "duration": "31.0",
+        "duration": "32.0",
         "name": "blink_perf.bindings/worker-text-encoded-transferable-roundtrip.html"
     },
     {
-        "duration": "26.0",
+        "duration": "22.0",
         "name": "blink_perf.bindings/worker-text-encoded-transferable-to-worker.html"
     },
     {
-        "duration": "24.0",
+        "duration": "20.0",
         "name": "blink_perf.bindings/worker-transferable-from-worker.html"
     },
     {
-        "duration": "25.0",
+        "duration": "21.0",
         "name": "blink_perf.bindings/worker-transferable-roundtrip.html"
     },
     {
-        "duration": "23.0",
+        "duration": "22.0",
         "name": "blink_perf.bindings/worker-transferable-to-worker.html"
     },
     {
@@ -412,103 +412,103 @@
         "name": "blink_perf.canvas/upload-webgl-to-texture_RAF.html?RAF"
     },
     {
-        "duration": "26.0",
+        "duration": "28.0",
         "name": "blink_perf.css/AttributeDescendantSelector.html"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "blink_perf.css/CSSPropertySetterGetter.html"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "blink_perf.css/CSSPropertySetterGetterMethods.html"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "blink_perf.css/CSSPropertyUpdateValue.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.css/ChangeStyleChildClassSelector.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.css/ChangeStyleChildElementSelectors.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.css/ChangeStyleElementSelector.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.css/ChangeStyleGrandChildElementSelector.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.css/ChangeStyleMultipleClassSelector.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.css/ChangeStyleMultipleQualifiedDataAttributesWithValuesSelector.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.css/ChangeStyleNestedPseudoSelector.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.css/ChangeStylePairOfNthChildSelector.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.css/ChangeStylePartialAttributeMatchingSelector.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeSelector.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeWithValueSelector.html"
     },
     {
-        "duration": "10.0",
+        "duration": "11.0",
         "name": "blink_perf.css/ChangeStyleShallowTree.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.css/ChangeStyleSingleClassSelector.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.css/ChangeStyleSingleNthChildSelector.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.css/ChangeStyleSinglePseudoSelector.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.css/ChangeStyleUniversalSelector.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeSelector.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeWithValueSelector.html"
     },
     {
-        "duration": "24.0",
+        "duration": "23.0",
         "name": "blink_perf.css/ClassDescendantSelector.html"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "blink_perf.css/ClassInvalidation.html"
     },
     {
-        "duration": "11.0",
+        "duration": "9.0",
         "name": "blink_perf.css/CustomPropertiesCascade.html"
     },
     {
@@ -516,11 +516,15 @@
         "name": "blink_perf.css/CustomPropertiesNonRootInheritance.html"
     },
     {
+        "duration": "13.0",
+        "name": "blink_perf.css/CustomPropertiesPendingSubstitution.html"
+    },
+    {
         "duration": "10.0",
         "name": "blink_perf.css/CustomPropertiesRootInheritance.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.css/CustomPropertiesVarAlias.html"
     },
     {
@@ -532,39 +536,39 @@
         "name": "blink_perf.css/LoadBootstrapBlog.html"
     },
     {
-        "duration": "9.0",
+        "duration": "10.0",
         "name": "blink_perf.css/LoadMaterializeStarterPage.html"
     },
     {
-        "duration": "10.0",
+        "duration": "11.0",
         "name": "blink_perf.css/LoadSemanticPageExample.html"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "blink_perf.css/PseudoClassSelectors.html"
     },
     {
-        "duration": "55.0",
+        "duration": "58.0",
         "name": "blink_perf.css/SelectorCountScaling.html"
     },
     {
-        "duration": "72.0",
+        "duration": "76.0",
         "name": "blink_perf.dom/custom-element-default-style-with-shadow.html"
     },
     {
-        "duration": "52.0",
+        "duration": "57.0",
         "name": "blink_perf.dom/custom-element-default-style.html"
     },
     {
-        "duration": "33.0",
+        "duration": "32.0",
         "name": "blink_perf.dom/long-sibling-list.html"
     },
     {
-        "duration": "11.0",
+        "duration": "12.0",
         "name": "blink_perf.dom/modify-element-classname.html"
     },
     {
-        "duration": "18.0",
+        "duration": "12.0",
         "name": "blink_perf.dom/modify-element-id.html"
     },
     {
@@ -584,7 +588,7 @@
         "name": "blink_perf.dom/select-single-remove.html"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "blink_perf.events/EventsDispatching.html"
     },
     {
@@ -604,7 +608,7 @@
         "name": "blink_perf.events/EventsDispatchingInV1ShadowTrees.html"
     },
     {
-        "duration": "59.0",
+        "duration": "55.0",
         "name": "blink_perf.events/hit-test-lots-of-layers.html"
     },
     {
@@ -616,43 +620,43 @@
         "name": "blink_perf.events/is-input-pending-default-events.html"
     },
     {
-        "duration": "53.0",
+        "duration": "56.0",
         "name": "blink_perf.image_decoder/decode-gif.html"
     },
     {
-        "duration": "20.0",
+        "duration": "24.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h1v1.html"
     },
     {
-        "duration": "19.0",
+        "duration": "22.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h1v2.html"
     },
     {
-        "duration": "19.0",
+        "duration": "21.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h2v1.html"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h2v2.html"
     },
     {
-        "duration": "51.0",
+        "duration": "54.0",
         "name": "blink_perf.image_decoder/decode-lossless-webp.html"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "blink_perf.image_decoder/decode-lossy-webp.html"
     },
     {
-        "duration": "32.0",
+        "duration": "35.0",
         "name": "blink_perf.image_decoder/decode-png-palette-opaque.html"
     },
     {
-        "duration": "19.0",
+        "duration": "23.0",
         "name": "blink_perf.image_decoder/decode-png-palette.html"
     },
     {
-        "duration": "55.0",
+        "duration": "56.0",
         "name": "blink_perf.image_decoder/decode-png.html"
     },
     {
@@ -660,11 +664,11 @@
         "name": "blink_perf.layout/ArabicLineLayout.html"
     },
     {
-        "duration": "8.0",
+        "duration": "7.0",
         "name": "blink_perf.layout/Shapes/MultipleShapes.html"
     },
     {
-        "duration": "13.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/SimpleTextPathLineLayout.html"
     },
     {
@@ -676,7 +680,7 @@
         "name": "blink_perf.layout/animate-abspos-deep.html"
     },
     {
-        "duration": "14.0",
+        "duration": "13.0",
         "name": "blink_perf.layout/attach-inlines-2.html"
     },
     {
@@ -688,27 +692,27 @@
         "name": "blink_perf.layout/auto-grid-lots-of-data.html"
     },
     {
-        "duration": "26.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/auto-grid-lots-of-spanning-data.html"
     },
     {
-        "duration": "24.0",
+        "duration": "19.0",
         "name": "blink_perf.layout/change-text-css-contain.html"
     },
     {
-        "duration": "25.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/chapter-reflow-once-random.html"
     },
     {
-        "duration": "32.0",
+        "duration": "13.0",
         "name": "blink_perf.layout/chapter-reflow-once.html"
     },
     {
-        "duration": "24.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/chapter-reflow-thrice.html"
     },
     {
-        "duration": "24.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/chapter-reflow-twice.html"
     },
     {
@@ -716,11 +720,11 @@
         "name": "blink_perf.layout/chapter-reflow.html"
     },
     {
-        "duration": "20.0",
+        "duration": "13.0",
         "name": "blink_perf.layout/character_fallback.html"
     },
     {
-        "duration": "24.0",
+        "duration": "22.0",
         "name": "blink_perf.layout/contain-content-style-change.html"
     },
     {
@@ -732,7 +736,7 @@
         "name": "blink_perf.layout/editing_append_single_line.html"
     },
     {
-        "duration": "16.0",
+        "duration": "13.0",
         "name": "blink_perf.layout/editing_delete.html"
     },
     {
@@ -744,35 +748,35 @@
         "name": "blink_perf.layout/editing_prepend.html"
     },
     {
-        "duration": "26.0",
+        "duration": "24.0",
         "name": "blink_perf.layout/fit-content-change-available-size-blocks.html"
     },
     {
-        "duration": "18.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/fit-content-change-available-size-text.html"
     },
     {
-        "duration": "20.0",
+        "duration": "15.0",
         "name": "blink_perf.layout/fixed-grid-lots-of-data.html"
     },
     {
-        "duration": "28.0",
+        "duration": "15.0",
         "name": "blink_perf.layout/fixed-grid-lots-of-stretched-data.html"
     },
     {
-        "duration": "14.0",
+        "duration": "13.0",
         "name": "blink_perf.layout/flexbox-column-nowrap.html"
     },
     {
-        "duration": "17.0",
+        "duration": "13.0",
         "name": "blink_perf.layout/flexbox-column-wrap.html"
     },
     {
-        "duration": "16.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/flexbox-deeply-nested-column-flow.html"
     },
     {
-        "duration": "15.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/flexbox-lots-of-data.html"
     },
     {
@@ -780,15 +784,15 @@
         "name": "blink_perf.layout/flexbox-row-nowrap.html"
     },
     {
-        "duration": "21.0",
+        "duration": "22.0",
         "name": "blink_perf.layout/flexbox-row-stretch-height-definite.html"
     },
     {
-        "duration": "21.0",
+        "duration": "13.0",
         "name": "blink_perf.layout/flexbox-row-wrap.html"
     },
     {
-        "duration": "21.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/flexbox-with-stretch-layout.html"
     },
     {
@@ -796,27 +800,27 @@
         "name": "blink_perf.layout/flexbox_with_list_item.html"
     },
     {
-        "duration": "51.0",
+        "duration": "49.0",
         "name": "blink_perf.layout/floats_100_100.html"
     },
     {
-        "duration": "45.0",
+        "duration": "55.0",
         "name": "blink_perf.layout/floats_100_100_nested.html"
     },
     {
-        "duration": "24.0",
+        "duration": "26.0",
         "name": "blink_perf.layout/floats_10_1000.html"
     },
     {
-        "duration": "28.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/floats_20_100.html"
     },
     {
-        "duration": "29.0",
+        "duration": "22.0",
         "name": "blink_perf.layout/floats_20_100_nested.html"
     },
     {
-        "duration": "16.0",
+        "duration": "15.0",
         "name": "blink_perf.layout/floats_2_100.html"
     },
     {
@@ -824,51 +828,51 @@
         "name": "blink_perf.layout/floats_2_100_nested.html"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/floats_50_100.html"
     },
     {
-        "duration": "23.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/floats_50_100_nested.html"
     },
     {
-        "duration": "15.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/hindi-line-layout.html"
     },
     {
-        "duration": "72.0",
+        "duration": "54.0",
         "name": "blink_perf.layout/japanese-kokoro-insert.html"
     },
     {
-        "duration": "33.0",
+        "duration": "29.0",
         "name": "blink_perf.layout/large-grid.html"
     },
     {
-        "duration": "17.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/large-spanning-grid-item.html"
     },
     {
-        "duration": "46.0",
+        "duration": "51.0",
         "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans-wider-than-table.html"
     },
     {
-        "duration": "42.0",
+        "duration": "58.0",
         "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans.html"
     },
     {
-        "duration": "42.0",
+        "duration": "46.0",
         "name": "blink_perf.layout/large-table-with-collapsed-borders-and-no-colspans.html"
     },
     {
-        "duration": "33.0",
+        "duration": "43.0",
         "name": "blink_perf.layout/latin-ebook-resize.html"
     },
     {
-        "duration": "18.0",
+        "duration": "26.0",
         "name": "blink_perf.layout/latin-ebook.html"
     },
     {
-        "duration": "11.0",
+        "duration": "10.0",
         "name": "blink_perf.layout/layers_overlap_2d.html"
     },
     {
@@ -884,19 +888,19 @@
         "name": "blink_perf.layout/line-layout-fit-content.html"
     },
     {
-        "duration": "40.0",
+        "duration": "43.0",
         "name": "blink_perf.layout/line-layout-line-height.html"
     },
     {
-        "duration": "13.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/line-layout-repeat-append-select.html"
     },
     {
-        "duration": "12.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/line-layout-repeat-append.html"
     },
     {
-        "duration": "13.0",
+        "duration": "17.0",
         "name": "blink_perf.layout/line-layout.html"
     },
     {
@@ -904,23 +908,23 @@
         "name": "blink_perf.layout/long-line-nowrap-collapse.html"
     },
     {
-        "duration": "8.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/long-line-nowrap-spans-collapse.html"
     },
     {
-        "duration": "23.0",
+        "duration": "22.0",
         "name": "blink_perf.layout/long-line-nowrap.html"
     },
     {
-        "duration": "13.0",
+        "duration": "24.0",
         "name": "blink_perf.layout/many-block-children-auto-inline-size.html"
     },
     {
-        "duration": "13.0",
+        "duration": "17.0",
         "name": "blink_perf.layout/many-block-children-fixed-inline-size.html"
     },
     {
-        "duration": "12.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/multicol/balance-forced-breaks.html"
     },
     {
@@ -928,11 +932,11 @@
         "name": "blink_perf.layout/multicol/deeply-nested-tables.html"
     },
     {
-        "duration": "13.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/multicol/fixed-height-with-spanner-and-nested-tables.html"
     },
     {
-        "duration": "13.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/multicol/lots-of-small-nested-unbreakable-blocks-autofill.html"
     },
     {
@@ -944,7 +948,7 @@
         "name": "blink_perf.layout/multicol/lots-of-text-autofill.html"
     },
     {
-        "duration": "14.0",
+        "duration": "13.0",
         "name": "blink_perf.layout/multicol/lots-of-text-balanced-orphans-widows.html"
     },
     {
@@ -952,7 +956,7 @@
         "name": "blink_perf.layout/multicol/lots-of-text-balanced.html"
     },
     {
-        "duration": "91.0",
+        "duration": "90.0",
         "name": "blink_perf.layout/multicol/nested-forced-breaks.html"
     },
     {
@@ -960,19 +964,19 @@
         "name": "blink_perf.layout/multicol/tall-content-short-columns-realistic.html"
     },
     {
-        "duration": "12.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/multicol/tall-content-short-columns.html"
     },
     {
-        "duration": "13.0",
+        "duration": "25.0",
         "name": "blink_perf.layout/nested-blocks-with-percent-height-and-max-height.html"
     },
     {
-        "duration": "13.0",
+        "duration": "25.0",
         "name": "blink_perf.layout/nested-grid.html"
     },
     {
-        "duration": "13.0",
+        "duration": "17.0",
         "name": "blink_perf.layout/nested-percent-height-tables.html"
     },
     {
@@ -980,39 +984,39 @@
         "name": "blink_perf.layout/subtree-detaching.html"
     },
     {
-        "duration": "55.0",
+        "duration": "54.0",
         "name": "blink_perf.layout/vertical-japanese-kokoro-insert.html"
     },
     {
-        "duration": "18.0",
+        "duration": "22.0",
         "name": "blink_perf.layout/word-break-break-all.html"
     },
     {
-        "duration": "25.0",
+        "duration": "33.0",
         "name": "blink_perf.layout/word-break-break-word.html"
     },
     {
-        "duration": "20.0",
+        "duration": "32.0",
         "name": "blink_perf.layout/word-wrap-break-word.html"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "blink_perf.owp_storage/blob-perf-files.html"
     },
     {
-        "duration": "15.0",
+        "duration": "18.0",
         "name": "blink_perf.owp_storage/blob-perf-ipc.html"
     },
     {
-        "duration": "12.0",
+        "duration": "16.0",
         "name": "blink_perf.owp_storage/blob-perf-shm.html"
     },
     {
-        "duration": "15.0",
+        "duration": "19.0",
         "name": "blink_perf.owp_storage/blob-perf-tiny.html"
     },
     {
-        "duration": "15.0",
+        "duration": "20.0",
         "name": "blink_perf.owp_storage/idb-load-docs.html"
     },
     {
@@ -1088,27 +1092,27 @@
         "name": "blink_perf.paint/transform-changes.html"
     },
     {
-        "duration": "31.0",
+        "duration": "20.0",
         "name": "blink_perf.parser/css-parser-yui.html"
     },
     {
-        "duration": "18.0",
+        "duration": "17.0",
         "name": "blink_perf.parser/html-parser-threaded.html"
     },
     {
-        "duration": "46.0",
+        "duration": "45.0",
         "name": "blink_perf.parser/html-parser.html"
     },
     {
-        "duration": "187.0",
+        "duration": "184.0",
         "name": "blink_perf.parser/html5-full-render.html"
     },
     {
-        "duration": "13.0",
+        "duration": "25.0",
         "name": "blink_perf.parser/iframe-append-remove.html"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "blink_perf.parser/innerHTML-setter-siblings.html"
     },
     {
@@ -1116,7 +1120,7 @@
         "name": "blink_perf.parser/innerHTML-setter.html"
     },
     {
-        "duration": "13.0",
+        "duration": "20.0",
         "name": "blink_perf.parser/query-selector-all-attribute-complex.html"
     },
     {
@@ -1132,11 +1136,11 @@
         "name": "blink_perf.parser/query-selector-all-class-first.html"
     },
     {
-        "duration": "14.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/query-selector-all-class-last.html"
     },
     {
-        "duration": "16.0",
+        "duration": "12.0",
         "name": "blink_perf.parser/query-selector-all-class.html"
     },
     {
@@ -1144,7 +1148,7 @@
         "name": "blink_perf.parser/query-selector-all-deep.html"
     },
     {
-        "duration": "12.0",
+        "duration": "17.0",
         "name": "blink_perf.parser/query-selector-all-first.html"
     },
     {
@@ -1152,43 +1156,43 @@
         "name": "blink_perf.parser/query-selector-all-id-deep.html"
     },
     {
-        "duration": "13.0",
+        "duration": "17.0",
         "name": "blink_perf.parser/query-selector-all-id-first.html"
     },
     {
-        "duration": "15.0",
+        "duration": "20.0",
         "name": "blink_perf.parser/query-selector-all-id-last.html"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "blink_perf.parser/query-selector-all-last.html"
     },
     {
-        "duration": "13.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/query-selector-deep.html"
     },
     {
-        "duration": "13.0",
+        "duration": "22.0",
         "name": "blink_perf.parser/query-selector-first.html"
     },
     {
-        "duration": "14.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/query-selector-id-deep.html"
     },
     {
-        "duration": "15.0",
+        "duration": "20.0",
         "name": "blink_perf.parser/query-selector-id-last.html"
     },
     {
-        "duration": "13.0",
+        "duration": "22.0",
         "name": "blink_perf.parser/query-selector-last.html"
     },
     {
-        "duration": "12.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/simple-url.html"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "blink_perf.parser/textarea-parsing.html"
     },
     {
@@ -1196,7 +1200,7 @@
         "name": "blink_perf.parser/tiny-innerHTML.html"
     },
     {
-        "duration": "17.0",
+        "duration": "22.0",
         "name": "blink_perf.parser/url-parser.html"
     },
     {
@@ -1428,7 +1432,7 @@
         "name": "blink_perf.svg/France.html"
     },
     {
-        "duration": "7.0",
+        "duration": "6.0",
         "name": "blink_perf.svg/FrancoBolloGnomeEzechi.html"
     },
     {
@@ -1448,7 +1452,7 @@
         "name": "blink_perf.svg/MtSaintHelens.html"
     },
     {
-        "duration": "7.0",
+        "duration": "6.0",
         "name": "blink_perf.svg/Samurai.html"
     },
     {
@@ -1488,7 +1492,7 @@
         "name": "dromaeo/http://dromaeo.com?dom-modify"
     },
     {
-        "duration": "55.0",
+        "duration": "54.0",
         "name": "dromaeo/http://dromaeo.com?dom-query"
     },
     {
@@ -1508,11 +1512,11 @@
         "name": "jetstream/JetStream"
     },
     {
-        "duration": "95.0",
+        "duration": "83.0",
         "name": "kraken/http://krakenbenchmark.mozilla.org/kraken-1.1/driver.html"
     },
     {
-        "duration": "19.0",
+        "duration": "18.0",
         "name": "loading.mobile/58Pic"
     },
     {
@@ -1520,7 +1524,7 @@
         "name": "loading.mobile/58Pic_3g"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "loading.mobile/Amazon"
     },
     {
@@ -1528,7 +1532,7 @@
         "name": "loading.mobile/Amazon_3g"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "loading.mobile/BOLNoticias"
     },
     {
@@ -1536,15 +1540,15 @@
         "name": "loading.mobile/BOLNoticias_3g"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "loading.mobile/Baidu"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "loading.mobile/Baidu_3g"
     },
     {
-        "duration": "20.0",
+        "duration": "14.0",
         "name": "loading.mobile/Bradesco"
     },
     {
@@ -1552,15 +1556,15 @@
         "name": "loading.mobile/Bradesco_3g"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "loading.mobile/Dailymotion"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "loading.mobile/Dailymotion_3g"
     },
     {
-        "duration": "21.0",
+        "duration": "16.0",
         "name": "loading.mobile/Dawn"
     },
     {
@@ -1568,15 +1572,15 @@
         "name": "loading.mobile/Dawn_3g"
     },
     {
-        "duration": "15.0",
+        "duration": "14.0",
         "name": "loading.mobile/DevOpera_cold"
     },
     {
-        "duration": "18.0",
+        "duration": "19.0",
         "name": "loading.mobile/DevOpera_cold_3g"
     },
     {
-        "duration": "18.0",
+        "duration": "19.0",
         "name": "loading.mobile/DevOpera_hot"
     },
     {
@@ -1584,11 +1588,11 @@
         "name": "loading.mobile/DevOpera_hot_3g"
     },
     {
-        "duration": "17.0",
+        "duration": "16.0",
         "name": "loading.mobile/DevOpera_warm"
     },
     {
-        "duration": "23.0",
+        "duration": "20.0",
         "name": "loading.mobile/DevOpera_warm_3g"
     },
     {
@@ -1596,11 +1600,11 @@
         "name": "loading.mobile/Dramaq"
     },
     {
-        "duration": "51.0",
+        "duration": "52.0",
         "name": "loading.mobile/Dramaq_3g"
     },
     {
-        "duration": "11.0",
+        "duration": "12.0",
         "name": "loading.mobile/EnquiryIndianRail"
     },
     {
@@ -1608,27 +1612,27 @@
         "name": "loading.mobile/EnquiryIndianRail_3g"
     },
     {
-        "duration": "11.0",
+        "duration": "12.0",
         "name": "loading.mobile/Facebook"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "loading.mobile/Facebook_3g"
     },
     {
-        "duration": "20.0",
+        "duration": "14.0",
         "name": "loading.mobile/FlipBoard_cold"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "loading.mobile/FlipBoard_cold_3g"
     },
     {
-        "duration": "27.0",
+        "duration": "24.0",
         "name": "loading.mobile/FlipBoard_hot"
     },
     {
-        "duration": "34.0",
+        "duration": "21.0",
         "name": "loading.mobile/FlipBoard_hot_3g"
     },
     {
@@ -1636,31 +1640,31 @@
         "name": "loading.mobile/FlipBoard_warm"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "loading.mobile/FlipBoard_warm_3g"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "loading.mobile/FlipKart_cold"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "loading.mobile/FlipKart_cold_3g"
     },
     {
-        "duration": "25.0",
+        "duration": "22.0",
         "name": "loading.mobile/FlipKart_hot"
     },
     {
-        "duration": "42.0",
+        "duration": "23.0",
         "name": "loading.mobile/FlipKart_hot_3g"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "loading.mobile/FlipKart_warm"
     },
     {
-        "duration": "31.0",
+        "duration": "30.0",
         "name": "loading.mobile/FlipKart_warm_3g"
     },
     {
@@ -1668,19 +1672,19 @@
         "name": "loading.mobile/FranceTVInfo"
     },
     {
-        "duration": "21.0",
+        "duration": "20.0",
         "name": "loading.mobile/FranceTVInfo_3g"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "loading.mobile/G1"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "loading.mobile/G1_3g"
     },
     {
-        "duration": "22.0",
+        "duration": "15.0",
         "name": "loading.mobile/GSShop"
     },
     {
@@ -1692,31 +1696,31 @@
         "name": "loading.mobile/GoogleBrazil"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "loading.mobile/GoogleBrazil_3g"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "loading.mobile/GoogleIndia"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "loading.mobile/GoogleIndia_3g"
     },
     {
-        "duration": "11.0",
+        "duration": "12.0",
         "name": "loading.mobile/GoogleIndonesia"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "loading.mobile/GoogleIndonesia_3g"
     },
     {
-        "duration": "16.0",
+        "duration": "15.0",
         "name": "loading.mobile/GoogleRedirectToGoogleJapan"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "loading.mobile/GoogleRedirectToGoogleJapan_3g"
     },
     {
@@ -1728,23 +1732,23 @@
         "name": "loading.mobile/Hongkiat_3g"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "loading.mobile/KapanLagi"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "loading.mobile/KapanLagi_3g"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "loading.mobile/Kaskus"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "loading.mobile/Kaskus_3g"
     },
     {
-        "duration": "32.0",
+        "duration": "19.0",
         "name": "loading.mobile/LocalMoxie"
     },
     {
@@ -1752,63 +1756,63 @@
         "name": "loading.mobile/LocalMoxie_3g"
     },
     {
-        "duration": "18.0",
+        "duration": "13.0",
         "name": "loading.mobile/Locanto"
     },
     {
-        "duration": "18.0",
+        "duration": "14.0",
         "name": "loading.mobile/Locanto_3g"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "loading.mobile/OLX"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "loading.mobile/OLX_3g"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "loading.mobile/QQNews"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "loading.mobile/QQNews_3g"
     },
     {
-        "duration": "15.0",
+        "duration": "13.0",
         "name": "loading.mobile/SlideShare"
     },
     {
-        "duration": "28.0",
+        "duration": "24.0",
         "name": "loading.mobile/SlideShare_3g"
     },
     {
-        "duration": "33.0",
+        "duration": "13.0",
         "name": "loading.mobile/Suumo_cold"
     },
     {
-        "duration": "15.0",
+        "duration": "14.0",
         "name": "loading.mobile/Suumo_cold_3g"
     },
     {
-        "duration": "19.0",
+        "duration": "17.0",
         "name": "loading.mobile/Suumo_hot"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "loading.mobile/Suumo_hot_3g"
     },
     {
-        "duration": "19.0",
+        "duration": "15.0",
         "name": "loading.mobile/Suumo_warm"
     },
     {
-        "duration": "17.0",
+        "duration": "15.0",
         "name": "loading.mobile/Suumo_warm_3g"
     },
     {
-        "duration": "26.0",
+        "duration": "13.0",
         "name": "loading.mobile/Thairath"
     },
     {
@@ -1816,7 +1820,7 @@
         "name": "loading.mobile/Thairath_3g"
     },
     {
-        "duration": "30.0",
+        "duration": "20.0",
         "name": "loading.mobile/TheStar"
     },
     {
@@ -1824,43 +1828,43 @@
         "name": "loading.mobile/TheStar_3g"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "loading.mobile/TribunNews"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "loading.mobile/TribunNews_3g"
     },
     {
-        "duration": "11.0",
+        "duration": "12.0",
         "name": "loading.mobile/Twitter"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "loading.mobile/Twitter_3g"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "loading.mobile/VoiceMemos_cold"
     },
     {
-        "duration": "21.0",
+        "duration": "17.0",
         "name": "loading.mobile/VoiceMemos_cold_3g"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "loading.mobile/VoiceMemos_hot"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "loading.mobile/VoiceMemos_hot_3g"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "loading.mobile/VoiceMemos_warm"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "loading.mobile/VoiceMemos_warm_3g"
     },
     {
@@ -1868,7 +1872,7 @@
         "name": "loading.mobile/Wikipedia"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "loading.mobile/Wikipedia_3g"
     },
     {
@@ -1876,7 +1880,7 @@
         "name": "loading.mobile/YahooNews"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "loading.mobile/YahooNews_3g"
     },
     {
@@ -1884,47 +1888,47 @@
         "name": "loading.mobile/Youtube"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "loading.mobile/Youtube_3g"
     },
     {
-        "duration": "78.0",
+        "duration": "70.0",
         "name": "octane/Octane"
     },
     {
-        "duration": "20.0",
+        "duration": "41.0",
         "name": "rasterize_and_record_micro.partial_invalidation/800_relpos_divs.html"
     },
     {
-        "duration": "34.0",
+        "duration": "33.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/amazon.html"
     },
     {
-        "duration": "15.0",
+        "duration": "14.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/blogger.html"
     },
     {
-        "duration": "35.0",
+        "duration": "34.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/booking.html"
     },
     {
-        "duration": "21.0",
+        "duration": "20.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/cnn.html"
     },
     {
-        "duration": "15.0",
+        "duration": "14.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/ebay.html"
     },
     {
-        "duration": "40.0",
+        "duration": "37.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/espn.html"
     },
     {
-        "duration": "30.0",
+        "duration": "29.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/facebook.html"
     },
     {
-        "duration": "58.0",
+        "duration": "51.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/gmail.html"
     },
     {
@@ -1932,39 +1936,39 @@
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/google.html"
     },
     {
-        "duration": "38.0",
+        "duration": "37.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googlecalendar.html"
     },
     {
-        "duration": "36.0",
+        "duration": "29.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googledocs.html"
     },
     {
-        "duration": "51.0",
+        "duration": "43.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleimagesearch.html"
     },
     {
-        "duration": "67.0",
+        "duration": "48.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleplus.html"
     },
     {
-        "duration": "38.0",
+        "duration": "32.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/linkedin.html"
     },
     {
-        "duration": "21.0",
+        "duration": "12.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/pinterest.html"
     },
     {
-        "duration": "26.0",
+        "duration": "25.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/techcrunch.html"
     },
     {
-        "duration": "57.0",
+        "duration": "49.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/twitter.html"
     },
     {
-        "duration": "39.0",
+        "duration": "30.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/weather.html"
     },
     {
@@ -1972,11 +1976,11 @@
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/wikipedia.html"
     },
     {
-        "duration": "30.0",
+        "duration": "19.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/wordpress.html"
     },
     {
-        "duration": "37.0",
+        "duration": "34.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahooanswers.html"
     },
     {
@@ -1988,139 +1992,139 @@
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoonews.html"
     },
     {
-        "duration": "114.0",
+        "duration": "101.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoosports.html"
     },
     {
-        "duration": "60.0",
+        "duration": "58.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/youtube.html"
     },
     {
-        "duration": "75.0",
+        "duration": "46.0",
         "name": "rendering.mobile/accu_weather_2018"
     },
     {
-        "duration": "37.0",
+        "duration": "45.0",
         "name": "rendering.mobile/accu_weather_mobile_pinch_2018"
     },
     {
-        "duration": "46.0",
+        "duration": "43.0",
         "name": "rendering.mobile/amazon_2018"
     },
     {
-        "duration": "44.0",
+        "duration": "24.0",
         "name": "rendering.mobile/amazon_mobile_2018"
     },
     {
-        "duration": "36.0",
+        "duration": "33.0",
         "name": "rendering.mobile/analog_clock_svg"
     },
     {
-        "duration": "36.0",
+        "duration": "32.0",
         "name": "rendering.mobile/androidpolice_mobile_2018"
     },
     {
-        "duration": "40.0",
+        "duration": "30.0",
         "name": "rendering.mobile/animometer_webgl"
     },
     {
-        "duration": "52.0",
+        "duration": "32.0",
         "name": "rendering.mobile/animometer_webgl_attrib_arrays"
     },
     {
-        "duration": "59.0",
+        "duration": "70.0",
         "name": "rendering.mobile/animometer_webgl_multi_draw"
     },
     {
-        "duration": "37.0",
+        "duration": "43.0",
         "name": "rendering.mobile/aquarium"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "rendering.mobile/aquarium_20k"
     },
     {
-        "duration": "25.0",
+        "duration": "24.0",
         "name": "rendering.mobile/background_color_animation"
     },
     {
-        "duration": "33.0",
+        "duration": "25.0",
         "name": "rendering.mobile/background_color_animation_with_gradient"
     },
     {
-        "duration": "69.0",
+        "duration": "37.0",
         "name": "rendering.mobile/baidu_mobile_2018"
     },
     {
-        "duration": "84.0",
+        "duration": "25.0",
         "name": "rendering.mobile/balls_css_key_frame_animations"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "rendering.mobile/balls_css_key_frame_animations_composited_transform"
     },
     {
-        "duration": "33.0",
+        "duration": "23.0",
         "name": "rendering.mobile/balls_css_transition_2_properties"
     },
     {
-        "duration": "24.0",
+        "duration": "23.0",
         "name": "rendering.mobile/balls_css_transition_40_properties"
     },
     {
-        "duration": "37.0",
+        "duration": "27.0",
         "name": "rendering.mobile/balls_css_transition_all_properties"
     },
     {
-        "duration": "42.0",
+        "duration": "31.0",
         "name": "rendering.mobile/balls_javascript_canvas"
     },
     {
-        "duration": "30.0",
+        "duration": "44.0",
         "name": "rendering.mobile/balls_javascript_css"
     },
     {
-        "duration": "29.0",
+        "duration": "36.0",
         "name": "rendering.mobile/balls_svg_animations"
     },
     {
-        "duration": "29.0",
+        "duration": "28.0",
         "name": "rendering.mobile/basic_stream"
     },
     {
-        "duration": "46.0",
+        "duration": "34.0",
         "name": "rendering.mobile/bing_mobile_2018"
     },
     {
-        "duration": "43.0",
+        "duration": "58.0",
         "name": "rendering.mobile/blob"
     },
     {
-        "duration": "60.0",
+        "duration": "21.0",
         "name": "rendering.mobile/blogspot_2018"
     },
     {
-        "duration": "54.0",
+        "duration": "44.0",
         "name": "rendering.mobile/blogspot_mobile_2018"
     },
     {
-        "duration": "21.0",
+        "duration": "26.0",
         "name": "rendering.mobile/blur_rotating_background"
     },
     {
-        "duration": "31.0",
+        "duration": "27.0",
         "name": "rendering.mobile/boingboing_mobile_2018"
     },
     {
-        "duration": "35.0",
+        "duration": "18.0",
         "name": "rendering.mobile/booking.com_2018"
     },
     {
-        "duration": "21.0",
+        "duration": "14.0",
         "name": "rendering.mobile/booking.com_mobile_2018"
     },
     {
-        "duration": "24.0",
+        "duration": "26.0",
         "name": "rendering.mobile/bouncing_balls_15"
     },
     {
@@ -2128,23 +2132,23 @@
         "name": "rendering.mobile/bouncing_balls_shadow"
     },
     {
-        "duration": "27.0",
+        "duration": "29.0",
         "name": "rendering.mobile/bouncing_clipped_rectangles"
     },
     {
-        "duration": "29.0",
+        "duration": "34.0",
         "name": "rendering.mobile/bouncing_gradient_circles"
     },
     {
-        "duration": "44.0",
+        "duration": "45.0",
         "name": "rendering.mobile/bouncing_png_images"
     },
     {
-        "duration": "42.0",
+        "duration": "33.0",
         "name": "rendering.mobile/bouncing_svg_images"
     },
     {
-        "duration": "45.0",
+        "duration": "36.0",
         "name": "rendering.mobile/camera_to_webgl"
     },
     {
@@ -2176,31 +2180,31 @@
         "name": "rendering.mobile/canvas_90000_pixels_per_second"
     },
     {
-        "duration": "23.0",
+        "duration": "22.0",
         "name": "rendering.mobile/canvas_animation_no_clear"
     },
     {
-        "duration": "29.0",
+        "duration": "26.0",
         "name": "rendering.mobile/canvas_arcs"
     },
     {
-        "duration": "60.0",
+        "duration": "34.0",
         "name": "rendering.mobile/canvas_font_cycler"
     },
     {
-        "duration": "33.0",
+        "duration": "34.0",
         "name": "rendering.mobile/canvas_lines"
     },
     {
-        "duration": "34.0",
+        "duration": "26.0",
         "name": "rendering.mobile/canvas_to_blob"
     },
     {
-        "duration": "33.0",
+        "duration": "30.0",
         "name": "rendering.mobile/capitolvolkswagen_mobile_2018"
     },
     {
-        "duration": "30.0",
+        "duration": "24.0",
         "name": "rendering.mobile/card_expansion"
     },
     {
@@ -2208,43 +2212,43 @@
         "name": "rendering.mobile/card_expansion_animated"
     },
     {
-        "duration": "31.0",
+        "duration": "23.0",
         "name": "rendering.mobile/card_expansion_images_text"
     },
     {
-        "duration": "29.0",
+        "duration": "21.0",
         "name": "rendering.mobile/card_flying"
     },
     {
-        "duration": "19.0",
+        "duration": "21.0",
         "name": "rendering.mobile/cats_unscaled"
     },
     {
-        "duration": "17.0",
+        "duration": "12.0",
         "name": "rendering.mobile/cats_viewport_width"
     },
     {
-        "duration": "37.0",
+        "duration": "49.0",
         "name": "rendering.mobile/cc_poster_circle"
     },
     {
-        "duration": "35.0",
+        "duration": "23.0",
         "name": "rendering.mobile/cc_scroll_text_only"
     },
     {
-        "duration": "79.0",
+        "duration": "61.0",
         "name": "rendering.mobile/chip_tune"
     },
     {
-        "duration": "30.0",
+        "duration": "27.0",
         "name": "rendering.mobile/cnn_2018"
     },
     {
-        "duration": "64.0",
+        "duration": "42.0",
         "name": "rendering.mobile/cnn_article_mobile_2018"
     },
     {
-        "duration": "55.0",
+        "duration": "34.0",
         "name": "rendering.mobile/cnn_mobile_2018"
     },
     {
@@ -2252,15 +2256,15 @@
         "name": "rendering.mobile/cnn_mobile_pinch_2018"
     },
     {
-        "duration": "53.0",
+        "duration": "36.0",
         "name": "rendering.mobile/cnn_pathological_2018"
     },
     {
-        "duration": "50.0",
+        "duration": "39.0",
         "name": "rendering.mobile/compositor_heavy_animation"
     },
     {
-        "duration": "40.0",
+        "duration": "29.0",
         "name": "rendering.mobile/coordinated_animation"
     },
     {
@@ -2268,183 +2272,183 @@
         "name": "rendering.mobile/core_scroll_header_panel"
     },
     {
-        "duration": "39.0",
+        "duration": "23.0",
         "name": "rendering.mobile/crafty_mind"
     },
     {
-        "duration": "32.0",
+        "duration": "28.0",
         "name": "rendering.mobile/css_animations_many_keyframes"
     },
     {
-        "duration": "33.0",
+        "duration": "24.0",
         "name": "rendering.mobile/css_animations_simultaneous_inline_style"
     },
     {
-        "duration": "38.0",
+        "duration": "24.0",
         "name": "rendering.mobile/css_animations_simultaneous_new_element"
     },
     {
-        "duration": "28.0",
+        "duration": "24.0",
         "name": "rendering.mobile/css_animations_simultaneous_style_element"
     },
     {
-        "duration": "28.0",
+        "duration": "24.0",
         "name": "rendering.mobile/css_animations_simultaneous_updating_class"
     },
     {
-        "duration": "28.0",
+        "duration": "23.0",
         "name": "rendering.mobile/css_animations_staggered_infinite_iterations"
     },
     {
-        "duration": "29.0",
+        "duration": "25.0",
         "name": "rendering.mobile/css_animations_staggered_inline_style"
     },
     {
-        "duration": "67.0",
+        "duration": "26.0",
         "name": "rendering.mobile/css_animations_staggered_new_element"
     },
     {
-        "duration": "72.0",
+        "duration": "26.0",
         "name": "rendering.mobile/css_animations_staggered_style_element"
     },
     {
-        "duration": "56.0",
+        "duration": "35.0",
         "name": "rendering.mobile/css_animations_staggered_updating_class"
     },
     {
-        "duration": "51.0",
+        "duration": "40.0",
         "name": "rendering.mobile/css_animations_triggered_inline_style"
     },
     {
-        "duration": "57.0",
+        "duration": "41.0",
         "name": "rendering.mobile/css_animations_triggered_new_element"
     },
     {
-        "duration": "60.0",
+        "duration": "43.0",
         "name": "rendering.mobile/css_animations_triggered_style_element"
     },
     {
-        "duration": "77.0",
+        "duration": "41.0",
         "name": "rendering.mobile/css_animations_triggered_updating_class"
     },
     {
-        "duration": "52.0",
+        "duration": "33.0",
         "name": "rendering.mobile/css_opacity_plus_n_layers_0"
     },
     {
-        "duration": "31.0",
+        "duration": "29.0",
         "name": "rendering.mobile/css_opacity_plus_n_layers_75"
     },
     {
-        "duration": "26.0",
+        "duration": "25.0",
         "name": "rendering.mobile/css_opacity_plus_n_layers_99"
     },
     {
-        "duration": "60.0",
+        "duration": "33.0",
         "name": "rendering.mobile/css_transitions_inline_style"
     },
     {
-        "duration": "28.0",
+        "duration": "24.0",
         "name": "rendering.mobile/css_transitions_new_element"
     },
     {
-        "duration": "23.0",
+        "duration": "27.0",
         "name": "rendering.mobile/css_transitions_staggered_inline_style"
     },
     {
-        "duration": "34.0",
+        "duration": "28.0",
         "name": "rendering.mobile/css_transitions_staggered_new_element"
     },
     {
-        "duration": "25.0",
+        "duration": "49.0",
         "name": "rendering.mobile/css_transitions_staggered_style_element"
     },
     {
-        "duration": "23.0",
+        "duration": "33.0",
         "name": "rendering.mobile/css_transitions_staggered_updating_class"
     },
     {
-        "duration": "22.0",
+        "duration": "30.0",
         "name": "rendering.mobile/css_transitions_style_element"
     },
     {
-        "duration": "23.0",
+        "duration": "34.0",
         "name": "rendering.mobile/css_transitions_triggered_inline_style"
     },
     {
-        "duration": "23.0",
+        "duration": "31.0",
         "name": "rendering.mobile/css_transitions_triggered_new_element"
     },
     {
-        "duration": "24.0",
+        "duration": "37.0",
         "name": "rendering.mobile/css_transitions_triggered_style_element"
     },
     {
-        "duration": "24.0",
+        "duration": "58.0",
         "name": "rendering.mobile/css_transitions_triggered_updating_class"
     },
     {
-        "duration": "23.0",
+        "duration": "33.0",
         "name": "rendering.mobile/css_transitions_updating_class"
     },
     {
-        "duration": "23.0",
+        "duration": "27.0",
         "name": "rendering.mobile/css_value_type_color"
     },
     {
-        "duration": "39.0",
+        "duration": "35.0",
         "name": "rendering.mobile/css_value_type_filter"
     },
     {
-        "duration": "38.0",
+        "duration": "42.0",
         "name": "rendering.mobile/css_value_type_length"
     },
     {
-        "duration": "38.0",
+        "duration": "30.0",
         "name": "rendering.mobile/css_value_type_length_complex"
     },
     {
-        "duration": "24.0",
+        "duration": "25.0",
         "name": "rendering.mobile/css_value_type_length_simple"
     },
     {
-        "duration": "39.0",
+        "duration": "37.0",
         "name": "rendering.mobile/css_value_type_path"
     },
     {
-        "duration": "32.0",
+        "duration": "52.0",
         "name": "rendering.mobile/css_value_type_shadow"
     },
     {
-        "duration": "27.0",
+        "duration": "30.0",
         "name": "rendering.mobile/css_value_type_transform_complex"
     },
     {
-        "duration": "30.0",
+        "duration": "36.0",
         "name": "rendering.mobile/css_value_type_transform_simple"
     },
     {
-        "duration": "53.0",
+        "duration": "54.0",
         "name": "rendering.mobile/deviantart_mobile_2018"
     },
     {
-        "duration": "24.0",
+        "duration": "27.0",
         "name": "rendering.mobile/digg_mobile_2018"
     },
     {
-        "duration": "29.0",
+        "duration": "36.0",
         "name": "rendering.mobile/dynamic_cube_map"
     },
     {
-        "duration": "44.0",
+        "duration": "83.0",
         "name": "rendering.mobile/earth"
     },
     {
-        "duration": "25.0",
+        "duration": "28.0",
         "name": "rendering.mobile/ebay_2018"
     },
     {
-        "duration": "21.0",
+        "duration": "24.0",
         "name": "rendering.mobile/ebay_mobile_2018"
     },
     {
@@ -2452,31 +2456,31 @@
         "name": "rendering.mobile/ebay_mobile_pinch_2018"
     },
     {
-        "duration": "31.0",
+        "duration": "48.0",
         "name": "rendering.mobile/ebay_scroll_2018"
     },
     {
-        "duration": "4.0",
+        "duration": "5.0",
         "name": "rendering.mobile/effect_games"
     },
     {
-        "duration": "42.0",
+        "duration": "39.0",
         "name": "rendering.mobile/espn_2018"
     },
     {
-        "duration": "23.0",
+        "duration": "39.0",
         "name": "rendering.mobile/espn_mobile_2018"
     },
     {
-        "duration": "30.0",
+        "duration": "28.0",
         "name": "rendering.mobile/espn_pathological_2018"
     },
     {
-        "duration": "36.0",
+        "duration": "50.0",
         "name": "rendering.mobile/extra_large_texture_uploads"
     },
     {
-        "duration": "26.0",
+        "duration": "30.0",
         "name": "rendering.mobile/facebook_2018"
     },
     {
@@ -2484,11 +2488,11 @@
         "name": "rendering.mobile/facebook_mobile_2018"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "rendering.mobile/famo_us_twitter_demo"
     },
     {
-        "duration": "27.0",
+        "duration": "30.0",
         "name": "rendering.mobile/fill_shapes"
     },
     {
@@ -2496,71 +2500,71 @@
         "name": "rendering.mobile/filter_terrain_svg"
     },
     {
-        "duration": "31.0",
+        "duration": "30.0",
         "name": "rendering.mobile/flickr_scroll_2018"
     },
     {
-        "duration": "52.0",
+        "duration": "19.0",
         "name": "rendering.mobile/font_wipe"
     },
     {
-        "duration": "28.0",
+        "duration": "21.0",
         "name": "rendering.mobile/forecast.io_mobile_2018"
     },
     {
-        "duration": "4.0",
+        "duration": "5.0",
         "name": "rendering.mobile/geo_apis"
     },
     {
-        "duration": "36.0",
+        "duration": "39.0",
         "name": "rendering.mobile/gmail_2018"
     },
     {
-        "duration": "40.0",
+        "duration": "28.0",
         "name": "rendering.mobile/google_calendar_2018"
     },
     {
-        "duration": "27.0",
+        "duration": "29.0",
         "name": "rendering.mobile/google_docs_2018"
     },
     {
-        "duration": "24.0",
+        "duration": "36.0",
         "name": "rendering.mobile/google_image_search_2018"
     },
     {
-        "duration": "23.0",
+        "duration": "27.0",
         "name": "rendering.mobile/google_image_search_mobile_2018"
     },
     {
-        "duration": "24.0",
+        "duration": "23.0",
         "name": "rendering.mobile/google_news_ios"
     },
     {
-        "duration": "4.0",
+        "duration": "5.0",
         "name": "rendering.mobile/google_news_mobile_2018"
     },
     {
-        "duration": "30.0",
+        "duration": "33.0",
         "name": "rendering.mobile/google_plus_2018"
     },
     {
-        "duration": "24.0",
+        "duration": "25.0",
         "name": "rendering.mobile/google_plus_mobile_2018"
     },
     {
-        "duration": "31.0",
+        "duration": "24.0",
         "name": "rendering.mobile/google_search_mobile_pinch_2018"
     },
     {
-        "duration": "21.0",
+        "duration": "30.0",
         "name": "rendering.mobile/google_web_search_2018"
     },
     {
-        "duration": "26.0",
+        "duration": "29.0",
         "name": "rendering.mobile/google_web_search_mobile_2018"
     },
     {
-        "duration": "32.0",
+        "duration": "29.0",
         "name": "rendering.mobile/gsp.ro_mobile_2018"
     },
     {
@@ -2568,7 +2572,7 @@
         "name": "rendering.mobile/guardian_pathological_2018"
     },
     {
-        "duration": "32.0",
+        "duration": "37.0",
         "name": "rendering.mobile/guimark_vector_chart"
     },
     {
@@ -2576,51 +2580,51 @@
         "name": "rendering.mobile/gws_boogie_expansion"
     },
     {
-        "duration": "35.0",
+        "duration": "20.0",
         "name": "rendering.mobile/gws_google_expansion"
     },
     {
-        "duration": "30.0",
+        "duration": "32.0",
         "name": "rendering.mobile/hakim"
     },
     {
-        "duration": "19.0",
+        "duration": "25.0",
         "name": "rendering.mobile/horizontal_vertical_expansion"
     },
     {
-        "duration": "55.0",
+        "duration": "41.0",
         "name": "rendering.mobile/idle_power_animated_gif"
     },
     {
-        "duration": "35.0",
+        "duration": "34.0",
         "name": "rendering.mobile/idle_power_blank"
     },
     {
-        "duration": "103.0",
+        "duration": "41.0",
         "name": "rendering.mobile/idle_power_css_animation"
     },
     {
-        "duration": "39.0",
+        "duration": "40.0",
         "name": "rendering.mobile/idle_power_request_animation_frame"
     },
     {
-        "duration": "112.0",
+        "duration": "111.0",
         "name": "rendering.mobile/idle_power_set_timeout_long"
     },
     {
-        "duration": "42.0",
+        "duration": "39.0",
         "name": "rendering.mobile/idle_power_set_timetout"
     },
     {
-        "duration": "42.0",
+        "duration": "55.0",
         "name": "rendering.mobile/ie_chalkboard"
     },
     {
-        "duration": "34.0",
+        "duration": "31.0",
         "name": "rendering.mobile/ie_pirate_mark"
     },
     {
-        "duration": "29.0",
+        "duration": "28.0",
         "name": "rendering.mobile/infinite_scroll_element_n_layers_0"
     },
     {
@@ -2628,15 +2632,15 @@
         "name": "rendering.mobile/infinite_scroll_element_n_layers_75"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "rendering.mobile/infinite_scroll_element_n_layers_99"
     },
     {
-        "duration": "24.0",
+        "duration": "25.0",
         "name": "rendering.mobile/infinite_scroll_root_fixed_n_layers_0"
     },
     {
-        "duration": "24.0",
+        "duration": "25.0",
         "name": "rendering.mobile/infinite_scroll_root_fixed_n_layers_75"
     },
     {
@@ -2656,7 +2660,7 @@
         "name": "rendering.mobile/infinite_scroll_root_n_layers_99"
     },
     {
-        "duration": "26.0",
+        "duration": "22.0",
         "name": "rendering.mobile/infinite_scrolling"
     },
     {
@@ -2664,7 +2668,7 @@
         "name": "rendering.mobile/jarro_doverson"
     },
     {
-        "duration": "37.0",
+        "duration": "17.0",
         "name": "rendering.mobile/jpeg_decoding_rgb_and_gpu_rasterization"
     },
     {
@@ -2672,15 +2676,15 @@
         "name": "rendering.mobile/jpeg_decoding_yuv_and_gpu_rasterization"
     },
     {
-        "duration": "39.0",
+        "duration": "29.0",
         "name": "rendering.mobile/js_full_screen_invalidation"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "rendering.mobile/js_opacity_plus_n_layers_0"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "rendering.mobile/js_opacity_plus_n_layers_75"
     },
     {
@@ -2688,11 +2692,11 @@
         "name": "rendering.mobile/js_opacity_plus_n_layers_99"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "rendering.mobile/js_paint_plus_n_layers_0"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "rendering.mobile/js_paint_plus_n_layers_75"
     },
     {
@@ -2700,15 +2704,15 @@
         "name": "rendering.mobile/js_paint_plus_n_layers_99"
     },
     {
-        "duration": "36.0",
+        "duration": "56.0",
         "name": "rendering.mobile/js_poster_circle"
     },
     {
-        "duration": "37.0",
+        "duration": "17.0",
         "name": "rendering.mobile/js_scroll_text_only"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "rendering.mobile/kevs_3d"
     },
     {
@@ -2720,23 +2724,23 @@
         "name": "rendering.mobile/large_texture_uploads"
     },
     {
-        "duration": "25.0",
+        "duration": "23.0",
         "name": "rendering.mobile/latimes_pathological_2018"
     },
     {
-        "duration": "26.0",
+        "duration": "24.0",
         "name": "rendering.mobile/linkedin_2018"
     },
     {
-        "duration": "47.0",
+        "duration": "50.0",
         "name": "rendering.mobile/linkedin_mobile_2018"
     },
     {
-        "duration": "50.0",
+        "duration": "42.0",
         "name": "rendering.mobile/linkedin_mobile_pinch_2018"
     },
     {
-        "duration": "73.0",
+        "duration": "44.0",
         "name": "rendering.mobile/linkedin_pathological_2018"
     },
     {
@@ -2744,7 +2748,7 @@
         "name": "rendering.mobile/list_animation_simple"
     },
     {
-        "duration": "67.0",
+        "duration": "25.0",
         "name": "rendering.mobile/list_recycle_transform"
     },
     {
@@ -2764,27 +2768,27 @@
         "name": "rendering.mobile/main_0fps_with_jank_impl_0fps"
     },
     {
-        "duration": "37.0",
+        "duration": "22.0",
         "name": "rendering.mobile/main_15fps_impl_0fps"
     },
     {
-        "duration": "37.0",
+        "duration": "22.0",
         "name": "rendering.mobile/main_15fps_with_jank_impl_0fps"
     },
     {
-        "duration": "32.0",
+        "duration": "22.0",
         "name": "rendering.mobile/main_30fps_impl_0fps"
     },
     {
-        "duration": "32.0",
+        "duration": "22.0",
         "name": "rendering.mobile/main_30fps_impl_60fps"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "rendering.mobile/main_60fps_impl_0fps"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "rendering.mobile/main_60fps_impl_60fps"
     },
     {
@@ -2796,11 +2800,11 @@
         "name": "rendering.mobile/main_60fps_impl_60fps_no_update_jank"
     },
     {
-        "duration": "27.0",
+        "duration": "23.0",
         "name": "rendering.mobile/main_60fps_with_jank_impl_0fps"
     },
     {
-        "duration": "38.0",
+        "duration": "23.0",
         "name": "rendering.mobile/man_in_blue"
     },
     {
@@ -2808,19 +2812,19 @@
         "name": "rendering.mobile/many_images"
     },
     {
-        "duration": "35.0",
+        "duration": "32.0",
         "name": "rendering.mobile/many_planets_deep"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "rendering.mobile/maps_perf_test"
     },
     {
-        "duration": "23.0",
+        "duration": "26.0",
         "name": "rendering.mobile/mask_transition_animation"
     },
     {
-        "duration": "43.0",
+        "duration": "21.0",
         "name": "rendering.mobile/masonry"
     },
     {
@@ -2828,67 +2832,67 @@
         "name": "rendering.mobile/medium_texture_uploads"
     },
     {
-        "duration": "53.0",
+        "duration": "43.0",
         "name": "rendering.mobile/megi_dish"
     },
     {
-        "duration": "69.0",
+        "duration": "31.0",
         "name": "rendering.mobile/microsoft_asteroid_belt"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "rendering.mobile/microsoft_fireflies"
     },
     {
-        "duration": "49.0",
+        "duration": "24.0",
         "name": "rendering.mobile/microsoft_fish_ie_tank"
     },
     {
-        "duration": "23.0",
+        "duration": "26.0",
         "name": "rendering.mobile/microsoft_performance"
     },
     {
-        "duration": "45.0",
+        "duration": "31.0",
         "name": "rendering.mobile/microsoft_snow"
     },
     {
-        "duration": "48.0",
+        "duration": "27.0",
         "name": "rendering.mobile/microsoft_speed_reading"
     },
     {
-        "duration": "65.0",
+        "duration": "34.0",
         "name": "rendering.mobile/microsoft_tweet_map"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "rendering.mobile/microsoft_video_city"
     },
     {
-        "duration": "32.0",
+        "duration": "27.0",
         "name": "rendering.mobile/microsoft_worker_fountains"
     },
     {
-        "duration": "44.0",
+        "duration": "23.0",
         "name": "rendering.mobile/mix_10k"
     },
     {
-        "duration": "27.0",
+        "duration": "31.0",
         "name": "rendering.mobile/mix_blend_mode_animation_difference"
     },
     {
-        "duration": "27.0",
+        "duration": "44.0",
         "name": "rendering.mobile/mix_blend_mode_animation_hue"
     },
     {
-        "duration": "27.0",
+        "duration": "26.0",
         "name": "rendering.mobile/mix_blend_mode_animation_propagating_isolation"
     },
     {
-        "duration": "27.0",
+        "duration": "30.0",
         "name": "rendering.mobile/mix_blend_mode_animation_screen"
     },
     {
-        "duration": "37.0",
+        "duration": "31.0",
         "name": "rendering.mobile/mlb_mobile_2018"
     },
     {
@@ -2896,111 +2900,111 @@
         "name": "rendering.mobile/mobile_news_sandbox"
     },
     {
-        "duration": "38.0",
+        "duration": "24.0",
         "name": "rendering.mobile/motion_mark_canvas_fill_shapes"
     },
     {
-        "duration": "47.0",
+        "duration": "23.0",
         "name": "rendering.mobile/motion_mark_canvas_stroke_shapes"
     },
     {
-        "duration": "55.0",
+        "duration": "50.0",
         "name": "rendering.mobile/motionmark_anim_design_15"
     },
     {
-        "duration": "25.0",
+        "duration": "21.0",
         "name": "rendering.mobile/motionmark_anim_focus_25"
     },
     {
-        "duration": "34.0",
+        "duration": "25.0",
         "name": "rendering.mobile/motionmark_anim_images_50"
     },
     {
-        "duration": "37.0",
+        "duration": "21.0",
         "name": "rendering.mobile/motionmark_anim_leaves_250"
     },
     {
-        "duration": "66.0",
+        "duration": "24.0",
         "name": "rendering.mobile/motionmark_anim_multiply_175"
     },
     {
-        "duration": "41.0",
+        "duration": "21.0",
         "name": "rendering.mobile/motionmark_anim_suits_125"
     },
     {
-        "duration": "33.0",
+        "duration": "27.0",
         "name": "rendering.mobile/motionmark_html_composited_transforms_125"
     },
     {
-        "duration": "41.0",
+        "duration": "34.0",
         "name": "rendering.mobile/motionmark_html_css_bouncing_blend_circles_25"
     },
     {
-        "duration": "62.0",
+        "duration": "24.0",
         "name": "rendering.mobile/motionmark_html_css_bouncing_circles_250"
     },
     {
-        "duration": "37.0",
+        "duration": "27.0",
         "name": "rendering.mobile/motionmark_html_css_bouncing_clipped_rects_100"
     },
     {
-        "duration": "41.0",
+        "duration": "24.0",
         "name": "rendering.mobile/motionmark_html_css_bouncing_filter_circles_15"
     },
     {
-        "duration": "37.0",
+        "duration": "30.0",
         "name": "rendering.mobile/motionmark_html_css_bouncing_gradient_circles_250"
     },
     {
-        "duration": "54.0",
+        "duration": "21.0",
         "name": "rendering.mobile/motionmark_html_css_bouncing_svg_images_50"
     },
     {
-        "duration": "50.0",
+        "duration": "27.0",
         "name": "rendering.mobile/motionmark_html_css_bouncing_tagged_images_225"
     },
     {
-        "duration": "46.0",
+        "duration": "34.0",
         "name": "rendering.mobile/motionmark_html_dom_particles_svg_masks_25"
     },
     {
-        "duration": "33.0",
+        "duration": "30.0",
         "name": "rendering.mobile/motionmark_html_focus_20_15"
     },
     {
-        "duration": "42.0",
+        "duration": "28.0",
         "name": "rendering.mobile/motionmark_html_leaves_20_50"
     },
     {
-        "duration": "37.0",
+        "duration": "24.0",
         "name": "rendering.mobile/motionmark_svg_bouncing_circles_250"
     },
     {
-        "duration": "37.0",
+        "duration": "24.0",
         "name": "rendering.mobile/motionmark_svg_bouncing_clipped_rects_100"
     },
     {
-        "duration": "54.0",
+        "duration": "24.0",
         "name": "rendering.mobile/motionmark_svg_bouncing_gradient_circles_200"
     },
     {
-        "duration": "41.0",
+        "duration": "24.0",
         "name": "rendering.mobile/motionmark_svg_bouncing_png_images_200"
     },
     {
-        "duration": "58.0",
+        "duration": "25.0",
         "name": "rendering.mobile/motionmark_svg_bouncing_svg_images_50"
     },
     {
-        "duration": "35.0",
+        "duration": "27.0",
         "name": "rendering.mobile/new_tilings"
     },
     {
-        "duration": "26.0",
+        "duration": "23.0",
         "name": "rendering.mobile/no_op_raf"
     },
     {
-        "duration": "21.0",
+        "duration": "19.0",
         "name": "rendering.mobile/no_op_scroll"
     },
     {
@@ -3012,27 +3016,27 @@
         "name": "rendering.mobile/no_op_touch_handler"
     },
     {
-        "duration": "27.0",
+        "duration": "37.0",
         "name": "rendering.mobile/nvidia_vertex_buffer_object"
     },
     {
-        "duration": "34.0",
+        "duration": "29.0",
         "name": "rendering.mobile/nyc_gov_scroll_2018"
     },
     {
-        "duration": "39.0",
+        "duration": "36.0",
         "name": "rendering.mobile/nytimes_mobile_2018"
     },
     {
-        "duration": "32.0",
+        "duration": "41.0",
         "name": "rendering.mobile/nytimes_scroll_2018"
     },
     {
-        "duration": "23.0",
+        "duration": "22.0",
         "name": "rendering.mobile/off_screen_main_60fps"
     },
     {
-        "duration": "23.0",
+        "duration": "22.0",
         "name": "rendering.mobile/off_screen_main_60fps_jank"
     },
     {
@@ -3040,55 +3044,55 @@
         "name": "rendering.mobile/overlay_background_color_css_transitions_page"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "rendering.mobile/paper_button"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "rendering.mobile/paper_calculator"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "rendering.mobile/paper_calculator_hit_test"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "rendering.mobile/paper_checkbox"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "rendering.mobile/paper_fab"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "rendering.mobile/paper_icon_button"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "rendering.mobile/paper_shadow"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "rendering.mobile/paper_tabs"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "rendering.mobile/paper_toggle_button"
     },
     {
-        "duration": "23.0",
+        "duration": "22.0",
         "name": "rendering.mobile/parallax_effect"
     },
     {
-        "duration": "35.0",
+        "duration": "36.0",
         "name": "rendering.mobile/particles"
     },
     {
-        "duration": "29.0",
+        "duration": "22.0",
         "name": "rendering.mobile/pbs_pathological_2018"
     },
     {
-        "duration": "40.0",
+        "duration": "19.0",
         "name": "rendering.mobile/physical_simulation"
     },
     {
@@ -3100,19 +3104,19 @@
         "name": "rendering.mobile/pinterest_mobile_2018"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "rendering.mobile/polymer_topeka"
     },
     {
-        "duration": "25.0",
+        "duration": "23.0",
         "name": "rendering.mobile/put_get_image_data"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "rendering.mobile/raf"
     },
     {
-        "duration": "19.0",
+        "duration": "24.0",
         "name": "rendering.mobile/raf_animation"
     },
     {
@@ -3120,7 +3124,7 @@
         "name": "rendering.mobile/raf_canvas"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "rendering.mobile/raf_touch_animation"
     },
     {
@@ -3128,39 +3132,39 @@
         "name": "rendering.mobile/recode_pathological_2018"
     },
     {
-        "duration": "25.0",
+        "duration": "29.0",
         "name": "rendering.mobile/reddit_mobile_2018"
     },
     {
-        "duration": "46.0",
+        "duration": "38.0",
         "name": "rendering.mobile/runway_2019"
     },
     {
-        "duration": "59.0",
+        "duration": "42.0",
         "name": "rendering.mobile/san_angeles"
     },
     {
-        "duration": "14.0",
+        "duration": "21.0",
         "name": "rendering.mobile/second_batch_js_heavy"
     },
     {
-        "duration": "14.0",
+        "duration": "17.0",
         "name": "rendering.mobile/second_batch_js_light"
     },
     {
-        "duration": "14.0",
+        "duration": "13.0",
         "name": "rendering.mobile/second_batch_js_medium"
     },
     {
-        "duration": "29.0",
+        "duration": "27.0",
         "name": "rendering.mobile/sfgate_mobile_2018"
     },
     {
-        "duration": "29.0",
+        "duration": "25.0",
         "name": "rendering.mobile/silk_finance"
     },
     {
-        "duration": "23.0",
+        "duration": "19.0",
         "name": "rendering.mobile/simple_text_page"
     },
     {
@@ -3168,11 +3172,11 @@
         "name": "rendering.mobile/simple_touch_drag"
     },
     {
-        "duration": "35.0",
+        "duration": "29.0",
         "name": "rendering.mobile/slashdot_mobile_2018"
     },
     {
-        "duration": "18.0",
+        "duration": "17.0",
         "name": "rendering.mobile/slide_drawer"
     },
     {
@@ -3184,19 +3188,19 @@
         "name": "rendering.mobile/smash_cat"
     },
     {
-        "duration": "29.0",
+        "duration": "46.0",
         "name": "rendering.mobile/spielzeugz"
     },
     {
-        "duration": "25.0",
+        "duration": "17.0",
         "name": "rendering.mobile/sticky_using_webkit"
     },
     {
-        "duration": "24.0",
+        "duration": "23.0",
         "name": "rendering.mobile/stress_hidey_bars"
     },
     {
-        "duration": "23.0",
+        "duration": "22.0",
         "name": "rendering.mobile/stroke_shapes"
     },
     {
@@ -3204,35 +3208,35 @@
         "name": "rendering.mobile/svg_icon_raster"
     },
     {
-        "duration": "28.0",
+        "duration": "14.0",
         "name": "rendering.mobile/swipe_action"
     },
     {
-        "duration": "18.0",
+        "duration": "21.0",
         "name": "rendering.mobile/swipe_to_dismiss"
     },
     {
-        "duration": "18.0",
+        "duration": "17.0",
         "name": "rendering.mobile/sync_scroll_offset"
     },
     {
-        "duration": "24.0",
+        "duration": "62.0",
         "name": "rendering.mobile/techcrunch_2018"
     },
     {
-        "duration": "41.0",
+        "duration": "31.0",
         "name": "rendering.mobile/techcrunch_mobile_2018"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "rendering.mobile/text_05000_pixels_per_second"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "rendering.mobile/text_10000_pixels_per_second"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.mobile/text_20000_pixels_per_second"
     },
     {
@@ -3244,7 +3248,7 @@
         "name": "rendering.mobile/text_60000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "rendering.mobile/text_75000_pixels_per_second"
     },
     {
@@ -3252,7 +3256,7 @@
         "name": "rendering.mobile/text_90000_pixels_per_second"
     },
     {
-        "duration": "26.0",
+        "duration": "36.0",
         "name": "rendering.mobile/text_constant_full_page_raster_05000_pixels_per_second"
     },
     {
@@ -3260,23 +3264,23 @@
         "name": "rendering.mobile/text_constant_full_page_raster_10000_pixels_per_second"
     },
     {
-        "duration": "21.0",
+        "duration": "18.0",
         "name": "rendering.mobile/text_constant_full_page_raster_20000_pixels_per_second"
     },
     {
-        "duration": "16.0",
+        "duration": "20.0",
         "name": "rendering.mobile/text_constant_full_page_raster_40000_pixels_per_second"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "rendering.mobile/text_constant_full_page_raster_60000_pixels_per_second"
     },
     {
-        "duration": "19.0",
+        "duration": "15.0",
         "name": "rendering.mobile/text_constant_full_page_raster_75000_pixels_per_second"
     },
     {
-        "duration": "22.0",
+        "duration": "25.0",
         "name": "rendering.mobile/text_constant_full_page_raster_90000_pixels_per_second"
     },
     {
@@ -3284,7 +3288,7 @@
         "name": "rendering.mobile/text_hover_05000_pixels_per_second"
     },
     {
-        "duration": "23.0",
+        "duration": "20.0",
         "name": "rendering.mobile/text_hover_10000_pixels_per_second"
     },
     {
@@ -3292,11 +3296,11 @@
         "name": "rendering.mobile/text_hover_20000_pixels_per_second"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "rendering.mobile/text_hover_40000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "rendering.mobile/text_hover_60000_pixels_per_second"
     },
     {
@@ -3308,11 +3312,11 @@
         "name": "rendering.mobile/text_hover_90000_pixels_per_second"
     },
     {
-        "duration": "37.0",
+        "duration": "46.0",
         "name": "rendering.mobile/theverge_article_mobile_2018"
     },
     {
-        "duration": "29.0",
+        "duration": "30.0",
         "name": "rendering.mobile/theverge_mobile_2018"
     },
     {
@@ -3320,11 +3324,11 @@
         "name": "rendering.mobile/toggle_drawer"
     },
     {
-        "duration": "21.0",
+        "duration": "19.0",
         "name": "rendering.mobile/touch_handler_scrolling"
     },
     {
-        "duration": "33.0",
+        "duration": "22.0",
         "name": "rendering.mobile/transform_transitions"
     },
     {
@@ -3332,27 +3336,27 @@
         "name": "rendering.mobile/transform_transitions_js_block"
     },
     {
-        "duration": "26.0",
+        "duration": "32.0",
         "name": "rendering.mobile/twitch_2018"
     },
     {
-        "duration": "41.0",
+        "duration": "39.0",
         "name": "rendering.mobile/twitch_mobile_pinch_2018"
     },
     {
-        "duration": "30.0",
+        "duration": "43.0",
         "name": "rendering.mobile/twitter_2018"
     },
     {
-        "duration": "22.0",
+        "duration": "39.0",
         "name": "rendering.mobile/twitter_mobile_2018"
     },
     {
-        "duration": "19.0",
+        "duration": "34.0",
         "name": "rendering.mobile/update_history_state"
     },
     {
-        "duration": "16.0",
+        "duration": "24.0",
         "name": "rendering.mobile/usatoday_mobile_2018"
     },
     {
@@ -3360,31 +3364,31 @@
         "name": "rendering.mobile/vertical_expansion"
     },
     {
-        "duration": "28.0",
+        "duration": "22.0",
         "name": "rendering.mobile/web_animation_value_type_color"
     },
     {
-        "duration": "39.0",
+        "duration": "55.0",
         "name": "rendering.mobile/web_animation_value_type_length_3d"
     },
     {
-        "duration": "33.0",
+        "duration": "44.0",
         "name": "rendering.mobile/web_animation_value_type_length_complex"
     },
     {
-        "duration": "50.0",
+        "duration": "44.0",
         "name": "rendering.mobile/web_animation_value_type_length_simple"
     },
     {
-        "duration": "57.0",
+        "duration": "41.0",
         "name": "rendering.mobile/web_animation_value_type_path"
     },
     {
-        "duration": "43.0",
+        "duration": "62.0",
         "name": "rendering.mobile/web_animation_value_type_shadow"
     },
     {
-        "duration": "44.0",
+        "duration": "33.0",
         "name": "rendering.mobile/web_animation_value_type_transform_complex"
     },
     {
@@ -3396,47 +3400,47 @@
         "name": "rendering.mobile/web_animations_many_keyframes"
     },
     {
-        "duration": "39.0",
+        "duration": "37.0",
         "name": "rendering.mobile/web_animations_set_current_time"
     },
     {
-        "duration": "28.0",
+        "duration": "30.0",
         "name": "rendering.mobile/web_animations_simultaneous"
     },
     {
-        "duration": "29.0",
+        "duration": "27.0",
         "name": "rendering.mobile/web_animations_staggered_chaining"
     },
     {
-        "duration": "33.0",
+        "duration": "22.0",
         "name": "rendering.mobile/web_animations_staggered_infinite_iterations"
     },
     {
-        "duration": "35.0",
+        "duration": "25.0",
         "name": "rendering.mobile/web_animations_staggered_triggering_page"
     },
     {
-        "duration": "44.0",
+        "duration": "17.0",
         "name": "rendering.mobile/webp_decoding_rgb_and_gpu_rasterization"
     },
     {
-        "duration": "22.0",
+        "duration": "17.0",
         "name": "rendering.mobile/webp_decoding_yuv_and_gpu_rasterization"
     },
     {
-        "duration": "47.0",
+        "duration": "28.0",
         "name": "rendering.mobile/wikipedia_2018"
     },
     {
-        "duration": "34.0",
+        "duration": "33.0",
         "name": "rendering.mobile/wikipedia_delayed_scroll_start_2018"
     },
     {
-        "duration": "33.0",
+        "duration": "26.0",
         "name": "rendering.mobile/wikipedia_mobile_2018"
     },
     {
-        "duration": "40.0",
+        "duration": "23.0",
         "name": "rendering.mobile/wordpress_2018"
     },
     {
@@ -3444,55 +3448,55 @@
         "name": "rendering.mobile/wordpress_mobile_2018"
     },
     {
-        "duration": "33.0",
+        "duration": "26.0",
         "name": "rendering.mobile/worldjournal_mobile_2018"
     },
     {
-        "duration": "32.0",
+        "duration": "26.0",
         "name": "rendering.mobile/wow_wiki_pathological_2018"
     },
     {
-        "duration": "48.0",
+        "duration": "39.0",
         "name": "rendering.mobile/wowwiki_mobile_2018"
     },
     {
-        "duration": "36.0",
+        "duration": "28.0",
         "name": "rendering.mobile/wsj_mobile_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "15.0",
         "name": "rendering.mobile/yahoo_answers_2018"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "rendering.mobile/yahoo_answers_mobile_2018"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "rendering.mobile/yahoo_news_2018"
     },
     {
-        "duration": "34.0",
+        "duration": "41.0",
         "name": "rendering.mobile/yahoo_news_mobile_2018"
     },
     {
-        "duration": "24.0",
+        "duration": "23.0",
         "name": "rendering.mobile/yahoo_sports_2018"
     },
     {
-        "duration": "42.0",
+        "duration": "23.0",
         "name": "rendering.mobile/yahoo_sports_pathological_2018"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "rendering.mobile/youtube_2018"
     },
     {
-        "duration": "37.0",
+        "duration": "22.0",
         "name": "rendering.mobile/youtube_mobile_2018"
     },
     {
-        "duration": "20.0",
+        "duration": "24.0",
         "name": "rendering.mobile/zdnet_pathological_2018"
     },
     {
@@ -3500,7 +3504,7 @@
         "name": "rendering.mobile/zoom_in_animation"
     },
     {
-        "duration": "64.0",
+        "duration": "65.0",
         "name": "speedometer-future/http://browserbench.org/Speedometer/"
     },
     {
@@ -3508,31 +3512,31 @@
         "name": "speedometer/http://browserbench.org/Speedometer/"
     },
     {
-        "duration": "103.0",
+        "duration": "97.0",
         "name": "speedometer2-future/Speedometer2"
     },
     {
-        "duration": "126.0",
+        "duration": "98.0",
         "name": "speedometer2/Speedometer2"
     },
     {
-        "duration": "63.0",
+        "duration": "46.0",
         "name": "system_health.common_mobile/background:media:imgur:2019"
     },
     {
-        "duration": "90.0",
+        "duration": "72.0",
         "name": "system_health.common_mobile/background:news:nytimes:2019"
     },
     {
-        "duration": "27.0",
+        "duration": "29.0",
         "name": "system_health.common_mobile/background:search:google:2019"
     },
     {
-        "duration": "40.0",
+        "duration": "33.0",
         "name": "system_health.common_mobile/background:social:facebook:2019"
     },
     {
-        "duration": "35.0",
+        "duration": "41.0",
         "name": "system_health.common_mobile/background:tools:gmail:2019"
     },
     {
@@ -3540,59 +3544,59 @@
         "name": "system_health.common_mobile/browse:chrome:newtab:2019"
     },
     {
-        "duration": "9.0",
+        "duration": "10.0",
         "name": "system_health.common_mobile/browse:chrome:omnibox:2019"
     },
     {
-        "duration": "103.0",
+        "duration": "75.0",
         "name": "system_health.common_mobile/browse:media:facebook_photos:2019"
     },
     {
-        "duration": "49.0",
+        "duration": "51.0",
         "name": "system_health.common_mobile/browse:media:flickr_infinite_scroll:2019"
     },
     {
-        "duration": "46.0",
+        "duration": "44.0",
         "name": "system_health.common_mobile/browse:media:googleplaystore:2019"
     },
     {
-        "duration": "95.0",
+        "duration": "78.0",
         "name": "system_health.common_mobile/browse:media:imgur:2019"
     },
     {
-        "duration": "56.0",
+        "duration": "57.0",
         "name": "system_health.common_mobile/browse:media:youtube:2019"
     },
     {
-        "duration": "75.0",
+        "duration": "72.0",
         "name": "system_health.common_mobile/browse:news:cnn:2018"
     },
     {
-        "duration": "57.0",
+        "duration": "54.0",
         "name": "system_health.common_mobile/browse:news:cricbuzz:2019"
     },
     {
-        "duration": "62.0",
+        "duration": "66.0",
         "name": "system_health.common_mobile/browse:news:globo:2019"
     },
     {
-        "duration": "115.0",
+        "duration": "112.0",
         "name": "system_health.common_mobile/browse:news:nytimes:2019"
     },
     {
-        "duration": "42.0",
+        "duration": "40.0",
         "name": "system_health.common_mobile/browse:news:qq:2019"
     },
     {
-        "duration": "61.0",
+        "duration": "59.0",
         "name": "system_health.common_mobile/browse:news:reddit:2019"
     },
     {
-        "duration": "104.0",
+        "duration": "84.0",
         "name": "system_health.common_mobile/browse:news:toi:2019"
     },
     {
-        "duration": "67.0",
+        "duration": "68.0",
         "name": "system_health.common_mobile/browse:news:washingtonpost:2019"
     },
     {
@@ -3604,15 +3608,15 @@
         "name": "system_health.common_mobile/browse:search:amp:sxg:2019"
     },
     {
-        "duration": "75.0",
+        "duration": "72.0",
         "name": "system_health.common_mobile/browse:shopping:amazon:2019"
     },
     {
-        "duration": "56.0",
+        "duration": "55.0",
         "name": "system_health.common_mobile/browse:shopping:avito:2019"
     },
     {
-        "duration": "84.0",
+        "duration": "72.0",
         "name": "system_health.common_mobile/browse:shopping:flipkart:2019"
     },
     {
@@ -3620,11 +3624,11 @@
         "name": "system_health.common_mobile/browse:shopping:lazada:2019"
     },
     {
-        "duration": "64.0",
+        "duration": "62.0",
         "name": "system_health.common_mobile/browse:social:facebook:2019"
     },
     {
-        "duration": "79.0",
+        "duration": "77.0",
         "name": "system_health.common_mobile/browse:social:facebook_infinite_scroll:2018"
     },
     {
@@ -3632,23 +3636,23 @@
         "name": "system_health.common_mobile/browse:social:instagram:2019"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "system_health.common_mobile/browse:social:pinterest_infinite_scroll:2019"
     },
     {
-        "duration": "69.0",
+        "duration": "68.0",
         "name": "system_health.common_mobile/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "75.0",
+        "duration": "71.0",
         "name": "system_health.common_mobile/browse:social:twitter:2019"
     },
     {
-        "duration": "73.0",
+        "duration": "86.0",
         "name": "system_health.common_mobile/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "73.0",
+        "duration": "43.0",
         "name": "system_health.common_mobile/browse:tools:maps:2019"
     },
     {
@@ -3656,15 +3660,15 @@
         "name": "system_health.common_mobile/load:chrome:blank"
     },
     {
-        "duration": "22.0",
+        "duration": "21.0",
         "name": "system_health.common_mobile/load:games:bubbles:2019"
     },
     {
-        "duration": "24.0",
+        "duration": "23.0",
         "name": "system_health.common_mobile/load:games:lazors"
     },
     {
-        "duration": "3.0",
+        "duration": "28.0",
         "name": "system_health.common_mobile/load:games:spychase:2018"
     },
     {
@@ -3672,11 +3676,11 @@
         "name": "system_health.common_mobile/load:media:dailymotion:2019"
     },
     {
-        "duration": "31.0",
+        "duration": "22.0",
         "name": "system_health.common_mobile/load:media:facebook_photos:2019"
     },
     {
-        "duration": "26.0",
+        "duration": "25.0",
         "name": "system_health.common_mobile/load:media:flickr:2018"
     },
     {
@@ -3684,11 +3688,11 @@
         "name": "system_health.common_mobile/load:media:google_images:2018"
     },
     {
-        "duration": "50.0",
+        "duration": "26.0",
         "name": "system_health.common_mobile/load:media:imgur:2018"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "system_health.common_mobile/load:media:soundcloud:2018"
     },
     {
@@ -3696,23 +3700,23 @@
         "name": "system_health.common_mobile/load:media:youtube:2018"
     },
     {
-        "duration": "23.0",
+        "duration": "24.0",
         "name": "system_health.common_mobile/load:news:bbc:2019"
     },
     {
-        "duration": "40.0",
+        "duration": "29.0",
         "name": "system_health.common_mobile/load:news:cnn:2018"
     },
     {
-        "duration": "48.0",
+        "duration": "25.0",
         "name": "system_health.common_mobile/load:news:irctc:2019"
     },
     {
-        "duration": "67.0",
+        "duration": "32.0",
         "name": "system_health.common_mobile/load:news:nytimes:2019"
     },
     {
-        "duration": "52.0",
+        "duration": "23.0",
         "name": "system_health.common_mobile/load:news:qq:2019"
     },
     {
@@ -3720,7 +3724,7 @@
         "name": "system_health.common_mobile/load:news:reddit:2019"
     },
     {
-        "duration": "34.0",
+        "duration": "23.0",
         "name": "system_health.common_mobile/load:news:washingtonpost:2019"
     },
     {
@@ -3728,23 +3732,23 @@
         "name": "system_health.common_mobile/load:news:wikipedia:2018"
     },
     {
-        "duration": "25.0",
+        "duration": "24.0",
         "name": "system_health.common_mobile/load:search:amazon:2019"
     },
     {
-        "duration": "25.0",
+        "duration": "24.0",
         "name": "system_health.common_mobile/load:search:baidu:2018"
     },
     {
-        "duration": "65.0",
+        "duration": "22.0",
         "name": "system_health.common_mobile/load:search:ebay:2018"
     },
     {
-        "duration": "37.0",
+        "duration": "22.0",
         "name": "system_health.common_mobile/load:search:google:2018"
     },
     {
-        "duration": "25.0",
+        "duration": "22.0",
         "name": "system_health.common_mobile/load:search:taobao:2019"
     },
     {
@@ -3756,7 +3760,7 @@
         "name": "system_health.common_mobile/load:search:yandex:2018"
     },
     {
-        "duration": "23.0",
+        "duration": "22.0",
         "name": "system_health.common_mobile/load:social:instagram:2019"
     },
     {
@@ -3764,27 +3768,27 @@
         "name": "system_health.common_mobile/load:social:pinterest:2019"
     },
     {
-        "duration": "26.0",
+        "duration": "22.0",
         "name": "system_health.common_mobile/load:social:twitter:2019"
     },
     {
-        "duration": "27.0",
+        "duration": "21.0",
         "name": "system_health.common_mobile/load:tools:docs:2019"
     },
     {
-        "duration": "37.0",
+        "duration": "22.0",
         "name": "system_health.common_mobile/load:tools:drive:2019"
     },
     {
-        "duration": "50.0",
+        "duration": "39.0",
         "name": "system_health.common_mobile/load:tools:dropbox:2019"
     },
     {
-        "duration": "47.0",
+        "duration": "32.0",
         "name": "system_health.common_mobile/load:tools:gmail:2019"
     },
     {
-        "duration": "30.0",
+        "duration": "23.0",
         "name": "system_health.common_mobile/load:tools:stackoverflow:2018"
     },
     {
@@ -3792,31 +3796,31 @@
         "name": "system_health.common_mobile/load:tools:weather:2019"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "system_health.common_mobile/long_running:tools:gmail-background"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "system_health.common_mobile/long_running:tools:gmail-foreground"
     },
     {
-        "duration": "54.0",
+        "duration": "34.0",
         "name": "system_health.memory_mobile/background:media:imgur:2019"
     },
     {
-        "duration": "69.0",
+        "duration": "71.0",
         "name": "system_health.memory_mobile/background:news:nytimes:2019"
     },
     {
-        "duration": "30.0",
+        "duration": "32.0",
         "name": "system_health.memory_mobile/background:search:google:2019"
     },
     {
-        "duration": "33.0",
+        "duration": "31.0",
         "name": "system_health.memory_mobile/background:social:facebook:2019"
     },
     {
-        "duration": "40.0",
+        "duration": "39.0",
         "name": "system_health.memory_mobile/background:tools:gmail:2019"
     },
     {
@@ -3824,11 +3828,11 @@
         "name": "system_health.memory_mobile/browse:chrome:newtab:2019"
     },
     {
-        "duration": "11.0",
+        "duration": "18.0",
         "name": "system_health.memory_mobile/browse:chrome:omnibox:2019"
     },
     {
-        "duration": "77.0",
+        "duration": "79.0",
         "name": "system_health.memory_mobile/browse:media:facebook_photos:2019"
     },
     {
@@ -3836,51 +3840,51 @@
         "name": "system_health.memory_mobile/browse:media:flickr_infinite_scroll:2019"
     },
     {
-        "duration": "47.0",
+        "duration": "48.0",
         "name": "system_health.memory_mobile/browse:media:googleplaystore:2019"
     },
     {
-        "duration": "76.0",
+        "duration": "86.0",
         "name": "system_health.memory_mobile/browse:media:imgur:2019"
     },
     {
-        "duration": "59.0",
+        "duration": "111.0",
         "name": "system_health.memory_mobile/browse:media:youtube:2019"
     },
     {
-        "duration": "79.0",
+        "duration": "78.0",
         "name": "system_health.memory_mobile/browse:news:cnn:2018"
     },
     {
-        "duration": "57.0",
+        "duration": "54.0",
         "name": "system_health.memory_mobile/browse:news:cricbuzz:2019"
     },
     {
-        "duration": "65.0",
+        "duration": "63.0",
         "name": "system_health.memory_mobile/browse:news:globo:2019"
     },
     {
-        "duration": "132.0",
+        "duration": "134.0",
         "name": "system_health.memory_mobile/browse:news:nytimes:2019"
     },
     {
-        "duration": "43.0",
+        "duration": "58.0",
         "name": "system_health.memory_mobile/browse:news:qq:2019"
     },
     {
-        "duration": "63.0",
+        "duration": "80.0",
         "name": "system_health.memory_mobile/browse:news:reddit:2019"
     },
     {
-        "duration": "79.0",
+        "duration": "78.0",
         "name": "system_health.memory_mobile/browse:news:toi:2019"
     },
     {
-        "duration": "71.0",
+        "duration": "98.0",
         "name": "system_health.memory_mobile/browse:news:washingtonpost:2019"
     },
     {
-        "duration": "30.0",
+        "duration": "37.0",
         "name": "system_health.memory_mobile/browse:search:amp:2018"
     },
     {
@@ -3900,7 +3904,7 @@
         "name": "system_health.memory_mobile/browse:shopping:flipkart:2019"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "system_health.memory_mobile/browse:shopping:lazada:2019"
     },
     {
@@ -3908,71 +3912,71 @@
         "name": "system_health.memory_mobile/browse:social:facebook:2019"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "system_health.memory_mobile/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "88.0",
+        "duration": "105.0",
         "name": "system_health.memory_mobile/browse:social:instagram:2019"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "system_health.memory_mobile/browse:social:pinterest_infinite_scroll:2019"
     },
     {
-        "duration": "70.0",
+        "duration": "71.0",
         "name": "system_health.memory_mobile/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "75.0",
+        "duration": "87.0",
         "name": "system_health.memory_mobile/browse:social:twitter:2019"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "system_health.memory_mobile/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "49.0",
+        "duration": "47.0",
         "name": "system_health.memory_mobile/browse:tools:maps:2019"
     },
     {
-        "duration": "28.0",
+        "duration": "26.0",
         "name": "system_health.memory_mobile/load:chrome:blank"
     },
     {
-        "duration": "33.0",
+        "duration": "24.0",
         "name": "system_health.memory_mobile/load:games:bubbles:2019"
     },
     {
-        "duration": "25.0",
+        "duration": "28.0",
         "name": "system_health.memory_mobile/load:games:lazors"
     },
     {
-        "duration": "2.0",
+        "duration": "35.0",
         "name": "system_health.memory_mobile/load:games:spychase:2018"
     },
     {
-        "duration": "32.0",
+        "duration": "33.0",
         "name": "system_health.memory_mobile/load:media:dailymotion:2019"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "system_health.memory_mobile/load:media:facebook_photos:2019"
     },
     {
-        "duration": "28.0",
+        "duration": "32.0",
         "name": "system_health.memory_mobile/load:media:flickr:2018"
     },
     {
-        "duration": "51.0",
+        "duration": "31.0",
         "name": "system_health.memory_mobile/load:media:google_images:2018"
     },
     {
-        "duration": "29.0",
+        "duration": "33.0",
         "name": "system_health.memory_mobile/load:media:imgur:2018"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "system_health.memory_mobile/load:media:soundcloud:2018"
     },
     {
@@ -3980,51 +3984,51 @@
         "name": "system_health.memory_mobile/load:media:youtube:2018"
     },
     {
-        "duration": "31.0",
+        "duration": "44.0",
         "name": "system_health.memory_mobile/load:news:bbc:2019"
     },
     {
-        "duration": "37.0",
+        "duration": "42.0",
         "name": "system_health.memory_mobile/load:news:cnn:2018"
     },
     {
-        "duration": "38.0",
+        "duration": "32.0",
         "name": "system_health.memory_mobile/load:news:irctc:2019"
     },
     {
-        "duration": "37.0",
+        "duration": "40.0",
         "name": "system_health.memory_mobile/load:news:nytimes:2019"
     },
     {
-        "duration": "26.0",
+        "duration": "29.0",
         "name": "system_health.memory_mobile/load:news:qq:2019"
     },
     {
-        "duration": "31.0",
+        "duration": "32.0",
         "name": "system_health.memory_mobile/load:news:reddit:2019"
     },
     {
-        "duration": "27.0",
+        "duration": "28.0",
         "name": "system_health.memory_mobile/load:news:washingtonpost:2019"
     },
     {
-        "duration": "28.0",
+        "duration": "27.0",
         "name": "system_health.memory_mobile/load:news:wikipedia:2018"
     },
     {
-        "duration": "29.0",
+        "duration": "36.0",
         "name": "system_health.memory_mobile/load:search:amazon:2019"
     },
     {
-        "duration": "28.0",
+        "duration": "43.0",
         "name": "system_health.memory_mobile/load:search:baidu:2018"
     },
     {
-        "duration": "29.0",
+        "duration": "75.0",
         "name": "system_health.memory_mobile/load:search:ebay:2018"
     },
     {
-        "duration": "26.0",
+        "duration": "27.0",
         "name": "system_health.memory_mobile/load:search:google:2018"
     },
     {
@@ -4036,15 +4040,15 @@
         "name": "system_health.memory_mobile/load:search:yahoo:2018"
     },
     {
-        "duration": "26.0",
+        "duration": "27.0",
         "name": "system_health.memory_mobile/load:search:yandex:2018"
     },
     {
-        "duration": "26.0",
+        "duration": "28.0",
         "name": "system_health.memory_mobile/load:social:instagram:2019"
     },
     {
-        "duration": "28.0",
+        "duration": "29.0",
         "name": "system_health.memory_mobile/load:social:pinterest:2019"
     },
     {
@@ -4052,47 +4056,47 @@
         "name": "system_health.memory_mobile/load:social:twitter:2019"
     },
     {
-        "duration": "24.0",
+        "duration": "41.0",
         "name": "system_health.memory_mobile/load:tools:docs:2019"
     },
     {
-        "duration": "26.0",
+        "duration": "33.0",
         "name": "system_health.memory_mobile/load:tools:drive:2019"
     },
     {
-        "duration": "44.0",
+        "duration": "48.0",
         "name": "system_health.memory_mobile/load:tools:dropbox:2019"
     },
     {
-        "duration": "35.0",
+        "duration": "39.0",
         "name": "system_health.memory_mobile/load:tools:gmail:2019"
     },
     {
-        "duration": "32.0",
+        "duration": "28.0",
         "name": "system_health.memory_mobile/load:tools:stackoverflow:2018"
     },
     {
-        "duration": "26.0",
+        "duration": "27.0",
         "name": "system_health.memory_mobile/load:tools:weather:2019"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "system_health.memory_mobile/long_running:tools:gmail-background"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "system_health.memory_mobile/long_running:tools:gmail-foreground"
     },
     {
-        "duration": "23.0",
+        "duration": "24.0",
         "name": "system_health.webview_startup/load:chrome:blank"
     },
     {
-        "duration": "13.0",
+        "duration": "12.0",
         "name": "tracing.tracing_with_background_memory_infra/Facebook"
     },
     {
-        "duration": "13.0",
+        "duration": "12.0",
         "name": "tracing.tracing_with_background_memory_infra/Wikipedia"
     },
     {
@@ -4104,11 +4108,11 @@
         "name": "tracing.tracing_with_background_memory_infra/http://www.ask.com/"
     },
     {
-        "duration": "11.0",
+        "duration": "15.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.bing.com/"
     },
     {
-        "duration": "11.0",
+        "duration": "10.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.yahoo.com/"
     },
     {
@@ -4124,83 +4128,83 @@
         "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/calendar/"
     },
     {
-        "duration": "13.0",
+        "duration": "89.0",
         "name": "v8.browsing_mobile/browse:chrome:newtab:2019"
     },
     {
-        "duration": "18.0",
+        "duration": "26.0",
         "name": "v8.browsing_mobile/browse:chrome:omnibox:2019"
     },
     {
-        "duration": "91.0",
+        "duration": "156.0",
         "name": "v8.browsing_mobile/browse:media:facebook_photos:2019"
     },
     {
-        "duration": "62.0",
+        "duration": "58.0",
         "name": "v8.browsing_mobile/browse:media:flickr_infinite_scroll:2019"
     },
     {
-        "duration": "50.0",
+        "duration": "87.0",
         "name": "v8.browsing_mobile/browse:media:googleplaystore:2019"
     },
     {
-        "duration": "113.0",
+        "duration": "145.0",
         "name": "v8.browsing_mobile/browse:media:imgur:2019"
     },
     {
-        "duration": "65.0",
+        "duration": "69.0",
         "name": "v8.browsing_mobile/browse:media:youtube:2019"
     },
     {
-        "duration": "86.0",
+        "duration": "117.0",
         "name": "v8.browsing_mobile/browse:news:cnn:2018"
     },
     {
-        "duration": "95.0",
+        "duration": "91.0",
         "name": "v8.browsing_mobile/browse:news:cricbuzz:2019"
     },
     {
-        "duration": "93.0",
+        "duration": "68.0",
         "name": "v8.browsing_mobile/browse:news:globo:2019"
     },
     {
-        "duration": "171.0",
+        "duration": "154.0",
         "name": "v8.browsing_mobile/browse:news:nytimes:2019"
     },
     {
-        "duration": "46.0",
+        "duration": "47.0",
         "name": "v8.browsing_mobile/browse:news:qq:2019"
     },
     {
-        "duration": "71.0",
+        "duration": "92.0",
         "name": "v8.browsing_mobile/browse:news:reddit:2019"
     },
     {
-        "duration": "124.0",
+        "duration": "131.0",
         "name": "v8.browsing_mobile/browse:news:toi:2019"
     },
     {
-        "duration": "83.0",
+        "duration": "106.0",
         "name": "v8.browsing_mobile/browse:news:washingtonpost:2019"
     },
     {
-        "duration": "32.0",
+        "duration": "31.0",
         "name": "v8.browsing_mobile/browse:search:amp:2018"
     },
     {
-        "duration": "88.0",
+        "duration": "35.0",
         "name": "v8.browsing_mobile/browse:search:amp:sxg:2019"
     },
     {
-        "duration": "76.0",
+        "duration": "79.0",
         "name": "v8.browsing_mobile/browse:shopping:amazon:2019"
     },
     {
-        "duration": "64.0",
+        "duration": "74.0",
         "name": "v8.browsing_mobile/browse:shopping:avito:2019"
     },
     {
-        "duration": "90.0",
+        "duration": "98.0",
         "name": "v8.browsing_mobile/browse:shopping:flipkart:2019"
     },
     {
@@ -4208,19 +4212,19 @@
         "name": "v8.browsing_mobile/browse:shopping:lazada:2019"
     },
     {
-        "duration": "105.0",
+        "duration": "107.0",
         "name": "v8.browsing_mobile/browse:social:facebook:2019"
     },
     {
-        "duration": "89.0",
+        "duration": "87.0",
         "name": "v8.browsing_mobile/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "v8.browsing_mobile/browse:social:instagram:2019"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "v8.browsing_mobile/browse:social:pinterest_infinite_scroll:2019"
     },
     {
@@ -4228,35 +4232,35 @@
         "name": "v8.browsing_mobile/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "80.0",
+        "duration": "107.0",
         "name": "v8.browsing_mobile/browse:social:twitter:2019"
     },
     {
-        "duration": "114.0",
+        "duration": "117.0",
         "name": "v8.browsing_mobile/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "49.0",
+        "duration": "105.0",
         "name": "v8.browsing_mobile/browse:tools:maps:2019"
     },
     {
-        "duration": "24.0",
+        "duration": "20.0",
         "name": "webrtc/10s_datachannel_transfer"
     },
     {
-        "duration": "21.0",
+        "duration": "20.0",
         "name": "webrtc/canvas_capture_peer_connection"
     },
     {
-        "duration": "31.0",
+        "duration": "30.0",
         "name": "webrtc/codec_constraints_h264"
     },
     {
-        "duration": "31.0",
+        "duration": "30.0",
         "name": "webrtc/codec_constraints_vp8"
     },
     {
-        "duration": "31.0",
+        "duration": "30.0",
         "name": "webrtc/codec_constraints_vp9"
     },
     {
@@ -4264,11 +4268,11 @@
         "name": "webrtc/hd_local_stream_10s"
     },
     {
-        "duration": "35.0",
+        "duration": "31.0",
         "name": "webrtc/multiple_peerconnections"
     },
     {
-        "duration": "34.0",
+        "duration": "32.0",
         "name": "webrtc/pause_play_peerconnections"
     }
 ]
\ No newline at end of file
diff --git a/tools/perf/core/shard_maps/timing_data/linux-perf_timing.json b/tools/perf/core/shard_maps/timing_data/linux-perf_timing.json
index 2fdf6f7..b1bdb85 100644
--- a/tools/perf/core/shard_maps/timing_data/linux-perf_timing.json
+++ b/tools/perf/core/shard_maps/timing_data/linux-perf_timing.json
@@ -1,286 +1,286 @@
 [
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "blink_perf.accessibility/line-breaks.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.accessibility/textarea-append.html"
     },
     {
-        "duration": "10.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/append-child.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/create-element.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/document-implementation.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/dom-attribute-on-prototoype.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/first-child.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.bindings/gc-forest.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.bindings/gc-mini-tree.html"
     },
     {
-        "duration": "6.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/gc-tree.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/get-attribute-rare.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/get-attribute.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/get-element-by-id.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/get-elements-by-tag-name.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/id-getter.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/id-setter.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/indexed-getter.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/insert-before.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/named-property-enumerator.html"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "blink_perf.bindings/node-list-access.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/node-type.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.bindings/post-message.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/sequence-conversion-array.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/sequence-conversion-custom-iterator.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.bindings/serialize-array.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.bindings/serialize-long-string.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.bindings/serialize-map.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.bindings/serialize-nested-array.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/set-attribute-rare.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/set-attribute.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.bindings/structured-clone-json-deserialize.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.bindings/structured-clone-json-serialize.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.bindings/structured-clone-long-string-deserialize.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.bindings/structured-clone-long-string-serialize.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/typed-array-construct-from-array.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/typed-array-construct-from-same-type.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/typed-array-construct-from-typed.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/typed-array-set-from-typed.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/undefined-first-child.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/undefined-get-element-by-id.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/undefined-id-getter.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.bindings/worker-structured-clone-different-payloads.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.bindings/worker-structured-clone-json-from-worker.html"
     },
     {
-        "duration": "10.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/worker-structured-clone-json-roundtrip.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.bindings/worker-structured-clone-json-to-worker.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.bindings/worker-structured-clone-workerDOM-DBMon-from-worker.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.bindings/worker-structured-clone-workerDOM-Map-from-worker.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.bindings/worker-text-encoded-transferable-from-worker.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.bindings/worker-text-encoded-transferable-roundtrip.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.bindings/worker-text-encoded-transferable-to-worker.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.bindings/worker-transferable-from-worker.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.bindings/worker-transferable-roundtrip.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.bindings/worker-transferable-to-worker.html"
     },
     {
-        "duration": "27.0",
+        "duration": "42.0",
         "name": "blink_perf.canvas/canvas-to-canvas-draw.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.canvas/canvas-to-canvas-draw_RAF.html?RAF"
     },
     {
-        "duration": "9.0",
+        "duration": "12.0",
         "name": "blink_perf.canvas/createImageBitmapFromImageData.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.canvas/createImageBitmapFromImageData_RAF.html?RAF"
     },
     {
-        "duration": "8.0",
+        "duration": "14.0",
         "name": "blink_perf.canvas/docs-paper.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.canvas/docs-paper_RAF.html?RAF"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "blink_perf.canvas/docs-resume.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.canvas/docs-resume_RAF.html?RAF"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.canvas/docs-table.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.canvas/docs-table_RAF.html?RAF"
     },
     {
-        "duration": "3.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/draw-dynamic-canvas-2d-to-hw-accelerated-canvas-2d.html"
     },
     {
-        "duration": "5.0",
+        "duration": "18.0",
         "name": "blink_perf.canvas/draw-dynamic-canvas-2d-to-hw-accelerated-canvas-2d_RAF.html?RAF"
     },
     {
-        "duration": "5.0",
+        "duration": "16.0",
         "name": "blink_perf.canvas/draw-dynamic-webgl-to-hw-accelerated-canvas-2d.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.canvas/draw-dynamic-webgl-to-hw-accelerated-canvas-2d_RAF.html?RAF"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.canvas/draw-hw-accelerated-canvas-2d-to-sw-canvas-2d.html"
     },
     {
-        "duration": "3.0",
+        "duration": "8.0",
         "name": "blink_perf.canvas/draw-hw-accelerated-canvas-2d-to-sw-canvas-2d_RAF.html?RAF"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.canvas/draw-static-canvas-2d-to-hw-accelerated-canvas-2d.html"
     },
     {
-        "duration": "7.0",
+        "duration": "20.0",
         "name": "blink_perf.canvas/draw-static-canvas-2d-to-hw-accelerated-canvas-2d_RAF.html?RAF"
     },
     {
@@ -288,1115 +288,1119 @@
         "name": "blink_perf.canvas/draw-static-webgl-to-hw-accelerated-canvas-2d.html"
     },
     {
-        "duration": "6.0",
+        "duration": "16.0",
         "name": "blink_perf.canvas/draw-static-webgl-to-hw-accelerated-canvas-2d_RAF.html?RAF"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.canvas/draw-video-to-hw-accelerated-canvas-2d.html"
     },
     {
-        "duration": "4.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/draw-video-to-hw-accelerated-canvas-2d_RAF.html?RAF"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.canvas/drawimage-not-pixelaligned.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.canvas/drawimage-not-pixelaligned_RAF.html?RAF"
     },
     {
-        "duration": "9.0",
+        "duration": "26.0",
         "name": "blink_perf.canvas/drawimage.html"
     },
     {
-        "duration": "9.0",
+        "duration": "26.0",
         "name": "blink_perf.canvas/drawimage_RAF.html?RAF"
     },
     {
-        "duration": "6.0",
+        "duration": "14.0",
         "name": "blink_perf.canvas/getImageData.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.canvas/getImageDataColorManaged.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.canvas/getImageDataColorManaged_RAF.html?RAF"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.canvas/getImageData_RAF.html?RAF"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.canvas/gpu-bound-shader.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/gpu-bound-shader_RAF.html?RAF"
     },
     {
-        "duration": "6.0",
+        "duration": "14.0",
         "name": "blink_perf.canvas/putImageData.html"
     },
     {
-        "duration": "6.0",
+        "duration": "14.0",
         "name": "blink_perf.canvas/putImageData_RAF.html?RAF"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "blink_perf.canvas/sheets-render.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.canvas/sheets-render_RAF.html?RAF"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.canvas/toBlob_duration.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.canvas/toBlob_duration_RAF.html?RAF"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.canvas/toBlob_duration_jpeg.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.canvas/toBlob_duration_jpeg_RAF.html?RAF"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.canvas/transferFromImageBitmap.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.canvas/transferFromImageBitmap_RAF.html?RAF"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.canvas/upload-canvas-2d-to-texture.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.canvas/upload-canvas-2d-to-texture_RAF.html?RAF"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.canvas/upload-video-to-sub-texture.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.canvas/upload-video-to-sub-texture_RAF.html?RAF"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.canvas/upload-video-to-texture.html"
     },
     {
-        "duration": "3.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/upload-video-to-texture_RAF.html?RAF"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.canvas/upload-webgl-to-texture.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/upload-webgl-to-texture_RAF.html?RAF"
     },
     {
-        "duration": "13.0",
+        "duration": "24.0",
         "name": "blink_perf.css/AttributeDescendantSelector.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.css/CSSPropertySetterGetter.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.css/CSSPropertySetterGetterMethods.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.css/CSSPropertyUpdateValue.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleChildClassSelector.html"
     },
     {
-        "duration": "7.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleChildElementSelectors.html"
     },
     {
-        "duration": "6.0",
+        "duration": "14.0",
         "name": "blink_perf.css/ChangeStyleElementSelector.html"
     },
     {
-        "duration": "6.0",
+        "duration": "14.0",
         "name": "blink_perf.css/ChangeStyleGrandChildElementSelector.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleMultipleClassSelector.html"
     },
     {
-        "duration": "7.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleMultipleQualifiedDataAttributesWithValuesSelector.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.css/ChangeStyleNestedPseudoSelector.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.css/ChangeStylePairOfNthChildSelector.html"
     },
     {
-        "duration": "6.0",
+        "duration": "14.0",
         "name": "blink_perf.css/ChangeStylePartialAttributeMatchingSelector.html"
     },
     {
-        "duration": "6.0",
+        "duration": "14.0",
         "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeSelector.html"
     },
     {
-        "duration": "7.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeWithValueSelector.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.css/ChangeStyleShallowTree.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.css/ChangeStyleSingleClassSelector.html"
     },
     {
-        "duration": "5.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleSingleNthChildSelector.html"
     },
     {
-        "duration": "7.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleSinglePseudoSelector.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleUniversalSelector.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeSelector.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeWithValueSelector.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.css/ClassDescendantSelector.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.css/ClassInvalidation.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.css/CustomPropertiesCascade.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.css/CustomPropertiesNonRootInheritance.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
+        "name": "blink_perf.css/CustomPropertiesPendingSubstitution.html"
+    },
+    {
+        "duration": "4.0",
         "name": "blink_perf.css/CustomPropertiesRootInheritance.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.css/CustomPropertiesVarAlias.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.css/FocusUpdate.html"
     },
     {
-        "duration": "6.0",
+        "duration": "14.0",
         "name": "blink_perf.css/LoadBootstrapBlog.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.css/LoadMaterializeStarterPage.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.css/LoadSemanticPageExample.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.css/PseudoClassSelectors.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.css/SelectorCountScaling.html"
     },
     {
-        "duration": "17.0",
+        "duration": "32.0",
         "name": "blink_perf.dom/custom-element-default-style-with-shadow.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.dom/custom-element-default-style.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.dom/long-sibling-list.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.dom/modify-element-classname.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.dom/modify-element-id.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.dom/modify-element-title.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.dom/select-multiple-add.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.dom/select-single-add.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.dom/select-single-remove.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.events/EventsDispatching.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.events/EventsDispatchingInDeeplyNestedV0ShadowTrees.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.events/EventsDispatchingInDeeplyNestedV1ShadowTrees.html"
     },
     {
-        "duration": "10.0",
+        "duration": "26.0",
         "name": "blink_perf.events/EventsDispatchingInV0ShadowTrees.html"
     },
     {
-        "duration": "10.0",
+        "duration": "24.0",
         "name": "blink_perf.events/EventsDispatchingInV1ShadowTrees.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.events/hit-test-lots-of-layers.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.events/is-input-pending-all-events.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.events/is-input-pending-default-events.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.image_decoder/decode-gif.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h1v1.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h1v2.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h2v1.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h2v2.html"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "blink_perf.image_decoder/decode-lossless-webp.html"
     },
     {
-        "duration": "7.0",
+        "duration": "16.0",
         "name": "blink_perf.image_decoder/decode-lossy-webp.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.image_decoder/decode-png-palette-opaque.html"
     },
     {
-        "duration": "8.0",
+        "duration": "14.0",
         "name": "blink_perf.image_decoder/decode-png-palette.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.image_decoder/decode-png.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/ArabicLineLayout.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.layout/Shapes/MultipleShapes.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/SimpleTextPathLineLayout.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/add-remove-inline-floats.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.layout/animate-abspos-deep.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/attach-inlines-2.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/attach-inlines.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/auto-grid-lots-of-data.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/auto-grid-lots-of-spanning-data.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/change-text-css-contain.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/chapter-reflow-once-random.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/chapter-reflow-once.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/chapter-reflow-thrice.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/chapter-reflow-twice.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/chapter-reflow.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.layout/character_fallback.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.layout/contain-content-style-change.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/editing_append.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/editing_append_single_line.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/editing_delete.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/editing_insert.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/editing_prepend.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/fit-content-change-available-size-blocks.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/fit-content-change-available-size-text.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/fixed-grid-lots-of-data.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/fixed-grid-lots-of-stretched-data.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/flexbox-column-nowrap.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/flexbox-column-wrap.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/flexbox-deeply-nested-column-flow.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/flexbox-lots-of-data.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/flexbox-row-nowrap.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/flexbox-row-stretch-height-definite.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/flexbox-row-wrap.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/flexbox-with-stretch-layout.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/flexbox_with_list_item.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.layout/floats_100_100.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.layout/floats_100_100_nested.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.layout/floats_10_1000.html"
     },
     {
-        "duration": "2.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/floats_20_100.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.layout/floats_20_100_nested.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.layout/floats_2_100.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.layout/floats_2_100_nested.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.layout/floats_50_100.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.layout/floats_50_100_nested.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/hindi-line-layout.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.layout/japanese-kokoro-insert.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/large-grid.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/large-spanning-grid-item.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans-wider-than-table.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.layout/large-table-with-collapsed-borders-and-no-colspans.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.layout/latin-ebook-resize.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.layout/latin-ebook.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.layout/layers_overlap_2d.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.layout/layers_overlap_3d.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.layout/line-layout-fit-content-break-word.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.layout/line-layout-fit-content.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/line-layout-line-height.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/line-layout-repeat-append-select.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/line-layout-repeat-append.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/line-layout.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.layout/long-line-nowrap-collapse.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.layout/long-line-nowrap-spans-collapse.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.layout/long-line-nowrap.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/many-block-children-auto-inline-size.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/many-block-children-fixed-inline-size.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/multicol/balance-forced-breaks.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/multicol/deeply-nested-tables.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/multicol/fixed-height-with-spanner-and-nested-tables.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/multicol/lots-of-small-nested-unbreakable-blocks-autofill.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/multicol/lots-of-small-unbreakable-blocks-autofill.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/multicol/lots-of-text-autofill.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/multicol/lots-of-text-balanced-orphans-widows.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/multicol/lots-of-text-balanced.html"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/multicol/nested-forced-breaks.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/multicol/tall-content-short-columns-realistic.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/multicol/tall-content-short-columns.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/nested-blocks-with-percent-height-and-max-height.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/nested-grid.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/nested-percent-height-tables.html"
     },
     {
-        "duration": "29.0",
+        "duration": "56.0",
         "name": "blink_perf.layout/subtree-detaching.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.layout/vertical-japanese-kokoro-insert.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.layout/word-break-break-all.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.layout/word-break-break-word.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.layout/word-wrap-break-word.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.owp_storage/blob-perf-files.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.owp_storage/blob-perf-ipc.html"
     },
     {
-        "duration": "7.0",
+        "duration": "16.0",
         "name": "blink_perf.owp_storage/blob-perf-shm.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.owp_storage/blob-perf-tiny.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.owp_storage/idb-load-docs.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.paint/appending-text.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.paint/color-changes.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.paint/complex-content-slow-scroll.html"
     },
     {
-        "duration": "7.0",
+        "duration": "16.0",
         "name": "blink_perf.paint/complex-iframe-filtered.html"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "blink_perf.paint/contain-update-layer-tree.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.paint/containment-resize.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.paint/fixed-and-many-layers-scroll.html"
     },
     {
-        "duration": "7.0",
+        "duration": "16.0",
         "name": "blink_perf.paint/large-table-background-change-with-invisible-collapsed-borders.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.paint/large-table-background-change-with-visible-collapsed-borders.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.paint/large-table-background-change-with-zero-width-collapsed-borders.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.paint/large-table-collapsed-border-change-with-backgrounds.html"
     },
     {
-        "duration": "7.0",
+        "duration": "16.0",
         "name": "blink_perf.paint/large-table-collapsed-border-change-with-text.html"
     },
     {
-        "duration": "7.0",
+        "duration": "16.0",
         "name": "blink_perf.paint/large-table-collapsed-border-change.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.paint/large-table-repaint.html"
     },
     {
-        "duration": "7.0",
+        "duration": "16.0",
         "name": "blink_perf.paint/move-text-with-mask.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.paint/paint-offset-changes.html"
     },
     {
-        "duration": "10.0",
+        "duration": "16.0",
         "name": "blink_perf.paint/select-all-words.html"
     },
     {
-        "duration": "9.0",
+        "duration": "16.0",
         "name": "blink_perf.paint/transform-changes.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.parser/css-parser-yui.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.parser/html-parser-threaded.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.parser/html-parser.html"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "blink_perf.parser/html5-full-render.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.parser/iframe-append-remove.html"
     },
     {
-        "duration": "7.0",
+        "duration": "12.0",
         "name": "blink_perf.parser/innerHTML-setter-siblings.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.parser/innerHTML-setter.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.parser/query-selector-all-attribute-complex.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.parser/query-selector-all-attribute.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.parser/query-selector-all-class-deep.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.parser/query-selector-all-class-first.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.parser/query-selector-all-class-last.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.parser/query-selector-all-class.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.parser/query-selector-all-deep.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.parser/query-selector-all-first.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.parser/query-selector-all-id-deep.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.parser/query-selector-all-id-first.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.parser/query-selector-all-id-last.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.parser/query-selector-all-last.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.parser/query-selector-deep.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.parser/query-selector-first.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.parser/query-selector-id-deep.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.parser/query-selector-id-last.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.parser/query-selector-last.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.parser/simple-url.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.parser/textarea-parsing.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.parser/tiny-innerHTML.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.parser/url-parser.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.parser/xml-parser.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/declarative-api.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/imperative-api-appendchild.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/imperative-api-assign.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/imperative-api-assigned-elements.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/imperative-api-assigned-slot.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/imperative-api-custom-detail-summary-large.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/imperative-api-custom-detail-summary.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/imperative-api-detail-summary-large.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/imperative-api-detail-summary.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/imperative-api-insertbefore.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/imperative-api.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/shadow-style-share-attr-selectors.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/shadow-style-share-media-query.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/shadow-style-share-with-distribution.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/shadow-style-share.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/style-sheet-insert.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/v0-changing-classname-with-shadow-dom.html"
     },
     {
-        "duration": "1.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v0-changing-classname-without-shadow-dom.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v0-changing-select-with-shadow-dom.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v0-changing-select-without-shadow-dom.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/v0-content-reprojection.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/v0-large-distribution-without-layout.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/v0-multiple-insertion-points.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/v0-shadow-reprojection.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/v0-small-distribution-with-layout.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v1-distribution-disconnected-and-reconnected.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/v1-distribution.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/v1-host-child-append.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v1-large-deep-distribution.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.shadow_dom/v1-large-deep-layout.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-append-layout.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-distribution.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-layout.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-prepend-layout.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-re-layout.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-slot-assigned-nodes.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-slot-flatten.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-re-layout.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-assigned-nodes.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-flatten.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/v1-slot-append.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/v1-small-deep-distribution.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/v1-small-deep-layout.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/v1-small-shallow-distribution.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/v1-small-shallow-layout.html"
     },
     {
-        "duration": "5.0",
+        "duration": "8.0",
         "name": "blink_perf.svg/AzLizardBenjiPark.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/Bamboo.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.svg/Cactus.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.svg/Cowboy.html"
     },
     {
@@ -1404,83 +1408,83 @@
         "name": "blink_perf.svg/Cowboy_transform.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.svg/CrawFishGanson.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.svg/Debian.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.svg/DropsOnABlade.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.svg/FlowerFromMyGarden.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.svg/FoodLeifLodahl.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.svg/France.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.svg/FrancoBolloGnomeEzechi.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.svg/GearFlowers.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.svg/HarveyRayner.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.svg/HereGear.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/MtSaintHelens.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.svg/Samurai.html"
     },
     {
-        "duration": "17.0",
+        "duration": "26.0",
         "name": "blink_perf.svg/SierpinskiCarpet.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.svg/SvgCubics.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.svg/SvgHitTesting.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.svg/SvgNestedUse.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.svg/UnderTheSee.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.svg/WorldIso.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/Worldcup.html"
     },
     {
-        "duration": "33.0",
+        "duration": "68.0",
         "name": "dromaeo/http://dromaeo.com?dom-attr"
     },
     {
@@ -1488,187 +1492,187 @@
         "name": "dromaeo/http://dromaeo.com?dom-modify"
     },
     {
-        "duration": "47.0",
+        "duration": "98.0",
         "name": "dromaeo/http://dromaeo.com?dom-query"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "dromaeo/http://dromaeo.com?dom-traverse"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "dummy_benchmark.noisy_benchmark_1/dummy_page.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "dummy_benchmark.stable_benchmark_1/dummy_page.html"
     },
     {
-        "duration": "169.0",
+        "duration": "338.0",
         "name": "jetstream/JetStream"
     },
     {
-        "duration": "141.0",
+        "duration": "284.0",
         "name": "jetstream2/JetStream2"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "kraken/http://krakenbenchmark.mozilla.org/kraken-1.1/driver.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "loading.desktop/24h_cold"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "loading.desktop/24h_warm"
     },
     {
-        "duration": "20.0",
+        "duration": "24.0",
         "name": "loading.desktop/AirBnB_cold"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "loading.desktop/AirBnB_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "16.0",
         "name": "loading.desktop/Aljayyash_cold"
     },
     {
-        "duration": "10.0",
+        "duration": "18.0",
         "name": "loading.desktop/Aljayyash_warm"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "loading.desktop/AllRecipes_cold"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "loading.desktop/AllRecipes_warm"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "loading.desktop/ArsTechnica_cold"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "loading.desktop/ArsTechnica_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "loading.desktop/Baidu_cold"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "loading.desktop/Baidu_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "loading.desktop/Bhaskar_cold"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "loading.desktop/Bhaskar_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "loading.desktop/Chosun_cold"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "loading.desktop/Chosun_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "loading.desktop/Colorado.edu_cold"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "loading.desktop/Colorado.edu_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "loading.desktop/Danawa_cold"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "loading.desktop/Danawa_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "loading.desktop/Daum_cold"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "loading.desktop/Daum_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "loading.desktop/Donga_cold"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "loading.desktop/Donga_warm"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "loading.desktop/Economist_cold"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "loading.desktop/Economist_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "16.0",
         "name": "loading.desktop/Elmundo_cold"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "loading.desktop/Elmundo_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "loading.desktop/FC2Blog_cold"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "loading.desktop/FC2Blog_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "loading.desktop/FIFA_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "loading.desktop/FIFA_warm"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "loading.desktop/FarsNews_cold"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "loading.desktop/FarsNews_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "loading.desktop/Flickr_cold"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "loading.desktop/Flickr_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "loading.desktop/FlipKart_cold"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "loading.desktop/FlipKart_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "16.0",
         "name": "loading.desktop/Free.fr_cold"
     },
     {
@@ -1676,519 +1680,519 @@
         "name": "loading.desktop/Free.fr_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "loading.desktop/HTML5Rocks_cold"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "loading.desktop/HTML5Rocks_warm"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "loading.desktop/Haraj_cold"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "loading.desktop/Haraj_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "loading.desktop/HatenaBookmark_cold"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "loading.desktop/HatenaBookmark_warm"
     },
     {
-        "duration": "10.0",
+        "duration": "18.0",
         "name": "loading.desktop/IGN_cold"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "loading.desktop/IGN_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "loading.desktop/IMDB_cold"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "loading.desktop/IMDB_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "loading.desktop/IndiaTimes_cold"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "loading.desktop/IndiaTimes_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "loading.desktop/Kakaku_cold"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "loading.desktop/Kakaku_warm"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "loading.desktop/Kenh14_cold"
     },
     {
-        "duration": "16.0",
+        "duration": "36.0",
         "name": "loading.desktop/Kenh14_warm"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "loading.desktop/Mercadolivre_cold"
     },
     {
-        "duration": "10.0",
+        "duration": "18.0",
         "name": "loading.desktop/Mercadolivre_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "loading.desktop/Naver_cold"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "loading.desktop/Naver_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "16.0",
         "name": "loading.desktop/Orange_cold"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "loading.desktop/Orange_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "loading.desktop/Pantip_cold"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "loading.desktop/Pantip_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "32.0",
         "name": "loading.desktop/PremierLeague_cold"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "loading.desktop/PremierLeague_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "loading.desktop/QQ_cold"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "loading.desktop/QQ_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "loading.desktop/REI_cold"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "loading.desktop/REI_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "loading.desktop/Ruten_cold"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "loading.desktop/Ruten_warm"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "loading.desktop/Sina_cold"
     },
     {
-        "duration": "18.0",
+        "duration": "40.0",
         "name": "loading.desktop/Sina_warm"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "loading.desktop/Taobao_cold"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "loading.desktop/Taobao_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "loading.desktop/TheOnion_cold"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "loading.desktop/TheOnion_warm"
     },
     {
-        "duration": "10.0",
+        "duration": "18.0",
         "name": "loading.desktop/TheVerge_cold"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "loading.desktop/TheVerge_warm"
     },
     {
-        "duration": "10.0",
+        "duration": "18.0",
         "name": "loading.desktop/TicketMaster_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "loading.desktop/TicketMaster_warm"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "loading.desktop/Vietnamnet_cold"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "loading.desktop/Vietnamnet_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "loading.desktop/Vnexpress_cold"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "loading.desktop/Vnexpress_warm"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "loading.desktop/Walgreens_cold"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "loading.desktop/Walgreens_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "16.0",
         "name": "loading.desktop/Yandex_cold"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "loading.desktop/Yandex_warm"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "loading.desktop/amazon.co.jp_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "loading.desktop/amazon.co.jp_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "loading.desktop/ja.wikipedia_cold"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "loading.desktop/ja.wikipedia_warm"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "loading.desktop/money.cnn_cold"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "loading.desktop/money.cnn_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "34.0",
         "name": "loading.desktop/ru.wikipedia_cold"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "loading.desktop/ru.wikipedia_warm"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "loading.desktop/uol.com.br_cold"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "loading.desktop/uol.com.br_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "loading.desktop/yahoo.co.jp_cold"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "loading.desktop/yahoo.co.jp_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "media.desktop/mse.html?media=aac_audio.mp4"
     },
     {
-        "duration": "9.0",
+        "duration": "16.0",
         "name": "media.desktop/mse.html?media=aac_audio.mp4,h264_video.mp4"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "media.desktop/mse.html?media=h264_video.mp4"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "media.desktop/mse.html?media=tulip0.av1.mp4"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "media.desktop/mse.html?media=tulip2.vp9.webm"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "media.desktop/video.html?src=crowd1080.mp4"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "media.desktop/video.html?src=crowd1080.webm"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "media.desktop/video.html?src=crowd1080_vp9.webm"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "media.desktop/video.html?src=garden2_10s.mp4&seek"
     },
     {
-        "duration": "9.0",
+        "duration": "16.0",
         "name": "media.desktop/video.html?src=garden2_10s.webm&seek"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "media.desktop/video.html?src=smpte_3840x2160_60fps_vp9.webm&seek"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "media.desktop/video.html?src=tulip0.av1.mp4"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "media.desktop/video.html?src=tulip0.av1.mp4&seek"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "media.desktop/video.html?src=tulip2.m4a&type=audio"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "media.desktop/video.html?src=tulip2.mp3&type=audio"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "media.desktop/video.html?src=tulip2.mp3&type=audio&seek"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "media.desktop/video.html?src=tulip2.mp4"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "media.desktop/video.html?src=tulip2.mp4&busyjs"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "media.desktop/video.html?src=tulip2.ogg&type=audio"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "media.desktop/video.html?src=tulip2.ogg&type=audio&seek"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "media.desktop/video.html?src=tulip2.vp9.webm"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "media.desktop/video.html?src=tulip2.vp9.webm&background"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "media.desktop/video.html?src=tulip2.vp9.webm_WiFi"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "memory.desktop/TrivialAnimationPageSharedPageState"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "memory.desktop/TrivialBlinkingCursorPageSharedPageState"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "memory.desktop/TrivialBlurAnimationPageSharedPageState"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "memory.desktop/TrivialCanvasPageSharedPageState"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "memory.desktop/TrivialFullscreenVideoPageSharedPageState"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "memory.desktop/TrivialGifPageSharedPageState"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "memory.desktop/TrivialScrollingPageSharedPageState"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "memory.desktop/TrivialWebGLPageSharedPageState"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "memory.desktop/WebWorker"
     },
     {
-        "duration": "36.0",
+        "duration": "74.0",
         "name": "octane/Octane"
     },
     {
-        "duration": "36.0",
+        "duration": "70.0",
         "name": "power.desktop/TrivialAnimationPageSharedPageState"
     },
     {
-        "duration": "35.0",
+        "duration": "70.0",
         "name": "power.desktop/TrivialBlinkingCursorPageSharedPageState"
     },
     {
-        "duration": "36.0",
+        "duration": "70.0",
         "name": "power.desktop/TrivialBlurAnimationPageSharedPageState"
     },
     {
-        "duration": "36.0",
+        "duration": "70.0",
         "name": "power.desktop/TrivialCanvasPageSharedPageState"
     },
     {
-        "duration": "36.0",
+        "duration": "70.0",
         "name": "power.desktop/TrivialFullscreenVideoPageSharedPageState"
     },
     {
-        "duration": "35.0",
+        "duration": "70.0",
         "name": "power.desktop/TrivialGifPageSharedPageState"
     },
     {
-        "duration": "37.0",
+        "duration": "72.0",
         "name": "power.desktop/TrivialScrollingPageSharedPageState"
     },
     {
-        "duration": "36.0",
+        "duration": "70.0",
         "name": "power.desktop/TrivialWebGLPageSharedPageState"
     },
     {
-        "duration": "42.0",
+        "duration": "80.0",
         "name": "power.desktop/abcnews"
     },
     {
-        "duration": "41.0",
+        "duration": "70.0",
         "name": "power.desktop/indiatimes"
     },
     {
-        "duration": "36.0",
+        "duration": "70.0",
         "name": "power.desktop/instagram"
     },
     {
-        "duration": "36.0",
+        "duration": "70.0",
         "name": "power.desktop/microsoft"
     },
     {
-        "duration": "36.0",
+        "duration": "72.0",
         "name": "power.desktop/sina"
     },
     {
-        "duration": "36.0",
+        "duration": "70.0",
         "name": "power.desktop/slideshare"
     },
     {
-        "duration": "36.0",
+        "duration": "72.0",
         "name": "power.desktop/uol"
     },
     {
-        "duration": "7.0",
+        "duration": "16.0",
         "name": "rasterize_and_record_micro.partial_invalidation/800_relpos_divs.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/amazon.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/blogger.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/booking.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/cnn.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/ebay.html"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/espn.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/facebook.html"
     },
     {
-        "duration": "6.0",
+        "duration": "14.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/gmail.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/google.html"
     },
     {
-        "duration": "5.0",
+        "duration": "12.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googlecalendar.html"
     },
     {
-        "duration": "5.0",
+        "duration": "12.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googledocs.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleimagesearch.html"
     },
     {
-        "duration": "13.0",
+        "duration": "28.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleplus.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/linkedin.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/pinterest.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/techcrunch.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/twitter.html"
     },
     {
-        "duration": "7.0",
+        "duration": "16.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/weather.html"
     },
     {
@@ -2196,1363 +2200,1363 @@
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/wikipedia.html"
     },
     {
-        "duration": "8.0",
+        "duration": "26.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/wordpress.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahooanswers.html"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoogames.html"
     },
     {
-        "duration": "90.0",
+        "duration": "184.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoonews.html"
     },
     {
-        "duration": "71.0",
+        "duration": "142.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoosports.html"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/youtube.html"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "rendering.desktop/accu_weather_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/accu_weather_pinch_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/amazon_2018"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "rendering.desktop/amazon_pinch_2018"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/analog_clock_svg"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/animometer_webgl"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/animometer_webgl_attrib_arrays"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/animometer_webgl_multi_draw"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/aquarium"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "rendering.desktop/aquarium_20k"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/background_color_animation"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/background_color_animation_with_gradient"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/balls_css_key_frame_animations"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "rendering.desktop/balls_css_key_frame_animations_composited_transform"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/balls_css_transition_2_properties"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/balls_css_transition_40_properties"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/balls_css_transition_all_properties"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/balls_javascript_canvas"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/balls_javascript_css"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/balls_svg_animations"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/blob"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/blogspot_2018"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "rendering.desktop/blogspot_pinch_2018"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "rendering.desktop/blur_rotating_background"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "rendering.desktop/booking.com_2018"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "rendering.desktop/booking_pinch_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/bouncing_balls_15"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/bouncing_balls_shadow"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/bouncing_clipped_rectangles"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/bouncing_gradient_circles"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/bouncing_png_images"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/bouncing_svg_images"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rendering.desktop/camera_to_webgl"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "rendering.desktop/canvas_05000_pixels_per_second"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "rendering.desktop/canvas_10000_pixels_per_second"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "rendering.desktop/canvas_20000_pixels_per_second"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "rendering.desktop/canvas_40000_pixels_per_second"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "rendering.desktop/canvas_60000_pixels_per_second"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "rendering.desktop/canvas_75000_pixels_per_second"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "rendering.desktop/canvas_90000_pixels_per_second"
     },
     {
-        "duration": "14.0",
+        "duration": "34.0",
         "name": "rendering.desktop/canvas_animation_no_clear"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/canvas_arcs"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/canvas_font_cycler"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/canvas_lines"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/canvas_to_blob"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "rendering.desktop/cats_unscaled"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "rendering.desktop/cats_viewport_width"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/cc_poster_circle"
     },
     {
-        "duration": "14.0",
+        "duration": "24.0",
         "name": "rendering.desktop/cc_scroll_text_only"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/chip_tune"
     },
     {
-        "duration": "18.0",
+        "duration": "24.0",
         "name": "rendering.desktop/cnn_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/cnn_pinch_2018"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/compositor_heavy_animation"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/crafty_mind"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_animations_many_keyframes"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_animations_simultaneous_inline_style"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_animations_simultaneous_new_element"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_animations_simultaneous_style_element"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_animations_simultaneous_updating_class"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_animations_staggered_infinite_iterations"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "rendering.desktop/css_animations_staggered_inline_style"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "rendering.desktop/css_animations_staggered_new_element"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_animations_staggered_style_element"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_animations_staggered_updating_class"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "rendering.desktop/css_animations_triggered_inline_style"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_animations_triggered_new_element"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_animations_triggered_style_element"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "rendering.desktop/css_animations_triggered_updating_class"
     },
     {
-        "duration": "19.0",
+        "duration": "36.0",
         "name": "rendering.desktop/css_opacity_plus_n_layers_99"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_transitions_inline_style"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_transitions_new_element"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_transitions_staggered_inline_style"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_transitions_staggered_new_element"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_transitions_staggered_style_element"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_transitions_staggered_updating_class"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_transitions_style_element"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_transitions_triggered_inline_style"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_transitions_triggered_new_element"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_transitions_triggered_style_element"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_transitions_triggered_updating_class"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_transitions_updating_class"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_value_type_color"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_value_type_filter"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_value_type_length"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_value_type_length_complex"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_value_type_length_simple"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_value_type_path"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_value_type_shadow"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_value_type_transform_complex"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/css_value_type_transform_simple"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/dynamic_cube_map"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/earth"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "rendering.desktop/ebay_2018"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "rendering.desktop/ebay_pinch_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "32.0",
         "name": "rendering.desktop/effect_games"
     },
     {
-        "duration": "12.0",
+        "duration": "34.0",
         "name": "rendering.desktop/espn_2018"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "rendering.desktop/espn_pinch_2018"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "rendering.desktop/extra_large_texture_uploads"
     },
     {
-        "duration": "11.0",
+        "duration": "30.0",
         "name": "rendering.desktop/facebook_2018"
     },
     {
-        "duration": "11.0",
+        "duration": "28.0",
         "name": "rendering.desktop/facebook_pinch_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/fill_shapes"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/filter_terrain_svg"
     },
     {
-        "duration": "16.0",
+        "duration": "28.0",
         "name": "rendering.desktop/geo_apis"
     },
     {
-        "duration": "15.0",
+        "duration": "20.0",
         "name": "rendering.desktop/gmail_2018"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rendering.desktop/gmail_move_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "22.0",
         "name": "rendering.desktop/gmail_pinch_2018"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "rendering.desktop/google_calendar_2018"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "rendering.desktop/google_calendar_pinch_2018"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "rendering.desktop/google_docs_2018"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "rendering.desktop/google_image_pinch_2018"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "rendering.desktop/google_image_search_2018"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "rendering.desktop/google_plus_2018"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "rendering.desktop/google_search_pinch_2018"
     },
     {
-        "duration": "10.0",
+        "duration": "18.0",
         "name": "rendering.desktop/google_web_search_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/guimark_vector_chart"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/hakim"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "rendering.desktop/ie_chalkboard"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/ie_pirate_mark"
     },
     {
-        "duration": "18.0",
+        "duration": "32.0",
         "name": "rendering.desktop/infinite_scroll_element_n_layers_99"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/infinite_scroll_root_fixed_n_layers_99"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/infinite_scroll_root_n_layers_99"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/jarro_doverson"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "rendering.desktop/jpeg_decoding_rgb_and_gpu_rasterization"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "rendering.desktop/jpeg_decoding_yuv_and_gpu_rasterization"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/js_full_screen_invalidation"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/js_opacity_plus_n_layers_99"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/js_paint_plus_n_layers_99"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/js_poster_circle"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/js_scroll_text_only"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/kevs_3d"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/keyframed_animations"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/large_texture_uploads"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "rendering.desktop/linkedin_2018"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "rendering.desktop/linkedin_pinch_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/main_0fps_impl_60fps"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/main_0fps_impl_60fps_no_update"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/main_0fps_impl_60fps_no_update_jank"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/main_0fps_with_jank_impl_0fps"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/main_15fps_impl_0fps"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/main_15fps_with_jank_impl_0fps"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/main_30fps_impl_0fps"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/main_30fps_impl_60fps"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/main_60fps_impl_0fps"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/main_60fps_impl_60fps"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/main_60fps_impl_60fps_no_update"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/main_60fps_impl_60fps_no_update_jank"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/main_60fps_with_jank_impl_0fps"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/man_in_blue"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/many_images"
     },
     {
-        "duration": "16.0",
+        "duration": "36.0",
         "name": "rendering.desktop/many_planets_deep"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/maps_move_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "32.0",
         "name": "rendering.desktop/maps_perf_test"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/medium_texture_uploads"
     },
     {
-        "duration": "14.0",
+        "duration": "32.0",
         "name": "rendering.desktop/megi_dish"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/microsoft_asteroid_belt"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/microsoft_fireflies"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/microsoft_fish_ie_tank"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/microsoft_performance"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/microsoft_snow"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/microsoft_speed_reading"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/microsoft_tweet_map"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/microsoft_video_city"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/microsoft_worker_fountains"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/mix_10k"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/mix_blend_mode_animation_difference"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/mix_blend_mode_animation_hue"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/mix_blend_mode_animation_propagating_isolation"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/mix_blend_mode_animation_screen"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/motion_mark_canvas_fill_shapes"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/motion_mark_canvas_stroke_shapes"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/new_tilings"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/nvidia_vertex_buffer_object"
     },
     {
-        "duration": "16.0",
+        "duration": "28.0",
         "name": "rendering.desktop/off_screen_main_60fps"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/off_screen_main_60fps_jank"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/overlay_background_color_css_transitions_page"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "rendering.desktop/particles"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/pinterest_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/put_get_image_data"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "rendering.desktop/raf"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "rendering.desktop/raf_animation"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "rendering.desktop/raf_canvas"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "rendering.desktop/raf_touch_animation"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "rendering.desktop/repaint_amazon_2018"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "rendering.desktop/repaint_cnn_2018"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "rendering.desktop/repaint_facebook_2018"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "rendering.desktop/repaint_google_search_2018"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "rendering.desktop/repaint_instagram_2018"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "rendering.desktop/repaint_reddit_2018"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "rendering.desktop/repaint_theverge_2018"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "rendering.desktop/repaint_twitter_2018"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "rendering.desktop/repaint_wikipedia_2018"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "rendering.desktop/repaint_yahoo_homepage_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/runway_2019"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "rendering.desktop/san_angeles"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "rendering.desktop/second_batch_js_heavy"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "rendering.desktop/second_batch_js_light"
     },
     {
-        "duration": "9.0",
+        "duration": "16.0",
         "name": "rendering.desktop/second_batch_js_medium"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "rendering.desktop/simple_text_page"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "rendering.desktop/simple_touch_drag"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/small_texture_uploads"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/smash_cat"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/spielzeugz"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/stroke_shapes"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "rendering.desktop/sync_scroll_offset"
     },
     {
-        "duration": "13.0",
+        "duration": "32.0",
         "name": "rendering.desktop/techcrunch_2018"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "rendering.desktop/text_05000_pixels_per_second"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "rendering.desktop/text_10000_pixels_per_second"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "rendering.desktop/text_20000_pixels_per_second"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "rendering.desktop/text_40000_pixels_per_second"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "rendering.desktop/text_60000_pixels_per_second"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "rendering.desktop/text_75000_pixels_per_second"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "rendering.desktop/text_90000_pixels_per_second"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "rendering.desktop/text_constant_full_page_raster_05000_pixels_per_second"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "rendering.desktop/text_constant_full_page_raster_10000_pixels_per_second"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "rendering.desktop/text_constant_full_page_raster_20000_pixels_per_second"
     },
     {
-        "duration": "9.0",
+        "duration": "16.0",
         "name": "rendering.desktop/text_constant_full_page_raster_40000_pixels_per_second"
     },
     {
-        "duration": "9.0",
+        "duration": "16.0",
         "name": "rendering.desktop/text_constant_full_page_raster_60000_pixels_per_second"
     },
     {
-        "duration": "9.0",
+        "duration": "16.0",
         "name": "rendering.desktop/text_constant_full_page_raster_75000_pixels_per_second"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "rendering.desktop/text_constant_full_page_raster_90000_pixels_per_second"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "rendering.desktop/text_hover_05000_pixels_per_second"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "rendering.desktop/text_hover_10000_pixels_per_second"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "rendering.desktop/text_hover_20000_pixels_per_second"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "rendering.desktop/text_hover_40000_pixels_per_second"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "rendering.desktop/text_hover_60000_pixels_per_second"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "rendering.desktop/text_hover_75000_pixels_per_second"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "rendering.desktop/text_hover_90000_pixels_per_second"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "rendering.desktop/touch_handler_scrolling"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/transform_transitions"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/transform_transitions_js_block"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "rendering.desktop/twitch_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "26.0",
         "name": "rendering.desktop/twitch_pinch_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/twitter_2018"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "rendering.desktop/twitter_pinch_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/web_animation_value_type_color"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/web_animation_value_type_length_3d"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/web_animation_value_type_length_complex"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/web_animation_value_type_length_simple"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/web_animation_value_type_path"
     },
     {
-        "duration": "16.0",
+        "duration": "28.0",
         "name": "rendering.desktop/web_animation_value_type_shadow"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/web_animation_value_type_transform_complex"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/web_animation_value_type_transform_simple"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/web_animations_many_keyframes"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/web_animations_set_current_time"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/web_animations_simultaneous"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/web_animations_staggered_chaining"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/web_animations_staggered_infinite_iterations"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/web_animations_staggered_triggering_page"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "rendering.desktop/webp_decoding_rgb_and_gpu_rasterization"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "rendering.desktop/webp_decoding_yuv_and_gpu_rasterization"
     },
     {
-        "duration": "16.0",
+        "duration": "26.0",
         "name": "rendering.desktop/wikipedia_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "24.0",
         "name": "rendering.desktop/wordpress_2018"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "rendering.desktop/yahoo_answers_2018"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "rendering.desktop/yahoo_news_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "22.0",
         "name": "rendering.desktop/yahoo_news_pinch_2018"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "rendering.desktop/yahoo_sports_2018"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "rendering.desktop/yahoo_sports_pinch_2018"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "rendering.desktop/youtube_2018"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "rendering.desktop/youtube_pinch_2018"
     },
     {
-        "duration": "31.0",
+        "duration": "62.0",
         "name": "speedometer-future/http://browserbench.org/Speedometer/"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "speedometer/http://browserbench.org/Speedometer/"
     },
     {
-        "duration": "57.0",
+        "duration": "112.0",
         "name": "speedometer2-future/Speedometer2"
     },
     {
-        "duration": "53.0",
+        "duration": "108.0",
         "name": "speedometer2/Speedometer2"
     },
     {
-        "duration": "39.0",
+        "duration": "80.0",
         "name": "system_health.common_desktop/browse:media:googleplaystore:2018"
     },
     {
-        "duration": "67.0",
+        "duration": "140.0",
         "name": "system_health.common_desktop/browse:media:imgur"
     },
     {
-        "duration": "83.0",
+        "duration": "168.0",
         "name": "system_health.common_desktop/browse:media:pinterest:2018"
     },
     {
-        "duration": "54.0",
+        "duration": "110.0",
         "name": "system_health.common_desktop/browse:media:tumblr:2018"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "system_health.common_desktop/browse:media:youtube:2019"
     },
     {
-        "duration": "61.0",
+        "duration": "122.0",
         "name": "system_health.common_desktop/browse:media:youtubetv:2019"
     },
     {
-        "duration": "35.0",
+        "duration": "74.0",
         "name": "system_health.common_desktop/browse:news:cnn:2018"
     },
     {
-        "duration": "43.0",
+        "duration": "90.0",
         "name": "system_health.common_desktop/browse:news:flipboard:2018"
     },
     {
-        "duration": "4.0",
+        "duration": "12.0",
         "name": "system_health.common_desktop/browse:news:hackernews:2018"
     },
     {
-        "duration": "55.0",
+        "duration": "112.0",
         "name": "system_health.common_desktop/browse:news:nytimes:2018"
     },
     {
-        "duration": "44.0",
+        "duration": "90.0",
         "name": "system_health.common_desktop/browse:news:reddit:2018"
     },
     {
-        "duration": "44.0",
+        "duration": "90.0",
         "name": "system_health.common_desktop/browse:search:google:2018"
     },
     {
-        "duration": "31.0",
+        "duration": "64.0",
         "name": "system_health.common_desktop/browse:search:google_india:2018"
     },
     {
-        "duration": "62.0",
+        "duration": "128.0",
         "name": "system_health.common_desktop/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "52.0",
+        "duration": "112.0",
         "name": "system_health.common_desktop/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "46.0",
+        "duration": "86.0",
         "name": "system_health.common_desktop/browse:social:twitter:2018"
     },
     {
-        "duration": "59.0",
+        "duration": "118.0",
         "name": "system_health.common_desktop/browse:social:twitter_infinite_scroll:2018"
     },
     {
-        "duration": "55.0",
+        "duration": "114.0",
         "name": "system_health.common_desktop/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "37.0",
+        "duration": "78.0",
         "name": "system_health.common_desktop/browse:tools:docs_scrolling"
     },
     {
-        "duration": "64.0",
+        "duration": "132.0",
         "name": "system_health.common_desktop/browse:tools:maps:2019"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "system_health.common_desktop/browse:tools:sheets:2019"
     },
     {
-        "duration": "5.0",
+        "duration": "12.0",
         "name": "system_health.common_desktop/browse_accessibility:media:youtube"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "system_health.common_desktop/browse_accessibility:tech:codesearch:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "system_health.common_desktop/load:chrome:blank"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.common_desktop/load:games:alphabetty:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "system_health.common_desktop/load:games:bubbles:2019"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "system_health.common_desktop/load:games:lazors"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "system_health.common_desktop/load:games:miniclip:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "system_health.common_desktop/load:games:spychase:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "38.0",
         "name": "system_health.common_desktop/load:media:9gag"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "system_health.common_desktop/load:media:dailymotion:2019"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "system_health.common_desktop/load:media:facebook_photos:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "system_health.common_desktop/load:media:flickr:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "system_health.common_desktop/load:media:google_images:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "system_health.common_desktop/load:media:imgur:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "system_health.common_desktop/load:media:soundcloud:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.common_desktop/load:media:youtube:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.common_desktop/load:news:bbc:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "system_health.common_desktop/load:news:cnn:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.common_desktop/load:news:flipboard"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "system_health.common_desktop/load:news:hackernews:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "32.0",
         "name": "system_health.common_desktop/load:news:nytimes:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "system_health.common_desktop/load:news:qq:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "system_health.common_desktop/load:news:reddit:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "system_health.common_desktop/load:news:wikipedia:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.common_desktop/load:search:amazon:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "system_health.common_desktop/load:search:baidu:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "system_health.common_desktop/load:search:ebay:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.common_desktop/load:search:flipkart:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.common_desktop/load:search:google:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "system_health.common_desktop/load:search:taobao:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "system_health.common_desktop/load:search:yahoo:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.common_desktop/load:search:yandex:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.common_desktop/load:social:instagram:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "32.0",
         "name": "system_health.common_desktop/load:social:pinterest:2019"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "system_health.common_desktop/load:social:vk:2018"
     },
     {
-        "duration": "22.0",
+        "duration": "42.0",
         "name": "system_health.common_desktop/load:tools:chat:2020"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "system_health.common_desktop/load:tools:docs:2019"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "system_health.common_desktop/load:tools:drive:2019"
     },
     {
-        "duration": "24.0",
+        "duration": "46.0",
         "name": "system_health.common_desktop/load:tools:gmail:2019"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.common_desktop/load:tools:stackoverflow:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.common_desktop/load:tools:weather:2019"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "system_health.common_desktop/load_accessibility:media:wikipedia:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "system_health.common_desktop/load_accessibility:shopping:amazon:2018"
     },
     {
-        "duration": "117.0",
+        "duration": "232.0",
         "name": "system_health.common_desktop/long_running:tools:gmail-background"
     },
     {
-        "duration": "116.0",
+        "duration": "232.0",
         "name": "system_health.common_desktop/long_running:tools:gmail-foreground"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "system_health.common_desktop/multitab:misc:typical24"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "system_health.common_desktop/multitab:misc:typical24:2018"
     },
     {
-        "duration": "39.0",
+        "duration": "80.0",
         "name": "system_health.common_desktop/play:media:google_play_music"
     },
     {
-        "duration": "40.0",
+        "duration": "80.0",
         "name": "system_health.common_desktop/play:media:soundcloud:2018"
     },
     {
-        "duration": "35.0",
+        "duration": "70.0",
         "name": "system_health.memory_desktop/browse:media:googleplaystore:2018"
     },
     {
-        "duration": "63.0",
+        "duration": "126.0",
         "name": "system_health.memory_desktop/browse:media:imgur"
     },
     {
@@ -3560,39 +3564,39 @@
         "name": "system_health.memory_desktop/browse:media:pinterest:2018"
     },
     {
-        "duration": "51.0",
+        "duration": "100.0",
         "name": "system_health.memory_desktop/browse:media:tumblr:2018"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "system_health.memory_desktop/browse:media:youtube:2019"
     },
     {
-        "duration": "57.0",
+        "duration": "116.0",
         "name": "system_health.memory_desktop/browse:media:youtubetv:2019"
     },
     {
-        "duration": "31.0",
+        "duration": "64.0",
         "name": "system_health.memory_desktop/browse:news:cnn:2018"
     },
     {
-        "duration": "40.0",
+        "duration": "80.0",
         "name": "system_health.memory_desktop/browse:news:flipboard:2018"
     },
     {
-        "duration": "45.0",
+        "duration": "90.0",
         "name": "system_health.memory_desktop/browse:news:hackernews:2018"
     },
     {
-        "duration": "50.0",
+        "duration": "100.0",
         "name": "system_health.memory_desktop/browse:news:nytimes:2018"
     },
     {
-        "duration": "41.0",
+        "duration": "80.0",
         "name": "system_health.memory_desktop/browse:news:reddit:2018"
     },
     {
-        "duration": "40.0",
+        "duration": "80.0",
         "name": "system_health.memory_desktop/browse:search:google:2018"
     },
     {
@@ -3604,31 +3608,31 @@
         "name": "system_health.memory_desktop/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "50.0",
+        "duration": "98.0",
         "name": "system_health.memory_desktop/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "39.0",
+        "duration": "78.0",
         "name": "system_health.memory_desktop/browse:social:twitter:2018"
     },
     {
-        "duration": "55.0",
+        "duration": "110.0",
         "name": "system_health.memory_desktop/browse:social:twitter_infinite_scroll:2018"
     },
     {
-        "duration": "51.0",
+        "duration": "102.0",
         "name": "system_health.memory_desktop/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "34.0",
+        "duration": "68.0",
         "name": "system_health.memory_desktop/browse:tools:docs_scrolling"
     },
     {
-        "duration": "60.0",
+        "duration": "122.0",
         "name": "system_health.memory_desktop/browse:tools:maps:2019"
     },
     {
-        "duration": "25.0",
+        "duration": "48.0",
         "name": "system_health.memory_desktop/browse:tools:sheets:2019"
     },
     {
@@ -3636,163 +3640,163 @@
         "name": "system_health.memory_desktop/browse_accessibility:media:youtube"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "system_health.memory_desktop/browse_accessibility:tech:codesearch:2018"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "system_health.memory_desktop/load:chrome:blank"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "system_health.memory_desktop/load:games:alphabetty:2018"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "system_health.memory_desktop/load:games:bubbles:2019"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "system_health.memory_desktop/load:games:lazors"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "system_health.memory_desktop/load:games:miniclip:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "system_health.memory_desktop/load:games:spychase:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.memory_desktop/load:media:9gag"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "system_health.memory_desktop/load:media:dailymotion:2019"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "system_health.memory_desktop/load:media:facebook_photos:2018"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "system_health.memory_desktop/load:media:flickr:2018"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "system_health.memory_desktop/load:media:google_images:2018"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "system_health.memory_desktop/load:media:imgur:2018"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "system_health.memory_desktop/load:media:soundcloud:2018"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "system_health.memory_desktop/load:media:youtube:2018"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "system_health.memory_desktop/load:news:bbc:2018"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "system_health.memory_desktop/load:news:cnn:2018"
     },
     {
-        "duration": "13.0",
+        "duration": "28.0",
         "name": "system_health.memory_desktop/load:news:flipboard"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "system_health.memory_desktop/load:news:hackernews:2018"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "system_health.memory_desktop/load:news:nytimes:2018"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "system_health.memory_desktop/load:news:qq:2018"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "system_health.memory_desktop/load:news:reddit:2018"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "system_health.memory_desktop/load:news:wikipedia:2018"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "system_health.memory_desktop/load:search:amazon:2018"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "system_health.memory_desktop/load:search:baidu:2018"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "system_health.memory_desktop/load:search:ebay:2018"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "system_health.memory_desktop/load:search:flipkart:2018"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "system_health.memory_desktop/load:search:google:2018"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "system_health.memory_desktop/load:search:taobao:2018"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "system_health.memory_desktop/load:search:yahoo:2018"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "system_health.memory_desktop/load:search:yandex:2018"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "system_health.memory_desktop/load:social:instagram:2018"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "system_health.memory_desktop/load:social:pinterest:2019"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "system_health.memory_desktop/load:social:vk:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "system_health.memory_desktop/load:tools:chat:2020"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.memory_desktop/load:tools:docs:2019"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "system_health.memory_desktop/load:tools:drive:2019"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "system_health.memory_desktop/load:tools:gmail:2019"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "system_health.memory_desktop/load:tools:stackoverflow:2018"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "system_health.memory_desktop/load:tools:weather:2019"
     },
     {
@@ -3800,7 +3804,7 @@
         "name": "system_health.memory_desktop/load_accessibility:media:wikipedia:2018"
     },
     {
-        "duration": "12.0",
+        "duration": "28.0",
         "name": "system_health.memory_desktop/load_accessibility:shopping:amazon:2018"
     },
     {
@@ -3820,11 +3824,11 @@
         "name": "system_health.memory_desktop/multitab:misc:typical24:2018"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "system_health.memory_desktop/play:media:google_play_music"
     },
     {
-        "duration": "37.0",
+        "duration": "72.0",
         "name": "system_health.memory_desktop/play:media:soundcloud:2018"
     },
     {
@@ -3832,239 +3836,239 @@
         "name": "tab_switching.typical_25/multitab:misc:typical24"
     },
     {
-        "duration": "9.0",
+        "duration": "16.0",
         "name": "tracing.tracing_with_background_memory_infra/Facebook"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "tracing.tracing_with_background_memory_infra/Wikipedia"
     },
     {
-        "duration": "9.0",
+        "duration": "16.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.amazon.com"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.ask.com/"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.bing.com/"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.yahoo.com/"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.youtube.com"
     },
     {
-        "duration": "10.0",
+        "duration": "18.0",
         "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/#hl=en&q=barack+obama"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/calendar/"
     },
     {
-        "duration": "47.0",
+        "duration": "92.0",
         "name": "v8.browsing_desktop-future/browse:media:googleplaystore:2018"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "v8.browsing_desktop-future/browse:media:imgur"
     },
     {
-        "duration": "89.0",
+        "duration": "178.0",
         "name": "v8.browsing_desktop-future/browse:media:pinterest:2018"
     },
     {
-        "duration": "60.0",
+        "duration": "122.0",
         "name": "v8.browsing_desktop-future/browse:media:tumblr:2018"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "v8.browsing_desktop-future/browse:media:youtube:2019"
     },
     {
-        "duration": "66.0",
+        "duration": "132.0",
         "name": "v8.browsing_desktop-future/browse:media:youtubetv:2019"
     },
     {
-        "duration": "45.0",
+        "duration": "88.0",
         "name": "v8.browsing_desktop-future/browse:news:cnn:2018"
     },
     {
-        "duration": "52.0",
+        "duration": "100.0",
         "name": "v8.browsing_desktop-future/browse:news:flipboard:2018"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "v8.browsing_desktop-future/browse:news:hackernews:2018"
     },
     {
-        "duration": "61.0",
+        "duration": "122.0",
         "name": "v8.browsing_desktop-future/browse:news:nytimes:2018"
     },
     {
-        "duration": "50.0",
+        "duration": "102.0",
         "name": "v8.browsing_desktop-future/browse:news:reddit:2018"
     },
     {
-        "duration": "52.0",
+        "duration": "102.0",
         "name": "v8.browsing_desktop-future/browse:search:google:2018"
     },
     {
-        "duration": "39.0",
+        "duration": "76.0",
         "name": "v8.browsing_desktop-future/browse:search:google_india:2018"
     },
     {
-        "duration": "71.0",
+        "duration": "140.0",
         "name": "v8.browsing_desktop-future/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "61.0",
+        "duration": "122.0",
         "name": "v8.browsing_desktop-future/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "48.0",
+        "duration": "98.0",
         "name": "v8.browsing_desktop-future/browse:social:twitter:2018"
     },
     {
-        "duration": "64.0",
+        "duration": "130.0",
         "name": "v8.browsing_desktop-future/browse:social:twitter_infinite_scroll:2018"
     },
     {
-        "duration": "64.0",
+        "duration": "126.0",
         "name": "v8.browsing_desktop-future/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "46.0",
+        "duration": "88.0",
         "name": "v8.browsing_desktop-future/browse:tools:docs_scrolling"
     },
     {
-        "duration": "73.0",
+        "duration": "142.0",
         "name": "v8.browsing_desktop-future/browse:tools:maps:2019"
     },
     {
-        "duration": "33.0",
+        "duration": "72.0",
         "name": "v8.browsing_desktop-future/browse:tools:sheets:2019"
     },
     {
-        "duration": "45.0",
+        "duration": "90.0",
         "name": "v8.browsing_desktop/browse:media:googleplaystore:2018"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "v8.browsing_desktop/browse:media:imgur"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "v8.browsing_desktop/browse:media:pinterest:2018"
     },
     {
-        "duration": "62.0",
+        "duration": "122.0",
         "name": "v8.browsing_desktop/browse:media:tumblr:2018"
     },
     {
-        "duration": "8.0",
+        "duration": "24.0",
         "name": "v8.browsing_desktop/browse:media:youtube:2019"
     },
     {
-        "duration": "65.0",
+        "duration": "144.0",
         "name": "v8.browsing_desktop/browse:media:youtubetv:2019"
     },
     {
-        "duration": "43.0",
+        "duration": "112.0",
         "name": "v8.browsing_desktop/browse:news:cnn:2018"
     },
     {
-        "duration": "50.0",
+        "duration": "100.0",
         "name": "v8.browsing_desktop/browse:news:flipboard:2018"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "v8.browsing_desktop/browse:news:hackernews:2018"
     },
     {
-        "duration": "63.0",
+        "duration": "124.0",
         "name": "v8.browsing_desktop/browse:news:nytimes:2018"
     },
     {
-        "duration": "52.0",
+        "duration": "102.0",
         "name": "v8.browsing_desktop/browse:news:reddit:2018"
     },
     {
-        "duration": "50.0",
+        "duration": "100.0",
         "name": "v8.browsing_desktop/browse:search:google:2018"
     },
     {
-        "duration": "37.0",
+        "duration": "72.0",
         "name": "v8.browsing_desktop/browse:search:google_india:2018"
     },
     {
-        "duration": "70.0",
+        "duration": "144.0",
         "name": "v8.browsing_desktop/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "60.0",
+        "duration": "118.0",
         "name": "v8.browsing_desktop/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "47.0",
+        "duration": "98.0",
         "name": "v8.browsing_desktop/browse:social:twitter:2018"
     },
     {
-        "duration": "63.0",
+        "duration": "136.0",
         "name": "v8.browsing_desktop/browse:social:twitter_infinite_scroll:2018"
     },
     {
-        "duration": "62.0",
+        "duration": "144.0",
         "name": "v8.browsing_desktop/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "44.0",
+        "duration": "86.0",
         "name": "v8.browsing_desktop/browse:tools:docs_scrolling"
     },
     {
-        "duration": "72.0",
+        "duration": "142.0",
         "name": "v8.browsing_desktop/browse:tools:maps:2019"
     },
     {
-        "duration": "35.0",
+        "duration": "68.0",
         "name": "v8.browsing_desktop/browse:tools:sheets:2019"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "webrtc/10s_datachannel_transfer"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "webrtc/canvas_capture_peer_connection"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "webrtc/codec_constraints_h264"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "webrtc/codec_constraints_vp8"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "webrtc/codec_constraints_vp9"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "webrtc/hd_local_stream_10s"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "webrtc/multiple_peerconnections"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "webrtc/pause_play_peerconnections"
     },
     {
@@ -4072,10 +4076,6 @@
         "name": "base_perftests/_gtest_"
     },
     {
-        "duration": "60.0",
-        "name": "net_perftests/_gtest_"
-    },
-    {
         "duration": "67.0",
         "name": "performance_browser_tests/_gtest_"
     },
@@ -4084,11 +4084,15 @@
         "name": "load_library_perf_tests/_gtest_"
     },
     {
-        "duration": "50.0",
-        "name": "tracing_perftests/_gtest_"
+        "duration": "60.0",
+        "name": "net_perftests/_gtest_"
     },
     {
         "duration": "16.0",
         "name": "media_perftests/_gtest_"
+    },
+    {
+        "duration": "50.0",
+        "name": "tracing_perftests/_gtest_"
     }
 ]
\ No newline at end of file
diff --git a/tools/perf/core/shard_maps/timing_data/mac-10_12_laptop_low_end-perf_timing.json b/tools/perf/core/shard_maps/timing_data/mac-10_12_laptop_low_end-perf_timing.json
index 150d8ec6..e1ec8a3 100644
--- a/tools/perf/core/shard_maps/timing_data/mac-10_12_laptop_low_end-perf_timing.json
+++ b/tools/perf/core/shard_maps/timing_data/mac-10_12_laptop_low_end-perf_timing.json
@@ -1,3866 +1,3870 @@
 [
     {
-        "duration": "27.0",
+        "duration": "56.0",
         "name": "blink_perf.accessibility/line-breaks.html"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "blink_perf.accessibility/textarea-append.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.bindings/append-child.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/create-element.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/document-implementation.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/dom-attribute-on-prototoype.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/first-child.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/gc-forest.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/gc-mini-tree.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/gc-tree.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/get-attribute-rare.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/get-attribute.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/get-element-by-id.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/get-elements-by-tag-name.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/id-getter.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/id-setter.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/indexed-getter.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/insert-before.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/named-property-enumerator.html"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "blink_perf.bindings/node-list-access.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/node-type.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.bindings/post-message.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/sequence-conversion-array.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/sequence-conversion-custom-iterator.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.bindings/serialize-array.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.bindings/serialize-long-string.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.bindings/serialize-map.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.bindings/serialize-nested-array.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/set-attribute-rare.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/set-attribute.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/structured-clone-json-deserialize.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/structured-clone-json-serialize.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.bindings/structured-clone-long-string-deserialize.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.bindings/structured-clone-long-string-serialize.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/typed-array-construct-from-array.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/typed-array-construct-from-same-type.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/typed-array-construct-from-typed.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/typed-array-set-from-typed.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/undefined-first-child.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/undefined-get-element-by-id.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/undefined-id-getter.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.bindings/worker-structured-clone-different-payloads.html"
     },
     {
-        "duration": "17.0",
+        "duration": "32.0",
         "name": "blink_perf.bindings/worker-structured-clone-json-from-worker.html"
     },
     {
-        "duration": "17.0",
+        "duration": "32.0",
         "name": "blink_perf.bindings/worker-structured-clone-json-roundtrip.html"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "blink_perf.bindings/worker-structured-clone-json-to-worker.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.bindings/worker-structured-clone-workerDOM-DBMon-from-worker.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.bindings/worker-structured-clone-workerDOM-Map-from-worker.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.bindings/worker-text-encoded-transferable-from-worker.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.bindings/worker-text-encoded-transferable-roundtrip.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.bindings/worker-text-encoded-transferable-to-worker.html"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "blink_perf.bindings/worker-transferable-from-worker.html"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "blink_perf.bindings/worker-transferable-roundtrip.html"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "blink_perf.bindings/worker-transferable-to-worker.html"
     },
     {
-        "duration": "43.0",
+        "duration": "86.0",
         "name": "blink_perf.canvas/canvas-to-canvas-draw.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.canvas/canvas-to-canvas-draw_RAF.html?RAF"
     },
     {
-        "duration": "13.0",
+        "duration": "18.0",
         "name": "blink_perf.canvas/createImageBitmapFromImageData.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.canvas/createImageBitmapFromImageData_RAF.html?RAF"
     },
     {
-        "duration": "10.0",
+        "duration": "18.0",
         "name": "blink_perf.canvas/docs-paper.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.canvas/docs-paper_RAF.html?RAF"
     },
     {
-        "duration": "19.0",
+        "duration": "36.0",
         "name": "blink_perf.canvas/docs-resume.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.canvas/docs-resume_RAF.html?RAF"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "blink_perf.canvas/docs-table.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.canvas/docs-table_RAF.html?RAF"
     },
     {
-        "duration": "6.0",
+        "duration": "20.0",
         "name": "blink_perf.canvas/draw-dynamic-canvas-2d-to-hw-accelerated-canvas-2d.html"
     },
     {
-        "duration": "9.0",
+        "duration": "28.0",
         "name": "blink_perf.canvas/draw-dynamic-canvas-2d-to-hw-accelerated-canvas-2d_RAF.html?RAF"
     },
     {
-        "duration": "8.0",
+        "duration": "32.0",
         "name": "blink_perf.canvas/draw-dynamic-webgl-to-hw-accelerated-canvas-2d.html"
     },
     {
-        "duration": "14.0",
+        "duration": "32.0",
         "name": "blink_perf.canvas/draw-dynamic-webgl-to-hw-accelerated-canvas-2d_RAF.html?RAF"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.canvas/draw-hw-accelerated-canvas-2d-to-sw-canvas-2d.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/draw-hw-accelerated-canvas-2d-to-sw-canvas-2d_RAF.html?RAF"
     },
     {
-        "duration": "3.0",
+        "duration": "8.0",
         "name": "blink_perf.canvas/draw-static-canvas-2d-to-hw-accelerated-canvas-2d.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.canvas/draw-static-canvas-2d-to-hw-accelerated-canvas-2d_RAF.html?RAF"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.canvas/draw-static-webgl-to-hw-accelerated-canvas-2d.html"
     },
     {
-        "duration": "7.0",
+        "duration": "22.0",
         "name": "blink_perf.canvas/draw-static-webgl-to-hw-accelerated-canvas-2d_RAF.html?RAF"
     },
     {
-        "duration": "6.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/draw-video-to-hw-accelerated-canvas-2d.html"
     },
     {
-        "duration": "6.0",
+        "duration": "20.0",
         "name": "blink_perf.canvas/draw-video-to-hw-accelerated-canvas-2d_RAF.html?RAF"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.canvas/drawimage-not-pixelaligned.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.canvas/drawimage-not-pixelaligned_RAF.html?RAF"
     },
     {
-        "duration": "10.0",
+        "duration": "26.0",
         "name": "blink_perf.canvas/drawimage.html"
     },
     {
-        "duration": "10.0",
+        "duration": "30.0",
         "name": "blink_perf.canvas/drawimage_RAF.html?RAF"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.canvas/getImageData.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.canvas/getImageDataColorManaged.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.canvas/getImageDataColorManaged_RAF.html?RAF"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.canvas/getImageData_RAF.html?RAF"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.canvas/gpu-bound-shader.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.canvas/gpu-bound-shader_RAF.html?RAF"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.canvas/putImageData.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.canvas/putImageData_RAF.html?RAF"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "blink_perf.canvas/sheets-render.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.canvas/sheets-render_RAF.html?RAF"
     },
     {
-        "duration": "28.0",
+        "duration": "54.0",
         "name": "blink_perf.canvas/toBlob_duration.html"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "blink_perf.canvas/toBlob_duration_RAF.html?RAF"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.canvas/toBlob_duration_jpeg.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.canvas/toBlob_duration_jpeg_RAF.html?RAF"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.canvas/transferFromImageBitmap.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.canvas/transferFromImageBitmap_RAF.html?RAF"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/upload-canvas-2d-to-texture.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.canvas/upload-canvas-2d-to-texture_RAF.html?RAF"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.canvas/upload-video-to-sub-texture.html"
     },
     {
-        "duration": "5.0",
+        "duration": "8.0",
         "name": "blink_perf.canvas/upload-video-to-sub-texture_RAF.html?RAF"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.canvas/upload-video-to-texture.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/upload-video-to-texture_RAF.html?RAF"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/upload-webgl-to-texture.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.canvas/upload-webgl-to-texture_RAF.html?RAF"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "blink_perf.css/AttributeDescendantSelector.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.css/CSSPropertySetterGetter.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.css/CSSPropertySetterGetterMethods.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.css/CSSPropertyUpdateValue.html"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "blink_perf.css/ChangeStyleChildClassSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.css/ChangeStyleChildElementSelectors.html"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "blink_perf.css/ChangeStyleElementSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "blink_perf.css/ChangeStyleGrandChildElementSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "blink_perf.css/ChangeStyleMultipleClassSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "blink_perf.css/ChangeStyleMultipleQualifiedDataAttributesWithValuesSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.css/ChangeStyleNestedPseudoSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.css/ChangeStylePairOfNthChildSelector.html"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "blink_perf.css/ChangeStylePartialAttributeMatchingSelector.html"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "18.0",
         "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeWithValueSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "blink_perf.css/ChangeStyleShallowTree.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.css/ChangeStyleSingleClassSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "18.0",
         "name": "blink_perf.css/ChangeStyleSingleNthChildSelector.html"
     },
     {
-        "duration": "10.0",
+        "duration": "18.0",
         "name": "blink_perf.css/ChangeStyleSinglePseudoSelector.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.css/ChangeStyleUniversalSelector.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeSelector.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeWithValueSelector.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.css/ClassDescendantSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.css/ClassInvalidation.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.css/CustomPropertiesCascade.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.css/CustomPropertiesNonRootInheritance.html"
     },
     {
-        "duration": "5.0",
+        "duration": "12.0",
+        "name": "blink_perf.css/CustomPropertiesPendingSubstitution.html"
+    },
+    {
+        "duration": "10.0",
         "name": "blink_perf.css/CustomPropertiesRootInheritance.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.css/CustomPropertiesVarAlias.html"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "blink_perf.css/FocusUpdate.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.css/LoadBootstrapBlog.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.css/LoadMaterializeStarterPage.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.css/LoadSemanticPageExample.html"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "blink_perf.css/PseudoClassSelectors.html"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "blink_perf.css/SelectorCountScaling.html"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "blink_perf.display_locking/abs_pos_outer_sizes_change.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.display_locking/fieldset_container_width_changes.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.display_locking/flex_container_width_changes.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.display_locking/forced_layout_on_locked_el.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.display_locking/inner_sizes_change.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.display_locking/outer_sizes_change.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.display_locking/outer_sizes_change_activatable.html"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "blink_perf.display_locking/outer_sizes_change_iframe.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.display_locking/unlock_top_items.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.display_locking/unlock_top_items_nested.html"
     },
     {
-        "duration": "36.0",
+        "duration": "72.0",
         "name": "blink_perf.dom/custom-element-default-style-with-shadow.html"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "blink_perf.dom/custom-element-default-style.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.dom/long-sibling-list.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.dom/modify-element-classname.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.dom/modify-element-id.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.dom/modify-element-title.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.dom/select-multiple-add.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.dom/select-single-add.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.dom/select-single-remove.html"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "blink_perf.events/EventsDispatching.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.events/EventsDispatchingInDeeplyNestedV0ShadowTrees.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.events/EventsDispatchingInDeeplyNestedV1ShadowTrees.html"
     },
     {
-        "duration": "15.0",
+        "duration": "36.0",
         "name": "blink_perf.events/EventsDispatchingInV0ShadowTrees.html"
     },
     {
-        "duration": "14.0",
+        "duration": "34.0",
         "name": "blink_perf.events/EventsDispatchingInV1ShadowTrees.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.events/hit-test-lots-of-layers.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.events/is-input-pending-all-events.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.events/is-input-pending-default-events.html"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "blink_perf.image_decoder/decode-gif.html"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h1v1.html"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h1v2.html"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h2v1.html"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h2v2.html"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "blink_perf.image_decoder/decode-lossless-webp.html"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "blink_perf.image_decoder/decode-lossy-webp.html"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "blink_perf.image_decoder/decode-png-palette-opaque.html"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "blink_perf.image_decoder/decode-png-palette.html"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "blink_perf.image_decoder/decode-png.html"
     },
     {
-        "duration": "24.0",
+        "duration": "50.0",
         "name": "blink_perf.layout/ArabicLineLayout.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.layout/Shapes/MultipleShapes.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/SimpleTextPathLineLayout.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/add-remove-inline-floats.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.layout/animate-abspos-deep.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/attach-inlines-2.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/attach-inlines.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/auto-grid-lots-of-data.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/auto-grid-lots-of-spanning-data.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/change-text-css-contain.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/chapter-reflow-once-random.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/chapter-reflow-once.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/chapter-reflow-thrice.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/chapter-reflow-twice.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/chapter-reflow.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.layout/character_fallback.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/contain-content-style-change.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/editing_append.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/editing_append_single_line.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/editing_delete.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/editing_insert.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/editing_prepend.html"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "blink_perf.layout/fit-content-change-available-size-blocks.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/fit-content-change-available-size-text.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/fixed-grid-lots-of-data.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/fixed-grid-lots-of-stretched-data.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/flexbox-column-nowrap.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/flexbox-column-wrap.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/flexbox-deeply-nested-column-flow.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/flexbox-lots-of-data.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/flexbox-row-nowrap.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/flexbox-row-stretch-height-definite.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/flexbox-row-wrap.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/flexbox-with-stretch-layout.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.layout/flexbox_with_list_item.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/floats_100_100.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/floats_100_100_nested.html"
     },
     {
-        "duration": "6.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/floats_10_1000.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/floats_20_100.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/floats_20_100_nested.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.layout/floats_2_100.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.layout/floats_2_100_nested.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/floats_50_100.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/floats_50_100_nested.html"
     },
     {
-        "duration": "38.0",
+        "duration": "84.0",
         "name": "blink_perf.layout/hindi-line-layout.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/japanese-kokoro-insert.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.layout/large-grid.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/large-spanning-grid-item.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans-wider-than-table.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/large-table-with-collapsed-borders-and-no-colspans.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/latin-ebook-resize.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/latin-ebook.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.layout/layers_overlap_2d.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.layout/layers_overlap_3d.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/line-layout-fit-content-break-word.html"
     },
     {
-        "duration": "8.0",
+        "duration": "28.0",
         "name": "blink_perf.layout/line-layout-fit-content.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/line-layout-line-height.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/line-layout-repeat-append-select.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/line-layout-repeat-append.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/line-layout.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.layout/long-line-nowrap-collapse.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.layout/long-line-nowrap-spans-collapse.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/long-line-nowrap.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/many-block-children-auto-inline-size.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/many-block-children-fixed-inline-size.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/multicol/balance-forced-breaks.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/multicol/deeply-nested-tables.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/multicol/fixed-height-with-spanner-and-nested-tables.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/multicol/lots-of-small-nested-unbreakable-blocks-autofill.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/multicol/lots-of-small-unbreakable-blocks-autofill.html"
     },
     {
-        "duration": "23.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/multicol/lots-of-text-autofill.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/multicol/lots-of-text-balanced-orphans-widows.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/multicol/lots-of-text-balanced.html"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "blink_perf.layout/multicol/nested-forced-breaks.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/multicol/tall-content-short-columns-realistic.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/multicol/tall-content-short-columns.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/nested-blocks-with-percent-height-and-max-height.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/nested-grid.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/nested-percent-height-tables.html"
     },
     {
-        "duration": "40.0",
+        "duration": "78.0",
         "name": "blink_perf.layout/subtree-detaching.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/vertical-japanese-kokoro-insert.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.layout/word-break-break-all.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.layout/word-break-break-word.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.layout/word-wrap-break-word.html"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "blink_perf.owp_storage/blob-perf-files.html"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "blink_perf.owp_storage/blob-perf-ipc.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.owp_storage/blob-perf-shm.html"
     },
     {
-        "duration": "13.0",
+        "duration": "28.0",
         "name": "blink_perf.owp_storage/blob-perf-tiny.html"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "blink_perf.owp_storage/idb-load-docs.html"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "blink_perf.paint/appending-text.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.paint/color-changes.html"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "blink_perf.paint/complex-content-slow-scroll.html"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "blink_perf.paint/complex-iframe-filtered.html"
     },
     {
-        "duration": "31.0",
+        "duration": "62.0",
         "name": "blink_perf.paint/contain-update-layer-tree.html"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "blink_perf.paint/containment-resize.html"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "blink_perf.paint/fixed-and-many-layers-scroll.html"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "blink_perf.paint/large-table-background-change-with-invisible-collapsed-borders.html"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "blink_perf.paint/large-table-background-change-with-visible-collapsed-borders.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.paint/large-table-background-change-with-zero-width-collapsed-borders.html"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "blink_perf.paint/large-table-collapsed-border-change-with-backgrounds.html"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "blink_perf.paint/large-table-collapsed-border-change-with-text.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.paint/large-table-collapsed-border-change.html"
     },
     {
-        "duration": "13.0",
+        "duration": "28.0",
         "name": "blink_perf.paint/large-table-repaint.html"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "blink_perf.paint/move-text-with-mask.html"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "blink_perf.paint/paint-offset-changes.html"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "blink_perf.paint/select-all-words.html"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "blink_perf.paint/transform-changes.html"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "blink_perf.parser/css-parser-yui.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.parser/html-parser-threaded.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.parser/html-parser.html"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "blink_perf.parser/html5-full-render.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/iframe-append-remove.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/innerHTML-setter-siblings.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/innerHTML-setter.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/query-selector-all-attribute-complex.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/query-selector-all-attribute.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/query-selector-all-class-deep.html"
     },
     {
-        "duration": "8.0",
+        "duration": "20.0",
         "name": "blink_perf.parser/query-selector-all-class-first.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/query-selector-all-class-last.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/query-selector-all-class.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/query-selector-all-deep.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/query-selector-all-first.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/query-selector-all-id-deep.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/query-selector-all-id-first.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/query-selector-all-id-last.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/query-selector-all-last.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/query-selector-deep.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/query-selector-first.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/query-selector-id-deep.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/query-selector-id-last.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/query-selector-last.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/simple-url.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/textarea-parsing.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/tiny-innerHTML.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.parser/url-parser.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/xml-parser.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.shadow_dom/declarative-api.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/imperative-api-appendchild.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/imperative-api-assign.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/imperative-api-assigned-elements.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/imperative-api-assigned-slot.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/imperative-api-custom-detail-summary-large.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/imperative-api-custom-detail-summary.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/imperative-api-detail-summary-large.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/imperative-api-detail-summary.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/imperative-api-insertbefore.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/imperative-api.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/shadow-style-share-attr-selectors.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/shadow-style-share-media-query.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/shadow-style-share-with-distribution.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/shadow-style-share.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/style-sheet-insert.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v0-changing-classname-with-shadow-dom.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v0-changing-classname-without-shadow-dom.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.shadow_dom/v0-changing-select-with-shadow-dom.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.shadow_dom/v0-changing-select-without-shadow-dom.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v0-content-reprojection.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v0-large-distribution-without-layout.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v0-multiple-insertion-points.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v0-shadow-reprojection.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v0-small-distribution-with-layout.html"
     },
     {
-        "duration": "7.0",
+        "duration": "12.0",
         "name": "blink_perf.shadow_dom/v1-distribution-disconnected-and-reconnected.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-distribution.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-host-child-append.html"
     },
     {
-        "duration": "7.0",
+        "duration": "12.0",
         "name": "blink_perf.shadow_dom/v1-large-deep-distribution.html"
     },
     {
-        "duration": "9.0",
+        "duration": "16.0",
         "name": "blink_perf.shadow_dom/v1-large-deep-layout.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-append-layout.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-distribution.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-layout.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-prepend-layout.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-re-layout.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-slot-assigned-nodes.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-slot-flatten.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-re-layout.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-assigned-nodes.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-flatten.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-slot-append.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v1-small-deep-distribution.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v1-small-deep-layout.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-small-shallow-distribution.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-small-shallow-layout.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.svg/AzLizardBenjiPark.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.svg/Bamboo.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.svg/Cactus.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.svg/Cowboy.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.svg/Cowboy_transform.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/CrawFishGanson.html"
     },
     {
-        "duration": "2.0",
+        "duration": "6.0",
         "name": "blink_perf.svg/Debian.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/DropsOnABlade.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/FlowerFromMyGarden.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/FoodLeifLodahl.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/France.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/FrancoBolloGnomeEzechi.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.svg/GearFlowers.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/HarveyRayner.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/HereGear.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.svg/MtSaintHelens.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/Samurai.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.svg/SierpinskiCarpet.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.svg/SvgCubics.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.svg/SvgHitTesting.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.svg/SvgNestedUse.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/UnderTheSee.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.svg/WorldIso.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.svg/Worldcup.html"
     },
     {
-        "duration": "38.0",
+        "duration": "74.0",
         "name": "dromaeo/http://dromaeo.com?dom-attr"
     },
     {
-        "duration": "34.0",
+        "duration": "68.0",
         "name": "dromaeo/http://dromaeo.com?dom-modify"
     },
     {
-        "duration": "48.0",
+        "duration": "96.0",
         "name": "dromaeo/http://dromaeo.com?dom-query"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "dromaeo/http://dromaeo.com?dom-traverse"
     },
     {
-        "duration": "7.0",
+        "duration": "12.0",
         "name": "dummy_benchmark.noisy_benchmark_1/dummy_page.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "dummy_benchmark.stable_benchmark_1/dummy_page.html"
     },
     {
-        "duration": "199.0",
+        "duration": "400.0",
         "name": "jetstream/JetStream"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "kraken/http://krakenbenchmark.mozilla.org/kraken-1.1/driver.html"
     },
     {
-        "duration": "17.0",
+        "duration": "62.0",
         "name": "loading.desktop/24h_cold"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "loading.desktop/24h_warm"
     },
     {
-        "duration": "23.0",
+        "duration": "44.0",
         "name": "loading.desktop/AirBnB_cold"
     },
     {
-        "duration": "33.0",
+        "duration": "66.0",
         "name": "loading.desktop/AirBnB_warm"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "loading.desktop/Aljayyash_cold"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "loading.desktop/Aljayyash_warm"
     },
     {
-        "duration": "10.0",
+        "duration": "18.0",
         "name": "loading.desktop/AllRecipes_cold"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "loading.desktop/AllRecipes_warm"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "loading.desktop/ArsTechnica_cold"
     },
     {
-        "duration": "33.0",
+        "duration": "66.0",
         "name": "loading.desktop/ArsTechnica_warm"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "loading.desktop/Baidu_cold"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "loading.desktop/Baidu_warm"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "loading.desktop/Bhaskar_cold"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "loading.desktop/Bhaskar_warm"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "loading.desktop/Chosun_cold"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "loading.desktop/Chosun_warm"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "loading.desktop/Colorado.edu_cold"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "loading.desktop/Colorado.edu_warm"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "loading.desktop/Danawa_cold"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "loading.desktop/Danawa_warm"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "loading.desktop/Daum_cold"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "loading.desktop/Daum_warm"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "loading.desktop/Donga_cold"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "loading.desktop/Donga_warm"
     },
     {
-        "duration": "20.0",
+        "duration": "42.0",
         "name": "loading.desktop/Economist_cold"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "loading.desktop/Economist_warm"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "loading.desktop/Elmundo_cold"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "loading.desktop/Elmundo_warm"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "loading.desktop/FC2Blog_cold"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "loading.desktop/FC2Blog_warm"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "loading.desktop/FIFA_cold"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "loading.desktop/FIFA_warm"
     },
     {
-        "duration": "28.0",
+        "duration": "54.0",
         "name": "loading.desktop/FarsNews_cold"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "loading.desktop/FarsNews_warm"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "loading.desktop/Flickr_cold"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "loading.desktop/Flickr_warm"
     },
     {
-        "duration": "30.0",
+        "duration": "34.0",
         "name": "loading.desktop/FlipKart_cold"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "loading.desktop/FlipKart_warm"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "loading.desktop/Free.fr_cold"
     },
     {
-        "duration": "17.0",
+        "duration": "32.0",
         "name": "loading.desktop/Free.fr_warm"
     },
     {
-        "duration": "30.0",
+        "duration": "34.0",
         "name": "loading.desktop/HTML5Rocks_cold"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "loading.desktop/HTML5Rocks_warm"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "loading.desktop/Haraj_cold"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "loading.desktop/Haraj_warm"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "loading.desktop/HatenaBookmark_cold"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "loading.desktop/HatenaBookmark_warm"
     },
     {
-        "duration": "17.0",
+        "duration": "58.0",
         "name": "loading.desktop/IGN_cold"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "loading.desktop/IGN_warm"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "loading.desktop/IMDB_cold"
     },
     {
-        "duration": "37.0",
+        "duration": "82.0",
         "name": "loading.desktop/IMDB_warm"
     },
     {
-        "duration": "16.0",
+        "duration": "62.0",
         "name": "loading.desktop/IndiaTimes_cold"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "loading.desktop/IndiaTimes_warm"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "loading.desktop/Kakaku_cold"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "loading.desktop/Kakaku_warm"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "loading.desktop/Kenh14_cold"
     },
     {
-        "duration": "31.0",
+        "duration": "60.0",
         "name": "loading.desktop/Kenh14_warm"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "loading.desktop/Mercadolivre_cold"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "loading.desktop/Mercadolivre_warm"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "loading.desktop/Naver_cold"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "loading.desktop/Naver_warm"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "loading.desktop/Orange_cold"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "loading.desktop/Orange_warm"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "loading.desktop/Pantip_cold"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "loading.desktop/Pantip_warm"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "loading.desktop/PremierLeague_cold"
     },
     {
-        "duration": "20.0",
+        "duration": "42.0",
         "name": "loading.desktop/PremierLeague_warm"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "loading.desktop/QQ_cold"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "loading.desktop/QQ_warm"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "loading.desktop/REI_cold"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "loading.desktop/REI_warm"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "loading.desktop/Ruten_cold"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "loading.desktop/Ruten_warm"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "loading.desktop/Sina_cold"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "loading.desktop/Sina_warm"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "loading.desktop/Taobao_cold"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "loading.desktop/Taobao_warm"
     },
     {
-        "duration": "19.0",
+        "duration": "42.0",
         "name": "loading.desktop/TheOnion_cold"
     },
     {
-        "duration": "24.0",
+        "duration": "76.0",
         "name": "loading.desktop/TheOnion_warm"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "loading.desktop/TheVerge_cold"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "loading.desktop/TheVerge_warm"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "loading.desktop/TicketMaster_cold"
     },
     {
-        "duration": "24.0",
+        "duration": "50.0",
         "name": "loading.desktop/TicketMaster_warm"
     },
     {
-        "duration": "19.0",
+        "duration": "42.0",
         "name": "loading.desktop/Vietnamnet_cold"
     },
     {
-        "duration": "40.0",
+        "duration": "54.0",
         "name": "loading.desktop/Vietnamnet_warm"
     },
     {
-        "duration": "18.0",
+        "duration": "40.0",
         "name": "loading.desktop/Vnexpress_cold"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "loading.desktop/Vnexpress_warm"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "loading.desktop/Walgreens_cold"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "loading.desktop/Walgreens_warm"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "loading.desktop/Yandex_cold"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "loading.desktop/Yandex_warm"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "loading.desktop/amazon.co.jp_cold"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "loading.desktop/amazon.co.jp_warm"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "loading.desktop/ja.wikipedia_cold"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "loading.desktop/ja.wikipedia_warm"
     },
     {
-        "duration": "20.0",
+        "duration": "42.0",
         "name": "loading.desktop/money.cnn_cold"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "loading.desktop/money.cnn_warm"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "loading.desktop/ru.wikipedia_cold"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "loading.desktop/ru.wikipedia_warm"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "loading.desktop/uol.com.br_cold"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "loading.desktop/uol.com.br_warm"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "loading.desktop/yahoo.co.jp_cold"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "loading.desktop/yahoo.co.jp_warm"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "media.desktop/mse.html?media=aac_audio.mp4"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "media.desktop/mse.html?media=aac_audio.mp4,h264_video.mp4"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "media.desktop/mse.html?media=h264_video.mp4"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "media.desktop/mse.html?media=tulip0.av1.mp4"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "media.desktop/mse.html?media=tulip2.vp9.webm"
     },
     {
-        "duration": "22.0",
+        "duration": "42.0",
         "name": "media.desktop/video.html?src=crowd1080.mp4"
     },
     {
-        "duration": "24.0",
+        "duration": "46.0",
         "name": "media.desktop/video.html?src=crowd1080.webm"
     },
     {
-        "duration": "22.0",
+        "duration": "42.0",
         "name": "media.desktop/video.html?src=crowd1080_vp9.webm"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "media.desktop/video.html?src=garden2_10s.mp4&seek"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "media.desktop/video.html?src=garden2_10s.webm&seek"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "media.desktop/video.html?src=smpte_3840x2160_60fps_vp9.webm&seek"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "media.desktop/video.html?src=tulip0.av1.mp4"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "media.desktop/video.html?src=tulip0.av1.mp4&seek"
     },
     {
-        "duration": "29.0",
+        "duration": "56.0",
         "name": "media.desktop/video.html?src=tulip2.m4a&type=audio"
     },
     {
-        "duration": "29.0",
+        "duration": "56.0",
         "name": "media.desktop/video.html?src=tulip2.mp3&type=audio"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "media.desktop/video.html?src=tulip2.mp3&type=audio&seek"
     },
     {
-        "duration": "29.0",
+        "duration": "56.0",
         "name": "media.desktop/video.html?src=tulip2.mp4"
     },
     {
-        "duration": "29.0",
+        "duration": "56.0",
         "name": "media.desktop/video.html?src=tulip2.mp4&busyjs"
     },
     {
-        "duration": "29.0",
+        "duration": "56.0",
         "name": "media.desktop/video.html?src=tulip2.ogg&type=audio"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "media.desktop/video.html?src=tulip2.ogg&type=audio&seek"
     },
     {
-        "duration": "29.0",
+        "duration": "56.0",
         "name": "media.desktop/video.html?src=tulip2.vp9.webm"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "media.desktop/video.html?src=tulip2.vp9.webm&background"
     },
     {
-        "duration": "31.0",
+        "duration": "60.0",
         "name": "media.desktop/video.html?src=tulip2.vp9.webm_WiFi"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "memory.desktop/TrivialAnimationPageSharedPageState"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "memory.desktop/TrivialBlinkingCursorPageSharedPageState"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "memory.desktop/TrivialBlurAnimationPageSharedPageState"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "memory.desktop/TrivialCanvasPageSharedPageState"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "memory.desktop/TrivialFullscreenVideoPageSharedPageState"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "memory.desktop/TrivialGifPageSharedPageState"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "memory.desktop/TrivialScrollingPageSharedPageState"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "memory.desktop/TrivialWebGLPageSharedPageState"
     },
     {
-        "duration": "54.0",
+        "duration": "110.0",
         "name": "memory.desktop/WebWorker"
     },
     {
-        "duration": "45.0",
+        "duration": "90.0",
         "name": "octane/Octane"
     },
     {
-        "duration": "41.0",
+        "duration": "82.0",
         "name": "power.desktop/TrivialAnimationPageSharedPageState"
     },
     {
-        "duration": "41.0",
+        "duration": "82.0",
         "name": "power.desktop/TrivialBlinkingCursorPageSharedPageState"
     },
     {
-        "duration": "41.0",
+        "duration": "82.0",
         "name": "power.desktop/TrivialBlurAnimationPageSharedPageState"
     },
     {
-        "duration": "41.0",
+        "duration": "82.0",
         "name": "power.desktop/TrivialCanvasPageSharedPageState"
     },
     {
-        "duration": "42.0",
+        "duration": "84.0",
         "name": "power.desktop/TrivialFullscreenVideoPageSharedPageState"
     },
     {
-        "duration": "41.0",
+        "duration": "82.0",
         "name": "power.desktop/TrivialGifPageSharedPageState"
     },
     {
-        "duration": "43.0",
+        "duration": "86.0",
         "name": "power.desktop/TrivialScrollingPageSharedPageState"
     },
     {
-        "duration": "41.0",
+        "duration": "82.0",
         "name": "power.desktop/TrivialWebGLPageSharedPageState"
     },
     {
-        "duration": "51.0",
+        "duration": "100.0",
         "name": "power.desktop/abcnews"
     },
     {
-        "duration": "42.0",
+        "duration": "86.0",
         "name": "power.desktop/indiatimes"
     },
     {
-        "duration": "41.0",
+        "duration": "82.0",
         "name": "power.desktop/instagram"
     },
     {
-        "duration": "42.0",
+        "duration": "86.0",
         "name": "power.desktop/microsoft"
     },
     {
-        "duration": "43.0",
+        "duration": "104.0",
         "name": "power.desktop/sina"
     },
     {
-        "duration": "42.0",
+        "duration": "84.0",
         "name": "power.desktop/slideshare"
     },
     {
-        "duration": "43.0",
+        "duration": "86.0",
         "name": "power.desktop/uol"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "rasterize_and_record_micro.partial_invalidation/800_relpos_divs.html"
     },
     {
-        "duration": "14.0",
+        "duration": "26.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/amazon.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/blogger.html"
     },
     {
-        "duration": "9.0",
+        "duration": "16.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/booking.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/cnn.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/ebay.html"
     },
     {
-        "duration": "13.0",
+        "duration": "24.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/espn.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/facebook.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/gmail.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/google.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googlecalendar.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googledocs.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleimagesearch.html"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleplus.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/linkedin.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/pinterest.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/techcrunch.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/twitter.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/weather.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/wikipedia.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/wordpress.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahooanswers.html"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoogames.html"
     },
     {
-        "duration": "98.0",
+        "duration": "180.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoonews.html"
     },
     {
-        "duration": "72.0",
+        "duration": "144.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoosports.html"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/youtube.html"
     },
     {
-        "duration": "30.0",
+        "duration": "58.0",
         "name": "rendering.desktop/accu_weather_2018"
     },
     {
-        "duration": "33.0",
+        "duration": "70.0",
         "name": "rendering.desktop/accu_weather_pinch_2018"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "rendering.desktop/amazon_2018"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "rendering.desktop/amazon_pinch_2018"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "rendering.desktop/analog_clock_svg"
     },
     {
-        "duration": "26.0",
+        "duration": "50.0",
         "name": "rendering.desktop/animometer_webgl"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "rendering.desktop/animometer_webgl_attrib_arrays"
     },
     {
-        "duration": "33.0",
+        "duration": "68.0",
         "name": "rendering.desktop/animometer_webgl_multi_draw"
     },
     {
-        "duration": "27.0",
+        "duration": "56.0",
         "name": "rendering.desktop/aquarium"
     },
     {
-        "duration": "29.0",
+        "duration": "60.0",
         "name": "rendering.desktop/aquarium_20k"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "rendering.desktop/background_color_animation"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "rendering.desktop/background_color_animation_with_gradient"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "rendering.desktop/balls_css_key_frame_animations"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.desktop/balls_css_key_frame_animations_composited_transform"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "rendering.desktop/balls_css_transition_2_properties"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "rendering.desktop/balls_css_transition_40_properties"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "rendering.desktop/balls_css_transition_all_properties"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "rendering.desktop/balls_javascript_canvas"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "rendering.desktop/balls_javascript_css"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "rendering.desktop/balls_svg_animations"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "rendering.desktop/blob"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "rendering.desktop/blogspot_2018"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "rendering.desktop/blogspot_pinch_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "38.0",
         "name": "rendering.desktop/blur_rotating_background"
     },
     {
-        "duration": "19.0",
+        "duration": "56.0",
         "name": "rendering.desktop/booking.com_2018"
     },
     {
-        "duration": "20.0",
+        "duration": "50.0",
         "name": "rendering.desktop/booking_pinch_2018"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/bouncing_balls_15"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.desktop/bouncing_balls_shadow"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.desktop/bouncing_clipped_rectangles"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.desktop/bouncing_gradient_circles"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/bouncing_png_images"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "rendering.desktop/bouncing_svg_images"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.desktop/camera_to_webgl"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/canvas_05000_pixels_per_second"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/canvas_10000_pixels_per_second"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/canvas_20000_pixels_per_second"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/canvas_40000_pixels_per_second"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/canvas_60000_pixels_per_second"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/canvas_75000_pixels_per_second"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/canvas_90000_pixels_per_second"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/canvas_animation_no_clear"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/canvas_arcs"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/canvas_font_cycler"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/canvas_lines"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/canvas_to_blob"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/cats_unscaled"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "rendering.desktop/cats_viewport_width"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.desktop/cc_poster_circle"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "rendering.desktop/cc_scroll_text_only"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.desktop/chip_tune"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.desktop/cnn_2018"
     },
     {
-        "duration": "30.0",
+        "duration": "50.0",
         "name": "rendering.desktop/cnn_pinch_2018"
     },
     {
-        "duration": "26.0",
+        "duration": "46.0",
         "name": "rendering.desktop/compositor_heavy_animation"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/crafty_mind"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "rendering.desktop/css_animations_many_keyframes"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/css_animations_simultaneous_inline_style"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/css_animations_simultaneous_new_element"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/css_animations_simultaneous_style_element"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/css_animations_simultaneous_updating_class"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/css_animations_staggered_infinite_iterations"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.desktop/css_animations_staggered_inline_style"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.desktop/css_animations_staggered_new_element"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.desktop/css_animations_staggered_style_element"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.desktop/css_animations_staggered_updating_class"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.desktop/css_animations_triggered_inline_style"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.desktop/css_animations_triggered_new_element"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/css_animations_triggered_style_element"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.desktop/css_animations_triggered_updating_class"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "rendering.desktop/css_opacity_plus_n_layers_99"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/css_transitions_inline_style"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/css_transitions_new_element"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/css_transitions_staggered_inline_style"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/css_transitions_staggered_new_element"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/css_transitions_staggered_style_element"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/css_transitions_staggered_updating_class"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/css_transitions_style_element"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/css_transitions_triggered_inline_style"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/css_transitions_triggered_new_element"
     },
     {
-        "duration": "22.0",
+        "duration": "50.0",
         "name": "rendering.desktop/css_transitions_triggered_style_element"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/css_transitions_triggered_updating_class"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/css_transitions_updating_class"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/css_value_type_color"
     },
     {
-        "duration": "23.0",
+        "duration": "44.0",
         "name": "rendering.desktop/css_value_type_filter"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/css_value_type_length"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/css_value_type_length_complex"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/css_value_type_length_simple"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/css_value_type_path"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/css_value_type_shadow"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/css_value_type_transform_complex"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/css_value_type_transform_simple"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.desktop/dynamic_cube_map"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "rendering.desktop/earth"
     },
     {
-        "duration": "20.0",
+        "duration": "38.0",
         "name": "rendering.desktop/ebay_2018"
     },
     {
-        "duration": "20.0",
+        "duration": "48.0",
         "name": "rendering.desktop/ebay_pinch_2018"
     },
     {
-        "duration": "23.0",
+        "duration": "52.0",
         "name": "rendering.desktop/effect_games"
     },
     {
-        "duration": "31.0",
+        "duration": "60.0",
         "name": "rendering.desktop/espn_2018"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.desktop/espn_pinch_2018"
     },
     {
-        "duration": "26.0",
+        "duration": "46.0",
         "name": "rendering.desktop/extra_large_texture_uploads"
     },
     {
-        "duration": "28.0",
+        "duration": "38.0",
         "name": "rendering.desktop/facebook_2018"
     },
     {
-        "duration": "25.0",
+        "duration": "40.0",
         "name": "rendering.desktop/facebook_pinch_2018"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/fill_shapes"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.desktop/filter_terrain_svg"
     },
     {
-        "duration": "25.0",
+        "duration": "44.0",
         "name": "rendering.desktop/geo_apis"
     },
     {
-        "duration": "20.0",
+        "duration": "42.0",
         "name": "rendering.desktop/gmail_2018"
     },
     {
-        "duration": "34.0",
+        "duration": "68.0",
         "name": "rendering.desktop/gmail_move_2018"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "rendering.desktop/gmail_pinch_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/google_calendar_2018"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rendering.desktop/google_calendar_pinch_2018"
     },
     {
-        "duration": "20.0",
+        "duration": "42.0",
         "name": "rendering.desktop/google_docs_2018"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "rendering.desktop/google_image_pinch_2018"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "rendering.desktop/google_image_search_2018"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rendering.desktop/google_plus_2018"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/google_search_pinch_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/google_web_search_2018"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "rendering.desktop/guimark_vector_chart"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/hakim"
     },
     {
-        "duration": "33.0",
+        "duration": "66.0",
         "name": "rendering.desktop/ie_chalkboard"
     },
     {
-        "duration": "25.0",
+        "duration": "48.0",
         "name": "rendering.desktop/ie_pirate_mark"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "rendering.desktop/infinite_scroll_element_n_layers_99"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "rendering.desktop/infinite_scroll_root_fixed_n_layers_99"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "rendering.desktop/infinite_scroll_root_n_layers_99"
     },
     {
-        "duration": "22.0",
+        "duration": "52.0",
         "name": "rendering.desktop/jarro_doverson"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "rendering.desktop/jpeg_decoding_rgb_and_gpu_rasterization"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/jpeg_decoding_yuv_and_gpu_rasterization"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "rendering.desktop/js_full_screen_invalidation"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "rendering.desktop/js_opacity_plus_n_layers_99"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "rendering.desktop/js_paint_plus_n_layers_99"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "rendering.desktop/js_poster_circle"
     },
     {
-        "duration": "24.0",
+        "duration": "50.0",
         "name": "rendering.desktop/js_scroll_text_only"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/kevs_3d"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.desktop/keyframed_animations"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/large_texture_uploads"
     },
     {
-        "duration": "19.0",
+        "duration": "36.0",
         "name": "rendering.desktop/linkedin_2018"
     },
     {
-        "duration": "20.0",
+        "duration": "50.0",
         "name": "rendering.desktop/linkedin_pinch_2018"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "rendering.desktop/main_0fps_impl_60fps"
     },
     {
-        "duration": "22.0",
+        "duration": "42.0",
         "name": "rendering.desktop/main_0fps_impl_60fps_no_update"
     },
     {
-        "duration": "22.0",
+        "duration": "42.0",
         "name": "rendering.desktop/main_0fps_impl_60fps_no_update_jank"
     },
     {
-        "duration": "22.0",
+        "duration": "42.0",
         "name": "rendering.desktop/main_0fps_with_jank_impl_0fps"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/main_15fps_impl_0fps"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/main_15fps_with_jank_impl_0fps"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/main_30fps_impl_0fps"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/main_30fps_impl_60fps"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/main_60fps_impl_0fps"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/main_60fps_impl_60fps"
     },
     {
-        "duration": "22.0",
+        "duration": "42.0",
         "name": "rendering.desktop/main_60fps_impl_60fps_no_update"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/main_60fps_impl_60fps_no_update_jank"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/main_60fps_with_jank_impl_0fps"
     },
     {
-        "duration": "25.0",
+        "duration": "42.0",
         "name": "rendering.desktop/man_in_blue"
     },
     {
-        "duration": "26.0",
+        "duration": "46.0",
         "name": "rendering.desktop/many_images"
     },
     {
-        "duration": "25.0",
+        "duration": "48.0",
         "name": "rendering.desktop/many_planets_deep"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "rendering.desktop/maps_move_2018"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.desktop/maps_perf_test"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.desktop/medium_texture_uploads"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.desktop/megi_dish"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "rendering.desktop/microsoft_asteroid_belt"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/microsoft_fireflies"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "rendering.desktop/microsoft_fish_ie_tank"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/microsoft_performance"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/microsoft_snow"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.desktop/microsoft_speed_reading"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "rendering.desktop/microsoft_tweet_map"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "rendering.desktop/microsoft_video_city"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "rendering.desktop/microsoft_worker_fountains"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.desktop/mix_10k"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "rendering.desktop/mix_blend_mode_animation_difference"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "rendering.desktop/mix_blend_mode_animation_hue"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.desktop/mix_blend_mode_animation_propagating_isolation"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.desktop/mix_blend_mode_animation_screen"
     },
     {
-        "duration": "22.0",
+        "duration": "52.0",
         "name": "rendering.desktop/motion_mark_canvas_fill_shapes"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "rendering.desktop/motion_mark_canvas_stroke_shapes"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "rendering.desktop/new_tilings"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "rendering.desktop/nvidia_vertex_buffer_object"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "rendering.desktop/off_screen_main_60fps"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "rendering.desktop/off_screen_main_60fps_jank"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "rendering.desktop/overlay_background_color_css_transitions_page"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "rendering.desktop/particles"
     },
     {
-        "duration": "28.0",
+        "duration": "52.0",
         "name": "rendering.desktop/pinterest_2018"
     },
     {
-        "duration": "21.0",
+        "duration": "48.0",
         "name": "rendering.desktop/put_get_image_data"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/raf"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/raf_animation"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/raf_canvas"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/raf_touch_animation"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "rendering.desktop/repaint_amazon_2018"
     },
     {
-        "duration": "18.0",
+        "duration": "34.0",
         "name": "rendering.desktop/repaint_cnn_2018"
     },
     {
-        "duration": "18.0",
+        "duration": "34.0",
         "name": "rendering.desktop/repaint_facebook_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/repaint_google_search_2018"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/repaint_instagram_2018"
     },
     {
-        "duration": "18.0",
+        "duration": "34.0",
         "name": "rendering.desktop/repaint_reddit_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/repaint_theverge_2018"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/repaint_twitter_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/repaint_wikipedia_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/repaint_yahoo_homepage_2018"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/runway_2019"
     },
     {
-        "duration": "23.0",
+        "duration": "50.0",
         "name": "rendering.desktop/san_angeles"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "rendering.desktop/second_batch_js_heavy"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "rendering.desktop/second_batch_js_light"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "rendering.desktop/second_batch_js_medium"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/simple_text_page"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "rendering.desktop/simple_touch_drag"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.desktop/small_texture_uploads"
     },
     {
-        "duration": "24.0",
+        "duration": "50.0",
         "name": "rendering.desktop/smash_cat"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.desktop/spielzeugz"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.desktop/stroke_shapes"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/sync_scroll_offset"
     },
     {
-        "duration": "26.0",
+        "duration": "40.0",
         "name": "rendering.desktop/techcrunch_2018"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/text_05000_pixels_per_second"
     },
     {
-        "duration": "18.0",
+        "duration": "34.0",
         "name": "rendering.desktop/text_10000_pixels_per_second"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/text_20000_pixels_per_second"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/text_40000_pixels_per_second"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/text_60000_pixels_per_second"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "rendering.desktop/text_75000_pixels_per_second"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "rendering.desktop/text_90000_pixels_per_second"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/text_constant_full_page_raster_05000_pixels_per_second"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/text_constant_full_page_raster_10000_pixels_per_second"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/text_constant_full_page_raster_20000_pixels_per_second"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/text_constant_full_page_raster_40000_pixels_per_second"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/text_constant_full_page_raster_60000_pixels_per_second"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "rendering.desktop/text_constant_full_page_raster_75000_pixels_per_second"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "rendering.desktop/text_constant_full_page_raster_90000_pixels_per_second"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/text_hover_05000_pixels_per_second"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/text_hover_10000_pixels_per_second"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/text_hover_20000_pixels_per_second"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "rendering.desktop/text_hover_40000_pixels_per_second"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "rendering.desktop/text_hover_60000_pixels_per_second"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "rendering.desktop/text_hover_75000_pixels_per_second"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "rendering.desktop/text_hover_90000_pixels_per_second"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/touch_handler_scrolling"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.desktop/transform_transitions"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.desktop/transform_transitions_js_block"
     },
     {
-        "duration": "18.0",
+        "duration": "48.0",
         "name": "rendering.desktop/twitch_2018"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "rendering.desktop/twitch_pinch_2018"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "rendering.desktop/twitter_2018"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/twitter_pinch_2018"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.desktop/web_animation_value_type_color"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.desktop/web_animation_value_type_length_3d"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.desktop/web_animation_value_type_length_complex"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.desktop/web_animation_value_type_length_simple"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.desktop/web_animation_value_type_path"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.desktop/web_animation_value_type_shadow"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.desktop/web_animation_value_type_transform_complex"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.desktop/web_animation_value_type_transform_simple"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "rendering.desktop/web_animations_many_keyframes"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.desktop/web_animations_set_current_time"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.desktop/web_animations_simultaneous"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "rendering.desktop/web_animations_staggered_chaining"
     },
     {
-        "duration": "21.0",
+        "duration": "48.0",
         "name": "rendering.desktop/web_animations_staggered_infinite_iterations"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "rendering.desktop/web_animations_staggered_triggering_page"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/webp_decoding_rgb_and_gpu_rasterization"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/webp_decoding_yuv_and_gpu_rasterization"
     },
     {
-        "duration": "20.0",
+        "duration": "42.0",
         "name": "rendering.desktop/wikipedia_2018"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "rendering.desktop/wordpress_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "rendering.desktop/yahoo_answers_2018"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "rendering.desktop/yahoo_news_2018"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "rendering.desktop/yahoo_news_pinch_2018"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "rendering.desktop/yahoo_sports_2018"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rendering.desktop/yahoo_sports_pinch_2018"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "rendering.desktop/youtube_2018"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "rendering.desktop/youtube_pinch_2018"
     },
     {
-        "duration": "60.0",
+        "duration": "112.0",
         "name": "speedometer-future/http://browserbench.org/Speedometer/"
     },
     {
-        "duration": "54.0",
+        "duration": "106.0",
         "name": "speedometer/http://browserbench.org/Speedometer/"
     },
     {
-        "duration": "97.0",
+        "duration": "202.0",
         "name": "speedometer2-future/Speedometer2"
     },
     {
-        "duration": "95.0",
+        "duration": "190.0",
         "name": "speedometer2/Speedometer2"
     },
     {
-        "duration": "46.0",
+        "duration": "90.0",
         "name": "system_health.common_desktop/browse:media:googleplaystore:2018"
     },
     {
-        "duration": "82.0",
+        "duration": "162.0",
         "name": "system_health.common_desktop/browse:media:imgur"
     },
     {
-        "duration": "95.0",
+        "duration": "190.0",
         "name": "system_health.common_desktop/browse:media:pinterest:2018"
     },
     {
-        "duration": "66.0",
+        "duration": "134.0",
         "name": "system_health.common_desktop/browse:media:tumblr:2018"
     },
     {
-        "duration": "7.0",
+        "duration": "18.0",
         "name": "system_health.common_desktop/browse:media:youtube:2019"
     },
     {
-        "duration": "76.0",
+        "duration": "154.0",
         "name": "system_health.common_desktop/browse:media:youtubetv:2019"
     },
     {
-        "duration": "53.0",
+        "duration": "100.0",
         "name": "system_health.common_desktop/browse:news:cnn:2018"
     },
     {
-        "duration": "53.0",
+        "duration": "104.0",
         "name": "system_health.common_desktop/browse:news:flipboard:2018"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "system_health.common_desktop/browse:news:hackernews:2018"
     },
     {
-        "duration": "74.0",
+        "duration": "148.0",
         "name": "system_health.common_desktop/browse:news:nytimes:2018"
     },
     {
-        "duration": "53.0",
+        "duration": "106.0",
         "name": "system_health.common_desktop/browse:news:reddit:2018"
     },
     {
-        "duration": "55.0",
+        "duration": "108.0",
         "name": "system_health.common_desktop/browse:search:google:2018"
     },
     {
-        "duration": "40.0",
+        "duration": "80.0",
         "name": "system_health.common_desktop/browse:search:google_india:2018"
     },
     {
-        "duration": "77.0",
+        "duration": "154.0",
         "name": "system_health.common_desktop/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "62.0",
+        "duration": "126.0",
         "name": "system_health.common_desktop/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "49.0",
+        "duration": "100.0",
         "name": "system_health.common_desktop/browse:social:twitter:2018"
     },
     {
-        "duration": "66.0",
+        "duration": "134.0",
         "name": "system_health.common_desktop/browse:social:twitter_infinite_scroll:2018"
     },
     {
-        "duration": "65.0",
+        "duration": "130.0",
         "name": "system_health.common_desktop/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "45.0",
+        "duration": "90.0",
         "name": "system_health.common_desktop/browse:tools:docs_scrolling"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "system_health.common_desktop/browse:tools:maps:2019"
     },
     {
-        "duration": "45.0",
+        "duration": "88.0",
         "name": "system_health.common_desktop/browse:tools:sheets:2019"
     },
     {
-        "duration": "11.0",
+        "duration": "16.0",
         "name": "system_health.common_desktop/browse_accessibility:media:youtube"
     },
     {
-        "duration": "35.0",
+        "duration": "66.0",
         "name": "system_health.common_desktop/browse_accessibility:tech:codesearch:2018"
     },
     {
-        "duration": "25.0",
+        "duration": "44.0",
         "name": "system_health.common_desktop/load:chrome:blank"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "system_health.common_desktop/load:games:alphabetty:2018"
     },
     {
-        "duration": "21.0",
+        "duration": "46.0",
         "name": "system_health.common_desktop/load:games:bubbles:2019"
     },
     {
-        "duration": "28.0",
+        "duration": "54.0",
         "name": "system_health.common_desktop/load:games:lazors"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "system_health.common_desktop/load:games:miniclip:2018"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "system_health.common_desktop/load:games:spychase:2018"
     },
     {
-        "duration": "31.0",
+        "duration": "66.0",
         "name": "system_health.common_desktop/load:media:9gag"
     },
     {
-        "duration": "22.0",
+        "duration": "48.0",
         "name": "system_health.common_desktop/load:media:dailymotion:2019"
     },
     {
-        "duration": "23.0",
+        "duration": "50.0",
         "name": "system_health.common_desktop/load:media:facebook_photos:2018"
     },
     {
-        "duration": "23.0",
+        "duration": "50.0",
         "name": "system_health.common_desktop/load:media:flickr:2018"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "system_health.common_desktop/load:media:google_images:2018"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "system_health.common_desktop/load:media:imgur:2018"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "system_health.common_desktop/load:media:soundcloud:2018"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "system_health.common_desktop/load:media:youtube:2018"
     },
     {
-        "duration": "22.0",
+        "duration": "48.0",
         "name": "system_health.common_desktop/load:news:bbc:2018"
     },
     {
-        "duration": "24.0",
+        "duration": "52.0",
         "name": "system_health.common_desktop/load:news:cnn:2018"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "system_health.common_desktop/load:news:flipboard"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "system_health.common_desktop/load:news:hackernews:2018"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "system_health.common_desktop/load:news:nytimes:2018"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "system_health.common_desktop/load:news:qq:2018"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "system_health.common_desktop/load:news:reddit:2018"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "system_health.common_desktop/load:news:wikipedia:2018"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "system_health.common_desktop/load:search:amazon:2018"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "system_health.common_desktop/load:search:baidu:2018"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "system_health.common_desktop/load:search:ebay:2018"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "system_health.common_desktop/load:search:flipkart:2018"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "system_health.common_desktop/load:search:google:2018"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "system_health.common_desktop/load:search:taobao:2018"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "system_health.common_desktop/load:search:yahoo:2018"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "system_health.common_desktop/load:search:yandex:2018"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "system_health.common_desktop/load:social:instagram:2018"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "system_health.common_desktop/load:social:pinterest:2019"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "system_health.common_desktop/load:social:vk:2018"
     },
     {
-        "duration": "33.0",
+        "duration": "68.0",
         "name": "system_health.common_desktop/load:tools:chat:2020"
     },
     {
-        "duration": "26.0",
+        "duration": "56.0",
         "name": "system_health.common_desktop/load:tools:docs:2019"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "system_health.common_desktop/load:tools:drive:2019"
     },
     {
-        "duration": "37.0",
+        "duration": "78.0",
         "name": "system_health.common_desktop/load:tools:gmail:2019"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "system_health.common_desktop/load:tools:stackoverflow:2018"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "system_health.common_desktop/load:tools:weather:2019"
     },
     {
-        "duration": "25.0",
+        "duration": "44.0",
         "name": "system_health.common_desktop/load_accessibility:media:wikipedia:2018"
     },
     {
-        "duration": "25.0",
+        "duration": "44.0",
         "name": "system_health.common_desktop/load_accessibility:shopping:amazon:2018"
     },
     {
-        "duration": "130.0",
+        "duration": "260.0",
         "name": "system_health.common_desktop/long_running:tools:gmail-background"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "system_health.common_desktop/long_running:tools:gmail-foreground"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "system_health.common_desktop/multitab:misc:typical24"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "system_health.common_desktop/multitab:misc:typical24:2018"
     },
     {
-        "duration": "54.0",
+        "duration": "106.0",
         "name": "system_health.common_desktop/play:media:google_play_music"
     },
     {
-        "duration": "49.0",
+        "duration": "98.0",
         "name": "system_health.common_desktop/play:media:soundcloud:2018"
     },
     {
-        "duration": "40.0",
+        "duration": "80.0",
         "name": "system_health.memory_desktop/browse:media:googleplaystore:2018"
     },
     {
-        "duration": "74.0",
+        "duration": "152.0",
         "name": "system_health.memory_desktop/browse:media:imgur"
     },
     {
-        "duration": "91.0",
+        "duration": "180.0",
         "name": "system_health.memory_desktop/browse:media:pinterest:2018"
     },
     {
-        "duration": "62.0",
+        "duration": "126.0",
         "name": "system_health.memory_desktop/browse:media:tumblr:2018"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "system_health.memory_desktop/browse:media:youtube:2019"
     },
     {
-        "duration": "66.0",
+        "duration": "134.0",
         "name": "system_health.memory_desktop/browse:media:youtubetv:2019"
     },
     {
-        "duration": "47.0",
+        "duration": "92.0",
         "name": "system_health.memory_desktop/browse:news:cnn:2018"
     },
     {
-        "duration": "49.0",
+        "duration": "94.0",
         "name": "system_health.memory_desktop/browse:news:flipboard:2018"
     },
     {
-        "duration": "56.0",
+        "duration": "110.0",
         "name": "system_health.memory_desktop/browse:news:hackernews:2018"
     },
     {
-        "duration": "68.0",
+        "duration": "134.0",
         "name": "system_health.memory_desktop/browse:news:nytimes:2018"
     },
     {
-        "duration": "49.0",
+        "duration": "96.0",
         "name": "system_health.memory_desktop/browse:news:reddit:2018"
     },
     {
-        "duration": "50.0",
+        "duration": "96.0",
         "name": "system_health.memory_desktop/browse:search:google:2018"
     },
     {
-        "duration": "34.0",
+        "duration": "68.0",
         "name": "system_health.memory_desktop/browse:search:google_india:2018"
     },
     {
-        "duration": "73.0",
+        "duration": "144.0",
         "name": "system_health.memory_desktop/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "60.0",
+        "duration": "120.0",
         "name": "system_health.memory_desktop/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "46.0",
+        "duration": "92.0",
         "name": "system_health.memory_desktop/browse:social:twitter:2018"
     },
     {
-        "duration": "63.0",
+        "duration": "126.0",
         "name": "system_health.memory_desktop/browse:social:twitter_infinite_scroll:2018"
     },
     {
-        "duration": "61.0",
+        "duration": "120.0",
         "name": "system_health.memory_desktop/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "41.0",
+        "duration": "80.0",
         "name": "system_health.memory_desktop/browse:tools:docs_scrolling"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "system_health.memory_desktop/browse:tools:maps:2019"
     },
     {
-        "duration": "39.0",
+        "duration": "78.0",
         "name": "system_health.memory_desktop/browse:tools:sheets:2019"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "system_health.memory_desktop/browse_accessibility:media:youtube"
     },
     {
-        "duration": "29.0",
+        "duration": "60.0",
         "name": "system_health.memory_desktop/browse_accessibility:tech:codesearch:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "system_health.memory_desktop/load:chrome:blank"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "system_health.memory_desktop/load:games:alphabetty:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "system_health.memory_desktop/load:games:bubbles:2019"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "system_health.memory_desktop/load:games:lazors"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "system_health.memory_desktop/load:games:miniclip:2018"
     },
     {
-        "duration": "24.0",
+        "duration": "50.0",
         "name": "system_health.memory_desktop/load:games:spychase:2018"
     },
     {
-        "duration": "24.0",
+        "duration": "50.0",
         "name": "system_health.memory_desktop/load:media:9gag"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "system_health.memory_desktop/load:media:dailymotion:2019"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "system_health.memory_desktop/load:media:facebook_photos:2018"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "system_health.memory_desktop/load:media:flickr:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "system_health.memory_desktop/load:media:google_images:2018"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "system_health.memory_desktop/load:media:imgur:2018"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "system_health.memory_desktop/load:media:soundcloud:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "36.0",
         "name": "system_health.memory_desktop/load:media:youtube:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "system_health.memory_desktop/load:news:bbc:2018"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "system_health.memory_desktop/load:news:cnn:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "system_health.memory_desktop/load:news:flipboard"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "system_health.memory_desktop/load:news:hackernews:2018"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "system_health.memory_desktop/load:news:nytimes:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "42.0",
         "name": "system_health.memory_desktop/load:news:qq:2018"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "system_health.memory_desktop/load:news:reddit:2018"
     },
     {
-        "duration": "21.0",
+        "duration": "40.0",
         "name": "system_health.memory_desktop/load:news:wikipedia:2018"
     },
     {
-        "duration": "18.0",
+        "duration": "40.0",
         "name": "system_health.memory_desktop/load:search:amazon:2018"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "system_health.memory_desktop/load:search:baidu:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "system_health.memory_desktop/load:search:ebay:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "system_health.memory_desktop/load:search:flipkart:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "system_health.memory_desktop/load:search:google:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "36.0",
         "name": "system_health.memory_desktop/load:search:taobao:2018"
     },
     {
-        "duration": "18.0",
+        "duration": "34.0",
         "name": "system_health.memory_desktop/load:search:yahoo:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "36.0",
         "name": "system_health.memory_desktop/load:search:yandex:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "system_health.memory_desktop/load:social:instagram:2018"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "system_health.memory_desktop/load:social:pinterest:2019"
     },
     {
-        "duration": "19.0",
+        "duration": "36.0",
         "name": "system_health.memory_desktop/load:social:vk:2018"
     },
     {
-        "duration": "30.0",
+        "duration": "62.0",
         "name": "system_health.memory_desktop/load:tools:chat:2020"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "system_health.memory_desktop/load:tools:docs:2019"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "system_health.memory_desktop/load:tools:drive:2019"
     },
     {
-        "duration": "34.0",
+        "duration": "68.0",
         "name": "system_health.memory_desktop/load:tools:gmail:2019"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "system_health.memory_desktop/load:tools:stackoverflow:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "36.0",
         "name": "system_health.memory_desktop/load:tools:weather:2019"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "system_health.memory_desktop/load_accessibility:media:wikipedia:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "system_health.memory_desktop/load_accessibility:shopping:amazon:2018"
     },
     {
-        "duration": "6.0",
+        "duration": "10.0",
         "name": "system_health.memory_desktop/long_running:tools:gmail-background"
     },
     {
-        "duration": "6.0",
+        "duration": "10.0",
         "name": "system_health.memory_desktop/long_running:tools:gmail-foreground"
     },
     {
-        "duration": "6.0",
+        "duration": "10.0",
         "name": "system_health.memory_desktop/multitab:misc:typical24"
     },
     {
-        "duration": "6.0",
+        "duration": "10.0",
         "name": "system_health.memory_desktop/multitab:misc:typical24:2018"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "system_health.memory_desktop/play:media:google_play_music"
     },
     {
-        "duration": "45.0",
+        "duration": "90.0",
         "name": "system_health.memory_desktop/play:media:soundcloud:2018"
     },
     {
@@ -3868,247 +3872,247 @@
         "name": "tab_switching.typical_25/multitab:misc:typical24"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "tracing.tracing_with_background_memory_infra/Facebook"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "tracing.tracing_with_background_memory_infra/Wikipedia"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.amazon.com"
     },
     {
-        "duration": "13.0",
+        "duration": "28.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.ask.com/"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.bing.com/"
     },
     {
-        "duration": "13.0",
+        "duration": "28.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.yahoo.com/"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.youtube.com"
     },
     {
-        "duration": "24.0",
+        "duration": "32.0",
         "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/#hl=en&q=barack+obama"
     },
     {
-        "duration": "16.0",
+        "duration": "28.0",
         "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/calendar/"
     },
     {
-        "duration": "59.0",
+        "duration": "112.0",
         "name": "v8.browsing_desktop-future/browse:media:googleplaystore:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "v8.browsing_desktop-future/browse:media:imgur"
     },
     {
-        "duration": "106.0",
+        "duration": "212.0",
         "name": "v8.browsing_desktop-future/browse:media:pinterest:2018"
     },
     {
-        "duration": "78.0",
+        "duration": "156.0",
         "name": "v8.browsing_desktop-future/browse:media:tumblr:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "v8.browsing_desktop-future/browse:media:youtube:2019"
     },
     {
-        "duration": "81.0",
+        "duration": "162.0",
         "name": "v8.browsing_desktop-future/browse:media:youtubetv:2019"
     },
     {
-        "duration": "67.0",
+        "duration": "132.0",
         "name": "v8.browsing_desktop-future/browse:news:cnn:2018"
     },
     {
-        "duration": "66.0",
+        "duration": "128.0",
         "name": "v8.browsing_desktop-future/browse:news:flipboard:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "v8.browsing_desktop-future/browse:news:hackernews:2018"
     },
     {
-        "duration": "86.0",
+        "duration": "172.0",
         "name": "v8.browsing_desktop-future/browse:news:nytimes:2018"
     },
     {
-        "duration": "65.0",
+        "duration": "130.0",
         "name": "v8.browsing_desktop-future/browse:news:reddit:2018"
     },
     {
-        "duration": "67.0",
+        "duration": "130.0",
         "name": "v8.browsing_desktop-future/browse:search:google:2018"
     },
     {
-        "duration": "53.0",
+        "duration": "100.0",
         "name": "v8.browsing_desktop-future/browse:search:google_india:2018"
     },
     {
-        "duration": "91.0",
+        "duration": "178.0",
         "name": "v8.browsing_desktop-future/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "80.0",
+        "duration": "158.0",
         "name": "v8.browsing_desktop-future/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "61.0",
+        "duration": "122.0",
         "name": "v8.browsing_desktop-future/browse:social:twitter:2018"
     },
     {
-        "duration": "78.0",
+        "duration": "156.0",
         "name": "v8.browsing_desktop-future/browse:social:twitter_infinite_scroll:2018"
     },
     {
-        "duration": "78.0",
+        "duration": "152.0",
         "name": "v8.browsing_desktop-future/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "58.0",
+        "duration": "112.0",
         "name": "v8.browsing_desktop-future/browse:tools:docs_scrolling"
     },
     {
-        "duration": "92.0",
+        "duration": "110.0",
         "name": "v8.browsing_desktop-future/browse:tools:maps:2019"
     },
     {
-        "duration": "55.0",
+        "duration": "110.0",
         "name": "v8.browsing_desktop-future/browse:tools:sheets:2019"
     },
     {
-        "duration": "55.0",
+        "duration": "108.0",
         "name": "v8.browsing_desktop/browse:media:googleplaystore:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "36.0",
         "name": "v8.browsing_desktop/browse:media:imgur"
     },
     {
-        "duration": "106.0",
+        "duration": "210.0",
         "name": "v8.browsing_desktop/browse:media:pinterest:2018"
     },
     {
-        "duration": "78.0",
+        "duration": "156.0",
         "name": "v8.browsing_desktop/browse:media:tumblr:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "38.0",
         "name": "v8.browsing_desktop/browse:media:youtube:2019"
     },
     {
-        "duration": "79.0",
+        "duration": "164.0",
         "name": "v8.browsing_desktop/browse:media:youtubetv:2019"
     },
     {
-        "duration": "63.0",
+        "duration": "136.0",
         "name": "v8.browsing_desktop/browse:news:cnn:2018"
     },
     {
-        "duration": "62.0",
+        "duration": "122.0",
         "name": "v8.browsing_desktop/browse:news:flipboard:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "36.0",
         "name": "v8.browsing_desktop/browse:news:hackernews:2018"
     },
     {
-        "duration": "86.0",
+        "duration": "170.0",
         "name": "v8.browsing_desktop/browse:news:nytimes:2018"
     },
     {
-        "duration": "65.0",
+        "duration": "128.0",
         "name": "v8.browsing_desktop/browse:news:reddit:2018"
     },
     {
-        "duration": "63.0",
+        "duration": "126.0",
         "name": "v8.browsing_desktop/browse:search:google:2018"
     },
     {
-        "duration": "49.0",
+        "duration": "96.0",
         "name": "v8.browsing_desktop/browse:search:google_india:2018"
     },
     {
-        "duration": "88.0",
+        "duration": "174.0",
         "name": "v8.browsing_desktop/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "77.0",
+        "duration": "158.0",
         "name": "v8.browsing_desktop/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "58.0",
+        "duration": "122.0",
         "name": "v8.browsing_desktop/browse:social:twitter:2018"
     },
     {
-        "duration": "76.0",
+        "duration": "156.0",
         "name": "v8.browsing_desktop/browse:social:twitter_infinite_scroll:2018"
     },
     {
-        "duration": "74.0",
+        "duration": "146.0",
         "name": "v8.browsing_desktop/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "54.0",
+        "duration": "106.0",
         "name": "v8.browsing_desktop/browse:tools:docs_scrolling"
     },
     {
-        "duration": "19.0",
+        "duration": "36.0",
         "name": "v8.browsing_desktop/browse:tools:maps:2019"
     },
     {
-        "duration": "55.0",
+        "duration": "108.0",
         "name": "v8.browsing_desktop/browse:tools:sheets:2019"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "webrtc/10s_datachannel_transfer"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "webrtc/canvas_capture_peer_connection"
     },
     {
-        "duration": "35.0",
+        "duration": "70.0",
         "name": "webrtc/codec_constraints_h264"
     },
     {
-        "duration": "35.0",
+        "duration": "70.0",
         "name": "webrtc/codec_constraints_vp8"
     },
     {
-        "duration": "35.0",
+        "duration": "70.0",
         "name": "webrtc/codec_constraints_vp9"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "webrtc/hd_local_stream_10s"
     },
     {
-        "duration": "36.0",
+        "duration": "72.0",
         "name": "webrtc/multiple_peerconnections"
     },
     {
-        "duration": "39.0",
+        "duration": "78.0",
         "name": "webrtc/pause_play_peerconnections"
     },
     {
-        "duration": "3.0",
-        "name": "load_library_perf_tests/_gtest_"
-    },
-    {
         "duration": "67.0",
         "name": "performance_browser_tests/_gtest_"
+    },
+    {
+        "duration": "3.0",
+        "name": "load_library_perf_tests/_gtest_"
     }
 ]
\ No newline at end of file
diff --git a/tools/perf/core/shard_maps/timing_data/mac-10_13_laptop_high_end-perf_timing.json b/tools/perf/core/shard_maps/timing_data/mac-10_13_laptop_high_end-perf_timing.json
index 8c6e460..2ef887b 100644
--- a/tools/perf/core/shard_maps/timing_data/mac-10_13_laptop_high_end-perf_timing.json
+++ b/tools/perf/core/shard_maps/timing_data/mac-10_13_laptop_high_end-perf_timing.json
@@ -1,214 +1,214 @@
 [
     {
-        "duration": "25.0",
+        "duration": "48.0",
         "name": "blink_perf.accessibility/line-breaks.html"
     },
     {
-        "duration": "19.0",
+        "duration": "36.0",
         "name": "blink_perf.accessibility/textarea-append.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.bindings/append-child.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/create-element.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/document-implementation.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/dom-attribute-on-prototoype.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/first-child.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.bindings/gc-forest.html"
     },
     {
-        "duration": "5.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/gc-mini-tree.html"
     },
     {
-        "duration": "6.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/gc-tree.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/get-attribute-rare.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/get-attribute.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/get-element-by-id.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/get-elements-by-tag-name.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/id-getter.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/id-setter.html"
     },
     {
-        "duration": "7.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/indexed-getter.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/insert-before.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/named-property-enumerator.html"
     },
     {
-        "duration": "15.0",
+        "duration": "34.0",
         "name": "blink_perf.bindings/node-list-access.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/node-type.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.bindings/post-message.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/sequence-conversion-array.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/sequence-conversion-custom-iterator.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.bindings/serialize-array.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.bindings/serialize-long-string.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.bindings/serialize-map.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.bindings/serialize-nested-array.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/set-attribute-rare.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/set-attribute.html"
     },
     {
-        "duration": "7.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/structured-clone-json-deserialize.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/structured-clone-json-serialize.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.bindings/structured-clone-long-string-deserialize.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.bindings/structured-clone-long-string-serialize.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/typed-array-construct-from-array.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/typed-array-construct-from-same-type.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/typed-array-construct-from-typed.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/typed-array-set-from-typed.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/undefined-first-child.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/undefined-get-element-by-id.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/undefined-id-getter.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.bindings/worker-structured-clone-different-payloads.html"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "blink_perf.bindings/worker-structured-clone-json-from-worker.html"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "blink_perf.bindings/worker-structured-clone-json-roundtrip.html"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "blink_perf.bindings/worker-structured-clone-json-to-worker.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.bindings/worker-structured-clone-workerDOM-DBMon-from-worker.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.bindings/worker-structured-clone-workerDOM-Map-from-worker.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/worker-text-encoded-transferable-from-worker.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/worker-text-encoded-transferable-roundtrip.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/worker-text-encoded-transferable-to-worker.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/worker-transferable-from-worker.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/worker-transferable-roundtrip.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/worker-transferable-to-worker.html"
     },
     {
@@ -412,463 +412,467 @@
         "name": "blink_perf.canvas/upload-webgl-to-texture_RAF.html?RAF"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "blink_perf.css/AttributeDescendantSelector.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.css/CSSPropertySetterGetter.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.css/CSSPropertySetterGetterMethods.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.css/CSSPropertyUpdateValue.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.css/ChangeStyleChildClassSelector.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.css/ChangeStyleChildElementSelectors.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.css/ChangeStyleElementSelector.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.css/ChangeStyleGrandChildElementSelector.html"
     },
     {
-        "duration": "7.0",
+        "duration": "16.0",
         "name": "blink_perf.css/ChangeStyleMultipleClassSelector.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.css/ChangeStyleMultipleQualifiedDataAttributesWithValuesSelector.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.css/ChangeStyleNestedPseudoSelector.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.css/ChangeStylePairOfNthChildSelector.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.css/ChangeStylePartialAttributeMatchingSelector.html"
     },
     {
-        "duration": "7.0",
+        "duration": "16.0",
         "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeSelector.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeWithValueSelector.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.css/ChangeStyleShallowTree.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.css/ChangeStyleSingleClassSelector.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.css/ChangeStyleSingleNthChildSelector.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.css/ChangeStyleSinglePseudoSelector.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.css/ChangeStyleUniversalSelector.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeSelector.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeWithValueSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.css/ClassDescendantSelector.html"
     },
     {
-        "duration": "9.0",
+        "duration": "26.0",
         "name": "blink_perf.css/ClassInvalidation.html"
     },
     {
-        "duration": "4.0",
+        "duration": "6.0",
         "name": "blink_perf.css/CustomPropertiesCascade.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.css/CustomPropertiesNonRootInheritance.html"
     },
     {
-        "duration": "3.0",
-        "name": "blink_perf.css/CustomPropertiesRootInheritance.html"
-    },
-    {
-        "duration": "3.0",
-        "name": "blink_perf.css/CustomPropertiesVarAlias.html"
-    },
-    {
-        "duration": "10.0",
-        "name": "blink_perf.css/FocusUpdate.html"
-    },
-    {
-        "duration": "8.0",
-        "name": "blink_perf.css/LoadBootstrapBlog.html"
-    },
-    {
-        "duration": "8.0",
-        "name": "blink_perf.css/LoadMaterializeStarterPage.html"
-    },
-    {
-        "duration": "8.0",
-        "name": "blink_perf.css/LoadSemanticPageExample.html"
-    },
-    {
-        "duration": "9.0",
-        "name": "blink_perf.css/PseudoClassSelectors.html"
-    },
-    {
-        "duration": "10.0",
-        "name": "blink_perf.css/SelectorCountScaling.html"
-    },
-    {
-        "duration": "29.0",
-        "name": "blink_perf.dom/custom-element-default-style-with-shadow.html"
-    },
-    {
-        "duration": "24.0",
-        "name": "blink_perf.dom/custom-element-default-style.html"
-    },
-    {
-        "duration": "10.0",
-        "name": "blink_perf.dom/long-sibling-list.html"
-    },
-    {
-        "duration": "3.0",
-        "name": "blink_perf.dom/modify-element-classname.html"
-    },
-    {
-        "duration": "3.0",
-        "name": "blink_perf.dom/modify-element-id.html"
-    },
-    {
-        "duration": "2.0",
-        "name": "blink_perf.dom/modify-element-title.html"
-    },
-    {
-        "duration": "8.0",
-        "name": "blink_perf.dom/select-multiple-add.html"
-    },
-    {
-        "duration": "7.0",
-        "name": "blink_perf.dom/select-single-add.html"
-    },
-    {
-        "duration": "7.0",
-        "name": "blink_perf.dom/select-single-remove.html"
-    },
-    {
-        "duration": "12.0",
-        "name": "blink_perf.events/EventsDispatching.html"
-    },
-    {
-        "duration": "8.0",
-        "name": "blink_perf.events/EventsDispatchingInDeeplyNestedV0ShadowTrees.html"
-    },
-    {
-        "duration": "8.0",
-        "name": "blink_perf.events/EventsDispatchingInDeeplyNestedV1ShadowTrees.html"
-    },
-    {
-        "duration": "12.0",
-        "name": "blink_perf.events/EventsDispatchingInV0ShadowTrees.html"
-    },
-    {
-        "duration": "11.0",
-        "name": "blink_perf.events/EventsDispatchingInV1ShadowTrees.html"
-    },
-    {
-        "duration": "8.0",
-        "name": "blink_perf.events/hit-test-lots-of-layers.html"
-    },
-    {
-        "duration": "7.0",
-        "name": "blink_perf.events/is-input-pending-all-events.html"
-    },
-    {
-        "duration": "7.0",
-        "name": "blink_perf.events/is-input-pending-default-events.html"
-    },
-    {
-        "duration": "16.0",
-        "name": "blink_perf.image_decoder/decode-gif.html"
-    },
-    {
-        "duration": "10.0",
-        "name": "blink_perf.image_decoder/decode-jpeg-h1v1.html"
-    },
-    {
-        "duration": "10.0",
-        "name": "blink_perf.image_decoder/decode-jpeg-h1v2.html"
-    },
-    {
-        "duration": "10.0",
-        "name": "blink_perf.image_decoder/decode-jpeg-h2v1.html"
-    },
-    {
-        "duration": "10.0",
-        "name": "blink_perf.image_decoder/decode-jpeg-h2v2.html"
-    },
-    {
-        "duration": "13.0",
-        "name": "blink_perf.image_decoder/decode-lossless-webp.html"
-    },
-    {
-        "duration": "9.0",
-        "name": "blink_perf.image_decoder/decode-lossy-webp.html"
-    },
-    {
-        "duration": "11.0",
-        "name": "blink_perf.image_decoder/decode-png-palette-opaque.html"
-    },
-    {
-        "duration": "10.0",
-        "name": "blink_perf.image_decoder/decode-png-palette.html"
-    },
-    {
-        "duration": "14.0",
-        "name": "blink_perf.image_decoder/decode-png.html"
-    },
-    {
-        "duration": "22.0",
-        "name": "blink_perf.layout/ArabicLineLayout.html"
-    },
-    {
-        "duration": "2.0",
-        "name": "blink_perf.layout/Shapes/MultipleShapes.html"
-    },
-    {
-        "duration": "7.0",
-        "name": "blink_perf.layout/SimpleTextPathLineLayout.html"
-    },
-    {
-        "duration": "7.0",
-        "name": "blink_perf.layout/add-remove-inline-floats.html"
-    },
-    {
-        "duration": "2.0",
-        "name": "blink_perf.layout/animate-abspos-deep.html"
-    },
-    {
-        "duration": "7.0",
-        "name": "blink_perf.layout/attach-inlines-2.html"
-    },
-    {
-        "duration": "7.0",
-        "name": "blink_perf.layout/attach-inlines.html"
-    },
-    {
-        "duration": "8.0",
-        "name": "blink_perf.layout/auto-grid-lots-of-data.html"
-    },
-    {
-        "duration": "8.0",
-        "name": "blink_perf.layout/auto-grid-lots-of-spanning-data.html"
-    },
-    {
-        "duration": "9.0",
-        "name": "blink_perf.layout/change-text-css-contain.html"
-    },
-    {
-        "duration": "7.0",
-        "name": "blink_perf.layout/chapter-reflow-once-random.html"
-    },
-    {
-        "duration": "7.0",
-        "name": "blink_perf.layout/chapter-reflow-once.html"
-    },
-    {
-        "duration": "8.0",
-        "name": "blink_perf.layout/chapter-reflow-thrice.html"
-    },
-    {
-        "duration": "7.0",
-        "name": "blink_perf.layout/chapter-reflow-twice.html"
-    },
-    {
-        "duration": "7.0",
-        "name": "blink_perf.layout/chapter-reflow.html"
-    },
-    {
-        "duration": "3.0",
-        "name": "blink_perf.layout/character_fallback.html"
-    },
-    {
-        "duration": "4.0",
-        "name": "blink_perf.layout/contain-content-style-change.html"
-    },
-    {
-        "duration": "7.0",
-        "name": "blink_perf.layout/editing_append.html"
-    },
-    {
-        "duration": "7.0",
-        "name": "blink_perf.layout/editing_append_single_line.html"
-    },
-    {
-        "duration": "7.0",
-        "name": "blink_perf.layout/editing_delete.html"
-    },
-    {
-        "duration": "7.0",
-        "name": "blink_perf.layout/editing_insert.html"
-    },
-    {
-        "duration": "7.0",
-        "name": "blink_perf.layout/editing_prepend.html"
-    },
-    {
-        "duration": "11.0",
-        "name": "blink_perf.layout/fit-content-change-available-size-blocks.html"
-    },
-    {
-        "duration": "7.0",
-        "name": "blink_perf.layout/fit-content-change-available-size-text.html"
-    },
-    {
-        "duration": "8.0",
-        "name": "blink_perf.layout/fixed-grid-lots-of-data.html"
-    },
-    {
-        "duration": "8.0",
-        "name": "blink_perf.layout/fixed-grid-lots-of-stretched-data.html"
-    },
-    {
-        "duration": "7.0",
-        "name": "blink_perf.layout/flexbox-column-nowrap.html"
-    },
-    {
-        "duration": "12.0",
-        "name": "blink_perf.layout/flexbox-column-wrap.html"
-    },
-    {
-        "duration": "8.0",
-        "name": "blink_perf.layout/flexbox-deeply-nested-column-flow.html"
-    },
-    {
-        "duration": "7.0",
-        "name": "blink_perf.layout/flexbox-lots-of-data.html"
-    },
-    {
-        "duration": "7.0",
-        "name": "blink_perf.layout/flexbox-row-nowrap.html"
-    },
-    {
-        "duration": "9.0",
-        "name": "blink_perf.layout/flexbox-row-stretch-height-definite.html"
-    },
-    {
-        "duration": "7.0",
-        "name": "blink_perf.layout/flexbox-row-wrap.html"
-    },
-    {
-        "duration": "9.0",
-        "name": "blink_perf.layout/flexbox-with-stretch-layout.html"
-    },
-    {
-        "duration": "9.0",
-        "name": "blink_perf.layout/flexbox_with_list_item.html"
-    },
-    {
-        "duration": "5.0",
-        "name": "blink_perf.layout/floats_100_100.html"
-    },
-    {
-        "duration": "5.0",
-        "name": "blink_perf.layout/floats_100_100_nested.html"
-    },
-    {
-        "duration": "5.0",
-        "name": "blink_perf.layout/floats_10_1000.html"
-    },
-    {
-        "duration": "3.0",
-        "name": "blink_perf.layout/floats_20_100.html"
-    },
-    {
-        "duration": "3.0",
-        "name": "blink_perf.layout/floats_20_100_nested.html"
-    },
-    {
-        "duration": "3.0",
-        "name": "blink_perf.layout/floats_2_100.html"
-    },
-    {
-        "duration": "2.0",
-        "name": "blink_perf.layout/floats_2_100_nested.html"
-    },
-    {
-        "duration": "3.0",
-        "name": "blink_perf.layout/floats_50_100.html"
-    },
-    {
-        "duration": "3.0",
-        "name": "blink_perf.layout/floats_50_100_nested.html"
-    },
-    {
-        "duration": "8.0",
-        "name": "blink_perf.layout/hindi-line-layout.html"
-    },
-    {
-        "duration": "3.0",
-        "name": "blink_perf.layout/japanese-kokoro-insert.html"
-    },
-    {
-        "duration": "9.0",
-        "name": "blink_perf.layout/large-grid.html"
-    },
-    {
-        "duration": "7.0",
-        "name": "blink_perf.layout/large-spanning-grid-item.html"
-    },
-    {
-        "duration": "7.0",
-        "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans-wider-than-table.html"
-    },
-    {
-        "duration": "7.0",
-        "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans.html"
-    },
-    {
-        "duration": "7.0",
-        "name": "blink_perf.layout/large-table-with-collapsed-borders-and-no-colspans.html"
+        "duration": "6.0",
+        "name": "blink_perf.css/CustomPropertiesPendingSubstitution.html"
     },
     {
         "duration": "6.0",
-        "name": "blink_perf.layout/latin-ebook-resize.html"
+        "name": "blink_perf.css/CustomPropertiesRootInheritance.html"
+    },
+    {
+        "duration": "6.0",
+        "name": "blink_perf.css/CustomPropertiesVarAlias.html"
+    },
+    {
+        "duration": "18.0",
+        "name": "blink_perf.css/FocusUpdate.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.css/LoadBootstrapBlog.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.css/LoadMaterializeStarterPage.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.css/LoadSemanticPageExample.html"
+    },
+    {
+        "duration": "16.0",
+        "name": "blink_perf.css/PseudoClassSelectors.html"
+    },
+    {
+        "duration": "18.0",
+        "name": "blink_perf.css/SelectorCountScaling.html"
+    },
+    {
+        "duration": "60.0",
+        "name": "blink_perf.dom/custom-element-default-style-with-shadow.html"
+    },
+    {
+        "duration": "48.0",
+        "name": "blink_perf.dom/custom-element-default-style.html"
+    },
+    {
+        "duration": "22.0",
+        "name": "blink_perf.dom/long-sibling-list.html"
+    },
+    {
+        "duration": "6.0",
+        "name": "blink_perf.dom/modify-element-classname.html"
+    },
+    {
+        "duration": "6.0",
+        "name": "blink_perf.dom/modify-element-id.html"
     },
     {
         "duration": "4.0",
+        "name": "blink_perf.dom/modify-element-title.html"
+    },
+    {
+        "duration": "16.0",
+        "name": "blink_perf.dom/select-multiple-add.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.dom/select-single-add.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.dom/select-single-remove.html"
+    },
+    {
+        "duration": "24.0",
+        "name": "blink_perf.events/EventsDispatching.html"
+    },
+    {
+        "duration": "16.0",
+        "name": "blink_perf.events/EventsDispatchingInDeeplyNestedV0ShadowTrees.html"
+    },
+    {
+        "duration": "16.0",
+        "name": "blink_perf.events/EventsDispatchingInDeeplyNestedV1ShadowTrees.html"
+    },
+    {
+        "duration": "28.0",
+        "name": "blink_perf.events/EventsDispatchingInV0ShadowTrees.html"
+    },
+    {
+        "duration": "28.0",
+        "name": "blink_perf.events/EventsDispatchingInV1ShadowTrees.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.events/hit-test-lots-of-layers.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.events/is-input-pending-all-events.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.events/is-input-pending-default-events.html"
+    },
+    {
+        "duration": "32.0",
+        "name": "blink_perf.image_decoder/decode-gif.html"
+    },
+    {
+        "duration": "22.0",
+        "name": "blink_perf.image_decoder/decode-jpeg-h1v1.html"
+    },
+    {
+        "duration": "20.0",
+        "name": "blink_perf.image_decoder/decode-jpeg-h1v2.html"
+    },
+    {
+        "duration": "22.0",
+        "name": "blink_perf.image_decoder/decode-jpeg-h2v1.html"
+    },
+    {
+        "duration": "20.0",
+        "name": "blink_perf.image_decoder/decode-jpeg-h2v2.html"
+    },
+    {
+        "duration": "26.0",
+        "name": "blink_perf.image_decoder/decode-lossless-webp.html"
+    },
+    {
+        "duration": "20.0",
+        "name": "blink_perf.image_decoder/decode-lossy-webp.html"
+    },
+    {
+        "duration": "22.0",
+        "name": "blink_perf.image_decoder/decode-png-palette-opaque.html"
+    },
+    {
+        "duration": "20.0",
+        "name": "blink_perf.image_decoder/decode-png-palette.html"
+    },
+    {
+        "duration": "28.0",
+        "name": "blink_perf.image_decoder/decode-png.html"
+    },
+    {
+        "duration": "46.0",
+        "name": "blink_perf.layout/ArabicLineLayout.html"
+    },
+    {
+        "duration": "4.0",
+        "name": "blink_perf.layout/Shapes/MultipleShapes.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.layout/SimpleTextPathLineLayout.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.layout/add-remove-inline-floats.html"
+    },
+    {
+        "duration": "4.0",
+        "name": "blink_perf.layout/animate-abspos-deep.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.layout/attach-inlines-2.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.layout/attach-inlines.html"
+    },
+    {
+        "duration": "16.0",
+        "name": "blink_perf.layout/auto-grid-lots-of-data.html"
+    },
+    {
+        "duration": "16.0",
+        "name": "blink_perf.layout/auto-grid-lots-of-spanning-data.html"
+    },
+    {
+        "duration": "18.0",
+        "name": "blink_perf.layout/change-text-css-contain.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.layout/chapter-reflow-once-random.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.layout/chapter-reflow-once.html"
+    },
+    {
+        "duration": "16.0",
+        "name": "blink_perf.layout/chapter-reflow-thrice.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.layout/chapter-reflow-twice.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.layout/chapter-reflow.html"
+    },
+    {
+        "duration": "6.0",
+        "name": "blink_perf.layout/character_fallback.html"
+    },
+    {
+        "duration": "8.0",
+        "name": "blink_perf.layout/contain-content-style-change.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.layout/editing_append.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.layout/editing_append_single_line.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.layout/editing_delete.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.layout/editing_insert.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.layout/editing_prepend.html"
+    },
+    {
+        "duration": "22.0",
+        "name": "blink_perf.layout/fit-content-change-available-size-blocks.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.layout/fit-content-change-available-size-text.html"
+    },
+    {
+        "duration": "16.0",
+        "name": "blink_perf.layout/fixed-grid-lots-of-data.html"
+    },
+    {
+        "duration": "16.0",
+        "name": "blink_perf.layout/fixed-grid-lots-of-stretched-data.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.layout/flexbox-column-nowrap.html"
+    },
+    {
+        "duration": "16.0",
+        "name": "blink_perf.layout/flexbox-column-wrap.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.layout/flexbox-deeply-nested-column-flow.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.layout/flexbox-lots-of-data.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.layout/flexbox-row-nowrap.html"
+    },
+    {
+        "duration": "18.0",
+        "name": "blink_perf.layout/flexbox-row-stretch-height-definite.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.layout/flexbox-row-wrap.html"
+    },
+    {
+        "duration": "18.0",
+        "name": "blink_perf.layout/flexbox-with-stretch-layout.html"
+    },
+    {
+        "duration": "20.0",
+        "name": "blink_perf.layout/flexbox_with_list_item.html"
+    },
+    {
+        "duration": "10.0",
+        "name": "blink_perf.layout/floats_100_100.html"
+    },
+    {
+        "duration": "10.0",
+        "name": "blink_perf.layout/floats_100_100_nested.html"
+    },
+    {
+        "duration": "10.0",
+        "name": "blink_perf.layout/floats_10_1000.html"
+    },
+    {
+        "duration": "6.0",
+        "name": "blink_perf.layout/floats_20_100.html"
+    },
+    {
+        "duration": "6.0",
+        "name": "blink_perf.layout/floats_20_100_nested.html"
+    },
+    {
+        "duration": "4.0",
+        "name": "blink_perf.layout/floats_2_100.html"
+    },
+    {
+        "duration": "4.0",
+        "name": "blink_perf.layout/floats_2_100_nested.html"
+    },
+    {
+        "duration": "6.0",
+        "name": "blink_perf.layout/floats_50_100.html"
+    },
+    {
+        "duration": "6.0",
+        "name": "blink_perf.layout/floats_50_100_nested.html"
+    },
+    {
+        "duration": "16.0",
+        "name": "blink_perf.layout/hindi-line-layout.html"
+    },
+    {
+        "duration": "6.0",
+        "name": "blink_perf.layout/japanese-kokoro-insert.html"
+    },
+    {
+        "duration": "18.0",
+        "name": "blink_perf.layout/large-grid.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.layout/large-spanning-grid-item.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans-wider-than-table.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans.html"
+    },
+    {
+        "duration": "14.0",
+        "name": "blink_perf.layout/large-table-with-collapsed-borders-and-no-colspans.html"
+    },
+    {
+        "duration": "12.0",
+        "name": "blink_perf.layout/latin-ebook-resize.html"
+    },
+    {
+        "duration": "8.0",
         "name": "blink_perf.layout/latin-ebook.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.layout/layers_overlap_2d.html"
     },
     {
@@ -876,527 +880,527 @@
         "name": "blink_perf.layout/layers_overlap_3d.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.layout/line-layout-fit-content-break-word.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/line-layout-fit-content.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/line-layout-line-height.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/line-layout-repeat-append-select.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/line-layout-repeat-append.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/line-layout.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.layout/long-line-nowrap-collapse.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.layout/long-line-nowrap-spans-collapse.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/long-line-nowrap.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/many-block-children-auto-inline-size.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/many-block-children-fixed-inline-size.html"
     },
     {
-        "duration": "7.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/multicol/balance-forced-breaks.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/multicol/deeply-nested-tables.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/multicol/fixed-height-with-spanner-and-nested-tables.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/multicol/lots-of-small-nested-unbreakable-blocks-autofill.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/multicol/lots-of-small-unbreakable-blocks-autofill.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/multicol/lots-of-text-autofill.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/multicol/lots-of-text-balanced-orphans-widows.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/multicol/lots-of-text-balanced.html"
     },
     {
-        "duration": "13.0",
+        "duration": "28.0",
         "name": "blink_perf.layout/multicol/nested-forced-breaks.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/multicol/tall-content-short-columns-realistic.html"
     },
     {
-        "duration": "7.0",
+        "duration": "24.0",
         "name": "blink_perf.layout/multicol/tall-content-short-columns.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/nested-blocks-with-percent-height-and-max-height.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/nested-grid.html"
     },
     {
-        "duration": "7.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/nested-percent-height-tables.html"
     },
     {
-        "duration": "34.0",
+        "duration": "66.0",
         "name": "blink_perf.layout/subtree-detaching.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.layout/vertical-japanese-kokoro-insert.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.layout/word-break-break-all.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.layout/word-break-break-word.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.layout/word-wrap-break-word.html"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "blink_perf.owp_storage/blob-perf-files.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.owp_storage/blob-perf-ipc.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.owp_storage/blob-perf-shm.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.owp_storage/blob-perf-tiny.html"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "blink_perf.owp_storage/idb-load-docs.html"
     },
     {
-        "duration": "12.0",
+        "duration": "22.0",
         "name": "blink_perf.paint/appending-text.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.paint/color-changes.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.paint/complex-content-slow-scroll.html"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "blink_perf.paint/complex-iframe-filtered.html"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "blink_perf.paint/contain-update-layer-tree.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.paint/containment-resize.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.paint/fixed-and-many-layers-scroll.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.paint/large-table-background-change-with-invisible-collapsed-borders.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.paint/large-table-background-change-with-visible-collapsed-borders.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.paint/large-table-background-change-with-zero-width-collapsed-borders.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.paint/large-table-collapsed-border-change-with-backgrounds.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.paint/large-table-collapsed-border-change-with-text.html"
     },
     {
-        "duration": "10.0",
+        "duration": "18.0",
         "name": "blink_perf.paint/large-table-collapsed-border-change.html"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "blink_perf.paint/large-table-repaint.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.paint/move-text-with-mask.html"
     },
     {
-        "duration": "10.0",
+        "duration": "18.0",
         "name": "blink_perf.paint/paint-offset-changes.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.paint/select-all-words.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.paint/transform-changes.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.parser/css-parser-yui.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.parser/html-parser-threaded.html"
     },
     {
-        "duration": "5.0",
+        "duration": "8.0",
         "name": "blink_perf.parser/html-parser.html"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "blink_perf.parser/html5-full-render.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/iframe-append-remove.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/innerHTML-setter-siblings.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.parser/innerHTML-setter.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.parser/query-selector-all-attribute-complex.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.parser/query-selector-all-attribute.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.parser/query-selector-all-class-deep.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/query-selector-all-class-first.html"
     },
     {
-        "duration": "7.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/query-selector-all-class-last.html"
     },
     {
-        "duration": "7.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/query-selector-all-class.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.parser/query-selector-all-deep.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.parser/query-selector-all-first.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/query-selector-all-id-deep.html"
     },
     {
-        "duration": "7.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/query-selector-all-id-first.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/query-selector-all-id-last.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.parser/query-selector-all-last.html"
     },
     {
-        "duration": "12.0",
+        "duration": "14.0",
         "name": "blink_perf.parser/query-selector-deep.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.parser/query-selector-first.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.parser/query-selector-id-deep.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/query-selector-id-last.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.parser/query-selector-last.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.parser/simple-url.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/textarea-parsing.html"
     },
     {
-        "duration": "7.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/tiny-innerHTML.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/url-parser.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.parser/xml-parser.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.shadow_dom/declarative-api.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/imperative-api-appendchild.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/imperative-api-assign.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/imperative-api-assigned-elements.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/imperative-api-assigned-slot.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/imperative-api-custom-detail-summary-large.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/imperative-api-custom-detail-summary.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/imperative-api-detail-summary-large.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/imperative-api-detail-summary.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/imperative-api-insertbefore.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/imperative-api.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/shadow-style-share-attr-selectors.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/shadow-style-share-media-query.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/shadow-style-share-with-distribution.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/shadow-style-share.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/style-sheet-insert.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v0-changing-classname-with-shadow-dom.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v0-changing-classname-without-shadow-dom.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v0-changing-select-with-shadow-dom.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.shadow_dom/v0-changing-select-without-shadow-dom.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v0-content-reprojection.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v0-large-distribution-without-layout.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v0-multiple-insertion-points.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v0-shadow-reprojection.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v0-small-distribution-with-layout.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.shadow_dom/v1-distribution-disconnected-and-reconnected.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-distribution.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-host-child-append.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.shadow_dom/v1-large-deep-distribution.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.shadow_dom/v1-large-deep-layout.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-append-layout.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-distribution.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-layout.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-prepend-layout.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-re-layout.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-slot-assigned-nodes.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-slot-flatten.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-re-layout.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-assigned-nodes.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-flatten.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-slot-append.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-small-deep-distribution.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-small-deep-layout.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-small-shallow-distribution.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-small-shallow-layout.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.svg/AzLizardBenjiPark.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.svg/Bamboo.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/Cactus.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/Cowboy.html"
     },
     {
@@ -1404,51 +1408,51 @@
         "name": "blink_perf.svg/Cowboy_transform.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/CrawFishGanson.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/Debian.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/DropsOnABlade.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/FlowerFromMyGarden.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/FoodLeifLodahl.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/France.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/FrancoBolloGnomeEzechi.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/GearFlowers.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/HarveyRayner.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/HereGear.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.svg/MtSaintHelens.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/Samurai.html"
     },
     {
@@ -1456,739 +1460,739 @@
         "name": "blink_perf.svg/SierpinskiCarpet.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/SvgCubics.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/SvgHitTesting.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.svg/SvgNestedUse.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/UnderTheSee.html"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/WorldIso.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.svg/Worldcup.html"
     },
     {
-        "duration": "37.0",
+        "duration": "72.0",
         "name": "dromaeo/http://dromaeo.com?dom-attr"
     },
     {
-        "duration": "34.0",
+        "duration": "68.0",
         "name": "dromaeo/http://dromaeo.com?dom-modify"
     },
     {
-        "duration": "47.0",
+        "duration": "94.0",
         "name": "dromaeo/http://dromaeo.com?dom-query"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "dromaeo/http://dromaeo.com?dom-traverse"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "dummy_benchmark.noisy_benchmark_1/dummy_page.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "dummy_benchmark.stable_benchmark_1/dummy_page.html"
     },
     {
-        "duration": "184.0",
+        "duration": "368.0",
         "name": "jetstream/JetStream"
     },
     {
-        "duration": "168.0",
+        "duration": "334.0",
         "name": "jetstream2/JetStream2"
     },
     {
-        "duration": "28.0",
+        "duration": "48.0",
         "name": "kraken/http://krakenbenchmark.mozilla.org/kraken-1.1/driver.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "loading.desktop/24h_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "loading.desktop/24h_warm"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "loading.desktop/AirBnB_cold"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "loading.desktop/AirBnB_warm"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "loading.desktop/Aljayyash_cold"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "loading.desktop/Aljayyash_warm"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "loading.desktop/AllRecipes_cold"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "loading.desktop/AllRecipes_warm"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "loading.desktop/ArsTechnica_cold"
     },
     {
-        "duration": "38.0",
+        "duration": "54.0",
         "name": "loading.desktop/ArsTechnica_warm"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "loading.desktop/Baidu_cold"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "loading.desktop/Baidu_warm"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "loading.desktop/Bhaskar_cold"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "loading.desktop/Bhaskar_warm"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "loading.desktop/Chosun_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "loading.desktop/Chosun_warm"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "loading.desktop/Colorado.edu_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "loading.desktop/Colorado.edu_warm"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "loading.desktop/Danawa_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "loading.desktop/Danawa_warm"
     },
     {
-        "duration": "12.0",
+        "duration": "22.0",
         "name": "loading.desktop/Daum_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "loading.desktop/Daum_warm"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "loading.desktop/Donga_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "loading.desktop/Donga_warm"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "loading.desktop/Economist_cold"
     },
     {
-        "duration": "20.0",
+        "duration": "60.0",
         "name": "loading.desktop/Economist_warm"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "loading.desktop/Elmundo_cold"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "loading.desktop/Elmundo_warm"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "loading.desktop/FC2Blog_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "loading.desktop/FC2Blog_warm"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "loading.desktop/FIFA_cold"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "loading.desktop/FIFA_warm"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "loading.desktop/FarsNews_cold"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "loading.desktop/FarsNews_warm"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "loading.desktop/Flickr_cold"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "loading.desktop/Flickr_warm"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "loading.desktop/FlipKart_cold"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "loading.desktop/FlipKart_warm"
     },
     {
-        "duration": "11.0",
+        "duration": "44.0",
         "name": "loading.desktop/Free.fr_cold"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "loading.desktop/Free.fr_warm"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "loading.desktop/HTML5Rocks_cold"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "loading.desktop/HTML5Rocks_warm"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "loading.desktop/Haraj_cold"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "loading.desktop/Haraj_warm"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "loading.desktop/HatenaBookmark_cold"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "loading.desktop/HatenaBookmark_warm"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "loading.desktop/IGN_cold"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "loading.desktop/IGN_warm"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "loading.desktop/IMDB_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "loading.desktop/IMDB_warm"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "loading.desktop/IndiaTimes_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "28.0",
         "name": "loading.desktop/IndiaTimes_warm"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "loading.desktop/Kakaku_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "loading.desktop/Kakaku_warm"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "loading.desktop/Kenh14_cold"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "loading.desktop/Kenh14_warm"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "loading.desktop/Mercadolivre_cold"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "loading.desktop/Mercadolivre_warm"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "loading.desktop/Naver_cold"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "loading.desktop/Naver_warm"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "loading.desktop/Orange_cold"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "loading.desktop/Orange_warm"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "loading.desktop/Pantip_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "loading.desktop/Pantip_warm"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "loading.desktop/PremierLeague_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "loading.desktop/PremierLeague_warm"
     },
     {
-        "duration": "23.0",
+        "duration": "24.0",
         "name": "loading.desktop/QQ_cold"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "loading.desktop/QQ_warm"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "loading.desktop/REI_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "28.0",
         "name": "loading.desktop/REI_warm"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "loading.desktop/Ruten_cold"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "loading.desktop/Ruten_warm"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "loading.desktop/Sina_cold"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "loading.desktop/Sina_warm"
     },
     {
-        "duration": "13.0",
+        "duration": "46.0",
         "name": "loading.desktop/Taobao_cold"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "loading.desktop/Taobao_warm"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "loading.desktop/TheOnion_cold"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "loading.desktop/TheOnion_warm"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "loading.desktop/TheVerge_cold"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "loading.desktop/TheVerge_warm"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "loading.desktop/TicketMaster_cold"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "loading.desktop/TicketMaster_warm"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "loading.desktop/Vietnamnet_cold"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "loading.desktop/Vietnamnet_warm"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "loading.desktop/Vnexpress_cold"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "loading.desktop/Vnexpress_warm"
     },
     {
-        "duration": "4.0",
+        "duration": "10.0",
         "name": "loading.desktop/Walgreens_cold"
     },
     {
-        "duration": "4.0",
+        "duration": "10.0",
         "name": "loading.desktop/Walgreens_warm"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "loading.desktop/Yandex_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "loading.desktop/Yandex_warm"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "loading.desktop/amazon.co.jp_cold"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "loading.desktop/amazon.co.jp_warm"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "loading.desktop/ja.wikipedia_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "28.0",
         "name": "loading.desktop/ja.wikipedia_warm"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "loading.desktop/money.cnn_cold"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "loading.desktop/money.cnn_warm"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "loading.desktop/ru.wikipedia_cold"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "loading.desktop/ru.wikipedia_warm"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "loading.desktop/uol.com.br_cold"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "loading.desktop/uol.com.br_warm"
     },
     {
-        "duration": "12.0",
+        "duration": "22.0",
         "name": "loading.desktop/yahoo.co.jp_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "loading.desktop/yahoo.co.jp_warm"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "media.desktop/mse.html?media=aac_audio.mp4"
     },
     {
-        "duration": "12.0",
+        "duration": "22.0",
         "name": "media.desktop/mse.html?media=aac_audio.mp4,h264_video.mp4"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "media.desktop/mse.html?media=h264_video.mp4"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "media.desktop/mse.html?media=tulip0.av1.mp4"
     },
     {
-        "duration": "12.0",
+        "duration": "22.0",
         "name": "media.desktop/mse.html?media=tulip2.vp9.webm"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "media.desktop/video.html?src=crowd1080.mp4"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "media.desktop/video.html?src=crowd1080.webm"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "media.desktop/video.html?src=crowd1080_vp9.webm"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "media.desktop/video.html?src=garden2_10s.mp4&seek"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "media.desktop/video.html?src=garden2_10s.webm&seek"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "media.desktop/video.html?src=smpte_3840x2160_60fps_vp9.webm&seek"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "media.desktop/video.html?src=tulip0.av1.mp4"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "media.desktop/video.html?src=tulip0.av1.mp4&seek"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "media.desktop/video.html?src=tulip2.m4a&type=audio"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "media.desktop/video.html?src=tulip2.mp3&type=audio"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "media.desktop/video.html?src=tulip2.mp3&type=audio&seek"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "media.desktop/video.html?src=tulip2.mp4"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "media.desktop/video.html?src=tulip2.mp4&busyjs"
     },
     {
-        "duration": "23.0",
+        "duration": "50.0",
         "name": "media.desktop/video.html?src=tulip2.ogg&type=audio"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "media.desktop/video.html?src=tulip2.ogg&type=audio&seek"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "media.desktop/video.html?src=tulip2.vp9.webm"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "media.desktop/video.html?src=tulip2.vp9.webm&background"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "media.desktop/video.html?src=tulip2.vp9.webm_WiFi"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "memory.desktop/TrivialAnimationPageSharedPageState"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "memory.desktop/TrivialBlinkingCursorPageSharedPageState"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "memory.desktop/TrivialBlurAnimationPageSharedPageState"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "memory.desktop/TrivialCanvasPageSharedPageState"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "memory.desktop/TrivialFullscreenVideoPageSharedPageState"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "memory.desktop/TrivialGifPageSharedPageState"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "memory.desktop/TrivialScrollingPageSharedPageState"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "memory.desktop/TrivialWebGLPageSharedPageState"
     },
     {
-        "duration": "42.0",
+        "duration": "86.0",
         "name": "memory.desktop/WebWorker"
     },
     {
-        "duration": "43.0",
+        "duration": "82.0",
         "name": "octane/Octane"
     },
     {
-        "duration": "36.0",
+        "duration": "72.0",
         "name": "power.desktop/TrivialAnimationPageSharedPageState"
     },
     {
-        "duration": "36.0",
+        "duration": "72.0",
         "name": "power.desktop/TrivialBlinkingCursorPageSharedPageState"
     },
     {
-        "duration": "36.0",
+        "duration": "72.0",
         "name": "power.desktop/TrivialBlurAnimationPageSharedPageState"
     },
     {
-        "duration": "36.0",
+        "duration": "72.0",
         "name": "power.desktop/TrivialCanvasPageSharedPageState"
     },
     {
-        "duration": "37.0",
+        "duration": "74.0",
         "name": "power.desktop/TrivialFullscreenVideoPageSharedPageState"
     },
     {
-        "duration": "36.0",
+        "duration": "72.0",
         "name": "power.desktop/TrivialGifPageSharedPageState"
     },
     {
-        "duration": "38.0",
+        "duration": "76.0",
         "name": "power.desktop/TrivialScrollingPageSharedPageState"
     },
     {
-        "duration": "36.0",
+        "duration": "72.0",
         "name": "power.desktop/TrivialWebGLPageSharedPageState"
     },
     {
-        "duration": "43.0",
+        "duration": "84.0",
         "name": "power.desktop/abcnews"
     },
     {
-        "duration": "36.0",
+        "duration": "76.0",
         "name": "power.desktop/indiatimes"
     },
     {
-        "duration": "36.0",
+        "duration": "72.0",
         "name": "power.desktop/instagram"
     },
     {
-        "duration": "36.0",
+        "duration": "76.0",
         "name": "power.desktop/microsoft"
     },
     {
-        "duration": "37.0",
+        "duration": "74.0",
         "name": "power.desktop/sina"
     },
     {
-        "duration": "36.0",
+        "duration": "72.0",
         "name": "power.desktop/slideshare"
     },
     {
-        "duration": "37.0",
+        "duration": "90.0",
         "name": "power.desktop/uol"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "rasterize_and_record_micro.partial_invalidation/800_relpos_divs.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/amazon.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/blogger.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/booking.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/cnn.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/ebay.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/espn.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/facebook.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/gmail.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/google.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googlecalendar.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googledocs.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleimagesearch.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleplus.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/linkedin.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/pinterest.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/techcrunch.html"
     },
     {
-        "duration": "8.0",
+        "duration": "14.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/twitter.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/weather.html"
     },
     {
@@ -2196,1635 +2200,1635 @@
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/wikipedia.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/wordpress.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahooanswers.html"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoogames.html"
     },
     {
-        "duration": "95.0",
+        "duration": "178.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoonews.html"
     },
     {
-        "duration": "70.0",
+        "duration": "140.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoosports.html"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/youtube.html"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.desktop/accu_weather_2018"
     },
     {
-        "duration": "20.0",
+        "duration": "42.0",
         "name": "rendering.desktop/accu_weather_pinch_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/amazon_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/amazon_pinch_2018"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/analog_clock_svg"
     },
     {
-        "duration": "20.0",
+        "duration": "38.0",
         "name": "rendering.desktop/animometer_webgl"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "rendering.desktop/animometer_webgl_attrib_arrays"
     },
     {
-        "duration": "25.0",
+        "duration": "46.0",
         "name": "rendering.desktop/animometer_webgl_multi_draw"
     },
     {
-        "duration": "20.0",
+        "duration": "42.0",
         "name": "rendering.desktop/aquarium"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/aquarium_20k"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rendering.desktop/background_color_animation"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/background_color_animation_with_gradient"
     },
     {
-        "duration": "19.0",
+        "duration": "36.0",
         "name": "rendering.desktop/balls_css_key_frame_animations"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rendering.desktop/balls_css_key_frame_animations_composited_transform"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/balls_css_transition_2_properties"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/balls_css_transition_40_properties"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/balls_css_transition_all_properties"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/balls_javascript_canvas"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/balls_javascript_css"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/balls_svg_animations"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "rendering.desktop/blob"
     },
     {
-        "duration": "16.0",
+        "duration": "46.0",
         "name": "rendering.desktop/blogspot_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "40.0",
         "name": "rendering.desktop/blogspot_pinch_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "30.0",
         "name": "rendering.desktop/blur_rotating_background"
     },
     {
-        "duration": "13.0",
+        "duration": "28.0",
         "name": "rendering.desktop/booking.com_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/booking_pinch_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/bouncing_balls_15"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/bouncing_balls_shadow"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/bouncing_clipped_rectangles"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/bouncing_gradient_circles"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/bouncing_png_images"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/bouncing_svg_images"
     },
     {
-        "duration": "22.0",
+        "duration": "48.0",
         "name": "rendering.desktop/camera_to_webgl"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/canvas_05000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "30.0",
         "name": "rendering.desktop/canvas_10000_pixels_per_second"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "rendering.desktop/canvas_20000_pixels_per_second"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "rendering.desktop/canvas_40000_pixels_per_second"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "rendering.desktop/canvas_60000_pixels_per_second"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "rendering.desktop/canvas_75000_pixels_per_second"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "rendering.desktop/canvas_90000_pixels_per_second"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/canvas_animation_no_clear"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/canvas_arcs"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/canvas_font_cycler"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/canvas_lines"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/canvas_to_blob"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "rendering.desktop/cats_unscaled"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "rendering.desktop/cats_viewport_width"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "rendering.desktop/cc_poster_circle"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/cc_scroll_text_only"
     },
     {
-        "duration": "20.0",
+        "duration": "42.0",
         "name": "rendering.desktop/chip_tune"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/cnn_2018"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "rendering.desktop/cnn_pinch_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/compositor_heavy_animation"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/crafty_mind"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/css_animations_many_keyframes"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/css_animations_simultaneous_inline_style"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_animations_simultaneous_new_element"
     },
     {
-        "duration": "19.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_animations_simultaneous_style_element"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_animations_simultaneous_updating_class"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_animations_staggered_infinite_iterations"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/css_animations_staggered_inline_style"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/css_animations_staggered_new_element"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/css_animations_staggered_style_element"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/css_animations_staggered_updating_class"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/css_animations_triggered_inline_style"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/css_animations_triggered_new_element"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/css_animations_triggered_style_element"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/css_animations_triggered_updating_class"
     },
     {
-        "duration": "20.0",
+        "duration": "42.0",
         "name": "rendering.desktop/css_opacity_plus_n_layers_99"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_transitions_inline_style"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_transitions_new_element"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_transitions_staggered_inline_style"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/css_transitions_staggered_new_element"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_transitions_staggered_style_element"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_transitions_staggered_updating_class"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_transitions_style_element"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/css_transitions_triggered_inline_style"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/css_transitions_triggered_new_element"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_transitions_triggered_style_element"
     },
     {
-        "duration": "17.0",
+        "duration": "38.0",
         "name": "rendering.desktop/css_transitions_triggered_updating_class"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_transitions_updating_class"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_value_type_color"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_value_type_filter"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_value_type_length"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_value_type_length_complex"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_value_type_length_simple"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_value_type_path"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_value_type_shadow"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_value_type_transform_complex"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_value_type_transform_simple"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "rendering.desktop/dynamic_cube_map"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rendering.desktop/earth"
     },
     {
-        "duration": "13.0",
+        "duration": "28.0",
         "name": "rendering.desktop/ebay_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/ebay_pinch_2018"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "rendering.desktop/effect_games"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "rendering.desktop/espn_2018"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/espn_pinch_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/extra_large_texture_uploads"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/facebook_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/facebook_pinch_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/fill_shapes"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/filter_terrain_svg"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/geo_apis"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/gmail_2018"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "rendering.desktop/gmail_move_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/gmail_pinch_2018"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "rendering.desktop/google_calendar_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/google_calendar_pinch_2018"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/google_docs_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/google_image_pinch_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/google_image_search_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/google_plus_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/google_search_pinch_2018"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "rendering.desktop/google_web_search_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/guimark_vector_chart"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/hakim"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "rendering.desktop/ie_chalkboard"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "rendering.desktop/ie_pirate_mark"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rendering.desktop/infinite_scroll_element_n_layers_99"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/infinite_scroll_root_fixed_n_layers_99"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "rendering.desktop/infinite_scroll_root_n_layers_99"
     },
     {
-        "duration": "19.0",
+        "duration": "34.0",
         "name": "rendering.desktop/jarro_doverson"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "rendering.desktop/jpeg_decoding_rgb_and_gpu_rasterization"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "rendering.desktop/jpeg_decoding_yuv_and_gpu_rasterization"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "rendering.desktop/js_full_screen_invalidation"
     },
     {
-        "duration": "22.0",
+        "duration": "40.0",
         "name": "rendering.desktop/js_opacity_plus_n_layers_99"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "rendering.desktop/js_paint_plus_n_layers_99"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "rendering.desktop/js_poster_circle"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rendering.desktop/js_scroll_text_only"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "rendering.desktop/kevs_3d"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/keyframed_animations"
     },
     {
-        "duration": "16.0",
+        "duration": "38.0",
         "name": "rendering.desktop/large_texture_uploads"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/linkedin_2018"
     },
     {
-        "duration": "19.0",
+        "duration": "36.0",
         "name": "rendering.desktop/linkedin_pinch_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/main_0fps_impl_60fps"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/main_0fps_impl_60fps_no_update"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/main_0fps_impl_60fps_no_update_jank"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/main_0fps_with_jank_impl_0fps"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/main_15fps_impl_0fps"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/main_15fps_with_jank_impl_0fps"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/main_30fps_impl_0fps"
     },
     {
-        "duration": "17.0",
+        "duration": "32.0",
         "name": "rendering.desktop/main_30fps_impl_60fps"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/main_60fps_impl_0fps"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/main_60fps_impl_60fps"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/main_60fps_impl_60fps_no_update"
     },
     {
-        "duration": "17.0",
+        "duration": "32.0",
         "name": "rendering.desktop/main_60fps_impl_60fps_no_update_jank"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/main_60fps_with_jank_impl_0fps"
     },
     {
-        "duration": "16.0",
+        "duration": "38.0",
         "name": "rendering.desktop/man_in_blue"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/many_images"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "rendering.desktop/many_planets_deep"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/maps_move_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/maps_perf_test"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/medium_texture_uploads"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/megi_dish"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/microsoft_asteroid_belt"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/microsoft_fireflies"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/microsoft_fish_ie_tank"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/microsoft_performance"
     },
     {
-        "duration": "17.0",
+        "duration": "32.0",
         "name": "rendering.desktop/microsoft_snow"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/microsoft_speed_reading"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/microsoft_tweet_map"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/microsoft_video_city"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/microsoft_worker_fountains"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/mix_10k"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "rendering.desktop/mix_blend_mode_animation_difference"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "rendering.desktop/mix_blend_mode_animation_hue"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/mix_blend_mode_animation_propagating_isolation"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/mix_blend_mode_animation_screen"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/motion_mark_canvas_fill_shapes"
     },
     {
-        "duration": "17.0",
+        "duration": "32.0",
         "name": "rendering.desktop/motion_mark_canvas_stroke_shapes"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "rendering.desktop/new_tilings"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/nvidia_vertex_buffer_object"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/off_screen_main_60fps"
     },
     {
-        "duration": "17.0",
+        "duration": "32.0",
         "name": "rendering.desktop/off_screen_main_60fps_jank"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/overlay_background_color_css_transitions_page"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/particles"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rendering.desktop/pinterest_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "32.0",
         "name": "rendering.desktop/put_get_image_data"
     },
     {
-        "duration": "13.0",
+        "duration": "28.0",
         "name": "rendering.desktop/raf"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/raf_animation"
     },
     {
-        "duration": "14.0",
+        "duration": "26.0",
         "name": "rendering.desktop/raf_canvas"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/raf_touch_animation"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/repaint_amazon_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/repaint_cnn_2018"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "rendering.desktop/repaint_facebook_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "28.0",
         "name": "rendering.desktop/repaint_google_search_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "24.0",
         "name": "rendering.desktop/repaint_instagram_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "24.0",
         "name": "rendering.desktop/repaint_reddit_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "24.0",
         "name": "rendering.desktop/repaint_theverge_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "24.0",
         "name": "rendering.desktop/repaint_twitter_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "24.0",
         "name": "rendering.desktop/repaint_wikipedia_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "24.0",
         "name": "rendering.desktop/repaint_yahoo_homepage_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/runway_2019"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "rendering.desktop/san_angeles"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "rendering.desktop/second_batch_js_heavy"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "rendering.desktop/second_batch_js_light"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "rendering.desktop/second_batch_js_medium"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/simple_text_page"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "rendering.desktop/simple_touch_drag"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/small_texture_uploads"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rendering.desktop/smash_cat"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/spielzeugz"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/stroke_shapes"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "rendering.desktop/sync_scroll_offset"
     },
     {
-        "duration": "20.0",
+        "duration": "44.0",
         "name": "rendering.desktop/techcrunch_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/text_05000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/text_10000_pixels_per_second"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "rendering.desktop/text_20000_pixels_per_second"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "rendering.desktop/text_40000_pixels_per_second"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "rendering.desktop/text_60000_pixels_per_second"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "rendering.desktop/text_75000_pixels_per_second"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "rendering.desktop/text_90000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/text_constant_full_page_raster_05000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/text_constant_full_page_raster_10000_pixels_per_second"
     },
     {
-        "duration": "12.0",
+        "duration": "22.0",
         "name": "rendering.desktop/text_constant_full_page_raster_20000_pixels_per_second"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "rendering.desktop/text_constant_full_page_raster_40000_pixels_per_second"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "rendering.desktop/text_constant_full_page_raster_60000_pixels_per_second"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "rendering.desktop/text_constant_full_page_raster_75000_pixels_per_second"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "rendering.desktop/text_constant_full_page_raster_90000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/text_hover_05000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/text_hover_10000_pixels_per_second"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "rendering.desktop/text_hover_20000_pixels_per_second"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "rendering.desktop/text_hover_40000_pixels_per_second"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "rendering.desktop/text_hover_60000_pixels_per_second"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "rendering.desktop/text_hover_75000_pixels_per_second"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "rendering.desktop/text_hover_90000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/touch_handler_scrolling"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/transform_transitions"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/transform_transitions_js_block"
     },
     {
-        "duration": "13.0",
+        "duration": "24.0",
         "name": "rendering.desktop/twitch_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/twitch_pinch_2018"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/twitter_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/twitter_pinch_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/web_animation_value_type_color"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/web_animation_value_type_length_3d"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/web_animation_value_type_length_complex"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/web_animation_value_type_length_simple"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/web_animation_value_type_path"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/web_animation_value_type_shadow"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/web_animation_value_type_transform_complex"
     },
     {
-        "duration": "16.0",
+        "duration": "38.0",
         "name": "rendering.desktop/web_animation_value_type_transform_simple"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/web_animations_many_keyframes"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "rendering.desktop/web_animations_set_current_time"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "rendering.desktop/web_animations_simultaneous"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/web_animations_staggered_chaining"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/web_animations_staggered_infinite_iterations"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/web_animations_staggered_triggering_page"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "rendering.desktop/webp_decoding_rgb_and_gpu_rasterization"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "rendering.desktop/webp_decoding_yuv_and_gpu_rasterization"
     },
     {
-        "duration": "15.0",
+        "duration": "40.0",
         "name": "rendering.desktop/wikipedia_2018"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/wordpress_2018"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "rendering.desktop/yahoo_answers_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "28.0",
         "name": "rendering.desktop/yahoo_news_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "36.0",
         "name": "rendering.desktop/yahoo_news_pinch_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "28.0",
         "name": "rendering.desktop/yahoo_sports_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "28.0",
         "name": "rendering.desktop/yahoo_sports_pinch_2018"
     },
     {
-        "duration": "4.0",
+        "duration": "10.0",
         "name": "rendering.desktop/youtube_2018"
     },
     {
-        "duration": "4.0",
+        "duration": "10.0",
         "name": "rendering.desktop/youtube_pinch_2018"
     },
     {
-        "duration": "43.0",
+        "duration": "84.0",
         "name": "speedometer-future/http://browserbench.org/Speedometer/"
     },
     {
-        "duration": "40.0",
+        "duration": "80.0",
         "name": "speedometer/http://browserbench.org/Speedometer/"
     },
     {
-        "duration": "76.0",
+        "duration": "156.0",
         "name": "speedometer2-future/Speedometer2"
     },
     {
-        "duration": "76.0",
+        "duration": "146.0",
         "name": "speedometer2/Speedometer2"
     },
     {
-        "duration": "39.0",
+        "duration": "76.0",
         "name": "system_health.common_desktop/browse:media:googleplaystore:2018"
     },
     {
-        "duration": "71.0",
+        "duration": "142.0",
         "name": "system_health.common_desktop/browse:media:imgur"
     },
     {
-        "duration": "87.0",
+        "duration": "176.0",
         "name": "system_health.common_desktop/browse:media:pinterest:2018"
     },
     {
-        "duration": "59.0",
+        "duration": "114.0",
         "name": "system_health.common_desktop/browse:media:tumblr:2018"
     },
     {
-        "duration": "6.0",
+        "duration": "8.0",
         "name": "system_health.common_desktop/browse:media:youtube:2019"
     },
     {
-        "duration": "67.0",
+        "duration": "130.0",
         "name": "system_health.common_desktop/browse:media:youtubetv:2019"
     },
     {
-        "duration": "40.0",
+        "duration": "78.0",
         "name": "system_health.common_desktop/browse:news:cnn:2018"
     },
     {
-        "duration": "45.0",
+        "duration": "88.0",
         "name": "system_health.common_desktop/browse:news:flipboard:2018"
     },
     {
-        "duration": "5.0",
+        "duration": "8.0",
         "name": "system_health.common_desktop/browse:news:hackernews:2018"
     },
     {
-        "duration": "57.0",
+        "duration": "114.0",
         "name": "system_health.common_desktop/browse:news:nytimes:2018"
     },
     {
-        "duration": "47.0",
+        "duration": "88.0",
         "name": "system_health.common_desktop/browse:news:reddit:2018"
     },
     {
-        "duration": "48.0",
+        "duration": "94.0",
         "name": "system_health.common_desktop/browse:search:google:2018"
     },
     {
-        "duration": "34.0",
+        "duration": "66.0",
         "name": "system_health.common_desktop/browse:search:google_india:2018"
     },
     {
-        "duration": "67.0",
+        "duration": "132.0",
         "name": "system_health.common_desktop/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "62.0",
+        "duration": "110.0",
         "name": "system_health.common_desktop/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "45.0",
+        "duration": "86.0",
         "name": "system_health.common_desktop/browse:social:twitter:2018"
     },
     {
-        "duration": "63.0",
+        "duration": "122.0",
         "name": "system_health.common_desktop/browse:social:twitter_infinite_scroll:2018"
     },
     {
-        "duration": "58.0",
+        "duration": "116.0",
         "name": "system_health.common_desktop/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "39.0",
+        "duration": "76.0",
         "name": "system_health.common_desktop/browse:tools:docs_scrolling"
     },
     {
-        "duration": "5.0",
+        "duration": "8.0",
         "name": "system_health.common_desktop/browse:tools:maps:2019"
     },
     {
-        "duration": "32.0",
+        "duration": "62.0",
         "name": "system_health.common_desktop/browse:tools:sheets:2019"
     },
     {
-        "duration": "5.0",
+        "duration": "8.0",
         "name": "system_health.common_desktop/browse_accessibility:media:youtube"
     },
     {
-        "duration": "29.0",
+        "duration": "56.0",
         "name": "system_health.common_desktop/browse_accessibility:tech:codesearch:2018"
     },
     {
-        "duration": "18.0",
+        "duration": "34.0",
         "name": "system_health.common_desktop/load:chrome:blank"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "system_health.common_desktop/load:games:alphabetty:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "system_health.common_desktop/load:games:bubbles:2019"
     },
     {
-        "duration": "21.0",
+        "duration": "34.0",
         "name": "system_health.common_desktop/load:games:lazors"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "system_health.common_desktop/load:games:miniclip:2018"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "system_health.common_desktop/load:games:spychase:2018"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "system_health.common_desktop/load:media:9gag"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "system_health.common_desktop/load:media:dailymotion:2019"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "system_health.common_desktop/load:media:facebook_photos:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "system_health.common_desktop/load:media:flickr:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "system_health.common_desktop/load:media:google_images:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "system_health.common_desktop/load:media:imgur:2018"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "system_health.common_desktop/load:media:soundcloud:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "system_health.common_desktop/load:media:youtube:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "system_health.common_desktop/load:news:bbc:2018"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "system_health.common_desktop/load:news:cnn:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "system_health.common_desktop/load:news:flipboard"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "system_health.common_desktop/load:news:hackernews:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "system_health.common_desktop/load:news:nytimes:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "system_health.common_desktop/load:news:qq:2018"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "system_health.common_desktop/load:news:reddit:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "system_health.common_desktop/load:news:wikipedia:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "system_health.common_desktop/load:search:amazon:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "system_health.common_desktop/load:search:baidu:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "system_health.common_desktop/load:search:ebay:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "system_health.common_desktop/load:search:flipkart:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "system_health.common_desktop/load:search:google:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "system_health.common_desktop/load:search:taobao:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "system_health.common_desktop/load:search:yahoo:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "system_health.common_desktop/load:search:yandex:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "system_health.common_desktop/load:social:instagram:2018"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "system_health.common_desktop/load:social:pinterest:2019"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "system_health.common_desktop/load:social:vk:2018"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "system_health.common_desktop/load:tools:chat:2020"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "system_health.common_desktop/load:tools:docs:2019"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "system_health.common_desktop/load:tools:drive:2019"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "system_health.common_desktop/load:tools:gmail:2019"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "system_health.common_desktop/load:tools:stackoverflow:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "system_health.common_desktop/load:tools:weather:2019"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "system_health.common_desktop/load_accessibility:media:wikipedia:2018"
     },
     {
-        "duration": "18.0",
+        "duration": "34.0",
         "name": "system_health.common_desktop/load_accessibility:shopping:amazon:2018"
     },
     {
-        "duration": "124.0",
+        "duration": "256.0",
         "name": "system_health.common_desktop/long_running:tools:gmail-background"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "system_health.common_desktop/long_running:tools:gmail-foreground"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "system_health.common_desktop/multitab:misc:typical24"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "system_health.common_desktop/multitab:misc:typical24:2018"
     },
     {
-        "duration": "47.0",
+        "duration": "92.0",
         "name": "system_health.common_desktop/play:media:google_play_music"
     },
     {
-        "duration": "45.0",
+        "duration": "86.0",
         "name": "system_health.common_desktop/play:media:soundcloud:2018"
     },
     {
-        "duration": "36.0",
+        "duration": "72.0",
         "name": "system_health.memory_desktop/browse:media:googleplaystore:2018"
     },
     {
-        "duration": "67.0",
+        "duration": "132.0",
         "name": "system_health.memory_desktop/browse:media:imgur"
     },
     {
-        "duration": "85.0",
+        "duration": "168.0",
         "name": "system_health.memory_desktop/browse:media:pinterest:2018"
     },
     {
-        "duration": "54.0",
+        "duration": "110.0",
         "name": "system_health.memory_desktop/browse:media:tumblr:2018"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "system_health.memory_desktop/browse:media:youtube:2019"
     },
     {
-        "duration": "62.0",
+        "duration": "124.0",
         "name": "system_health.memory_desktop/browse:media:youtubetv:2019"
     },
     {
-        "duration": "36.0",
+        "duration": "72.0",
         "name": "system_health.memory_desktop/browse:news:cnn:2018"
     },
     {
-        "duration": "41.0",
+        "duration": "84.0",
         "name": "system_health.memory_desktop/browse:news:flipboard:2018"
     },
     {
-        "duration": "47.0",
+        "duration": "94.0",
         "name": "system_health.memory_desktop/browse:news:hackernews:2018"
     },
     {
-        "duration": "53.0",
+        "duration": "106.0",
         "name": "system_health.memory_desktop/browse:news:nytimes:2018"
     },
     {
-        "duration": "42.0",
+        "duration": "82.0",
         "name": "system_health.memory_desktop/browse:news:reddit:2018"
     },
     {
-        "duration": "44.0",
+        "duration": "88.0",
         "name": "system_health.memory_desktop/browse:search:google:2018"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "system_health.memory_desktop/browse:search:google_india:2018"
     },
     {
-        "duration": "63.0",
+        "duration": "126.0",
         "name": "system_health.memory_desktop/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "54.0",
+        "duration": "106.0",
         "name": "system_health.memory_desktop/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "42.0",
+        "duration": "82.0",
         "name": "system_health.memory_desktop/browse:social:twitter:2018"
     },
     {
-        "duration": "59.0",
+        "duration": "116.0",
         "name": "system_health.memory_desktop/browse:social:twitter_infinite_scroll:2018"
     },
     {
-        "duration": "55.0",
+        "duration": "110.0",
         "name": "system_health.memory_desktop/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "35.0",
+        "duration": "70.0",
         "name": "system_health.memory_desktop/browse:tools:docs_scrolling"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "system_health.memory_desktop/browse:tools:maps:2019"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "system_health.memory_desktop/browse:tools:sheets:2019"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "system_health.memory_desktop/browse_accessibility:media:youtube"
     },
     {
-        "duration": "26.0",
+        "duration": "50.0",
         "name": "system_health.memory_desktop/browse_accessibility:tech:codesearch:2018"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "system_health.memory_desktop/load:chrome:blank"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.memory_desktop/load:games:alphabetty:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.memory_desktop/load:games:bubbles:2019"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "system_health.memory_desktop/load:games:lazors"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "system_health.memory_desktop/load:games:miniclip:2018"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "system_health.memory_desktop/load:games:spychase:2018"
     },
     {
-        "duration": "18.0",
+        "duration": "34.0",
         "name": "system_health.memory_desktop/load:media:9gag"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "system_health.memory_desktop/load:media:dailymotion:2019"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "system_health.memory_desktop/load:media:facebook_photos:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "system_health.memory_desktop/load:media:flickr:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.memory_desktop/load:media:google_images:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "system_health.memory_desktop/load:media:imgur:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "system_health.memory_desktop/load:media:soundcloud:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "system_health.memory_desktop/load:media:youtube:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.memory_desktop/load:news:bbc:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "system_health.memory_desktop/load:news:cnn:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "system_health.memory_desktop/load:news:flipboard"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.memory_desktop/load:news:hackernews:2018"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "system_health.memory_desktop/load:news:nytimes:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "system_health.memory_desktop/load:news:qq:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "system_health.memory_desktop/load:news:reddit:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.memory_desktop/load:news:wikipedia:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.memory_desktop/load:search:amazon:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.memory_desktop/load:search:baidu:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.memory_desktop/load:search:ebay:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "system_health.memory_desktop/load:search:flipkart:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.memory_desktop/load:search:google:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.memory_desktop/load:search:taobao:2018"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "system_health.memory_desktop/load:search:yahoo:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "system_health.memory_desktop/load:search:yandex:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.memory_desktop/load:social:instagram:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "system_health.memory_desktop/load:social:pinterest:2019"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.memory_desktop/load:social:vk:2018"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "system_health.memory_desktop/load:tools:chat:2020"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "system_health.memory_desktop/load:tools:docs:2019"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "system_health.memory_desktop/load:tools:drive:2019"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "system_health.memory_desktop/load:tools:gmail:2019"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.memory_desktop/load:tools:stackoverflow:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "system_health.memory_desktop/load:tools:weather:2019"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.memory_desktop/load_accessibility:media:wikipedia:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "system_health.memory_desktop/load_accessibility:shopping:amazon:2018"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "system_health.memory_desktop/long_running:tools:gmail-background"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "system_health.memory_desktop/long_running:tools:gmail-foreground"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "system_health.memory_desktop/multitab:misc:typical24"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "system_health.memory_desktop/multitab:misc:typical24:2018"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "system_health.memory_desktop/play:media:google_play_music"
     },
     {
-        "duration": "40.0",
+        "duration": "80.0",
         "name": "system_health.memory_desktop/play:media:soundcloud:2018"
     },
     {
@@ -3832,246 +3836,242 @@
         "name": "tab_switching.typical_25/multitab:misc:typical24"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "tracing.tracing_with_background_memory_infra/Facebook"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "tracing.tracing_with_background_memory_infra/Wikipedia"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.amazon.com"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.ask.com/"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.bing.com/"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.yahoo.com/"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.youtube.com"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/#hl=en&q=barack+obama"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/calendar/"
     },
     {
-        "duration": "45.0",
+        "duration": "92.0",
         "name": "v8.browsing_desktop-future/browse:media:googleplaystore:2018"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "v8.browsing_desktop-future/browse:media:imgur"
     },
     {
-        "duration": "95.0",
+        "duration": "186.0",
         "name": "v8.browsing_desktop-future/browse:media:pinterest:2018"
     },
     {
-        "duration": "65.0",
+        "duration": "126.0",
         "name": "v8.browsing_desktop-future/browse:media:tumblr:2018"
     },
     {
-        "duration": "12.0",
+        "duration": "20.0",
         "name": "v8.browsing_desktop-future/browse:media:youtube:2019"
     },
     {
-        "duration": "72.0",
+        "duration": "140.0",
         "name": "v8.browsing_desktop-future/browse:media:youtubetv:2019"
     },
     {
-        "duration": "46.0",
+        "duration": "96.0",
         "name": "v8.browsing_desktop-future/browse:news:cnn:2018"
     },
     {
-        "duration": "51.0",
+        "duration": "104.0",
         "name": "v8.browsing_desktop-future/browse:news:flipboard:2018"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "v8.browsing_desktop-future/browse:news:hackernews:2018"
     },
     {
-        "duration": "66.0",
+        "duration": "128.0",
         "name": "v8.browsing_desktop-future/browse:news:nytimes:2018"
     },
     {
-        "duration": "53.0",
+        "duration": "102.0",
         "name": "v8.browsing_desktop-future/browse:news:reddit:2018"
     },
     {
-        "duration": "53.0",
+        "duration": "108.0",
         "name": "v8.browsing_desktop-future/browse:search:google:2018"
     },
     {
-        "duration": "39.0",
+        "duration": "80.0",
         "name": "v8.browsing_desktop-future/browse:search:google_india:2018"
     },
     {
-        "duration": "73.0",
+        "duration": "148.0",
         "name": "v8.browsing_desktop-future/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "67.0",
+        "duration": "130.0",
         "name": "v8.browsing_desktop-future/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "51.0",
+        "duration": "98.0",
         "name": "v8.browsing_desktop-future/browse:social:twitter:2018"
     },
     {
-        "duration": "69.0",
+        "duration": "134.0",
         "name": "v8.browsing_desktop-future/browse:social:twitter_infinite_scroll:2018"
     },
     {
-        "duration": "64.0",
+        "duration": "130.0",
         "name": "v8.browsing_desktop-future/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "44.0",
+        "duration": "90.0",
         "name": "v8.browsing_desktop-future/browse:tools:docs_scrolling"
     },
     {
-        "duration": "75.0",
+        "duration": "78.0",
         "name": "v8.browsing_desktop-future/browse:tools:maps:2019"
     },
     {
-        "duration": "38.0",
+        "duration": "74.0",
         "name": "v8.browsing_desktop-future/browse:tools:sheets:2019"
     },
     {
-        "duration": "44.0",
+        "duration": "90.0",
         "name": "v8.browsing_desktop/browse:media:googleplaystore:2018"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "v8.browsing_desktop/browse:media:imgur"
     },
     {
-        "duration": "94.0",
+        "duration": "188.0",
         "name": "v8.browsing_desktop/browse:media:pinterest:2018"
     },
     {
-        "duration": "64.0",
+        "duration": "128.0",
         "name": "v8.browsing_desktop/browse:media:tumblr:2018"
     },
     {
-        "duration": "11.0",
+        "duration": "18.0",
         "name": "v8.browsing_desktop/browse:media:youtube:2019"
     },
     {
-        "duration": "77.0",
+        "duration": "140.0",
         "name": "v8.browsing_desktop/browse:media:youtubetv:2019"
     },
     {
-        "duration": "77.0",
+        "duration": "98.0",
         "name": "v8.browsing_desktop/browse:news:cnn:2018"
     },
     {
-        "duration": "50.0",
+        "duration": "100.0",
         "name": "v8.browsing_desktop/browse:news:flipboard:2018"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "v8.browsing_desktop/browse:news:hackernews:2018"
     },
     {
-        "duration": "65.0",
+        "duration": "128.0",
         "name": "v8.browsing_desktop/browse:news:nytimes:2018"
     },
     {
-        "duration": "51.0",
+        "duration": "102.0",
         "name": "v8.browsing_desktop/browse:news:reddit:2018"
     },
     {
-        "duration": "53.0",
+        "duration": "106.0",
         "name": "v8.browsing_desktop/browse:search:google:2018"
     },
     {
-        "duration": "39.0",
+        "duration": "78.0",
         "name": "v8.browsing_desktop/browse:search:google_india:2018"
     },
     {
-        "duration": "73.0",
+        "duration": "146.0",
         "name": "v8.browsing_desktop/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "61.0",
+        "duration": "128.0",
         "name": "v8.browsing_desktop/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "50.0",
+        "duration": "96.0",
         "name": "v8.browsing_desktop/browse:social:twitter:2018"
     },
     {
-        "duration": "69.0",
+        "duration": "132.0",
         "name": "v8.browsing_desktop/browse:social:twitter_infinite_scroll:2018"
     },
     {
-        "duration": "64.0",
+        "duration": "128.0",
         "name": "v8.browsing_desktop/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "44.0",
+        "duration": "88.0",
         "name": "v8.browsing_desktop/browse:tools:docs_scrolling"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "v8.browsing_desktop/browse:tools:maps:2019"
     },
     {
-        "duration": "37.0",
+        "duration": "74.0",
         "name": "v8.browsing_desktop/browse:tools:sheets:2019"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "webrtc/10s_datachannel_transfer"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "webrtc/canvas_capture_peer_connection"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "webrtc/codec_constraints_h264"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "webrtc/codec_constraints_vp8"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "webrtc/codec_constraints_vp9"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "webrtc/hd_local_stream_10s"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "webrtc/multiple_peerconnections"
     },
     {
-        "duration": "31.0",
+        "duration": "62.0",
         "name": "webrtc/pause_play_peerconnections"
     },
     {
-        "duration": "60.0",
-        "name": "net_perftests/_gtest_"
-    },
-    {
         "duration": "16.0",
         "name": "media_perftests/_gtest_"
     },
@@ -4080,15 +4080,19 @@
         "name": "dawn_perf_tests/_gtest_"
     },
     {
-        "duration": "67.0",
-        "name": "performance_browser_tests/_gtest_"
+        "duration": "7.0",
+        "name": "views_perftests/_gtest_"
     },
     {
         "duration": "270.0",
         "name": "base_perftests/_gtest_"
     },
     {
-        "duration": "7.0",
-        "name": "views_perftests/_gtest_"
+        "duration": "67.0",
+        "name": "performance_browser_tests/_gtest_"
+    },
+    {
+        "duration": "60.0",
+        "name": "net_perftests/_gtest_"
     }
 ]
\ No newline at end of file
diff --git a/tools/perf/core/shard_maps/timing_data/win-10-perf_timing.json b/tools/perf/core/shard_maps/timing_data/win-10-perf_timing.json
index b2c52c97..1832d85 100644
--- a/tools/perf/core/shard_maps/timing_data/win-10-perf_timing.json
+++ b/tools/perf/core/shard_maps/timing_data/win-10-perf_timing.json
@@ -1,1390 +1,1394 @@
 [
     {
-        "duration": "31.0",
+        "duration": "44.0",
         "name": "blink_perf.accessibility/line-breaks.html"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "blink_perf.accessibility/textarea-append.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.bindings/append-child.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/create-element.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/document-implementation.html"
     },
     {
-        "duration": "9.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/dom-attribute-on-prototoype.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/first-child.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/gc-forest.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/gc-mini-tree.html"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "blink_perf.bindings/gc-tree.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/get-attribute-rare.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/get-attribute.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/get-element-by-id.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/get-elements-by-tag-name.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/id-getter.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/id-setter.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/indexed-getter.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/insert-before.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/named-property-enumerator.html"
     },
     {
-        "duration": "16.0",
+        "duration": "36.0",
         "name": "blink_perf.bindings/node-list-access.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/node-type.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.bindings/post-message.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/sequence-conversion-array.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/sequence-conversion-custom-iterator.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.bindings/serialize-array.html"
     },
     {
-        "duration": "4.0",
+        "duration": "6.0",
         "name": "blink_perf.bindings/serialize-long-string.html"
     },
     {
-        "duration": "5.0",
+        "duration": "8.0",
         "name": "blink_perf.bindings/serialize-map.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.bindings/serialize-nested-array.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/set-attribute-rare.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/set-attribute.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/structured-clone-json-deserialize.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/structured-clone-json-serialize.html"
     },
     {
-        "duration": "6.0",
+        "duration": "10.0",
         "name": "blink_perf.bindings/structured-clone-long-string-deserialize.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.bindings/structured-clone-long-string-serialize.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/typed-array-construct-from-array.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/typed-array-construct-from-same-type.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/typed-array-construct-from-typed.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/typed-array-set-from-typed.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/undefined-first-child.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/undefined-get-element-by-id.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/undefined-id-getter.html"
     },
     {
-        "duration": "4.0",
+        "duration": "6.0",
         "name": "blink_perf.bindings/worker-structured-clone-different-payloads.html"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "blink_perf.bindings/worker-structured-clone-json-from-worker.html"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "blink_perf.bindings/worker-structured-clone-json-roundtrip.html"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "blink_perf.bindings/worker-structured-clone-json-to-worker.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.bindings/worker-structured-clone-workerDOM-DBMon-from-worker.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.bindings/worker-structured-clone-workerDOM-Map-from-worker.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/worker-text-encoded-transferable-from-worker.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/worker-text-encoded-transferable-roundtrip.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/worker-text-encoded-transferable-to-worker.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/worker-transferable-from-worker.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/worker-transferable-roundtrip.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/worker-transferable-to-worker.html"
     },
     {
-        "duration": "20.0",
+        "duration": "42.0",
         "name": "blink_perf.canvas/canvas-to-canvas-draw.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/canvas-to-canvas-draw_RAF.html?RAF"
     },
     {
-        "duration": "10.0",
+        "duration": "18.0",
         "name": "blink_perf.canvas/createImageBitmapFromImageData.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.canvas/createImageBitmapFromImageData_RAF.html?RAF"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.canvas/docs-paper.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.canvas/docs-paper_RAF.html?RAF"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "blink_perf.canvas/docs-resume.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/docs-resume_RAF.html?RAF"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.canvas/docs-table.html"
     },
     {
-        "duration": "6.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/docs-table_RAF.html?RAF"
     },
     {
-        "duration": "5.0",
+        "duration": "14.0",
         "name": "blink_perf.canvas/draw-dynamic-canvas-2d-to-hw-accelerated-canvas-2d.html"
     },
     {
-        "duration": "7.0",
+        "duration": "16.0",
         "name": "blink_perf.canvas/draw-dynamic-canvas-2d-to-hw-accelerated-canvas-2d_RAF.html?RAF"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.canvas/draw-dynamic-webgl-to-hw-accelerated-canvas-2d.html"
     },
     {
-        "duration": "9.0",
+        "duration": "16.0",
         "name": "blink_perf.canvas/draw-dynamic-webgl-to-hw-accelerated-canvas-2d_RAF.html?RAF"
     },
     {
-        "duration": "4.0",
+        "duration": "6.0",
         "name": "blink_perf.canvas/draw-hw-accelerated-canvas-2d-to-sw-canvas-2d.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.canvas/draw-hw-accelerated-canvas-2d-to-sw-canvas-2d_RAF.html?RAF"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.canvas/draw-static-canvas-2d-to-hw-accelerated-canvas-2d.html"
     },
     {
-        "duration": "15.0",
+        "duration": "44.0",
         "name": "blink_perf.canvas/draw-static-canvas-2d-to-hw-accelerated-canvas-2d_RAF.html?RAF"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.canvas/draw-static-webgl-to-hw-accelerated-canvas-2d.html"
     },
     {
-        "duration": "16.0",
+        "duration": "44.0",
         "name": "blink_perf.canvas/draw-static-webgl-to-hw-accelerated-canvas-2d_RAF.html?RAF"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/draw-video-to-hw-accelerated-canvas-2d.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/draw-video-to-hw-accelerated-canvas-2d_RAF.html?RAF"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.canvas/drawimage-not-pixelaligned.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.canvas/drawimage-not-pixelaligned_RAF.html?RAF"
     },
     {
-        "duration": "12.0",
+        "duration": "30.0",
         "name": "blink_perf.canvas/drawimage.html"
     },
     {
-        "duration": "12.0",
+        "duration": "36.0",
         "name": "blink_perf.canvas/drawimage_RAF.html?RAF"
     },
     {
-        "duration": "9.0",
+        "duration": "72.0",
         "name": "blink_perf.canvas/getImageData.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.canvas/getImageDataColorManaged.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.canvas/getImageDataColorManaged_RAF.html?RAF"
     },
     {
-        "duration": "9.0",
+        "duration": "22.0",
         "name": "blink_perf.canvas/getImageData_RAF.html?RAF"
     },
     {
-        "duration": "4.0",
+        "duration": "6.0",
         "name": "blink_perf.canvas/gpu-bound-shader.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.canvas/gpu-bound-shader_RAF.html?RAF"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.canvas/putImageData.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.canvas/putImageData_RAF.html?RAF"
     },
     {
-        "duration": "18.0",
+        "duration": "34.0",
         "name": "blink_perf.canvas/sheets-render.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.canvas/sheets-render_RAF.html?RAF"
     },
     {
-        "duration": "6.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/toBlob_duration.html"
     },
     {
-        "duration": "6.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/toBlob_duration_RAF.html?RAF"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.canvas/toBlob_duration_jpeg.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.canvas/toBlob_duration_jpeg_RAF.html?RAF"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.canvas/transferFromImageBitmap.html"
     },
     {
-        "duration": "22.0",
+        "duration": "36.0",
         "name": "blink_perf.canvas/transferFromImageBitmap_RAF.html?RAF"
     },
     {
-        "duration": "5.0",
+        "duration": "8.0",
         "name": "blink_perf.canvas/upload-canvas-2d-to-texture.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.canvas/upload-canvas-2d-to-texture_RAF.html?RAF"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.canvas/upload-video-to-sub-texture.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/upload-video-to-sub-texture_RAF.html?RAF"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.canvas/upload-video-to-texture.html"
     },
     {
-        "duration": "5.0",
+        "duration": "12.0",
         "name": "blink_perf.canvas/upload-video-to-texture_RAF.html?RAF"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.canvas/upload-webgl-to-texture.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.canvas/upload-webgl-to-texture_RAF.html?RAF"
     },
     {
-        "duration": "13.0",
+        "duration": "44.0",
         "name": "blink_perf.css/AttributeDescendantSelector.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.css/CSSPropertySetterGetter.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.css/CSSPropertySetterGetterMethods.html"
     },
     {
-        "duration": "10.0",
+        "duration": "18.0",
         "name": "blink_perf.css/CSSPropertyUpdateValue.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.css/ChangeStyleChildClassSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "blink_perf.css/ChangeStyleChildElementSelectors.html"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "blink_perf.css/ChangeStyleElementSelector.html"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "blink_perf.css/ChangeStyleGrandChildElementSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "blink_perf.css/ChangeStyleMultipleClassSelector.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.css/ChangeStyleMultipleQualifiedDataAttributesWithValuesSelector.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.css/ChangeStyleNestedPseudoSelector.html"
     },
     {
-        "duration": "12.0",
+        "duration": "18.0",
         "name": "blink_perf.css/ChangeStylePairOfNthChildSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "blink_perf.css/ChangeStylePartialAttributeMatchingSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "18.0",
         "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeWithValueSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "blink_perf.css/ChangeStyleShallowTree.html"
     },
     {
-        "duration": "11.0",
+        "duration": "18.0",
         "name": "blink_perf.css/ChangeStyleSingleClassSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "blink_perf.css/ChangeStyleSingleNthChildSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "blink_perf.css/ChangeStyleSinglePseudoSelector.html"
     },
     {
-        "duration": "10.0",
+        "duration": "18.0",
         "name": "blink_perf.css/ChangeStyleUniversalSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeWithValueSelector.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.css/ClassDescendantSelector.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.css/ClassInvalidation.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.css/CustomPropertiesCascade.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.css/CustomPropertiesNonRootInheritance.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
+        "name": "blink_perf.css/CustomPropertiesPendingSubstitution.html"
+    },
+    {
+        "duration": "10.0",
         "name": "blink_perf.css/CustomPropertiesRootInheritance.html"
     },
     {
-        "duration": "6.0",
+        "duration": "10.0",
         "name": "blink_perf.css/CustomPropertiesVarAlias.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.css/FocusUpdate.html"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "blink_perf.css/LoadBootstrapBlog.html"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "blink_perf.css/LoadMaterializeStarterPage.html"
     },
     {
-        "duration": "12.0",
+        "duration": "20.0",
         "name": "blink_perf.css/LoadSemanticPageExample.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.css/PseudoClassSelectors.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.css/SelectorCountScaling.html"
     },
     {
-        "duration": "18.0",
+        "duration": "64.0",
         "name": "blink_perf.dom/custom-element-default-style-with-shadow.html"
     },
     {
-        "duration": "14.0",
+        "duration": "32.0",
         "name": "blink_perf.dom/custom-element-default-style.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.dom/long-sibling-list.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.dom/modify-element-classname.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.dom/modify-element-id.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.dom/modify-element-title.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.dom/select-multiple-add.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.dom/select-single-add.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.dom/select-single-remove.html"
     },
     {
-        "duration": "23.0",
+        "duration": "20.0",
         "name": "blink_perf.events/EventsDispatching.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.events/EventsDispatchingInDeeplyNestedV0ShadowTrees.html"
     },
     {
-        "duration": "10.0",
+        "duration": "18.0",
         "name": "blink_perf.events/EventsDispatchingInDeeplyNestedV1ShadowTrees.html"
     },
     {
-        "duration": "13.0",
+        "duration": "30.0",
         "name": "blink_perf.events/EventsDispatchingInV0ShadowTrees.html"
     },
     {
-        "duration": "13.0",
+        "duration": "30.0",
         "name": "blink_perf.events/EventsDispatchingInV1ShadowTrees.html"
     },
     {
-        "duration": "8.0",
+        "duration": "22.0",
         "name": "blink_perf.events/hit-test-lots-of-layers.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.events/is-input-pending-all-events.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.events/is-input-pending-default-events.html"
     },
     {
-        "duration": "18.0",
+        "duration": "30.0",
         "name": "blink_perf.image_decoder/decode-gif.html"
     },
     {
-        "duration": "13.0",
+        "duration": "22.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h1v1.html"
     },
     {
-        "duration": "13.0",
+        "duration": "24.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h1v2.html"
     },
     {
-        "duration": "14.0",
+        "duration": "24.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h2v1.html"
     },
     {
-        "duration": "13.0",
+        "duration": "22.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h2v2.html"
     },
     {
-        "duration": "18.0",
+        "duration": "28.0",
         "name": "blink_perf.image_decoder/decode-lossless-webp.html"
     },
     {
-        "duration": "12.0",
+        "duration": "22.0",
         "name": "blink_perf.image_decoder/decode-lossy-webp.html"
     },
     {
-        "duration": "16.0",
+        "duration": "26.0",
         "name": "blink_perf.image_decoder/decode-png-palette-opaque.html"
     },
     {
-        "duration": "13.0",
+        "duration": "22.0",
         "name": "blink_perf.image_decoder/decode-png-palette.html"
     },
     {
-        "duration": "19.0",
+        "duration": "32.0",
         "name": "blink_perf.image_decoder/decode-png.html"
     },
     {
-        "duration": "23.0",
+        "duration": "34.0",
         "name": "blink_perf.layout/ArabicLineLayout.html"
     },
     {
-        "duration": "4.0",
+        "duration": "6.0",
         "name": "blink_perf.layout/Shapes/MultipleShapes.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/SimpleTextPathLineLayout.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/add-remove-inline-floats.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/animate-abspos-deep.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/attach-inlines-2.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/attach-inlines.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/auto-grid-lots-of-data.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/auto-grid-lots-of-spanning-data.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/change-text-css-contain.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/chapter-reflow-once-random.html"
     },
     {
-        "duration": "9.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/chapter-reflow-once.html"
     },
     {
-        "duration": "24.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/chapter-reflow-thrice.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/chapter-reflow-twice.html"
     },
     {
-        "duration": "10.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/chapter-reflow.html"
     },
     {
-        "duration": "7.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/character_fallback.html"
     },
     {
-        "duration": "5.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/contain-content-style-change.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/editing_append.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/editing_append_single_line.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/editing_delete.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/editing_insert.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/editing_prepend.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/fit-content-change-available-size-blocks.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/fit-content-change-available-size-text.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/fixed-grid-lots-of-data.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/fixed-grid-lots-of-stretched-data.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/flexbox-column-nowrap.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/flexbox-column-wrap.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/flexbox-deeply-nested-column-flow.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/flexbox-lots-of-data.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/flexbox-row-nowrap.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/flexbox-row-stretch-height-definite.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/flexbox-row-wrap.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.layout/flexbox-with-stretch-layout.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.layout/flexbox_with_list_item.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/floats_100_100.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/floats_100_100_nested.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/floats_10_1000.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/floats_20_100.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/floats_20_100_nested.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/floats_2_100.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/floats_2_100_nested.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/floats_50_100.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/floats_50_100_nested.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/hindi-line-layout.html"
     },
     {
-        "duration": "5.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/japanese-kokoro-insert.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.layout/large-grid.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/large-spanning-grid-item.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans-wider-than-table.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/large-table-with-collapsed-borders-and-no-colspans.html"
     },
     {
-        "duration": "6.0",
+        "duration": "42.0",
         "name": "blink_perf.layout/latin-ebook-resize.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.layout/latin-ebook.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/layers_overlap_2d.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.layout/layers_overlap_3d.html"
     },
     {
-        "duration": "5.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/line-layout-fit-content-break-word.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/line-layout-fit-content.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/line-layout-line-height.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/line-layout-repeat-append-select.html"
     },
     {
-        "duration": "9.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/line-layout-repeat-append.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/line-layout.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/long-line-nowrap-collapse.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/long-line-nowrap-spans-collapse.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/long-line-nowrap.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/many-block-children-auto-inline-size.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/many-block-children-fixed-inline-size.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/multicol/balance-forced-breaks.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/multicol/deeply-nested-tables.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/multicol/fixed-height-with-spanner-and-nested-tables.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/multicol/lots-of-small-nested-unbreakable-blocks-autofill.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/multicol/lots-of-small-unbreakable-blocks-autofill.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/multicol/lots-of-text-autofill.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/multicol/lots-of-text-balanced-orphans-widows.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/multicol/lots-of-text-balanced.html"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "blink_perf.layout/multicol/nested-forced-breaks.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/multicol/tall-content-short-columns-realistic.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/multicol/tall-content-short-columns.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/nested-blocks-with-percent-height-and-max-height.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/nested-grid.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/nested-percent-height-tables.html"
     },
     {
-        "duration": "31.0",
+        "duration": "62.0",
         "name": "blink_perf.layout/subtree-detaching.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.layout/vertical-japanese-kokoro-insert.html"
     },
     {
-        "duration": "4.0",
+        "duration": "6.0",
         "name": "blink_perf.layout/word-break-break-all.html"
     },
     {
-        "duration": "4.0",
+        "duration": "6.0",
         "name": "blink_perf.layout/word-break-break-word.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/word-wrap-break-word.html"
     },
     {
-        "duration": "21.0",
+        "duration": "40.0",
         "name": "blink_perf.owp_storage/blob-perf-files.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.owp_storage/blob-perf-ipc.html"
     },
     {
-        "duration": "12.0",
+        "duration": "22.0",
         "name": "blink_perf.owp_storage/blob-perf-shm.html"
     },
     {
-        "duration": "12.0",
+        "duration": "22.0",
         "name": "blink_perf.owp_storage/blob-perf-tiny.html"
     },
     {
-        "duration": "16.0",
+        "duration": "36.0",
         "name": "blink_perf.owp_storage/idb-load-docs.html"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "blink_perf.paint/appending-text.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.paint/color-changes.html"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "blink_perf.paint/complex-content-slow-scroll.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.paint/complex-iframe-filtered.html"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "blink_perf.paint/contain-update-layer-tree.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.paint/containment-resize.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.paint/fixed-and-many-layers-scroll.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.paint/large-table-background-change-with-invisible-collapsed-borders.html"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "blink_perf.paint/large-table-background-change-with-visible-collapsed-borders.html"
     },
     {
-        "duration": "12.0",
+        "duration": "22.0",
         "name": "blink_perf.paint/large-table-background-change-with-zero-width-collapsed-borders.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.paint/large-table-collapsed-border-change-with-backgrounds.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.paint/large-table-collapsed-border-change-with-text.html"
     },
     {
-        "duration": "11.0",
+        "duration": "20.0",
         "name": "blink_perf.paint/large-table-collapsed-border-change.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.paint/large-table-repaint.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.paint/move-text-with-mask.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.paint/paint-offset-changes.html"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "blink_perf.paint/select-all-words.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.paint/transform-changes.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.parser/css-parser-yui.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.parser/html-parser-threaded.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.parser/html-parser.html"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "blink_perf.parser/html5-full-render.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/iframe-append-remove.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/innerHTML-setter-siblings.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/innerHTML-setter.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/query-selector-all-attribute-complex.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/query-selector-all-attribute.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/query-selector-all-class-deep.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/query-selector-all-class-first.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/query-selector-all-class-last.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/query-selector-all-class.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/query-selector-all-deep.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/query-selector-all-first.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/query-selector-all-id-deep.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/query-selector-all-id-first.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/query-selector-all-id-last.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/query-selector-all-last.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/query-selector-deep.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/query-selector-first.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/query-selector-id-deep.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/query-selector-id-last.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/query-selector-last.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/simple-url.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/textarea-parsing.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/tiny-innerHTML.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/url-parser.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/xml-parser.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/declarative-api.html"
     },
     {
-        "duration": "4.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/imperative-api-appendchild.html"
     },
     {
-        "duration": "4.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/imperative-api-assign.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/imperative-api-assigned-elements.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/imperative-api-assigned-slot.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/imperative-api-custom-detail-summary-large.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/imperative-api-custom-detail-summary.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/imperative-api-detail-summary-large.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/imperative-api-detail-summary.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/imperative-api-insertbefore.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/imperative-api.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/shadow-style-share-attr-selectors.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/shadow-style-share-media-query.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/shadow-style-share-with-distribution.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/shadow-style-share.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/style-sheet-insert.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v0-changing-classname-with-shadow-dom.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v0-changing-classname-without-shadow-dom.html"
     },
     {
-        "duration": "6.0",
+        "duration": "10.0",
         "name": "blink_perf.shadow_dom/v0-changing-select-with-shadow-dom.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.shadow_dom/v0-changing-select-without-shadow-dom.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v0-content-reprojection.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v0-large-distribution-without-layout.html"
     },
     {
-        "duration": "5.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v0-multiple-insertion-points.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v0-shadow-reprojection.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v0-small-distribution-with-layout.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.shadow_dom/v1-distribution-disconnected-and-reconnected.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v1-distribution.html"
     },
     {
-        "duration": "5.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v1-host-child-append.html"
     },
     {
-        "duration": "7.0",
+        "duration": "12.0",
         "name": "blink_perf.shadow_dom/v1-large-deep-distribution.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.shadow_dom/v1-large-deep-layout.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-append-layout.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-distribution.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-layout.html"
     },
     {
-        "duration": "5.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-prepend-layout.html"
     },
     {
-        "duration": "5.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-re-layout.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-slot-assigned-nodes.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-slot-flatten.html"
     },
     {
-        "duration": "5.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-re-layout.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-assigned-nodes.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-flatten.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v1-slot-append.html"
     },
     {
-        "duration": "5.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v1-small-deep-distribution.html"
     },
     {
-        "duration": "5.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v1-small-deep-layout.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v1-small-shallow-distribution.html"
     },
     {
-        "duration": "5.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v1-small-shallow-layout.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.svg/AzLizardBenjiPark.html"
     },
     {
@@ -1392,11 +1396,11 @@
         "name": "blink_perf.svg/Bamboo.html"
     },
     {
-        "duration": "4.0",
+        "duration": "6.0",
         "name": "blink_perf.svg/Cactus.html"
     },
     {
-        "duration": "4.0",
+        "duration": "6.0",
         "name": "blink_perf.svg/Cowboy.html"
     },
     {
@@ -1404,51 +1408,51 @@
         "name": "blink_perf.svg/Cowboy_transform.html"
     },
     {
-        "duration": "4.0",
+        "duration": "6.0",
         "name": "blink_perf.svg/CrawFishGanson.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.svg/Debian.html"
     },
     {
-        "duration": "4.0",
+        "duration": "6.0",
         "name": "blink_perf.svg/DropsOnABlade.html"
     },
     {
-        "duration": "4.0",
+        "duration": "6.0",
         "name": "blink_perf.svg/FlowerFromMyGarden.html"
     },
     {
-        "duration": "4.0",
+        "duration": "18.0",
         "name": "blink_perf.svg/FoodLeifLodahl.html"
     },
     {
-        "duration": "4.0",
+        "duration": "10.0",
         "name": "blink_perf.svg/France.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.svg/FrancoBolloGnomeEzechi.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.svg/GearFlowers.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.svg/HarveyRayner.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.svg/HereGear.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.svg/MtSaintHelens.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.svg/Samurai.html"
     },
     {
@@ -1456,739 +1460,739 @@
         "name": "blink_perf.svg/SierpinskiCarpet.html"
     },
     {
-        "duration": "5.0",
+        "duration": "12.0",
         "name": "blink_perf.svg/SvgCubics.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.svg/SvgHitTesting.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.svg/SvgNestedUse.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.svg/UnderTheSee.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.svg/WorldIso.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.svg/Worldcup.html"
     },
     {
-        "duration": "33.0",
+        "duration": "66.0",
         "name": "dromaeo/http://dromaeo.com?dom-attr"
     },
     {
-        "duration": "33.0",
+        "duration": "66.0",
         "name": "dromaeo/http://dromaeo.com?dom-modify"
     },
     {
-        "duration": "48.0",
+        "duration": "96.0",
         "name": "dromaeo/http://dromaeo.com?dom-query"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "dromaeo/http://dromaeo.com?dom-traverse"
     },
     {
-        "duration": "13.0",
+        "duration": "28.0",
         "name": "dummy_benchmark.noisy_benchmark_1/dummy_page.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "dummy_benchmark.stable_benchmark_1/dummy_page.html"
     },
     {
-        "duration": "167.0",
+        "duration": "344.0",
         "name": "jetstream/JetStream"
     },
     {
-        "duration": "137.0",
+        "duration": "312.0",
         "name": "jetstream2/JetStream2"
     },
     {
-        "duration": "20.0",
+        "duration": "44.0",
         "name": "kraken/http://krakenbenchmark.mozilla.org/kraken-1.1/driver.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "loading.desktop/24h_cold"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "loading.desktop/24h_warm"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "loading.desktop/AirBnB_cold"
     },
     {
-        "duration": "27.0",
+        "duration": "50.0",
         "name": "loading.desktop/AirBnB_warm"
     },
     {
-        "duration": "12.0",
+        "duration": "28.0",
         "name": "loading.desktop/Aljayyash_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "34.0",
         "name": "loading.desktop/Aljayyash_warm"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "loading.desktop/AllRecipes_cold"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "loading.desktop/AllRecipes_warm"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "loading.desktop/ArsTechnica_cold"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "loading.desktop/ArsTechnica_warm"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "loading.desktop/Baidu_cold"
     },
     {
-        "duration": "14.0",
+        "duration": "54.0",
         "name": "loading.desktop/Baidu_warm"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "loading.desktop/Bhaskar_cold"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "loading.desktop/Bhaskar_warm"
     },
     {
-        "duration": "17.0",
+        "duration": "32.0",
         "name": "loading.desktop/Chosun_cold"
     },
     {
-        "duration": "18.0",
+        "duration": "34.0",
         "name": "loading.desktop/Chosun_warm"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "loading.desktop/Colorado.edu_cold"
     },
     {
-        "duration": "17.0",
+        "duration": "30.0",
         "name": "loading.desktop/Colorado.edu_warm"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "loading.desktop/Danawa_cold"
     },
     {
-        "duration": "17.0",
+        "duration": "32.0",
         "name": "loading.desktop/Danawa_warm"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "loading.desktop/Daum_cold"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "loading.desktop/Daum_warm"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "loading.desktop/Donga_cold"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "loading.desktop/Donga_warm"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "loading.desktop/Economist_cold"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "loading.desktop/Economist_warm"
     },
     {
-        "duration": "17.0",
+        "duration": "42.0",
         "name": "loading.desktop/Elmundo_cold"
     },
     {
-        "duration": "3.0",
+        "duration": "8.0",
         "name": "loading.desktop/Elmundo_warm"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "loading.desktop/FC2Blog_cold"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "loading.desktop/FC2Blog_warm"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "loading.desktop/FIFA_cold"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "loading.desktop/FIFA_warm"
     },
     {
-        "duration": "20.0",
+        "duration": "46.0",
         "name": "loading.desktop/FarsNews_cold"
     },
     {
-        "duration": "15.0",
+        "duration": "34.0",
         "name": "loading.desktop/FarsNews_warm"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "loading.desktop/Flickr_cold"
     },
     {
-        "duration": "17.0",
+        "duration": "32.0",
         "name": "loading.desktop/Flickr_warm"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "loading.desktop/FlipKart_cold"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "loading.desktop/FlipKart_warm"
     },
     {
-        "duration": "13.0",
+        "duration": "28.0",
         "name": "loading.desktop/Free.fr_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "30.0",
         "name": "loading.desktop/Free.fr_warm"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "loading.desktop/HTML5Rocks_cold"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "loading.desktop/HTML5Rocks_warm"
     },
     {
-        "duration": "12.0",
+        "duration": "56.0",
         "name": "loading.desktop/Haraj_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "34.0",
         "name": "loading.desktop/Haraj_warm"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "loading.desktop/HatenaBookmark_cold"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "loading.desktop/HatenaBookmark_warm"
     },
     {
-        "duration": "16.0",
+        "duration": "42.0",
         "name": "loading.desktop/IGN_cold"
     },
     {
-        "duration": "17.0",
+        "duration": "30.0",
         "name": "loading.desktop/IGN_warm"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "loading.desktop/IMDB_cold"
     },
     {
-        "duration": "17.0",
+        "duration": "32.0",
         "name": "loading.desktop/IMDB_warm"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "loading.desktop/IndiaTimes_cold"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "loading.desktop/IndiaTimes_warm"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "loading.desktop/Kakaku_cold"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "loading.desktop/Kakaku_warm"
     },
     {
-        "duration": "20.0",
+        "duration": "38.0",
         "name": "loading.desktop/Kenh14_cold"
     },
     {
-        "duration": "26.0",
+        "duration": "46.0",
         "name": "loading.desktop/Kenh14_warm"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "loading.desktop/Mercadolivre_cold"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "loading.desktop/Mercadolivre_warm"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "loading.desktop/Naver_cold"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "loading.desktop/Naver_warm"
     },
     {
-        "duration": "3.0",
+        "duration": "8.0",
         "name": "loading.desktop/Orange_cold"
     },
     {
-        "duration": "3.0",
+        "duration": "8.0",
         "name": "loading.desktop/Orange_warm"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "loading.desktop/Pantip_cold"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "loading.desktop/Pantip_warm"
     },
     {
-        "duration": "24.0",
+        "duration": "30.0",
         "name": "loading.desktop/PremierLeague_cold"
     },
     {
-        "duration": "19.0",
+        "duration": "34.0",
         "name": "loading.desktop/PremierLeague_warm"
     },
     {
-        "duration": "16.0",
+        "duration": "38.0",
         "name": "loading.desktop/QQ_cold"
     },
     {
-        "duration": "19.0",
+        "duration": "42.0",
         "name": "loading.desktop/QQ_warm"
     },
     {
-        "duration": "17.0",
+        "duration": "56.0",
         "name": "loading.desktop/REI_cold"
     },
     {
-        "duration": "18.0",
+        "duration": "46.0",
         "name": "loading.desktop/REI_warm"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "loading.desktop/Ruten_cold"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "loading.desktop/Ruten_warm"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "loading.desktop/Sina_cold"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "loading.desktop/Sina_warm"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "loading.desktop/Taobao_cold"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "loading.desktop/Taobao_warm"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "loading.desktop/TheOnion_cold"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "loading.desktop/TheOnion_warm"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "loading.desktop/TheVerge_cold"
     },
     {
-        "duration": "20.0",
+        "duration": "34.0",
         "name": "loading.desktop/TheVerge_warm"
     },
     {
-        "duration": "18.0",
+        "duration": "34.0",
         "name": "loading.desktop/TicketMaster_cold"
     },
     {
-        "duration": "21.0",
+        "duration": "38.0",
         "name": "loading.desktop/TicketMaster_warm"
     },
     {
-        "duration": "20.0",
+        "duration": "38.0",
         "name": "loading.desktop/Vietnamnet_cold"
     },
     {
-        "duration": "24.0",
+        "duration": "44.0",
         "name": "loading.desktop/Vietnamnet_warm"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "loading.desktop/Vnexpress_cold"
     },
     {
-        "duration": "33.0",
+        "duration": "38.0",
         "name": "loading.desktop/Vnexpress_warm"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "loading.desktop/Walgreens_cold"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "loading.desktop/Walgreens_warm"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "loading.desktop/Yandex_cold"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "loading.desktop/Yandex_warm"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "loading.desktop/amazon.co.jp_cold"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "loading.desktop/amazon.co.jp_warm"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "loading.desktop/ja.wikipedia_cold"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "loading.desktop/ja.wikipedia_warm"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "loading.desktop/money.cnn_cold"
     },
     {
-        "duration": "23.0",
+        "duration": "44.0",
         "name": "loading.desktop/money.cnn_warm"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "loading.desktop/ru.wikipedia_cold"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "loading.desktop/ru.wikipedia_warm"
     },
     {
-        "duration": "32.0",
+        "duration": "40.0",
         "name": "loading.desktop/uol.com.br_cold"
     },
     {
-        "duration": "27.0",
+        "duration": "52.0",
         "name": "loading.desktop/uol.com.br_warm"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "loading.desktop/yahoo.co.jp_cold"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "loading.desktop/yahoo.co.jp_warm"
     },
     {
-        "duration": "13.0",
+        "duration": "24.0",
         "name": "media.desktop/mse.html?media=aac_audio.mp4"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "media.desktop/mse.html?media=aac_audio.mp4,h264_video.mp4"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "media.desktop/mse.html?media=h264_video.mp4"
     },
     {
-        "duration": "13.0",
+        "duration": "24.0",
         "name": "media.desktop/mse.html?media=tulip0.av1.mp4"
     },
     {
-        "duration": "13.0",
+        "duration": "24.0",
         "name": "media.desktop/mse.html?media=tulip2.vp9.webm"
     },
     {
-        "duration": "17.0",
+        "duration": "32.0",
         "name": "media.desktop/video.html?src=crowd1080.mp4"
     },
     {
-        "duration": "18.0",
+        "duration": "34.0",
         "name": "media.desktop/video.html?src=crowd1080.webm"
     },
     {
-        "duration": "17.0",
+        "duration": "32.0",
         "name": "media.desktop/video.html?src=crowd1080_vp9.webm"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "media.desktop/video.html?src=garden2_10s.mp4&seek"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "media.desktop/video.html?src=garden2_10s.webm&seek"
     },
     {
-        "duration": "13.0",
+        "duration": "24.0",
         "name": "media.desktop/video.html?src=smpte_3840x2160_60fps_vp9.webm&seek"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "media.desktop/video.html?src=tulip0.av1.mp4"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "media.desktop/video.html?src=tulip0.av1.mp4&seek"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "media.desktop/video.html?src=tulip2.m4a&type=audio"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "media.desktop/video.html?src=tulip2.mp3&type=audio"
     },
     {
-        "duration": "12.0",
+        "duration": "22.0",
         "name": "media.desktop/video.html?src=tulip2.mp3&type=audio&seek"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "media.desktop/video.html?src=tulip2.mp4"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "media.desktop/video.html?src=tulip2.mp4&busyjs"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "media.desktop/video.html?src=tulip2.ogg&type=audio"
     },
     {
-        "duration": "12.0",
+        "duration": "22.0",
         "name": "media.desktop/video.html?src=tulip2.ogg&type=audio&seek"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "media.desktop/video.html?src=tulip2.vp9.webm"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "media.desktop/video.html?src=tulip2.vp9.webm&background"
     },
     {
-        "duration": "25.0",
+        "duration": "48.0",
         "name": "media.desktop/video.html?src=tulip2.vp9.webm_WiFi"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "memory.desktop/TrivialAnimationPageSharedPageState"
     },
     {
-        "duration": "24.0",
+        "duration": "50.0",
         "name": "memory.desktop/TrivialBlinkingCursorPageSharedPageState"
     },
     {
-        "duration": "26.0",
+        "duration": "50.0",
         "name": "memory.desktop/TrivialBlurAnimationPageSharedPageState"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "memory.desktop/TrivialCanvasPageSharedPageState"
     },
     {
-        "duration": "25.0",
+        "duration": "54.0",
         "name": "memory.desktop/TrivialFullscreenVideoPageSharedPageState"
     },
     {
-        "duration": "24.0",
+        "duration": "50.0",
         "name": "memory.desktop/TrivialGifPageSharedPageState"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "memory.desktop/TrivialScrollingPageSharedPageState"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "memory.desktop/TrivialWebGLPageSharedPageState"
     },
     {
-        "duration": "44.0",
+        "duration": "88.0",
         "name": "memory.desktop/WebWorker"
     },
     {
-        "duration": "37.0",
+        "duration": "74.0",
         "name": "octane/Octane"
     },
     {
-        "duration": "38.0",
+        "duration": "76.0",
         "name": "power.desktop/TrivialAnimationPageSharedPageState"
     },
     {
-        "duration": "38.0",
+        "duration": "76.0",
         "name": "power.desktop/TrivialBlinkingCursorPageSharedPageState"
     },
     {
-        "duration": "38.0",
+        "duration": "78.0",
         "name": "power.desktop/TrivialBlurAnimationPageSharedPageState"
     },
     {
-        "duration": "38.0",
+        "duration": "76.0",
         "name": "power.desktop/TrivialCanvasPageSharedPageState"
     },
     {
-        "duration": "38.0",
+        "duration": "76.0",
         "name": "power.desktop/TrivialFullscreenVideoPageSharedPageState"
     },
     {
-        "duration": "38.0",
+        "duration": "76.0",
         "name": "power.desktop/TrivialGifPageSharedPageState"
     },
     {
-        "duration": "41.0",
+        "duration": "78.0",
         "name": "power.desktop/TrivialScrollingPageSharedPageState"
     },
     {
-        "duration": "38.0",
+        "duration": "76.0",
         "name": "power.desktop/TrivialWebGLPageSharedPageState"
     },
     {
-        "duration": "45.0",
+        "duration": "90.0",
         "name": "power.desktop/abcnews"
     },
     {
-        "duration": "41.0",
+        "duration": "80.0",
         "name": "power.desktop/indiatimes"
     },
     {
-        "duration": "38.0",
+        "duration": "86.0",
         "name": "power.desktop/instagram"
     },
     {
-        "duration": "40.0",
+        "duration": "78.0",
         "name": "power.desktop/microsoft"
     },
     {
-        "duration": "43.0",
+        "duration": "86.0",
         "name": "power.desktop/sina"
     },
     {
-        "duration": "38.0",
+        "duration": "78.0",
         "name": "power.desktop/slideshare"
     },
     {
-        "duration": "46.0",
+        "duration": "80.0",
         "name": "power.desktop/uol"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "rasterize_and_record_micro.partial_invalidation/800_relpos_divs.html"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/amazon.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/blogger.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/booking.html"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/cnn.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/ebay.html"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/espn.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/facebook.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/gmail.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/google.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googlecalendar.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googledocs.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleimagesearch.html"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleplus.html"
     },
     {
-        "duration": "10.0",
+        "duration": "18.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/linkedin.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/pinterest.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/techcrunch.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/twitter.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/weather.html"
     },
     {
@@ -2196,1635 +2200,1635 @@
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/wikipedia.html"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/wordpress.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahooanswers.html"
     },
     {
-        "duration": "23.0",
+        "duration": "44.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoogames.html"
     },
     {
-        "duration": "95.0",
+        "duration": "190.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoonews.html"
     },
     {
-        "duration": "81.0",
+        "duration": "162.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoosports.html"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/youtube.html"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "rendering.desktop/accu_weather_2018"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "rendering.desktop/accu_weather_pinch_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/amazon_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/amazon_pinch_2018"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/analog_clock_svg"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rendering.desktop/animometer_webgl"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rendering.desktop/animometer_webgl_attrib_arrays"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "rendering.desktop/animometer_webgl_multi_draw"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "rendering.desktop/aquarium"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "rendering.desktop/aquarium_20k"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/background_color_animation"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/background_color_animation_with_gradient"
     },
     {
-        "duration": "18.0",
+        "duration": "34.0",
         "name": "rendering.desktop/balls_css_key_frame_animations"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/balls_css_key_frame_animations_composited_transform"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/balls_css_transition_2_properties"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/balls_css_transition_40_properties"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/balls_css_transition_all_properties"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/balls_javascript_canvas"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/balls_javascript_css"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/balls_svg_animations"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rendering.desktop/blob"
     },
     {
-        "duration": "17.0",
+        "duration": "44.0",
         "name": "rendering.desktop/blogspot_2018"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/blogspot_pinch_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "44.0",
         "name": "rendering.desktop/blur_rotating_background"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/booking.com_2018"
     },
     {
-        "duration": "15.0",
+        "duration": "34.0",
         "name": "rendering.desktop/booking_pinch_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "40.0",
         "name": "rendering.desktop/bouncing_balls_15"
     },
     {
-        "duration": "18.0",
+        "duration": "40.0",
         "name": "rendering.desktop/bouncing_balls_shadow"
     },
     {
-        "duration": "25.0",
+        "duration": "36.0",
         "name": "rendering.desktop/bouncing_clipped_rectangles"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/bouncing_gradient_circles"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/bouncing_png_images"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/bouncing_svg_images"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "rendering.desktop/camera_to_webgl"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/canvas_05000_pixels_per_second"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/canvas_10000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/canvas_20000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "24.0",
         "name": "rendering.desktop/canvas_40000_pixels_per_second"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "rendering.desktop/canvas_60000_pixels_per_second"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "rendering.desktop/canvas_75000_pixels_per_second"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "rendering.desktop/canvas_90000_pixels_per_second"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/canvas_animation_no_clear"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/canvas_arcs"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/canvas_font_cycler"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/canvas_lines"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/canvas_to_blob"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/cats_unscaled"
     },
     {
-        "duration": "13.0",
+        "duration": "24.0",
         "name": "rendering.desktop/cats_viewport_width"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "rendering.desktop/cc_poster_circle"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/cc_scroll_text_only"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rendering.desktop/chip_tune"
     },
     {
-        "duration": "22.0",
+        "duration": "32.0",
         "name": "rendering.desktop/cnn_2018"
     },
     {
-        "duration": "19.0",
+        "duration": "36.0",
         "name": "rendering.desktop/cnn_pinch_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/compositor_heavy_animation"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/crafty_mind"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_animations_many_keyframes"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_animations_simultaneous_inline_style"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_animations_simultaneous_new_element"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_animations_simultaneous_style_element"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_animations_simultaneous_updating_class"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_animations_staggered_infinite_iterations"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/css_animations_staggered_inline_style"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/css_animations_staggered_new_element"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/css_animations_staggered_style_element"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/css_animations_staggered_updating_class"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/css_animations_triggered_inline_style"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/css_animations_triggered_new_element"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_animations_triggered_style_element"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/css_animations_triggered_updating_class"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "rendering.desktop/css_opacity_plus_n_layers_99"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_transitions_inline_style"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_transitions_new_element"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_transitions_staggered_inline_style"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_transitions_staggered_new_element"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_transitions_staggered_style_element"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_transitions_staggered_updating_class"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_transitions_style_element"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_transitions_triggered_inline_style"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_transitions_triggered_new_element"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_transitions_triggered_style_element"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_transitions_triggered_updating_class"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_transitions_updating_class"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_value_type_color"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_value_type_filter"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_value_type_length"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_value_type_length_complex"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_value_type_length_simple"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_value_type_path"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_value_type_shadow"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_value_type_transform_complex"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_value_type_transform_simple"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "rendering.desktop/dynamic_cube_map"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rendering.desktop/earth"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "rendering.desktop/ebay_2018"
     },
     {
-        "duration": "20.0",
+        "duration": "42.0",
         "name": "rendering.desktop/ebay_pinch_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "38.0",
         "name": "rendering.desktop/effect_games"
     },
     {
-        "duration": "17.0",
+        "duration": "44.0",
         "name": "rendering.desktop/espn_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/espn_pinch_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "50.0",
         "name": "rendering.desktop/extra_large_texture_uploads"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/facebook_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "rendering.desktop/facebook_pinch_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "38.0",
         "name": "rendering.desktop/fill_shapes"
     },
     {
-        "duration": "19.0",
+        "duration": "8.0",
         "name": "rendering.desktop/filter_terrain_svg"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/geo_apis"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/gmail_2018"
     },
     {
-        "duration": "29.0",
+        "duration": "56.0",
         "name": "rendering.desktop/gmail_move_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "30.0",
         "name": "rendering.desktop/gmail_pinch_2018"
     },
     {
-        "duration": "19.0",
+        "duration": "28.0",
         "name": "rendering.desktop/google_calendar_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/google_calendar_pinch_2018"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "rendering.desktop/google_docs_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/google_image_pinch_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "rendering.desktop/google_image_search_2018"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "rendering.desktop/google_plus_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/google_search_pinch_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/google_web_search_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/guimark_vector_chart"
     },
     {
-        "duration": "19.0",
+        "duration": "34.0",
         "name": "rendering.desktop/hakim"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "rendering.desktop/ie_chalkboard"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "rendering.desktop/ie_pirate_mark"
     },
     {
-        "duration": "26.0",
+        "duration": "38.0",
         "name": "rendering.desktop/infinite_scroll_element_n_layers_99"
     },
     {
-        "duration": "19.0",
+        "duration": "36.0",
         "name": "rendering.desktop/infinite_scroll_root_fixed_n_layers_99"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/infinite_scroll_root_n_layers_99"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/jarro_doverson"
     },
     {
-        "duration": "14.0",
+        "duration": "26.0",
         "name": "rendering.desktop/jpeg_decoding_rgb_and_gpu_rasterization"
     },
     {
-        "duration": "14.0",
+        "duration": "26.0",
         "name": "rendering.desktop/jpeg_decoding_yuv_and_gpu_rasterization"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "rendering.desktop/js_full_screen_invalidation"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rendering.desktop/js_opacity_plus_n_layers_99"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rendering.desktop/js_paint_plus_n_layers_99"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rendering.desktop/js_poster_circle"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/js_scroll_text_only"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/kevs_3d"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/keyframed_animations"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/large_texture_uploads"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/linkedin_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rendering.desktop/linkedin_pinch_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/main_0fps_impl_60fps"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/main_0fps_impl_60fps_no_update"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "rendering.desktop/main_0fps_impl_60fps_no_update_jank"
     },
     {
-        "duration": "17.0",
+        "duration": "32.0",
         "name": "rendering.desktop/main_0fps_with_jank_impl_0fps"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/main_15fps_impl_0fps"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/main_15fps_with_jank_impl_0fps"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/main_30fps_impl_0fps"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/main_30fps_impl_60fps"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/main_60fps_impl_0fps"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/main_60fps_impl_60fps"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/main_60fps_impl_60fps_no_update"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/main_60fps_impl_60fps_no_update_jank"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/main_60fps_with_jank_impl_0fps"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/man_in_blue"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/many_images"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "rendering.desktop/many_planets_deep"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/maps_move_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/maps_perf_test"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "rendering.desktop/medium_texture_uploads"
     },
     {
-        "duration": "17.0",
+        "duration": "38.0",
         "name": "rendering.desktop/megi_dish"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/microsoft_asteroid_belt"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/microsoft_fireflies"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/microsoft_fish_ie_tank"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/microsoft_performance"
     },
     {
-        "duration": "18.0",
+        "duration": "34.0",
         "name": "rendering.desktop/microsoft_snow"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/microsoft_speed_reading"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/microsoft_tweet_map"
     },
     {
-        "duration": "18.0",
+        "duration": "34.0",
         "name": "rendering.desktop/microsoft_video_city"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/microsoft_worker_fountains"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/mix_10k"
     },
     {
-        "duration": "16.0",
+        "duration": "42.0",
         "name": "rendering.desktop/mix_blend_mode_animation_difference"
     },
     {
-        "duration": "16.0",
+        "duration": "40.0",
         "name": "rendering.desktop/mix_blend_mode_animation_hue"
     },
     {
-        "duration": "17.0",
+        "duration": "54.0",
         "name": "rendering.desktop/mix_blend_mode_animation_propagating_isolation"
     },
     {
-        "duration": "16.0",
+        "duration": "36.0",
         "name": "rendering.desktop/mix_blend_mode_animation_screen"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/motion_mark_canvas_fill_shapes"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/motion_mark_canvas_stroke_shapes"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rendering.desktop/new_tilings"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rendering.desktop/nvidia_vertex_buffer_object"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "rendering.desktop/off_screen_main_60fps"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/off_screen_main_60fps_jank"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/overlay_background_color_css_transitions_page"
     },
     {
-        "duration": "20.0",
+        "duration": "38.0",
         "name": "rendering.desktop/particles"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.desktop/pinterest_2018"
     },
     {
-        "duration": "25.0",
+        "duration": "34.0",
         "name": "rendering.desktop/put_get_image_data"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/raf"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "rendering.desktop/raf_animation"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "rendering.desktop/raf_canvas"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "rendering.desktop/raf_touch_animation"
     },
     {
-        "duration": "17.0",
+        "duration": "30.0",
         "name": "rendering.desktop/repaint_amazon_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "28.0",
         "name": "rendering.desktop/repaint_cnn_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "28.0",
         "name": "rendering.desktop/repaint_facebook_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "28.0",
         "name": "rendering.desktop/repaint_google_search_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "rendering.desktop/repaint_instagram_2018"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "rendering.desktop/repaint_reddit_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/repaint_theverge_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/repaint_twitter_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/repaint_wikipedia_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/repaint_yahoo_homepage_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/runway_2019"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rendering.desktop/san_angeles"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "rendering.desktop/second_batch_js_heavy"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/second_batch_js_light"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/second_batch_js_medium"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "rendering.desktop/simple_text_page"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/simple_touch_drag"
     },
     {
-        "duration": "17.0",
+        "duration": "32.0",
         "name": "rendering.desktop/small_texture_uploads"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rendering.desktop/smash_cat"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/spielzeugz"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/stroke_shapes"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/sync_scroll_offset"
     },
     {
-        "duration": "17.0",
+        "duration": "40.0",
         "name": "rendering.desktop/techcrunch_2018"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rendering.desktop/text_05000_pixels_per_second"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/text_10000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/text_20000_pixels_per_second"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "rendering.desktop/text_40000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/text_60000_pixels_per_second"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "rendering.desktop/text_75000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/text_90000_pixels_per_second"
     },
     {
-        "duration": "15.0",
+        "duration": "28.0",
         "name": "rendering.desktop/text_constant_full_page_raster_05000_pixels_per_second"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/text_constant_full_page_raster_10000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/text_constant_full_page_raster_20000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/text_constant_full_page_raster_40000_pixels_per_second"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "rendering.desktop/text_constant_full_page_raster_60000_pixels_per_second"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "rendering.desktop/text_constant_full_page_raster_75000_pixels_per_second"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "rendering.desktop/text_constant_full_page_raster_90000_pixels_per_second"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/text_hover_05000_pixels_per_second"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/text_hover_10000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/text_hover_20000_pixels_per_second"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "rendering.desktop/text_hover_40000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "24.0",
         "name": "rendering.desktop/text_hover_60000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/text_hover_75000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/text_hover_90000_pixels_per_second"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/touch_handler_scrolling"
     },
     {
-        "duration": "17.0",
+        "duration": "32.0",
         "name": "rendering.desktop/transform_transitions"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/transform_transitions_js_block"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "rendering.desktop/twitch_2018"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "rendering.desktop/twitch_pinch_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/twitter_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "32.0",
         "name": "rendering.desktop/twitter_pinch_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "rendering.desktop/web_animation_value_type_color"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/web_animation_value_type_length_3d"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/web_animation_value_type_length_complex"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/web_animation_value_type_length_simple"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "rendering.desktop/web_animation_value_type_path"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/web_animation_value_type_shadow"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/web_animation_value_type_transform_complex"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "rendering.desktop/web_animation_value_type_transform_simple"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/web_animations_many_keyframes"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/web_animations_set_current_time"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "rendering.desktop/web_animations_simultaneous"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/web_animations_staggered_chaining"
     },
     {
-        "duration": "17.0",
+        "duration": "32.0",
         "name": "rendering.desktop/web_animations_staggered_infinite_iterations"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/web_animations_staggered_triggering_page"
     },
     {
-        "duration": "13.0",
+        "duration": "28.0",
         "name": "rendering.desktop/webp_decoding_rgb_and_gpu_rasterization"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rendering.desktop/webp_decoding_yuv_and_gpu_rasterization"
     },
     {
-        "duration": "18.0",
+        "duration": "34.0",
         "name": "rendering.desktop/wikipedia_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/wordpress_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rendering.desktop/yahoo_answers_2018"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "rendering.desktop/yahoo_news_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "32.0",
         "name": "rendering.desktop/yahoo_news_pinch_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rendering.desktop/yahoo_sports_2018"
     },
     {
-        "duration": "18.0",
+        "duration": "30.0",
         "name": "rendering.desktop/yahoo_sports_pinch_2018"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "rendering.desktop/youtube_2018"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "rendering.desktop/youtube_pinch_2018"
     },
     {
-        "duration": "38.0",
+        "duration": "80.0",
         "name": "speedometer-future/http://browserbench.org/Speedometer/"
     },
     {
-        "duration": "37.0",
+        "duration": "74.0",
         "name": "speedometer/http://browserbench.org/Speedometer/"
     },
     {
-        "duration": "68.0",
+        "duration": "168.0",
         "name": "speedometer2-future/Speedometer2"
     },
     {
-        "duration": "67.0",
+        "duration": "134.0",
         "name": "speedometer2/Speedometer2"
     },
     {
-        "duration": "42.0",
+        "duration": "84.0",
         "name": "system_health.common_desktop/browse:media:googleplaystore:2018"
     },
     {
-        "duration": "71.0",
+        "duration": "140.0",
         "name": "system_health.common_desktop/browse:media:imgur"
     },
     {
-        "duration": "86.0",
+        "duration": "172.0",
         "name": "system_health.common_desktop/browse:media:pinterest:2018"
     },
     {
-        "duration": "57.0",
+        "duration": "114.0",
         "name": "system_health.common_desktop/browse:media:tumblr:2018"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "system_health.common_desktop/browse:media:youtube:2019"
     },
     {
-        "duration": "63.0",
+        "duration": "126.0",
         "name": "system_health.common_desktop/browse:media:youtubetv:2019"
     },
     {
-        "duration": "43.0",
+        "duration": "86.0",
         "name": "system_health.common_desktop/browse:news:cnn:2018"
     },
     {
-        "duration": "49.0",
+        "duration": "96.0",
         "name": "system_health.common_desktop/browse:news:flipboard:2018"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "system_health.common_desktop/browse:news:hackernews:2018"
     },
     {
-        "duration": "64.0",
+        "duration": "128.0",
         "name": "system_health.common_desktop/browse:news:nytimes:2018"
     },
     {
-        "duration": "48.0",
+        "duration": "96.0",
         "name": "system_health.common_desktop/browse:news:reddit:2018"
     },
     {
-        "duration": "49.0",
+        "duration": "96.0",
         "name": "system_health.common_desktop/browse:search:google:2018"
     },
     {
-        "duration": "34.0",
+        "duration": "68.0",
         "name": "system_health.common_desktop/browse:search:google_india:2018"
     },
     {
-        "duration": "71.0",
+        "duration": "138.0",
         "name": "system_health.common_desktop/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "55.0",
+        "duration": "110.0",
         "name": "system_health.common_desktop/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "45.0",
+        "duration": "92.0",
         "name": "system_health.common_desktop/browse:social:twitter:2018"
     },
     {
-        "duration": "64.0",
+        "duration": "124.0",
         "name": "system_health.common_desktop/browse:social:twitter_infinite_scroll:2018"
     },
     {
-        "duration": "59.0",
+        "duration": "118.0",
         "name": "system_health.common_desktop/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "41.0",
+        "duration": "82.0",
         "name": "system_health.common_desktop/browse:tools:docs_scrolling"
     },
     {
-        "duration": "70.0",
+        "duration": "140.0",
         "name": "system_health.common_desktop/browse:tools:maps:2019"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "system_health.common_desktop/browse:tools:sheets:2019"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "system_health.common_desktop/browse_accessibility:media:youtube"
     },
     {
-        "duration": "29.0",
+        "duration": "54.0",
         "name": "system_health.common_desktop/browse_accessibility:tech:codesearch:2018"
     },
     {
-        "duration": "32.0",
+        "duration": "42.0",
         "name": "system_health.common_desktop/load:chrome:blank"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "system_health.common_desktop/load:games:alphabetty:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "36.0",
         "name": "system_health.common_desktop/load:games:bubbles:2019"
     },
     {
-        "duration": "29.0",
+        "duration": "38.0",
         "name": "system_health.common_desktop/load:games:lazors"
     },
     {
-        "duration": "24.0",
+        "duration": "42.0",
         "name": "system_health.common_desktop/load:games:miniclip:2018"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "system_health.common_desktop/load:games:spychase:2018"
     },
     {
-        "duration": "28.0",
+        "duration": "86.0",
         "name": "system_health.common_desktop/load:media:9gag"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "system_health.common_desktop/load:media:dailymotion:2019"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "system_health.common_desktop/load:media:facebook_photos:2018"
     },
     {
-        "duration": "21.0",
+        "duration": "40.0",
         "name": "system_health.common_desktop/load:media:flickr:2018"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "system_health.common_desktop/load:media:google_images:2018"
     },
     {
-        "duration": "21.0",
+        "duration": "40.0",
         "name": "system_health.common_desktop/load:media:imgur:2018"
     },
     {
-        "duration": "23.0",
+        "duration": "42.0",
         "name": "system_health.common_desktop/load:media:soundcloud:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "38.0",
         "name": "system_health.common_desktop/load:media:youtube:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "system_health.common_desktop/load:news:bbc:2018"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "system_health.common_desktop/load:news:cnn:2018"
     },
     {
-        "duration": "21.0",
+        "duration": "40.0",
         "name": "system_health.common_desktop/load:news:flipboard"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "system_health.common_desktop/load:news:hackernews:2018"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "system_health.common_desktop/load:news:nytimes:2018"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "system_health.common_desktop/load:news:qq:2018"
     },
     {
-        "duration": "22.0",
+        "duration": "38.0",
         "name": "system_health.common_desktop/load:news:reddit:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "42.0",
         "name": "system_health.common_desktop/load:news:wikipedia:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "system_health.common_desktop/load:search:amazon:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "system_health.common_desktop/load:search:baidu:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "38.0",
         "name": "system_health.common_desktop/load:search:ebay:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "system_health.common_desktop/load:search:flipkart:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "38.0",
         "name": "system_health.common_desktop/load:search:google:2018"
     },
     {
-        "duration": "22.0",
+        "duration": "40.0",
         "name": "system_health.common_desktop/load:search:taobao:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "36.0",
         "name": "system_health.common_desktop/load:search:yahoo:2018"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "system_health.common_desktop/load:search:yandex:2018"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "system_health.common_desktop/load:social:instagram:2018"
     },
     {
-        "duration": "22.0",
+        "duration": "40.0",
         "name": "system_health.common_desktop/load:social:pinterest:2019"
     },
     {
-        "duration": "21.0",
+        "duration": "38.0",
         "name": "system_health.common_desktop/load:social:vk:2018"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "system_health.common_desktop/load:tools:chat:2020"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "system_health.common_desktop/load:tools:docs:2019"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "system_health.common_desktop/load:tools:drive:2019"
     },
     {
-        "duration": "4.0",
+        "duration": "10.0",
         "name": "system_health.common_desktop/load:tools:gmail:2019"
     },
     {
-        "duration": "20.0",
+        "duration": "38.0",
         "name": "system_health.common_desktop/load:tools:stackoverflow:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "system_health.common_desktop/load:tools:weather:2019"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "system_health.common_desktop/load_accessibility:media:wikipedia:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "34.0",
         "name": "system_health.common_desktop/load_accessibility:shopping:amazon:2018"
     },
     {
-        "duration": "121.0",
+        "duration": "274.0",
         "name": "system_health.common_desktop/long_running:tools:gmail-background"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "system_health.common_desktop/long_running:tools:gmail-foreground"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "system_health.common_desktop/multitab:misc:typical24"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "system_health.common_desktop/multitab:misc:typical24:2018"
     },
     {
-        "duration": "48.0",
+        "duration": "92.0",
         "name": "system_health.common_desktop/play:media:google_play_music"
     },
     {
-        "duration": "43.0",
+        "duration": "86.0",
         "name": "system_health.common_desktop/play:media:soundcloud:2018"
     },
     {
-        "duration": "38.0",
+        "duration": "76.0",
         "name": "system_health.memory_desktop/browse:media:googleplaystore:2018"
     },
     {
-        "duration": "65.0",
+        "duration": "130.0",
         "name": "system_health.memory_desktop/browse:media:imgur"
     },
     {
-        "duration": "83.0",
+        "duration": "166.0",
         "name": "system_health.memory_desktop/browse:media:pinterest:2018"
     },
     {
-        "duration": "54.0",
+        "duration": "108.0",
         "name": "system_health.memory_desktop/browse:media:tumblr:2018"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "system_health.memory_desktop/browse:media:youtube:2019"
     },
     {
-        "duration": "59.0",
+        "duration": "118.0",
         "name": "system_health.memory_desktop/browse:media:youtubetv:2019"
     },
     {
-        "duration": "39.0",
+        "duration": "82.0",
         "name": "system_health.memory_desktop/browse:news:cnn:2018"
     },
     {
-        "duration": "45.0",
+        "duration": "88.0",
         "name": "system_health.memory_desktop/browse:news:flipboard:2018"
     },
     {
-        "duration": "52.0",
+        "duration": "104.0",
         "name": "system_health.memory_desktop/browse:news:hackernews:2018"
     },
     {
-        "duration": "59.0",
+        "duration": "118.0",
         "name": "system_health.memory_desktop/browse:news:nytimes:2018"
     },
     {
-        "duration": "44.0",
+        "duration": "90.0",
         "name": "system_health.memory_desktop/browse:news:reddit:2018"
     },
     {
-        "duration": "44.0",
+        "duration": "86.0",
         "name": "system_health.memory_desktop/browse:search:google:2018"
     },
     {
-        "duration": "30.0",
+        "duration": "58.0",
         "name": "system_health.memory_desktop/browse:search:google_india:2018"
     },
     {
-        "duration": "67.0",
+        "duration": "132.0",
         "name": "system_health.memory_desktop/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "52.0",
+        "duration": "110.0",
         "name": "system_health.memory_desktop/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "43.0",
+        "duration": "86.0",
         "name": "system_health.memory_desktop/browse:social:twitter:2018"
     },
     {
-        "duration": "59.0",
+        "duration": "116.0",
         "name": "system_health.memory_desktop/browse:social:twitter_infinite_scroll:2018"
     },
     {
-        "duration": "55.0",
+        "duration": "108.0",
         "name": "system_health.memory_desktop/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "37.0",
+        "duration": "74.0",
         "name": "system_health.memory_desktop/browse:tools:docs_scrolling"
     },
     {
-        "duration": "66.0",
+        "duration": "130.0",
         "name": "system_health.memory_desktop/browse:tools:maps:2019"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "system_health.memory_desktop/browse:tools:sheets:2019"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "system_health.memory_desktop/browse_accessibility:media:youtube"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "system_health.memory_desktop/browse_accessibility:tech:codesearch:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "system_health.memory_desktop/load:chrome:blank"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "system_health.memory_desktop/load:games:alphabetty:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.memory_desktop/load:games:bubbles:2019"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "system_health.memory_desktop/load:games:lazors"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "system_health.memory_desktop/load:games:miniclip:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "system_health.memory_desktop/load:games:spychase:2018"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "system_health.memory_desktop/load:media:9gag"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "system_health.memory_desktop/load:media:dailymotion:2019"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "system_health.memory_desktop/load:media:facebook_photos:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "system_health.memory_desktop/load:media:flickr:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "system_health.memory_desktop/load:media:google_images:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "system_health.memory_desktop/load:media:imgur:2018"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "system_health.memory_desktop/load:media:soundcloud:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "system_health.memory_desktop/load:media:youtube:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "system_health.memory_desktop/load:news:bbc:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "system_health.memory_desktop/load:news:cnn:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "system_health.memory_desktop/load:news:flipboard"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.memory_desktop/load:news:hackernews:2018"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "system_health.memory_desktop/load:news:nytimes:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "36.0",
         "name": "system_health.memory_desktop/load:news:qq:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "system_health.memory_desktop/load:news:reddit:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "system_health.memory_desktop/load:news:wikipedia:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "system_health.memory_desktop/load:search:amazon:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "system_health.memory_desktop/load:search:baidu:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "system_health.memory_desktop/load:search:ebay:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "system_health.memory_desktop/load:search:flipkart:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "system_health.memory_desktop/load:search:google:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "system_health.memory_desktop/load:search:taobao:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "system_health.memory_desktop/load:search:yahoo:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "system_health.memory_desktop/load:search:yandex:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "system_health.memory_desktop/load:social:instagram:2018"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "system_health.memory_desktop/load:social:pinterest:2019"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "system_health.memory_desktop/load:social:vk:2018"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "system_health.memory_desktop/load:tools:chat:2020"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "system_health.memory_desktop/load:tools:docs:2019"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "system_health.memory_desktop/load:tools:drive:2019"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "system_health.memory_desktop/load:tools:gmail:2019"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "system_health.memory_desktop/load:tools:stackoverflow:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "system_health.memory_desktop/load:tools:weather:2019"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "system_health.memory_desktop/load_accessibility:media:wikipedia:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "system_health.memory_desktop/load_accessibility:shopping:amazon:2018"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "system_health.memory_desktop/long_running:tools:gmail-background"
     },
     {
-        "duration": "126.0",
+        "duration": "252.0",
         "name": "system_health.memory_desktop/long_running:tools:gmail-foreground"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "system_health.memory_desktop/multitab:misc:typical24"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "system_health.memory_desktop/multitab:misc:typical24:2018"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "system_health.memory_desktop/play:media:google_play_music"
     },
     {
-        "duration": "40.0",
+        "duration": "80.0",
         "name": "system_health.memory_desktop/play:media:soundcloud:2018"
     },
     {
@@ -3832,263 +3836,263 @@
         "name": "tab_switching.typical_25/multitab:misc:typical24"
     },
     {
-        "duration": "14.0",
+        "duration": "26.0",
         "name": "tracing.tracing_with_background_memory_infra/Facebook"
     },
     {
-        "duration": "14.0",
+        "duration": "26.0",
         "name": "tracing.tracing_with_background_memory_infra/Wikipedia"
     },
     {
-        "duration": "13.0",
+        "duration": "24.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.amazon.com"
     },
     {
-        "duration": "13.0",
+        "duration": "24.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.ask.com/"
     },
     {
-        "duration": "13.0",
+        "duration": "24.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.bing.com/"
     },
     {
-        "duration": "14.0",
+        "duration": "24.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.yahoo.com/"
     },
     {
-        "duration": "14.0",
+        "duration": "26.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.youtube.com"
     },
     {
-        "duration": "15.0",
+        "duration": "26.0",
         "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/#hl=en&q=barack+obama"
     },
     {
-        "duration": "14.0",
+        "duration": "26.0",
         "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/calendar/"
     },
     {
-        "duration": "48.0",
+        "duration": "92.0",
         "name": "v8.browsing_desktop-future/browse:media:googleplaystore:2018"
     },
     {
-        "duration": "10.0",
+        "duration": "18.0",
         "name": "v8.browsing_desktop-future/browse:media:imgur"
     },
     {
-        "duration": "93.0",
+        "duration": "182.0",
         "name": "v8.browsing_desktop-future/browse:media:pinterest:2018"
     },
     {
-        "duration": "63.0",
+        "duration": "122.0",
         "name": "v8.browsing_desktop-future/browse:media:tumblr:2018"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "v8.browsing_desktop-future/browse:media:youtube:2019"
     },
     {
-        "duration": "67.0",
+        "duration": "134.0",
         "name": "v8.browsing_desktop-future/browse:media:youtubetv:2019"
     },
     {
-        "duration": "50.0",
+        "duration": "110.0",
         "name": "v8.browsing_desktop-future/browse:news:cnn:2018"
     },
     {
-        "duration": "54.0",
+        "duration": "118.0",
         "name": "v8.browsing_desktop-future/browse:news:flipboard:2018"
     },
     {
-        "duration": "10.0",
+        "duration": "18.0",
         "name": "v8.browsing_desktop-future/browse:news:hackernews:2018"
     },
     {
-        "duration": "71.0",
+        "duration": "134.0",
         "name": "v8.browsing_desktop-future/browse:news:nytimes:2018"
     },
     {
-        "duration": "55.0",
+        "duration": "106.0",
         "name": "v8.browsing_desktop-future/browse:news:reddit:2018"
     },
     {
-        "duration": "54.0",
+        "duration": "118.0",
         "name": "v8.browsing_desktop-future/browse:search:google:2018"
     },
     {
-        "duration": "39.0",
+        "duration": "74.0",
         "name": "v8.browsing_desktop-future/browse:search:google_india:2018"
     },
     {
-        "duration": "77.0",
+        "duration": "162.0",
         "name": "v8.browsing_desktop-future/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "71.0",
+        "duration": "138.0",
         "name": "v8.browsing_desktop-future/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "50.0",
+        "duration": "100.0",
         "name": "v8.browsing_desktop-future/browse:social:twitter:2018"
     },
     {
-        "duration": "67.0",
+        "duration": "132.0",
         "name": "v8.browsing_desktop-future/browse:social:twitter_infinite_scroll:2018"
     },
     {
-        "duration": "64.0",
+        "duration": "138.0",
         "name": "v8.browsing_desktop-future/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "46.0",
+        "duration": "88.0",
         "name": "v8.browsing_desktop-future/browse:tools:docs_scrolling"
     },
     {
-        "duration": "76.0",
+        "duration": "148.0",
         "name": "v8.browsing_desktop-future/browse:tools:maps:2019"
     },
     {
-        "duration": "10.0",
+        "duration": "18.0",
         "name": "v8.browsing_desktop-future/browse:tools:sheets:2019"
     },
     {
-        "duration": "48.0",
+        "duration": "92.0",
         "name": "v8.browsing_desktop/browse:media:googleplaystore:2018"
     },
     {
-        "duration": "10.0",
+        "duration": "18.0",
         "name": "v8.browsing_desktop/browse:media:imgur"
     },
     {
-        "duration": "93.0",
+        "duration": "182.0",
         "name": "v8.browsing_desktop/browse:media:pinterest:2018"
     },
     {
-        "duration": "64.0",
+        "duration": "124.0",
         "name": "v8.browsing_desktop/browse:media:tumblr:2018"
     },
     {
-        "duration": "10.0",
+        "duration": "18.0",
         "name": "v8.browsing_desktop/browse:media:youtube:2019"
     },
     {
-        "duration": "69.0",
+        "duration": "134.0",
         "name": "v8.browsing_desktop/browse:media:youtubetv:2019"
     },
     {
-        "duration": "51.0",
+        "duration": "136.0",
         "name": "v8.browsing_desktop/browse:news:cnn:2018"
     },
     {
-        "duration": "54.0",
+        "duration": "110.0",
         "name": "v8.browsing_desktop/browse:news:flipboard:2018"
     },
     {
-        "duration": "10.0",
+        "duration": "18.0",
         "name": "v8.browsing_desktop/browse:news:hackernews:2018"
     },
     {
-        "duration": "71.0",
+        "duration": "138.0",
         "name": "v8.browsing_desktop/browse:news:nytimes:2018"
     },
     {
-        "duration": "55.0",
+        "duration": "108.0",
         "name": "v8.browsing_desktop/browse:news:reddit:2018"
     },
     {
-        "duration": "54.0",
+        "duration": "110.0",
         "name": "v8.browsing_desktop/browse:search:google:2018"
     },
     {
-        "duration": "39.0",
+        "duration": "80.0",
         "name": "v8.browsing_desktop/browse:search:google_india:2018"
     },
     {
-        "duration": "77.0",
+        "duration": "156.0",
         "name": "v8.browsing_desktop/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "62.0",
+        "duration": "140.0",
         "name": "v8.browsing_desktop/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "63.0",
+        "duration": "100.0",
         "name": "v8.browsing_desktop/browse:social:twitter:2018"
     },
     {
-        "duration": "69.0",
+        "duration": "134.0",
         "name": "v8.browsing_desktop/browse:social:twitter_infinite_scroll:2018"
     },
     {
-        "duration": "65.0",
+        "duration": "132.0",
         "name": "v8.browsing_desktop/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "46.0",
+        "duration": "94.0",
         "name": "v8.browsing_desktop/browse:tools:docs_scrolling"
     },
     {
-        "duration": "76.0",
+        "duration": "150.0",
         "name": "v8.browsing_desktop/browse:tools:maps:2019"
     },
     {
-        "duration": "10.0",
+        "duration": "18.0",
         "name": "v8.browsing_desktop/browse:tools:sheets:2019"
     },
     {
-        "duration": "21.0",
+        "duration": "38.0",
         "name": "webrtc/10s_datachannel_transfer"
     },
     {
-        "duration": "19.0",
+        "duration": "34.0",
         "name": "webrtc/canvas_capture_peer_connection"
     },
     {
-        "duration": "29.0",
+        "duration": "54.0",
         "name": "webrtc/codec_constraints_h264"
     },
     {
-        "duration": "29.0",
+        "duration": "54.0",
         "name": "webrtc/codec_constraints_vp8"
     },
     {
-        "duration": "29.0",
+        "duration": "54.0",
         "name": "webrtc/codec_constraints_vp9"
     },
     {
-        "duration": "19.0",
+        "duration": "34.0",
         "name": "webrtc/hd_local_stream_10s"
     },
     {
-        "duration": "33.0",
+        "duration": "58.0",
         "name": "webrtc/multiple_peerconnections"
     },
     {
-        "duration": "23.0",
+        "duration": "10.0",
         "name": "webrtc/pause_play_peerconnections"
     },
     {
+        "duration": "270.0",
+        "name": "base_perftests/_gtest_"
+    },
+    {
         "duration": "16.0",
         "name": "media_perftests/_gtest_"
     },
     {
-        "duration": "110.0",
-        "name": "components_perftests/_gtest_"
-    },
-    {
         "duration": "1988.0",
         "name": "angle_perftests/_gtest_"
     },
     {
         "duration": "270.0",
-        "name": "base_perftests/_gtest_"
+        "name": "dawn_perf_tests/_gtest_"
     },
     {
         "duration": "7.0",
         "name": "views_perftests/_gtest_"
     },
     {
-        "duration": "270.0",
-        "name": "dawn_perf_tests/_gtest_"
+        "duration": "110.0",
+        "name": "components_perftests/_gtest_"
     }
 ]
\ No newline at end of file
diff --git a/tools/perf/core/shard_maps/timing_data/win-10_laptop_low_end-perf_timing.json b/tools/perf/core/shard_maps/timing_data/win-10_laptop_low_end-perf_timing.json
index bb79fbec..cfdd89c 100644
--- a/tools/perf/core/shard_maps/timing_data/win-10_laptop_low_end-perf_timing.json
+++ b/tools/perf/core/shard_maps/timing_data/win-10_laptop_low_end-perf_timing.json
@@ -1,3830 +1,3834 @@
 [
     {
-        "duration": "29.0",
+        "duration": "60.0",
         "name": "blink_perf.accessibility/line-breaks.html"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "blink_perf.accessibility/textarea-append.html"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "blink_perf.bindings/append-child.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.bindings/create-element.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/document-implementation.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/dom-attribute-on-prototoype.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.bindings/first-child.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.bindings/gc-forest.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.bindings/gc-mini-tree.html"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "blink_perf.bindings/gc-tree.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/get-attribute-rare.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/get-attribute.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/get-element-by-id.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/get-elements-by-tag-name.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/id-getter.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/id-setter.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.bindings/indexed-getter.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/insert-before.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/named-property-enumerator.html"
     },
     {
-        "duration": "20.0",
+        "duration": "38.0",
         "name": "blink_perf.bindings/node-list-access.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.bindings/node-type.html"
     },
     {
-        "duration": "3.0",
+        "duration": "8.0",
         "name": "blink_perf.bindings/post-message.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.bindings/sequence-conversion-array.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/sequence-conversion-custom-iterator.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.bindings/serialize-array.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.bindings/serialize-long-string.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/serialize-map.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.bindings/serialize-nested-array.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/set-attribute-rare.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/set-attribute.html"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "blink_perf.bindings/structured-clone-json-deserialize.html"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "blink_perf.bindings/structured-clone-json-serialize.html"
     },
     {
-        "duration": "6.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/structured-clone-long-string-deserialize.html"
     },
     {
-        "duration": "6.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/structured-clone-long-string-serialize.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/typed-array-construct-from-array.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.bindings/typed-array-construct-from-same-type.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/typed-array-construct-from-typed.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.bindings/typed-array-set-from-typed.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.bindings/undefined-first-child.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/undefined-get-element-by-id.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/undefined-id-getter.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.bindings/worker-structured-clone-different-payloads.html"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "blink_perf.bindings/worker-structured-clone-json-from-worker.html"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "blink_perf.bindings/worker-structured-clone-json-roundtrip.html"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "blink_perf.bindings/worker-structured-clone-json-to-worker.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.bindings/worker-structured-clone-workerDOM-DBMon-from-worker.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.bindings/worker-structured-clone-workerDOM-Map-from-worker.html"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "blink_perf.bindings/worker-text-encoded-transferable-from-worker.html"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "blink_perf.bindings/worker-text-encoded-transferable-roundtrip.html"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "blink_perf.bindings/worker-text-encoded-transferable-to-worker.html"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "blink_perf.bindings/worker-transferable-from-worker.html"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "blink_perf.bindings/worker-transferable-roundtrip.html"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "blink_perf.bindings/worker-transferable-to-worker.html"
     },
     {
-        "duration": "81.0",
+        "duration": "158.0",
         "name": "blink_perf.canvas/canvas-to-canvas-draw.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/canvas-to-canvas-draw_RAF.html?RAF"
     },
     {
-        "duration": "13.0",
+        "duration": "20.0",
         "name": "blink_perf.canvas/createImageBitmapFromImageData.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.canvas/createImageBitmapFromImageData_RAF.html?RAF"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.canvas/docs-paper.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.canvas/docs-paper_RAF.html?RAF"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "blink_perf.canvas/docs-resume.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/docs-resume_RAF.html?RAF"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "blink_perf.canvas/docs-table.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/docs-table_RAF.html?RAF"
     },
     {
-        "duration": "12.0",
+        "duration": "34.0",
         "name": "blink_perf.canvas/draw-dynamic-canvas-2d-to-hw-accelerated-canvas-2d.html"
     },
     {
-        "duration": "9.0",
+        "duration": "40.0",
         "name": "blink_perf.canvas/draw-dynamic-canvas-2d-to-hw-accelerated-canvas-2d_RAF.html?RAF"
     },
     {
-        "duration": "14.0",
+        "duration": "42.0",
         "name": "blink_perf.canvas/draw-dynamic-webgl-to-hw-accelerated-canvas-2d.html"
     },
     {
-        "duration": "4.0",
+        "duration": "12.0",
         "name": "blink_perf.canvas/draw-dynamic-webgl-to-hw-accelerated-canvas-2d_RAF.html?RAF"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.canvas/draw-hw-accelerated-canvas-2d-to-sw-canvas-2d.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/draw-hw-accelerated-canvas-2d-to-sw-canvas-2d_RAF.html?RAF"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.canvas/draw-static-canvas-2d-to-hw-accelerated-canvas-2d.html"
     },
     {
-        "duration": "14.0",
+        "duration": "46.0",
         "name": "blink_perf.canvas/draw-static-canvas-2d-to-hw-accelerated-canvas-2d_RAF.html?RAF"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.canvas/draw-static-webgl-to-hw-accelerated-canvas-2d.html"
     },
     {
-        "duration": "13.0",
+        "duration": "46.0",
         "name": "blink_perf.canvas/draw-static-webgl-to-hw-accelerated-canvas-2d_RAF.html?RAF"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.canvas/draw-video-to-hw-accelerated-canvas-2d.html"
     },
     {
-        "duration": "5.0",
+        "duration": "12.0",
         "name": "blink_perf.canvas/draw-video-to-hw-accelerated-canvas-2d_RAF.html?RAF"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "blink_perf.canvas/drawimage-not-pixelaligned.html"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "blink_perf.canvas/drawimage-not-pixelaligned_RAF.html?RAF"
     },
     {
-        "duration": "12.0",
+        "duration": "32.0",
         "name": "blink_perf.canvas/drawimage.html"
     },
     {
-        "duration": "12.0",
+        "duration": "32.0",
         "name": "blink_perf.canvas/drawimage_RAF.html?RAF"
     },
     {
-        "duration": "13.0",
+        "duration": "24.0",
         "name": "blink_perf.canvas/getImageData.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.canvas/getImageDataColorManaged.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.canvas/getImageDataColorManaged_RAF.html?RAF"
     },
     {
-        "duration": "14.0",
+        "duration": "24.0",
         "name": "blink_perf.canvas/getImageData_RAF.html?RAF"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.canvas/gpu-bound-shader.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/gpu-bound-shader_RAF.html?RAF"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "blink_perf.canvas/putImageData.html"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "blink_perf.canvas/putImageData_RAF.html?RAF"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "blink_perf.canvas/sheets-render.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/sheets-render_RAF.html?RAF"
     },
     {
-        "duration": "6.0",
+        "duration": "14.0",
         "name": "blink_perf.canvas/toBlob_duration.html"
     },
     {
-        "duration": "6.0",
+        "duration": "14.0",
         "name": "blink_perf.canvas/toBlob_duration_RAF.html?RAF"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/toBlob_duration_jpeg.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/toBlob_duration_jpeg_RAF.html?RAF"
     },
     {
-        "duration": "40.0",
+        "duration": "60.0",
         "name": "blink_perf.canvas/transferFromImageBitmap.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/transferFromImageBitmap_RAF.html?RAF"
     },
     {
-        "duration": "7.0",
+        "duration": "16.0",
         "name": "blink_perf.canvas/upload-canvas-2d-to-texture.html"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "blink_perf.canvas/upload-canvas-2d-to-texture_RAF.html?RAF"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.canvas/upload-video-to-sub-texture.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/upload-video-to-sub-texture_RAF.html?RAF"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.canvas/upload-video-to-texture.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/upload-video-to-texture_RAF.html?RAF"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.canvas/upload-webgl-to-texture.html"
     },
     {
-        "duration": "13.0",
+        "duration": "28.0",
         "name": "blink_perf.canvas/upload-webgl-to-texture_RAF.html?RAF"
     },
     {
-        "duration": "24.0",
+        "duration": "46.0",
         "name": "blink_perf.css/AttributeDescendantSelector.html"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "blink_perf.css/CSSPropertySetterGetter.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.css/CSSPropertySetterGetterMethods.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "blink_perf.css/CSSPropertyUpdateValue.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.css/ChangeStyleChildClassSelector.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.css/ChangeStyleChildElementSelectors.html"
     },
     {
-        "duration": "13.0",
+        "duration": "24.0",
         "name": "blink_perf.css/ChangeStyleElementSelector.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.css/ChangeStyleGrandChildElementSelector.html"
     },
     {
-        "duration": "13.0",
+        "duration": "24.0",
         "name": "blink_perf.css/ChangeStyleMultipleClassSelector.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.css/ChangeStyleMultipleQualifiedDataAttributesWithValuesSelector.html"
     },
     {
-        "duration": "13.0",
+        "duration": "24.0",
         "name": "blink_perf.css/ChangeStyleNestedPseudoSelector.html"
     },
     {
-        "duration": "13.0",
+        "duration": "24.0",
         "name": "blink_perf.css/ChangeStylePairOfNthChildSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "26.0",
         "name": "blink_perf.css/ChangeStylePartialAttributeMatchingSelector.html"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeSelector.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeWithValueSelector.html"
     },
     {
-        "duration": "13.0",
+        "duration": "28.0",
         "name": "blink_perf.css/ChangeStyleShallowTree.html"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "blink_perf.css/ChangeStyleSingleClassSelector.html"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "blink_perf.css/ChangeStyleSingleNthChildSelector.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.css/ChangeStyleSinglePseudoSelector.html"
     },
     {
-        "duration": "13.0",
+        "duration": "24.0",
         "name": "blink_perf.css/ChangeStyleUniversalSelector.html"
     },
     {
-        "duration": "13.0",
+        "duration": "24.0",
         "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeSelector.html"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeWithValueSelector.html"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "blink_perf.css/ClassDescendantSelector.html"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "blink_perf.css/ClassInvalidation.html"
     },
     {
-        "duration": "9.0",
+        "duration": "16.0",
         "name": "blink_perf.css/CustomPropertiesCascade.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.css/CustomPropertiesNonRootInheritance.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
+        "name": "blink_perf.css/CustomPropertiesPendingSubstitution.html"
+    },
+    {
+        "duration": "18.0",
         "name": "blink_perf.css/CustomPropertiesRootInheritance.html"
     },
     {
-        "duration": "9.0",
+        "duration": "16.0",
         "name": "blink_perf.css/CustomPropertiesVarAlias.html"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "blink_perf.css/FocusUpdate.html"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "blink_perf.css/LoadBootstrapBlog.html"
     },
     {
-        "duration": "14.0",
+        "duration": "26.0",
         "name": "blink_perf.css/LoadMaterializeStarterPage.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.css/LoadSemanticPageExample.html"
     },
     {
-        "duration": "13.0",
+        "duration": "28.0",
         "name": "blink_perf.css/PseudoClassSelectors.html"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "blink_perf.css/SelectorCountScaling.html"
     },
     {
-        "duration": "40.0",
+        "duration": "92.0",
         "name": "blink_perf.dom/custom-element-default-style-with-shadow.html"
     },
     {
-        "duration": "30.0",
+        "duration": "70.0",
         "name": "blink_perf.dom/custom-element-default-style.html"
     },
     {
-        "duration": "13.0",
+        "duration": "38.0",
         "name": "blink_perf.dom/long-sibling-list.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.dom/modify-element-classname.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.dom/modify-element-id.html"
     },
     {
-        "duration": "4.0",
+        "duration": "10.0",
         "name": "blink_perf.dom/modify-element-title.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.dom/select-multiple-add.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.dom/select-single-add.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.dom/select-single-remove.html"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "blink_perf.events/EventsDispatching.html"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "blink_perf.events/EventsDispatchingInDeeplyNestedV0ShadowTrees.html"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "blink_perf.events/EventsDispatchingInDeeplyNestedV1ShadowTrees.html"
     },
     {
-        "duration": "19.0",
+        "duration": "48.0",
         "name": "blink_perf.events/EventsDispatchingInV0ShadowTrees.html"
     },
     {
-        "duration": "19.0",
+        "duration": "50.0",
         "name": "blink_perf.events/EventsDispatchingInV1ShadowTrees.html"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "blink_perf.events/hit-test-lots-of-layers.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.events/is-input-pending-all-events.html"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "blink_perf.events/is-input-pending-default-events.html"
     },
     {
-        "duration": "33.0",
+        "duration": "64.0",
         "name": "blink_perf.image_decoder/decode-gif.html"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h1v1.html"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h1v2.html"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h2v1.html"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h2v2.html"
     },
     {
-        "duration": "30.0",
+        "duration": "58.0",
         "name": "blink_perf.image_decoder/decode-lossless-webp.html"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "blink_perf.image_decoder/decode-lossy-webp.html"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "blink_perf.image_decoder/decode-png-palette-opaque.html"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "blink_perf.image_decoder/decode-png-palette.html"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "blink_perf.image_decoder/decode-png.html"
     },
     {
-        "duration": "15.0",
+        "duration": "34.0",
         "name": "blink_perf.layout/ArabicLineLayout.html"
     },
     {
-        "duration": "3.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/Shapes/MultipleShapes.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/SimpleTextPathLineLayout.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/add-remove-inline-floats.html"
     },
     {
-        "duration": "4.0",
+        "duration": "10.0",
         "name": "blink_perf.layout/animate-abspos-deep.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/attach-inlines-2.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/attach-inlines.html"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "blink_perf.layout/auto-grid-lots-of-data.html"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "blink_perf.layout/auto-grid-lots-of-spanning-data.html"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "blink_perf.layout/change-text-css-contain.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/chapter-reflow-once-random.html"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "blink_perf.layout/chapter-reflow-once.html"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "blink_perf.layout/chapter-reflow-thrice.html"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "blink_perf.layout/chapter-reflow-twice.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/chapter-reflow.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.layout/character_fallback.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/contain-content-style-change.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/editing_append.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/editing_append_single_line.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/editing_delete.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/editing_insert.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/editing_prepend.html"
     },
     {
-        "duration": "16.0",
+        "duration": "36.0",
         "name": "blink_perf.layout/fit-content-change-available-size-blocks.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/fit-content-change-available-size-text.html"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "blink_perf.layout/fixed-grid-lots-of-data.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.layout/fixed-grid-lots-of-stretched-data.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/flexbox-column-nowrap.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/flexbox-column-wrap.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/flexbox-deeply-nested-column-flow.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/flexbox-lots-of-data.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/flexbox-row-nowrap.html"
     },
     {
-        "duration": "13.0",
+        "duration": "28.0",
         "name": "blink_perf.layout/flexbox-row-stretch-height-definite.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/flexbox-row-wrap.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/flexbox-with-stretch-layout.html"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "blink_perf.layout/flexbox_with_list_item.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.layout/floats_100_100.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.layout/floats_100_100_nested.html"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "blink_perf.layout/floats_10_1000.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/floats_20_100.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/floats_20_100_nested.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.layout/floats_2_100.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/floats_2_100_nested.html"
     },
     {
-        "duration": "6.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/floats_50_100.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/floats_50_100_nested.html"
     },
     {
-        "duration": "12.0",
+        "duration": "26.0",
         "name": "blink_perf.layout/hindi-line-layout.html"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/japanese-kokoro-insert.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.layout/large-grid.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/large-spanning-grid-item.html"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans-wider-than-table.html"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans.html"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "blink_perf.layout/large-table-with-collapsed-borders-and-no-colspans.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "blink_perf.layout/latin-ebook-resize.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/latin-ebook.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.layout/layers_overlap_2d.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.layout/layers_overlap_3d.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.layout/line-layout-fit-content-break-word.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/line-layout-fit-content.html"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "blink_perf.layout/line-layout-line-height.html"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "blink_perf.layout/line-layout-repeat-append-select.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/line-layout-repeat-append.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/line-layout.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/long-line-nowrap-collapse.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/long-line-nowrap-spans-collapse.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/long-line-nowrap.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/many-block-children-auto-inline-size.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/many-block-children-fixed-inline-size.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/multicol/balance-forced-breaks.html"
     },
     {
-        "duration": "9.0",
+        "duration": "22.0",
         "name": "blink_perf.layout/multicol/deeply-nested-tables.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/multicol/fixed-height-with-spanner-and-nested-tables.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/multicol/lots-of-small-nested-unbreakable-blocks-autofill.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/multicol/lots-of-small-unbreakable-blocks-autofill.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/multicol/lots-of-text-autofill.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/multicol/lots-of-text-balanced-orphans-widows.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/multicol/lots-of-text-balanced.html"
     },
     {
-        "duration": "32.0",
+        "duration": "60.0",
         "name": "blink_perf.layout/multicol/nested-forced-breaks.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/multicol/tall-content-short-columns-realistic.html"
     },
     {
-        "duration": "8.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/multicol/tall-content-short-columns.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/nested-blocks-with-percent-height-and-max-height.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/nested-grid.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/nested-percent-height-tables.html"
     },
     {
-        "duration": "67.0",
+        "duration": "132.0",
         "name": "blink_perf.layout/subtree-detaching.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/vertical-japanese-kokoro-insert.html"
     },
     {
-        "duration": "3.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/word-break-break-all.html"
     },
     {
-        "duration": "3.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/word-break-break-word.html"
     },
     {
-        "duration": "3.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/word-wrap-break-word.html"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "blink_perf.owp_storage/blob-perf-files.html"
     },
     {
-        "duration": "20.0",
+        "duration": "38.0",
         "name": "blink_perf.owp_storage/blob-perf-ipc.html"
     },
     {
-        "duration": "18.0",
+        "duration": "34.0",
         "name": "blink_perf.owp_storage/blob-perf-shm.html"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "blink_perf.owp_storage/blob-perf-tiny.html"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "blink_perf.owp_storage/idb-load-docs.html"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "blink_perf.paint/appending-text.html"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "blink_perf.paint/color-changes.html"
     },
     {
-        "duration": "26.0",
+        "duration": "44.0",
         "name": "blink_perf.paint/complex-content-slow-scroll.html"
     },
     {
-        "duration": "20.0",
+        "duration": "42.0",
         "name": "blink_perf.paint/complex-iframe-filtered.html"
     },
     {
-        "duration": "49.0",
+        "duration": "102.0",
         "name": "blink_perf.paint/contain-update-layer-tree.html"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "blink_perf.paint/containment-resize.html"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "blink_perf.paint/fixed-and-many-layers-scroll.html"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "blink_perf.paint/large-table-background-change-with-invisible-collapsed-borders.html"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "blink_perf.paint/large-table-background-change-with-visible-collapsed-borders.html"
     },
     {
-        "duration": "24.0",
+        "duration": "50.0",
         "name": "blink_perf.paint/large-table-background-change-with-zero-width-collapsed-borders.html"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "blink_perf.paint/large-table-collapsed-border-change-with-backgrounds.html"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "blink_perf.paint/large-table-collapsed-border-change-with-text.html"
     },
     {
-        "duration": "18.0",
+        "duration": "36.0",
         "name": "blink_perf.paint/large-table-collapsed-border-change.html"
     },
     {
-        "duration": "23.0",
+        "duration": "58.0",
         "name": "blink_perf.paint/large-table-repaint.html"
     },
     {
-        "duration": "17.0",
+        "duration": "38.0",
         "name": "blink_perf.paint/move-text-with-mask.html"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "blink_perf.paint/paint-offset-changes.html"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "blink_perf.paint/select-all-words.html"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "blink_perf.paint/transform-changes.html"
     },
     {
-        "duration": "15.0",
+        "duration": "32.0",
         "name": "blink_perf.parser/css-parser-yui.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/html-parser-threaded.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/html-parser.html"
     },
     {
-        "duration": "42.0",
+        "duration": "86.0",
         "name": "blink_perf.parser/html5-full-render.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/iframe-append-remove.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.parser/innerHTML-setter-siblings.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.parser/innerHTML-setter.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.parser/query-selector-all-attribute-complex.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.parser/query-selector-all-attribute.html"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "blink_perf.parser/query-selector-all-class-deep.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.parser/query-selector-all-class-first.html"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "blink_perf.parser/query-selector-all-class-last.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/query-selector-all-class.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.parser/query-selector-all-deep.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.parser/query-selector-all-first.html"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "blink_perf.parser/query-selector-all-id-deep.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.parser/query-selector-all-id-first.html"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "blink_perf.parser/query-selector-all-id-last.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.parser/query-selector-all-last.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.parser/query-selector-deep.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.parser/query-selector-first.html"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "blink_perf.parser/query-selector-id-deep.html"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "blink_perf.parser/query-selector-id-last.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.parser/query-selector-last.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/simple-url.html"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "blink_perf.parser/textarea-parsing.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/tiny-innerHTML.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.parser/url-parser.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.parser/xml-parser.html"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "blink_perf.shadow_dom/declarative-api.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/imperative-api-appendchild.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/imperative-api-assign.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/imperative-api-assigned-elements.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/imperative-api-assigned-slot.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/imperative-api-custom-detail-summary-large.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/imperative-api-custom-detail-summary.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/imperative-api-detail-summary-large.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/imperative-api-detail-summary.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/imperative-api-insertbefore.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/imperative-api.html"
     },
     {
-        "duration": "4.0",
+        "duration": "10.0",
         "name": "blink_perf.shadow_dom/shadow-style-share-attr-selectors.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/shadow-style-share-media-query.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/shadow-style-share-with-distribution.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/shadow-style-share.html"
     },
     {
-        "duration": "3.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/style-sheet-insert.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v0-changing-classname-with-shadow-dom.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.shadow_dom/v0-changing-classname-without-shadow-dom.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.shadow_dom/v0-changing-select-with-shadow-dom.html"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "blink_perf.shadow_dom/v0-changing-select-without-shadow-dom.html"
     },
     {
-        "duration": "3.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v0-content-reprojection.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v0-large-distribution-without-layout.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v0-multiple-insertion-points.html"
     },
     {
-        "duration": "3.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v0-shadow-reprojection.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v0-small-distribution-with-layout.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.shadow_dom/v1-distribution-disconnected-and-reconnected.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v1-distribution.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v1-host-child-append.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "blink_perf.shadow_dom/v1-large-deep-distribution.html"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "blink_perf.shadow_dom/v1-large-deep-layout.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-append-layout.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-distribution.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-layout.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-prepend-layout.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-re-layout.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-slot-assigned-nodes.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-slot-flatten.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-re-layout.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-assigned-nodes.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-flatten.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v1-slot-append.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.shadow_dom/v1-small-deep-distribution.html"
     },
     {
-        "duration": "4.0",
+        "duration": "10.0",
         "name": "blink_perf.shadow_dom/v1-small-deep-layout.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v1-small-shallow-distribution.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.shadow_dom/v1-small-shallow-layout.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.svg/AzLizardBenjiPark.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.svg/Bamboo.html"
     },
     {
-        "duration": "3.0",
+        "duration": "8.0",
         "name": "blink_perf.svg/Cactus.html"
     },
     {
-        "duration": "3.0",
+        "duration": "8.0",
         "name": "blink_perf.svg/Cowboy.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.svg/Cowboy_transform.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.svg/CrawFishGanson.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.svg/Debian.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.svg/DropsOnABlade.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.svg/FlowerFromMyGarden.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.svg/FoodLeifLodahl.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.svg/France.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.svg/FrancoBolloGnomeEzechi.html"
     },
     {
-        "duration": "3.0",
+        "duration": "8.0",
         "name": "blink_perf.svg/GearFlowers.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.svg/HarveyRayner.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.svg/HereGear.html"
     },
     {
-        "duration": "6.0",
+        "duration": "14.0",
         "name": "blink_perf.svg/MtSaintHelens.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.svg/Samurai.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "blink_perf.svg/SierpinskiCarpet.html"
     },
     {
-        "duration": "5.0",
+        "duration": "10.0",
         "name": "blink_perf.svg/SvgCubics.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.svg/SvgHitTesting.html"
     },
     {
-        "duration": "9.0",
+        "duration": "20.0",
         "name": "blink_perf.svg/SvgNestedUse.html"
     },
     {
-        "duration": "3.0",
+        "duration": "6.0",
         "name": "blink_perf.svg/UnderTheSee.html"
     },
     {
-        "duration": "4.0",
+        "duration": "8.0",
         "name": "blink_perf.svg/WorldIso.html"
     },
     {
-        "duration": "6.0",
+        "duration": "12.0",
         "name": "blink_perf.svg/Worldcup.html"
     },
     {
-        "duration": "36.0",
+        "duration": "68.0",
         "name": "dromaeo/http://dromaeo.com?dom-attr"
     },
     {
-        "duration": "34.0",
+        "duration": "68.0",
         "name": "dromaeo/http://dromaeo.com?dom-modify"
     },
     {
-        "duration": "50.0",
+        "duration": "100.0",
         "name": "dromaeo/http://dromaeo.com?dom-query"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "dromaeo/http://dromaeo.com?dom-traverse"
     },
     {
-        "duration": "7.0",
+        "duration": "14.0",
         "name": "dummy_benchmark.noisy_benchmark_1/dummy_page.html"
     },
     {
-        "duration": "4.0",
+        "duration": "10.0",
         "name": "dummy_benchmark.stable_benchmark_1/dummy_page.html"
     },
     {
-        "duration": "228.0",
+        "duration": "454.0",
         "name": "jetstream/JetStream"
     },
     {
-        "duration": "322.0",
+        "duration": "642.0",
         "name": "jetstream2/JetStream2"
     },
     {
-        "duration": "43.0",
+        "duration": "76.0",
         "name": "kraken/http://krakenbenchmark.mozilla.org/kraken-1.1/driver.html"
     },
     {
-        "duration": "27.0",
+        "duration": "56.0",
         "name": "loading.desktop/24h_cold"
     },
     {
-        "duration": "30.0",
+        "duration": "62.0",
         "name": "loading.desktop/24h_warm"
     },
     {
-        "duration": "30.0",
+        "duration": "66.0",
         "name": "loading.desktop/AirBnB_cold"
     },
     {
-        "duration": "43.0",
+        "duration": "92.0",
         "name": "loading.desktop/AirBnB_warm"
     },
     {
-        "duration": "23.0",
+        "duration": "50.0",
         "name": "loading.desktop/Aljayyash_cold"
     },
     {
-        "duration": "24.0",
+        "duration": "80.0",
         "name": "loading.desktop/Aljayyash_warm"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "loading.desktop/AllRecipes_cold"
     },
     {
-        "duration": "38.0",
+        "duration": "80.0",
         "name": "loading.desktop/AllRecipes_warm"
     },
     {
-        "duration": "27.0",
+        "duration": "56.0",
         "name": "loading.desktop/ArsTechnica_cold"
     },
     {
-        "duration": "37.0",
+        "duration": "76.0",
         "name": "loading.desktop/ArsTechnica_warm"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "loading.desktop/Baidu_cold"
     },
     {
-        "duration": "27.0",
+        "duration": "56.0",
         "name": "loading.desktop/Baidu_warm"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "loading.desktop/Bhaskar_cold"
     },
     {
-        "duration": "33.0",
+        "duration": "68.0",
         "name": "loading.desktop/Bhaskar_warm"
     },
     {
-        "duration": "26.0",
+        "duration": "82.0",
         "name": "loading.desktop/Chosun_cold"
     },
     {
-        "duration": "30.0",
+        "duration": "58.0",
         "name": "loading.desktop/Chosun_warm"
     },
     {
-        "duration": "24.0",
+        "duration": "80.0",
         "name": "loading.desktop/Colorado.edu_cold"
     },
     {
-        "duration": "26.0",
+        "duration": "56.0",
         "name": "loading.desktop/Colorado.edu_warm"
     },
     {
-        "duration": "26.0",
+        "duration": "50.0",
         "name": "loading.desktop/Danawa_cold"
     },
     {
-        "duration": "29.0",
+        "duration": "54.0",
         "name": "loading.desktop/Danawa_warm"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "loading.desktop/Daum_cold"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "loading.desktop/Daum_warm"
     },
     {
-        "duration": "27.0",
+        "duration": "56.0",
         "name": "loading.desktop/Donga_cold"
     },
     {
-        "duration": "30.0",
+        "duration": "62.0",
         "name": "loading.desktop/Donga_warm"
     },
     {
-        "duration": "29.0",
+        "duration": "60.0",
         "name": "loading.desktop/Economist_cold"
     },
     {
-        "duration": "39.0",
+        "duration": "78.0",
         "name": "loading.desktop/Economist_warm"
     },
     {
-        "duration": "27.0",
+        "duration": "56.0",
         "name": "loading.desktop/Elmundo_cold"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "loading.desktop/Elmundo_warm"
     },
     {
-        "duration": "42.0",
+        "duration": "48.0",
         "name": "loading.desktop/FC2Blog_cold"
     },
     {
-        "duration": "30.0",
+        "duration": "54.0",
         "name": "loading.desktop/FC2Blog_warm"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "loading.desktop/FIFA_cold"
     },
     {
-        "duration": "31.0",
+        "duration": "62.0",
         "name": "loading.desktop/FIFA_warm"
     },
     {
-        "duration": "37.0",
+        "duration": "78.0",
         "name": "loading.desktop/FarsNews_cold"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "loading.desktop/FarsNews_warm"
     },
     {
-        "duration": "24.0",
+        "duration": "50.0",
         "name": "loading.desktop/Flickr_cold"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "loading.desktop/Flickr_warm"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "loading.desktop/FlipKart_cold"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "loading.desktop/FlipKart_warm"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "loading.desktop/Free.fr_cold"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "loading.desktop/Free.fr_warm"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "loading.desktop/HTML5Rocks_cold"
     },
     {
-        "duration": "24.0",
+        "duration": "50.0",
         "name": "loading.desktop/HTML5Rocks_warm"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "loading.desktop/Haraj_cold"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "loading.desktop/Haraj_warm"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "loading.desktop/HatenaBookmark_cold"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "loading.desktop/HatenaBookmark_warm"
     },
     {
-        "duration": "25.0",
+        "duration": "54.0",
         "name": "loading.desktop/IGN_cold"
     },
     {
-        "duration": "28.0",
+        "duration": "60.0",
         "name": "loading.desktop/IGN_warm"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "loading.desktop/IMDB_cold"
     },
     {
-        "duration": "29.0",
+        "duration": "60.0",
         "name": "loading.desktop/IMDB_warm"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "loading.desktop/IndiaTimes_cold"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "loading.desktop/IndiaTimes_warm"
     },
     {
-        "duration": "28.0",
+        "duration": "50.0",
         "name": "loading.desktop/Kakaku_cold"
     },
     {
-        "duration": "33.0",
+        "duration": "98.0",
         "name": "loading.desktop/Kakaku_warm"
     },
     {
-        "duration": "35.0",
+        "duration": "72.0",
         "name": "loading.desktop/Kenh14_cold"
     },
     {
-        "duration": "48.0",
+        "duration": "92.0",
         "name": "loading.desktop/Kenh14_warm"
     },
     {
-        "duration": "24.0",
+        "duration": "50.0",
         "name": "loading.desktop/Mercadolivre_cold"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "loading.desktop/Mercadolivre_warm"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "loading.desktop/Naver_cold"
     },
     {
-        "duration": "27.0",
+        "duration": "56.0",
         "name": "loading.desktop/Naver_warm"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "loading.desktop/Orange_cold"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "loading.desktop/Orange_warm"
     },
     {
-        "duration": "26.0",
+        "duration": "50.0",
         "name": "loading.desktop/Pantip_cold"
     },
     {
-        "duration": "43.0",
+        "duration": "56.0",
         "name": "loading.desktop/Pantip_warm"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "loading.desktop/PremierLeague_cold"
     },
     {
-        "duration": "31.0",
+        "duration": "62.0",
         "name": "loading.desktop/PremierLeague_warm"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "loading.desktop/QQ_cold"
     },
     {
-        "duration": "33.0",
+        "duration": "66.0",
         "name": "loading.desktop/QQ_warm"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "loading.desktop/REI_cold"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "loading.desktop/REI_warm"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "loading.desktop/Ruten_cold"
     },
     {
-        "duration": "27.0",
+        "duration": "56.0",
         "name": "loading.desktop/Ruten_warm"
     },
     {
-        "duration": "27.0",
+        "duration": "58.0",
         "name": "loading.desktop/Sina_cold"
     },
     {
-        "duration": "32.0",
+        "duration": "66.0",
         "name": "loading.desktop/Sina_warm"
     },
     {
-        "duration": "32.0",
+        "duration": "64.0",
         "name": "loading.desktop/Taobao_cold"
     },
     {
-        "duration": "43.0",
+        "duration": "86.0",
         "name": "loading.desktop/Taobao_warm"
     },
     {
-        "duration": "27.0",
+        "duration": "56.0",
         "name": "loading.desktop/TheOnion_cold"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "loading.desktop/TheOnion_warm"
     },
     {
-        "duration": "27.0",
+        "duration": "60.0",
         "name": "loading.desktop/TheVerge_cold"
     },
     {
-        "duration": "34.0",
+        "duration": "72.0",
         "name": "loading.desktop/TheVerge_warm"
     },
     {
-        "duration": "28.0",
+        "duration": "62.0",
         "name": "loading.desktop/TicketMaster_cold"
     },
     {
-        "duration": "35.0",
+        "duration": "78.0",
         "name": "loading.desktop/TicketMaster_warm"
     },
     {
-        "duration": "33.0",
+        "duration": "68.0",
         "name": "loading.desktop/Vietnamnet_cold"
     },
     {
-        "duration": "40.0",
+        "duration": "82.0",
         "name": "loading.desktop/Vietnamnet_warm"
     },
     {
-        "duration": "29.0",
+        "duration": "60.0",
         "name": "loading.desktop/Vnexpress_cold"
     },
     {
-        "duration": "36.0",
+        "duration": "74.0",
         "name": "loading.desktop/Vnexpress_warm"
     },
     {
-        "duration": "16.0",
+        "duration": "32.0",
         "name": "loading.desktop/Walgreens_cold"
     },
     {
-        "duration": "16.0",
+        "duration": "34.0",
         "name": "loading.desktop/Walgreens_warm"
     },
     {
-        "duration": "24.0",
+        "duration": "46.0",
         "name": "loading.desktop/Yandex_cold"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "loading.desktop/Yandex_warm"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "loading.desktop/amazon.co.jp_cold"
     },
     {
-        "duration": "31.0",
+        "duration": "64.0",
         "name": "loading.desktop/amazon.co.jp_warm"
     },
     {
-        "duration": "28.0",
+        "duration": "60.0",
         "name": "loading.desktop/ja.wikipedia_cold"
     },
     {
-        "duration": "32.0",
+        "duration": "68.0",
         "name": "loading.desktop/ja.wikipedia_warm"
     },
     {
-        "duration": "29.0",
+        "duration": "60.0",
         "name": "loading.desktop/money.cnn_cold"
     },
     {
-        "duration": "39.0",
+        "duration": "80.0",
         "name": "loading.desktop/money.cnn_warm"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "loading.desktop/ru.wikipedia_cold"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "loading.desktop/ru.wikipedia_warm"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "loading.desktop/uol.com.br_cold"
     },
     {
-        "duration": "39.0",
+        "duration": "80.0",
         "name": "loading.desktop/uol.com.br_warm"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "loading.desktop/yahoo.co.jp_cold"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "loading.desktop/yahoo.co.jp_warm"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "media.desktop/mse.html?media=aac_audio.mp4"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "media.desktop/mse.html?media=aac_audio.mp4,h264_video.mp4"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "media.desktop/mse.html?media=h264_video.mp4"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "media.desktop/mse.html?media=tulip0.av1.mp4"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "media.desktop/mse.html?media=tulip2.vp9.webm"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "media.desktop/video.html?src=crowd1080.mp4"
     },
     {
-        "duration": "43.0",
+        "duration": "62.0",
         "name": "media.desktop/video.html?src=crowd1080.webm"
     },
     {
-        "duration": "27.0",
+        "duration": "56.0",
         "name": "media.desktop/video.html?src=crowd1080_vp9.webm"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "media.desktop/video.html?src=garden2_10s.mp4&seek"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "media.desktop/video.html?src=garden2_10s.webm&seek"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "media.desktop/video.html?src=smpte_3840x2160_60fps_vp9.webm&seek"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "media.desktop/video.html?src=tulip0.av1.mp4"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "media.desktop/video.html?src=tulip0.av1.mp4&seek"
     },
     {
-        "duration": "34.0",
+        "duration": "68.0",
         "name": "media.desktop/video.html?src=tulip2.m4a&type=audio"
     },
     {
-        "duration": "34.0",
+        "duration": "68.0",
         "name": "media.desktop/video.html?src=tulip2.mp3&type=audio"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "media.desktop/video.html?src=tulip2.mp3&type=audio&seek"
     },
     {
-        "duration": "34.0",
+        "duration": "70.0",
         "name": "media.desktop/video.html?src=tulip2.mp4"
     },
     {
-        "duration": "35.0",
+        "duration": "72.0",
         "name": "media.desktop/video.html?src=tulip2.mp4&busyjs"
     },
     {
-        "duration": "34.0",
+        "duration": "68.0",
         "name": "media.desktop/video.html?src=tulip2.ogg&type=audio"
     },
     {
-        "duration": "21.0",
+        "duration": "44.0",
         "name": "media.desktop/video.html?src=tulip2.ogg&type=audio&seek"
     },
     {
-        "duration": "34.0",
+        "duration": "70.0",
         "name": "media.desktop/video.html?src=tulip2.vp9.webm"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "media.desktop/video.html?src=tulip2.vp9.webm&background"
     },
     {
-        "duration": "34.0",
+        "duration": "70.0",
         "name": "media.desktop/video.html?src=tulip2.vp9.webm_WiFi"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "memory.desktop/TrivialAnimationPageSharedPageState"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "memory.desktop/TrivialBlinkingCursorPageSharedPageState"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "memory.desktop/TrivialBlurAnimationPageSharedPageState"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "memory.desktop/TrivialCanvasPageSharedPageState"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "memory.desktop/TrivialFullscreenVideoPageSharedPageState"
     },
     {
-        "duration": "28.0",
+        "duration": "52.0",
         "name": "memory.desktop/TrivialGifPageSharedPageState"
     },
     {
-        "duration": "27.0",
+        "duration": "56.0",
         "name": "memory.desktop/TrivialScrollingPageSharedPageState"
     },
     {
-        "duration": "26.0",
+        "duration": "56.0",
         "name": "memory.desktop/TrivialWebGLPageSharedPageState"
     },
     {
-        "duration": "62.0",
+        "duration": "126.0",
         "name": "memory.desktop/WebWorker"
     },
     {
-        "duration": "48.0",
+        "duration": "96.0",
         "name": "octane/Octane"
     },
     {
-        "duration": "49.0",
+        "duration": "98.0",
         "name": "power.desktop/TrivialAnimationPageSharedPageState"
     },
     {
-        "duration": "49.0",
+        "duration": "98.0",
         "name": "power.desktop/TrivialBlinkingCursorPageSharedPageState"
     },
     {
-        "duration": "50.0",
+        "duration": "98.0",
         "name": "power.desktop/TrivialBlurAnimationPageSharedPageState"
     },
     {
-        "duration": "49.0",
+        "duration": "98.0",
         "name": "power.desktop/TrivialCanvasPageSharedPageState"
     },
     {
-        "duration": "50.0",
+        "duration": "100.0",
         "name": "power.desktop/TrivialFullscreenVideoPageSharedPageState"
     },
     {
-        "duration": "49.0",
+        "duration": "98.0",
         "name": "power.desktop/TrivialGifPageSharedPageState"
     },
     {
-        "duration": "50.0",
+        "duration": "100.0",
         "name": "power.desktop/TrivialScrollingPageSharedPageState"
     },
     {
-        "duration": "49.0",
+        "duration": "98.0",
         "name": "power.desktop/TrivialWebGLPageSharedPageState"
     },
     {
-        "duration": "62.0",
+        "duration": "124.0",
         "name": "power.desktop/abcnews"
     },
     {
-        "duration": "51.0",
+        "duration": "112.0",
         "name": "power.desktop/indiatimes"
     },
     {
-        "duration": "50.0",
+        "duration": "100.0",
         "name": "power.desktop/instagram"
     },
     {
-        "duration": "51.0",
+        "duration": "110.0",
         "name": "power.desktop/microsoft"
     },
     {
-        "duration": "53.0",
+        "duration": "106.0",
         "name": "power.desktop/sina"
     },
     {
-        "duration": "51.0",
+        "duration": "100.0",
         "name": "power.desktop/slideshare"
     },
     {
-        "duration": "52.0",
+        "duration": "128.0",
         "name": "power.desktop/uol"
     },
     {
-        "duration": "8.0",
+        "duration": "16.0",
         "name": "rasterize_and_record_micro.partial_invalidation/800_relpos_divs.html"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/amazon.html"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/blogger.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/booking.html"
     },
     {
-        "duration": "18.0",
+        "duration": "38.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/cnn.html"
     },
     {
-        "duration": "14.0",
+        "duration": "30.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/ebay.html"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/espn.html"
     },
     {
-        "duration": "13.0",
+        "duration": "28.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/facebook.html"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/gmail.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/google.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googlecalendar.html"
     },
     {
-        "duration": "10.0",
+        "duration": "20.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googledocs.html"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleimagesearch.html"
     },
     {
-        "duration": "31.0",
+        "duration": "64.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleplus.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/linkedin.html"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/pinterest.html"
     },
     {
-        "duration": "17.0",
+        "duration": "36.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/techcrunch.html"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/twitter.html"
     },
     {
-        "duration": "14.0",
+        "duration": "28.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/weather.html"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/wikipedia.html"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/wordpress.html"
     },
     {
-        "duration": "15.0",
+        "duration": "30.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahooanswers.html"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoogames.html"
     },
     {
-        "duration": "99.0",
+        "duration": "200.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoonews.html"
     },
     {
-        "duration": "95.0",
+        "duration": "190.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoosports.html"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/youtube.html"
     },
     {
-        "duration": "41.0",
+        "duration": "80.0",
         "name": "rendering.desktop/accu_weather_2018"
     },
     {
-        "duration": "38.0",
+        "duration": "80.0",
         "name": "rendering.desktop/accu_weather_pinch_2018"
     },
     {
-        "duration": "30.0",
+        "duration": "62.0",
         "name": "rendering.desktop/amazon_2018"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.desktop/amazon_pinch_2018"
     },
     {
-        "duration": "31.0",
+        "duration": "64.0",
         "name": "rendering.desktop/analog_clock_svg"
     },
     {
-        "duration": "33.0",
+        "duration": "66.0",
         "name": "rendering.desktop/animometer_webgl"
     },
     {
-        "duration": "32.0",
+        "duration": "66.0",
         "name": "rendering.desktop/animometer_webgl_attrib_arrays"
     },
     {
-        "duration": "34.0",
+        "duration": "70.0",
         "name": "rendering.desktop/animometer_webgl_multi_draw"
     },
     {
-        "duration": "39.0",
+        "duration": "82.0",
         "name": "rendering.desktop/aquarium"
     },
     {
-        "duration": "39.0",
+        "duration": "80.0",
         "name": "rendering.desktop/aquarium_20k"
     },
     {
-        "duration": "32.0",
+        "duration": "66.0",
         "name": "rendering.desktop/background_color_animation"
     },
     {
-        "duration": "33.0",
+        "duration": "70.0",
         "name": "rendering.desktop/background_color_animation_with_gradient"
     },
     {
-        "duration": "31.0",
+        "duration": "64.0",
         "name": "rendering.desktop/balls_css_key_frame_animations"
     },
     {
-        "duration": "32.0",
+        "duration": "68.0",
         "name": "rendering.desktop/balls_css_key_frame_animations_composited_transform"
     },
     {
-        "duration": "29.0",
+        "duration": "62.0",
         "name": "rendering.desktop/balls_css_transition_2_properties"
     },
     {
-        "duration": "30.0",
+        "duration": "62.0",
         "name": "rendering.desktop/balls_css_transition_40_properties"
     },
     {
-        "duration": "30.0",
+        "duration": "62.0",
         "name": "rendering.desktop/balls_css_transition_all_properties"
     },
     {
-        "duration": "30.0",
+        "duration": "62.0",
         "name": "rendering.desktop/balls_javascript_canvas"
     },
     {
-        "duration": "30.0",
+        "duration": "62.0",
         "name": "rendering.desktop/balls_javascript_css"
     },
     {
-        "duration": "31.0",
+        "duration": "64.0",
         "name": "rendering.desktop/balls_svg_animations"
     },
     {
-        "duration": "32.0",
+        "duration": "66.0",
         "name": "rendering.desktop/blob"
     },
     {
-        "duration": "29.0",
+        "duration": "62.0",
         "name": "rendering.desktop/blogspot_2018"
     },
     {
-        "duration": "27.0",
+        "duration": "58.0",
         "name": "rendering.desktop/blogspot_pinch_2018"
     },
     {
-        "duration": "28.0",
+        "duration": "54.0",
         "name": "rendering.desktop/blur_rotating_background"
     },
     {
-        "duration": "27.0",
+        "duration": "56.0",
         "name": "rendering.desktop/booking.com_2018"
     },
     {
-        "duration": "27.0",
+        "duration": "58.0",
         "name": "rendering.desktop/booking_pinch_2018"
     },
     {
-        "duration": "30.0",
+        "duration": "62.0",
         "name": "rendering.desktop/bouncing_balls_15"
     },
     {
-        "duration": "31.0",
+        "duration": "66.0",
         "name": "rendering.desktop/bouncing_balls_shadow"
     },
     {
-        "duration": "30.0",
+        "duration": "64.0",
         "name": "rendering.desktop/bouncing_clipped_rectangles"
     },
     {
-        "duration": "29.0",
+        "duration": "66.0",
         "name": "rendering.desktop/bouncing_gradient_circles"
     },
     {
-        "duration": "29.0",
+        "duration": "60.0",
         "name": "rendering.desktop/bouncing_png_images"
     },
     {
-        "duration": "32.0",
+        "duration": "66.0",
         "name": "rendering.desktop/bouncing_svg_images"
     },
     {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/camera_to_webgl"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "rendering.desktop/canvas_05000_pixels_per_second"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "rendering.desktop/canvas_10000_pixels_per_second"
     },
     {
-        "duration": "23.0",
+        "duration": "50.0",
         "name": "rendering.desktop/canvas_20000_pixels_per_second"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "rendering.desktop/canvas_40000_pixels_per_second"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.desktop/canvas_60000_pixels_per_second"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.desktop/canvas_75000_pixels_per_second"
     },
     {
-        "duration": "21.0",
+        "duration": "48.0",
         "name": "rendering.desktop/canvas_90000_pixels_per_second"
     },
     {
-        "duration": "32.0",
+        "duration": "66.0",
         "name": "rendering.desktop/canvas_animation_no_clear"
     },
     {
-        "duration": "30.0",
+        "duration": "62.0",
         "name": "rendering.desktop/canvas_arcs"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/canvas_font_cycler"
     },
     {
-        "duration": "29.0",
+        "duration": "60.0",
         "name": "rendering.desktop/canvas_lines"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/canvas_to_blob"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "rendering.desktop/cats_unscaled"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "rendering.desktop/cats_viewport_width"
     },
     {
-        "duration": "32.0",
+        "duration": "66.0",
         "name": "rendering.desktop/cc_poster_circle"
     },
     {
-        "duration": "27.0",
+        "duration": "56.0",
         "name": "rendering.desktop/cc_scroll_text_only"
     },
     {
-        "duration": "34.0",
+        "duration": "68.0",
         "name": "rendering.desktop/chip_tune"
     },
     {
-        "duration": "30.0",
+        "duration": "84.0",
         "name": "rendering.desktop/cnn_2018"
     },
     {
-        "duration": "43.0",
+        "duration": "86.0",
         "name": "rendering.desktop/cnn_pinch_2018"
     },
     {
-        "duration": "33.0",
+        "duration": "62.0",
         "name": "rendering.desktop/compositor_heavy_animation"
     },
     {
-        "duration": "31.0",
+        "duration": "60.0",
         "name": "rendering.desktop/crafty_mind"
     },
     {
-        "duration": "31.0",
+        "duration": "62.0",
         "name": "rendering.desktop/css_animations_many_keyframes"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/css_animations_simultaneous_inline_style"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/css_animations_simultaneous_new_element"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/css_animations_simultaneous_style_element"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/css_animations_simultaneous_updating_class"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/css_animations_staggered_infinite_iterations"
     },
     {
-        "duration": "31.0",
+        "duration": "62.0",
         "name": "rendering.desktop/css_animations_staggered_inline_style"
     },
     {
-        "duration": "31.0",
+        "duration": "62.0",
         "name": "rendering.desktop/css_animations_staggered_new_element"
     },
     {
-        "duration": "31.0",
+        "duration": "62.0",
         "name": "rendering.desktop/css_animations_staggered_style_element"
     },
     {
-        "duration": "31.0",
+        "duration": "62.0",
         "name": "rendering.desktop/css_animations_staggered_updating_class"
     },
     {
-        "duration": "31.0",
+        "duration": "62.0",
         "name": "rendering.desktop/css_animations_triggered_inline_style"
     },
     {
-        "duration": "31.0",
+        "duration": "62.0",
         "name": "rendering.desktop/css_animations_triggered_new_element"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/css_animations_triggered_style_element"
     },
     {
-        "duration": "31.0",
+        "duration": "62.0",
         "name": "rendering.desktop/css_animations_triggered_updating_class"
     },
     {
-        "duration": "32.0",
+        "duration": "64.0",
         "name": "rendering.desktop/css_opacity_plus_n_layers_99"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/css_transitions_inline_style"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/css_transitions_new_element"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/css_transitions_staggered_inline_style"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/css_transitions_staggered_new_element"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/css_transitions_staggered_style_element"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/css_transitions_staggered_updating_class"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/css_transitions_style_element"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/css_transitions_triggered_inline_style"
     },
     {
-        "duration": "31.0",
+        "duration": "60.0",
         "name": "rendering.desktop/css_transitions_triggered_new_element"
     },
     {
-        "duration": "31.0",
+        "duration": "60.0",
         "name": "rendering.desktop/css_transitions_triggered_style_element"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/css_transitions_triggered_updating_class"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/css_transitions_updating_class"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/css_value_type_color"
     },
     {
-        "duration": "31.0",
+        "duration": "60.0",
         "name": "rendering.desktop/css_value_type_filter"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/css_value_type_length"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/css_value_type_length_complex"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/css_value_type_length_simple"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/css_value_type_path"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/css_value_type_shadow"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/css_value_type_transform_complex"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/css_value_type_transform_simple"
     },
     {
-        "duration": "36.0",
+        "duration": "74.0",
         "name": "rendering.desktop/dynamic_cube_map"
     },
     {
-        "duration": "32.0",
+        "duration": "64.0",
         "name": "rendering.desktop/earth"
     },
     {
-        "duration": "28.0",
+        "duration": "54.0",
         "name": "rendering.desktop/ebay_2018"
     },
     {
-        "duration": "30.0",
+        "duration": "70.0",
         "name": "rendering.desktop/ebay_pinch_2018"
     },
     {
-        "duration": "31.0",
+        "duration": "70.0",
         "name": "rendering.desktop/effect_games"
     },
     {
-        "duration": "43.0",
+        "duration": "86.0",
         "name": "rendering.desktop/espn_2018"
     },
     {
-        "duration": "34.0",
+        "duration": "68.0",
         "name": "rendering.desktop/espn_pinch_2018"
     },
     {
-        "duration": "31.0",
+        "duration": "66.0",
         "name": "rendering.desktop/extra_large_texture_uploads"
     },
     {
-        "duration": "30.0",
+        "duration": "58.0",
         "name": "rendering.desktop/facebook_2018"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/facebook_pinch_2018"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/fill_shapes"
     },
     {
-        "duration": "33.0",
+        "duration": "34.0",
         "name": "rendering.desktop/filter_terrain_svg"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "rendering.desktop/geo_apis"
     },
     {
-        "duration": "31.0",
+        "duration": "62.0",
         "name": "rendering.desktop/gmail_2018"
     },
     {
-        "duration": "46.0",
+        "duration": "92.0",
         "name": "rendering.desktop/gmail_move_2018"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/gmail_pinch_2018"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "rendering.desktop/google_calendar_2018"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "rendering.desktop/google_calendar_pinch_2018"
     },
     {
-        "duration": "31.0",
+        "duration": "62.0",
         "name": "rendering.desktop/google_docs_2018"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "rendering.desktop/google_image_pinch_2018"
     },
     {
-        "duration": "27.0",
+        "duration": "52.0",
         "name": "rendering.desktop/google_image_search_2018"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "rendering.desktop/google_plus_2018"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.desktop/google_search_pinch_2018"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.desktop/google_web_search_2018"
     },
     {
-        "duration": "31.0",
+        "duration": "62.0",
         "name": "rendering.desktop/guimark_vector_chart"
     },
     {
-        "duration": "31.0",
+        "duration": "60.0",
         "name": "rendering.desktop/hakim"
     },
     {
-        "duration": "40.0",
+        "duration": "82.0",
         "name": "rendering.desktop/ie_chalkboard"
     },
     {
-        "duration": "32.0",
+        "duration": "66.0",
         "name": "rendering.desktop/ie_pirate_mark"
     },
     {
-        "duration": "32.0",
+        "duration": "64.0",
         "name": "rendering.desktop/infinite_scroll_element_n_layers_99"
     },
     {
-        "duration": "32.0",
+        "duration": "64.0",
         "name": "rendering.desktop/infinite_scroll_root_fixed_n_layers_99"
     },
     {
-        "duration": "32.0",
+        "duration": "64.0",
         "name": "rendering.desktop/infinite_scroll_root_n_layers_99"
     },
     {
-        "duration": "33.0",
+        "duration": "64.0",
         "name": "rendering.desktop/jarro_doverson"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.desktop/jpeg_decoding_rgb_and_gpu_rasterization"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "rendering.desktop/jpeg_decoding_yuv_and_gpu_rasterization"
     },
     {
-        "duration": "33.0",
+        "duration": "66.0",
         "name": "rendering.desktop/js_full_screen_invalidation"
     },
     {
-        "duration": "33.0",
+        "duration": "64.0",
         "name": "rendering.desktop/js_opacity_plus_n_layers_99"
     },
     {
-        "duration": "33.0",
+        "duration": "64.0",
         "name": "rendering.desktop/js_paint_plus_n_layers_99"
     },
     {
-        "duration": "33.0",
+        "duration": "64.0",
         "name": "rendering.desktop/js_poster_circle"
     },
     {
-        "duration": "32.0",
+        "duration": "64.0",
         "name": "rendering.desktop/js_scroll_text_only"
     },
     {
-        "duration": "33.0",
+        "duration": "60.0",
         "name": "rendering.desktop/kevs_3d"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.desktop/keyframed_animations"
     },
     {
-        "duration": "29.0",
+        "duration": "60.0",
         "name": "rendering.desktop/large_texture_uploads"
     },
     {
-        "duration": "27.0",
+        "duration": "56.0",
         "name": "rendering.desktop/linkedin_2018"
     },
     {
-        "duration": "35.0",
+        "duration": "60.0",
         "name": "rendering.desktop/linkedin_pinch_2018"
     },
     {
-        "duration": "28.0",
+        "duration": "60.0",
         "name": "rendering.desktop/main_0fps_impl_60fps"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.desktop/main_0fps_impl_60fps_no_update"
     },
     {
-        "duration": "28.0",
+        "duration": "62.0",
         "name": "rendering.desktop/main_0fps_impl_60fps_no_update_jank"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.desktop/main_0fps_with_jank_impl_0fps"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.desktop/main_15fps_impl_0fps"
     },
     {
-        "duration": "28.0",
+        "duration": "60.0",
         "name": "rendering.desktop/main_15fps_with_jank_impl_0fps"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.desktop/main_30fps_impl_0fps"
     },
     {
-        "duration": "28.0",
+        "duration": "60.0",
         "name": "rendering.desktop/main_30fps_impl_60fps"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.desktop/main_60fps_impl_0fps"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.desktop/main_60fps_impl_60fps"
     },
     {
-        "duration": "28.0",
+        "duration": "60.0",
         "name": "rendering.desktop/main_60fps_impl_60fps_no_update"
     },
     {
-        "duration": "28.0",
+        "duration": "60.0",
         "name": "rendering.desktop/main_60fps_impl_60fps_no_update_jank"
     },
     {
-        "duration": "28.0",
+        "duration": "60.0",
         "name": "rendering.desktop/main_60fps_with_jank_impl_0fps"
     },
     {
-        "duration": "29.0",
+        "duration": "68.0",
         "name": "rendering.desktop/man_in_blue"
     },
     {
-        "duration": "32.0",
+        "duration": "64.0",
         "name": "rendering.desktop/many_images"
     },
     {
-        "duration": "31.0",
+        "duration": "66.0",
         "name": "rendering.desktop/many_planets_deep"
     },
     {
-        "duration": "31.0",
+        "duration": "60.0",
         "name": "rendering.desktop/maps_move_2018"
     },
     {
-        "duration": "30.0",
+        "duration": "62.0",
         "name": "rendering.desktop/maps_perf_test"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "rendering.desktop/medium_texture_uploads"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "rendering.desktop/megi_dish"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/microsoft_asteroid_belt"
     },
     {
-        "duration": "35.0",
+        "duration": "74.0",
         "name": "rendering.desktop/microsoft_fireflies"
     },
     {
-        "duration": "29.0",
+        "duration": "60.0",
         "name": "rendering.desktop/microsoft_fish_ie_tank"
     },
     {
-        "duration": "29.0",
+        "duration": "60.0",
         "name": "rendering.desktop/microsoft_performance"
     },
     {
-        "duration": "31.0",
+        "duration": "62.0",
         "name": "rendering.desktop/microsoft_snow"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "rendering.desktop/microsoft_speed_reading"
     },
     {
-        "duration": "29.0",
+        "duration": "60.0",
         "name": "rendering.desktop/microsoft_tweet_map"
     },
     {
-        "duration": "33.0",
+        "duration": "68.0",
         "name": "rendering.desktop/microsoft_video_city"
     },
     {
-        "duration": "29.0",
+        "duration": "60.0",
         "name": "rendering.desktop/microsoft_worker_fountains"
     },
     {
-        "duration": "29.0",
+        "duration": "60.0",
         "name": "rendering.desktop/mix_10k"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "rendering.desktop/mix_blend_mode_animation_difference"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "rendering.desktop/mix_blend_mode_animation_hue"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "rendering.desktop/mix_blend_mode_animation_propagating_isolation"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "rendering.desktop/mix_blend_mode_animation_screen"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/motion_mark_canvas_fill_shapes"
     },
     {
-        "duration": "29.0",
+        "duration": "60.0",
         "name": "rendering.desktop/motion_mark_canvas_stroke_shapes"
     },
     {
-        "duration": "33.0",
+        "duration": "66.0",
         "name": "rendering.desktop/new_tilings"
     },
     {
-        "duration": "32.0",
+        "duration": "66.0",
         "name": "rendering.desktop/nvidia_vertex_buffer_object"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.desktop/off_screen_main_60fps"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.desktop/off_screen_main_60fps_jank"
     },
     {
-        "duration": "29.0",
+        "duration": "60.0",
         "name": "rendering.desktop/overlay_background_color_css_transitions_page"
     },
     {
-        "duration": "31.0",
+        "duration": "64.0",
         "name": "rendering.desktop/particles"
     },
     {
-        "duration": "36.0",
+        "duration": "74.0",
         "name": "rendering.desktop/pinterest_2018"
     },
     {
-        "duration": "29.0",
+        "duration": "60.0",
         "name": "rendering.desktop/put_get_image_data"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "rendering.desktop/raf"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "rendering.desktop/raf_animation"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "rendering.desktop/raf_canvas"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "rendering.desktop/raf_touch_animation"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.desktop/repaint_amazon_2018"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "rendering.desktop/repaint_cnn_2018"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "rendering.desktop/repaint_facebook_2018"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "rendering.desktop/repaint_google_search_2018"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "rendering.desktop/repaint_instagram_2018"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "rendering.desktop/repaint_reddit_2018"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "rendering.desktop/repaint_theverge_2018"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "rendering.desktop/repaint_twitter_2018"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "rendering.desktop/repaint_wikipedia_2018"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "rendering.desktop/repaint_yahoo_homepage_2018"
     },
     {
-        "duration": "29.0",
+        "duration": "60.0",
         "name": "rendering.desktop/runway_2019"
     },
     {
-        "duration": "31.0",
+        "duration": "64.0",
         "name": "rendering.desktop/san_angeles"
     },
     {
-        "duration": "23.0",
+        "duration": "44.0",
         "name": "rendering.desktop/second_batch_js_heavy"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.desktop/second_batch_js_light"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "rendering.desktop/second_batch_js_medium"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "rendering.desktop/simple_text_page"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "rendering.desktop/simple_touch_drag"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "rendering.desktop/small_texture_uploads"
     },
     {
-        "duration": "34.0",
+        "duration": "68.0",
         "name": "rendering.desktop/smash_cat"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.desktop/spielzeugz"
     },
     {
-        "duration": "29.0",
+        "duration": "60.0",
         "name": "rendering.desktop/stroke_shapes"
     },
     {
-        "duration": "24.0",
+        "duration": "50.0",
         "name": "rendering.desktop/sync_scroll_offset"
     },
     {
-        "duration": "36.0",
+        "duration": "80.0",
         "name": "rendering.desktop/techcrunch_2018"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.desktop/text_05000_pixels_per_second"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "rendering.desktop/text_10000_pixels_per_second"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "rendering.desktop/text_20000_pixels_per_second"
     },
     {
-        "duration": "22.0",
+        "duration": "50.0",
         "name": "rendering.desktop/text_40000_pixels_per_second"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "rendering.desktop/text_60000_pixels_per_second"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.desktop/text_75000_pixels_per_second"
     },
     {
-        "duration": "24.0",
+        "duration": "46.0",
         "name": "rendering.desktop/text_90000_pixels_per_second"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "rendering.desktop/text_constant_full_page_raster_05000_pixels_per_second"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.desktop/text_constant_full_page_raster_10000_pixels_per_second"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "rendering.desktop/text_constant_full_page_raster_20000_pixels_per_second"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "rendering.desktop/text_constant_full_page_raster_40000_pixels_per_second"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.desktop/text_constant_full_page_raster_60000_pixels_per_second"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.desktop/text_constant_full_page_raster_75000_pixels_per_second"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "rendering.desktop/text_constant_full_page_raster_90000_pixels_per_second"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.desktop/text_hover_05000_pixels_per_second"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "rendering.desktop/text_hover_10000_pixels_per_second"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "rendering.desktop/text_hover_20000_pixels_per_second"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.desktop/text_hover_40000_pixels_per_second"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "rendering.desktop/text_hover_60000_pixels_per_second"
     },
     {
-        "duration": "22.0",
+        "duration": "46.0",
         "name": "rendering.desktop/text_hover_75000_pixels_per_second"
     },
     {
-        "duration": "22.0",
+        "duration": "48.0",
         "name": "rendering.desktop/text_hover_90000_pixels_per_second"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "rendering.desktop/touch_handler_scrolling"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.desktop/transform_transitions"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.desktop/transform_transitions_js_block"
     },
     {
-        "duration": "27.0",
+        "duration": "56.0",
         "name": "rendering.desktop/twitch_2018"
     },
     {
-        "duration": "35.0",
+        "duration": "70.0",
         "name": "rendering.desktop/twitch_pinch_2018"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.desktop/twitter_2018"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "rendering.desktop/twitter_pinch_2018"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.desktop/web_animation_value_type_color"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "rendering.desktop/web_animation_value_type_length_3d"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.desktop/web_animation_value_type_length_complex"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.desktop/web_animation_value_type_length_simple"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "rendering.desktop/web_animation_value_type_path"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.desktop/web_animation_value_type_shadow"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.desktop/web_animation_value_type_transform_complex"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.desktop/web_animation_value_type_transform_simple"
     },
     {
-        "duration": "31.0",
+        "duration": "62.0",
         "name": "rendering.desktop/web_animations_many_keyframes"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.desktop/web_animations_set_current_time"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.desktop/web_animations_simultaneous"
     },
     {
-        "duration": "29.0",
+        "duration": "60.0",
         "name": "rendering.desktop/web_animations_staggered_chaining"
     },
     {
-        "duration": "28.0",
+        "duration": "58.0",
         "name": "rendering.desktop/web_animations_staggered_infinite_iterations"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "rendering.desktop/web_animations_staggered_triggering_page"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "rendering.desktop/webp_decoding_rgb_and_gpu_rasterization"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "rendering.desktop/webp_decoding_yuv_and_gpu_rasterization"
     },
     {
-        "duration": "29.0",
+        "duration": "60.0",
         "name": "rendering.desktop/wikipedia_2018"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "rendering.desktop/wordpress_2018"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "rendering.desktop/yahoo_answers_2018"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "rendering.desktop/yahoo_news_2018"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "rendering.desktop/yahoo_news_pinch_2018"
     },
     {
-        "duration": "29.0",
+        "duration": "60.0",
         "name": "rendering.desktop/yahoo_sports_2018"
     },
     {
-        "duration": "29.0",
+        "duration": "60.0",
         "name": "rendering.desktop/yahoo_sports_pinch_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "0.0",
         "name": "rendering.desktop/youtube_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "0.0",
         "name": "rendering.desktop/youtube_pinch_2018"
     },
     {
-        "duration": "80.0",
+        "duration": "158.0",
         "name": "speedometer-future/http://browserbench.org/Speedometer/"
     },
     {
-        "duration": "75.0",
+        "duration": "148.0",
         "name": "speedometer/http://browserbench.org/Speedometer/"
     },
     {
-        "duration": "143.0",
+        "duration": "284.0",
         "name": "speedometer2-future/Speedometer2"
     },
     {
-        "duration": "131.0",
+        "duration": "264.0",
         "name": "speedometer2/Speedometer2"
     },
     {
-        "duration": "57.0",
+        "duration": "118.0",
         "name": "system_health.common_desktop/browse:media:googleplaystore:2018"
     },
     {
-        "duration": "94.0",
+        "duration": "192.0",
         "name": "system_health.common_desktop/browse:media:imgur"
     },
     {
-        "duration": "104.0",
+        "duration": "204.0",
         "name": "system_health.common_desktop/browse:media:pinterest:2018"
     },
     {
-        "duration": "81.0",
+        "duration": "156.0",
         "name": "system_health.common_desktop/browse:media:tumblr:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "38.0",
         "name": "system_health.common_desktop/browse:media:youtube:2019"
     },
     {
-        "duration": "77.0",
+        "duration": "158.0",
         "name": "system_health.common_desktop/browse:media:youtubetv:2019"
     },
     {
-        "duration": "71.0",
+        "duration": "142.0",
         "name": "system_health.common_desktop/browse:news:cnn:2018"
     },
     {
-        "duration": "66.0",
+        "duration": "132.0",
         "name": "system_health.common_desktop/browse:news:flipboard:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "38.0",
         "name": "system_health.common_desktop/browse:news:hackernews:2018"
     },
     {
-        "duration": "100.0",
+        "duration": "192.0",
         "name": "system_health.common_desktop/browse:news:nytimes:2018"
     },
     {
-        "duration": "64.0",
+        "duration": "124.0",
         "name": "system_health.common_desktop/browse:news:reddit:2018"
     },
     {
-        "duration": "62.0",
+        "duration": "128.0",
         "name": "system_health.common_desktop/browse:search:google:2018"
     },
     {
-        "duration": "47.0",
+        "duration": "98.0",
         "name": "system_health.common_desktop/browse:search:google_india:2018"
     },
     {
-        "duration": "93.0",
+        "duration": "184.0",
         "name": "system_health.common_desktop/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "72.0",
+        "duration": "160.0",
         "name": "system_health.common_desktop/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "59.0",
+        "duration": "122.0",
         "name": "system_health.common_desktop/browse:social:twitter:2018"
     },
     {
-        "duration": "77.0",
+        "duration": "158.0",
         "name": "system_health.common_desktop/browse:social:twitter_infinite_scroll:2018"
     },
     {
-        "duration": "75.0",
+        "duration": "150.0",
         "name": "system_health.common_desktop/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "55.0",
+        "duration": "114.0",
         "name": "system_health.common_desktop/browse:tools:docs_scrolling"
     },
     {
-        "duration": "89.0",
+        "duration": "182.0",
         "name": "system_health.common_desktop/browse:tools:maps:2019"
     },
     {
-        "duration": "17.0",
+        "duration": "38.0",
         "name": "system_health.common_desktop/browse:tools:sheets:2019"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "system_health.common_desktop/browse_accessibility:media:youtube"
     },
     {
-        "duration": "46.0",
+        "duration": "90.0",
         "name": "system_health.common_desktop/browse_accessibility:tech:codesearch:2018"
     },
     {
-        "duration": "32.0",
+        "duration": "64.0",
         "name": "system_health.common_desktop/load:chrome:blank"
     },
     {
-        "duration": "32.0",
+        "duration": "68.0",
         "name": "system_health.common_desktop/load:games:alphabetty:2018"
     },
     {
-        "duration": "30.0",
+        "duration": "56.0",
         "name": "system_health.common_desktop/load:games:bubbles:2019"
     },
     {
-        "duration": "30.0",
+        "duration": "66.0",
         "name": "system_health.common_desktop/load:games:lazors"
     },
     {
-        "duration": "36.0",
+        "duration": "68.0",
         "name": "system_health.common_desktop/load:games:miniclip:2018"
     },
     {
-        "duration": "35.0",
+        "duration": "66.0",
         "name": "system_health.common_desktop/load:games:spychase:2018"
     },
     {
-        "duration": "43.0",
+        "duration": "80.0",
         "name": "system_health.common_desktop/load:media:9gag"
     },
     {
-        "duration": "33.0",
+        "duration": "60.0",
         "name": "system_health.common_desktop/load:media:dailymotion:2019"
     },
     {
-        "duration": "34.0",
+        "duration": "64.0",
         "name": "system_health.common_desktop/load:media:facebook_photos:2018"
     },
     {
-        "duration": "33.0",
+        "duration": "62.0",
         "name": "system_health.common_desktop/load:media:flickr:2018"
     },
     {
-        "duration": "32.0",
+        "duration": "60.0",
         "name": "system_health.common_desktop/load:media:google_images:2018"
     },
     {
-        "duration": "33.0",
+        "duration": "62.0",
         "name": "system_health.common_desktop/load:media:imgur:2018"
     },
     {
-        "duration": "36.0",
+        "duration": "66.0",
         "name": "system_health.common_desktop/load:media:soundcloud:2018"
     },
     {
-        "duration": "31.0",
+        "duration": "60.0",
         "name": "system_health.common_desktop/load:media:youtube:2018"
     },
     {
-        "duration": "32.0",
+        "duration": "68.0",
         "name": "system_health.common_desktop/load:news:bbc:2018"
     },
     {
-        "duration": "35.0",
+        "duration": "66.0",
         "name": "system_health.common_desktop/load:news:cnn:2018"
     },
     {
-        "duration": "32.0",
+        "duration": "60.0",
         "name": "system_health.common_desktop/load:news:flipboard"
     },
     {
-        "duration": "30.0",
+        "duration": "56.0",
         "name": "system_health.common_desktop/load:news:hackernews:2018"
     },
     {
-        "duration": "37.0",
+        "duration": "70.0",
         "name": "system_health.common_desktop/load:news:nytimes:2018"
     },
     {
-        "duration": "33.0",
+        "duration": "62.0",
         "name": "system_health.common_desktop/load:news:qq:2018"
     },
     {
-        "duration": "35.0",
+        "duration": "66.0",
         "name": "system_health.common_desktop/load:news:reddit:2018"
     },
     {
-        "duration": "32.0",
+        "duration": "60.0",
         "name": "system_health.common_desktop/load:news:wikipedia:2018"
     },
     {
-        "duration": "32.0",
+        "duration": "68.0",
         "name": "system_health.common_desktop/load:search:amazon:2018"
     },
     {
-        "duration": "31.0",
+        "duration": "66.0",
         "name": "system_health.common_desktop/load:search:baidu:2018"
     },
     {
-        "duration": "32.0",
+        "duration": "60.0",
         "name": "system_health.common_desktop/load:search:ebay:2018"
     },
     {
-        "duration": "33.0",
+        "duration": "60.0",
         "name": "system_health.common_desktop/load:search:flipkart:2018"
     },
     {
-        "duration": "32.0",
+        "duration": "60.0",
         "name": "system_health.common_desktop/load:search:google:2018"
     },
     {
-        "duration": "31.0",
+        "duration": "58.0",
         "name": "system_health.common_desktop/load:search:taobao:2018"
     },
     {
-        "duration": "30.0",
+        "duration": "58.0",
         "name": "system_health.common_desktop/load:search:yahoo:2018"
     },
     {
-        "duration": "31.0",
+        "duration": "60.0",
         "name": "system_health.common_desktop/load:search:yandex:2018"
     },
     {
-        "duration": "32.0",
+        "duration": "60.0",
         "name": "system_health.common_desktop/load:social:instagram:2018"
     },
     {
-        "duration": "34.0",
+        "duration": "64.0",
         "name": "system_health.common_desktop/load:social:pinterest:2019"
     },
     {
-        "duration": "32.0",
+        "duration": "60.0",
         "name": "system_health.common_desktop/load:social:vk:2018"
     },
     {
-        "duration": "44.0",
+        "duration": "84.0",
         "name": "system_health.common_desktop/load:tools:chat:2020"
     },
     {
-        "duration": "39.0",
+        "duration": "72.0",
         "name": "system_health.common_desktop/load:tools:docs:2019"
     },
     {
-        "duration": "33.0",
+        "duration": "62.0",
         "name": "system_health.common_desktop/load:tools:drive:2019"
     },
     {
-        "duration": "17.0",
+        "duration": "30.0",
         "name": "system_health.common_desktop/load:tools:gmail:2019"
     },
     {
-        "duration": "32.0",
+        "duration": "60.0",
         "name": "system_health.common_desktop/load:tools:stackoverflow:2018"
     },
     {
-        "duration": "31.0",
+        "duration": "60.0",
         "name": "system_health.common_desktop/load:tools:weather:2019"
     },
     {
-        "duration": "34.0",
+        "duration": "68.0",
         "name": "system_health.common_desktop/load_accessibility:media:wikipedia:2018"
     },
     {
-        "duration": "35.0",
+        "duration": "70.0",
         "name": "system_health.common_desktop/load_accessibility:shopping:amazon:2018"
     },
     {
-        "duration": "139.0",
+        "duration": "264.0",
         "name": "system_health.common_desktop/long_running:tools:gmail-background"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "system_health.common_desktop/long_running:tools:gmail-foreground"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "system_health.common_desktop/multitab:misc:typical24"
     },
     {
-        "duration": "16.0",
+        "duration": "30.0",
         "name": "system_health.common_desktop/multitab:misc:typical24:2018"
     },
     {
-        "duration": "61.0",
+        "duration": "126.0",
         "name": "system_health.common_desktop/play:media:google_play_music"
     },
     {
-        "duration": "58.0",
+        "duration": "112.0",
         "name": "system_health.common_desktop/play:media:soundcloud:2018"
     },
     {
-        "duration": "47.0",
+        "duration": "96.0",
         "name": "system_health.memory_desktop/browse:media:googleplaystore:2018"
     },
     {
-        "duration": "82.0",
+        "duration": "166.0",
         "name": "system_health.memory_desktop/browse:media:imgur"
     },
     {
-        "duration": "97.0",
+        "duration": "192.0",
         "name": "system_health.memory_desktop/browse:media:pinterest:2018"
     },
     {
-        "duration": "72.0",
+        "duration": "144.0",
         "name": "system_health.memory_desktop/browse:media:tumblr:2018"
     },
     {
-        "duration": "11.0",
+        "duration": "22.0",
         "name": "system_health.memory_desktop/browse:media:youtube:2019"
     },
     {
-        "duration": "69.0",
+        "duration": "140.0",
         "name": "system_health.memory_desktop/browse:media:youtubetv:2019"
     },
     {
-        "duration": "56.0",
+        "duration": "116.0",
         "name": "system_health.memory_desktop/browse:news:cnn:2018"
     },
     {
-        "duration": "54.0",
+        "duration": "110.0",
         "name": "system_health.memory_desktop/browse:news:flipboard:2018"
     },
     {
-        "duration": "62.0",
+        "duration": "126.0",
         "name": "system_health.memory_desktop/browse:news:hackernews:2018"
     },
     {
-        "duration": "87.0",
+        "duration": "174.0",
         "name": "system_health.memory_desktop/browse:news:nytimes:2018"
     },
     {
-        "duration": "56.0",
+        "duration": "112.0",
         "name": "system_health.memory_desktop/browse:news:reddit:2018"
     },
     {
-        "duration": "53.0",
+        "duration": "108.0",
         "name": "system_health.memory_desktop/browse:search:google:2018"
     },
     {
-        "duration": "38.0",
+        "duration": "78.0",
         "name": "system_health.memory_desktop/browse:search:google_india:2018"
     },
     {
-        "duration": "79.0",
+        "duration": "162.0",
         "name": "system_health.memory_desktop/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "66.0",
+        "duration": "132.0",
         "name": "system_health.memory_desktop/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "52.0",
+        "duration": "104.0",
         "name": "system_health.memory_desktop/browse:social:twitter:2018"
     },
     {
-        "duration": "69.0",
+        "duration": "138.0",
         "name": "system_health.memory_desktop/browse:social:twitter_infinite_scroll:2018"
     },
     {
-        "duration": "64.0",
+        "duration": "130.0",
         "name": "system_health.memory_desktop/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "46.0",
+        "duration": "94.0",
         "name": "system_health.memory_desktop/browse:tools:docs_scrolling"
     },
     {
-        "duration": "79.0",
+        "duration": "160.0",
         "name": "system_health.memory_desktop/browse:tools:maps:2019"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "system_health.memory_desktop/browse:tools:sheets:2019"
     },
     {
-        "duration": "11.0",
+        "duration": "24.0",
         "name": "system_health.memory_desktop/browse_accessibility:media:youtube"
     },
     {
-        "duration": "37.0",
+        "duration": "70.0",
         "name": "system_health.memory_desktop/browse_accessibility:tech:codesearch:2018"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "system_health.memory_desktop/load:chrome:blank"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "system_health.memory_desktop/load:games:alphabetty:2018"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "system_health.memory_desktop/load:games:bubbles:2019"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "system_health.memory_desktop/load:games:lazors"
     },
     {
-        "duration": "29.0",
+        "duration": "58.0",
         "name": "system_health.memory_desktop/load:games:miniclip:2018"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "system_health.memory_desktop/load:games:spychase:2018"
     },
     {
-        "duration": "29.0",
+        "duration": "60.0",
         "name": "system_health.memory_desktop/load:media:9gag"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "system_health.memory_desktop/load:media:dailymotion:2019"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "system_health.memory_desktop/load:media:facebook_photos:2018"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "system_health.memory_desktop/load:media:flickr:2018"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "system_health.memory_desktop/load:media:google_images:2018"
     },
     {
-        "duration": "26.0",
+        "duration": "54.0",
         "name": "system_health.memory_desktop/load:media:imgur:2018"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "system_health.memory_desktop/load:media:soundcloud:2018"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "system_health.memory_desktop/load:media:youtube:2018"
     },
     {
-        "duration": "25.0",
+        "duration": "48.0",
         "name": "system_health.memory_desktop/load:news:bbc:2018"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "system_health.memory_desktop/load:news:cnn:2018"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "system_health.memory_desktop/load:news:flipboard"
     },
     {
-        "duration": "23.0",
+        "duration": "46.0",
         "name": "system_health.memory_desktop/load:news:hackernews:2018"
     },
     {
-        "duration": "30.0",
+        "duration": "60.0",
         "name": "system_health.memory_desktop/load:news:nytimes:2018"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "system_health.memory_desktop/load:news:qq:2018"
     },
     {
-        "duration": "28.0",
+        "duration": "56.0",
         "name": "system_health.memory_desktop/load:news:reddit:2018"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "system_health.memory_desktop/load:news:wikipedia:2018"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "system_health.memory_desktop/load:search:amazon:2018"
     },
     {
-        "duration": "24.0",
+        "duration": "46.0",
         "name": "system_health.memory_desktop/load:search:baidu:2018"
     },
     {
-        "duration": "25.0",
+        "duration": "52.0",
         "name": "system_health.memory_desktop/load:search:ebay:2018"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "system_health.memory_desktop/load:search:flipkart:2018"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "system_health.memory_desktop/load:search:google:2018"
     },
     {
-        "duration": "24.0",
+        "duration": "48.0",
         "name": "system_health.memory_desktop/load:search:taobao:2018"
     },
     {
-        "duration": "23.0",
+        "duration": "48.0",
         "name": "system_health.memory_desktop/load:search:yahoo:2018"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "system_health.memory_desktop/load:search:yandex:2018"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "system_health.memory_desktop/load:social:instagram:2018"
     },
     {
-        "duration": "27.0",
+        "duration": "54.0",
         "name": "system_health.memory_desktop/load:social:pinterest:2019"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "system_health.memory_desktop/load:social:vk:2018"
     },
     {
-        "duration": "35.0",
+        "duration": "70.0",
         "name": "system_health.memory_desktop/load:tools:chat:2020"
     },
     {
-        "duration": "31.0",
+        "duration": "62.0",
         "name": "system_health.memory_desktop/load:tools:docs:2019"
     },
     {
-        "duration": "26.0",
+        "duration": "52.0",
         "name": "system_health.memory_desktop/load:tools:drive:2019"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "system_health.memory_desktop/load:tools:gmail:2019"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "system_health.memory_desktop/load:tools:stackoverflow:2018"
     },
     {
-        "duration": "25.0",
+        "duration": "50.0",
         "name": "system_health.memory_desktop/load:tools:weather:2019"
     },
     {
-        "duration": "26.0",
+        "duration": "50.0",
         "name": "system_health.memory_desktop/load_accessibility:media:wikipedia:2018"
     },
     {
-        "duration": "28.0",
+        "duration": "52.0",
         "name": "system_health.memory_desktop/load_accessibility:shopping:amazon:2018"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "system_health.memory_desktop/long_running:tools:gmail-background"
     },
     {
-        "duration": "142.0",
+        "duration": "284.0",
         "name": "system_health.memory_desktop/long_running:tools:gmail-foreground"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "system_health.memory_desktop/multitab:misc:typical24"
     },
     {
-        "duration": "12.0",
+        "duration": "24.0",
         "name": "system_health.memory_desktop/multitab:misc:typical24:2018"
     },
     {
-        "duration": "10.0",
+        "duration": "22.0",
         "name": "system_health.memory_desktop/play:media:google_play_music"
     },
     {
-        "duration": "50.0",
+        "duration": "102.0",
         "name": "system_health.memory_desktop/play:media:soundcloud:2018"
     },
     {
@@ -3832,755 +3836,755 @@
         "name": "tab_switching.typical_25/multitab:misc:typical24"
     },
     {
-        "duration": "21.0",
+        "duration": "40.0",
         "name": "tracing.tracing_with_background_memory_infra/Facebook"
     },
     {
-        "duration": "19.0",
+        "duration": "40.0",
         "name": "tracing.tracing_with_background_memory_infra/Wikipedia"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.amazon.com"
     },
     {
-        "duration": "20.0",
+        "duration": "38.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.ask.com/"
     },
     {
-        "duration": "20.0",
+        "duration": "40.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.bing.com/"
     },
     {
-        "duration": "20.0",
+        "duration": "38.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.yahoo.com/"
     },
     {
-        "duration": "20.0",
+        "duration": "42.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.youtube.com"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/#hl=en&q=barack+obama"
     },
     {
-        "duration": "21.0",
+        "duration": "42.0",
         "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/calendar/"
     },
     {
-        "duration": "73.0",
+        "duration": "150.0",
         "name": "v8.browsing_desktop-future/browse:media:googleplaystore:2018"
     },
     {
-        "duration": "34.0",
+        "duration": "70.0",
         "name": "v8.browsing_desktop-future/browse:media:imgur"
     },
     {
-        "duration": "122.0",
+        "duration": "246.0",
         "name": "v8.browsing_desktop-future/browse:media:pinterest:2018"
     },
     {
-        "duration": "99.0",
+        "duration": "202.0",
         "name": "v8.browsing_desktop-future/browse:media:tumblr:2018"
     },
     {
-        "duration": "34.0",
+        "duration": "72.0",
         "name": "v8.browsing_desktop-future/browse:media:youtube:2019"
     },
     {
-        "duration": "95.0",
+        "duration": "194.0",
         "name": "v8.browsing_desktop-future/browse:media:youtubetv:2019"
     },
     {
-        "duration": "87.0",
+        "duration": "176.0",
         "name": "v8.browsing_desktop-future/browse:news:cnn:2018"
     },
     {
-        "duration": "81.0",
+        "duration": "166.0",
         "name": "v8.browsing_desktop-future/browse:news:flipboard:2018"
     },
     {
-        "duration": "34.0",
+        "duration": "70.0",
         "name": "v8.browsing_desktop-future/browse:news:hackernews:2018"
     },
     {
-        "duration": "118.0",
+        "duration": "238.0",
         "name": "v8.browsing_desktop-future/browse:news:nytimes:2018"
     },
     {
-        "duration": "84.0",
+        "duration": "170.0",
         "name": "v8.browsing_desktop-future/browse:news:reddit:2018"
     },
     {
-        "duration": "78.0",
+        "duration": "158.0",
         "name": "v8.browsing_desktop-future/browse:search:google:2018"
     },
     {
-        "duration": "64.0",
+        "duration": "130.0",
         "name": "v8.browsing_desktop-future/browse:search:google_india:2018"
     },
     {
-        "duration": "109.0",
+        "duration": "220.0",
         "name": "v8.browsing_desktop-future/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "90.0",
+        "duration": "194.0",
         "name": "v8.browsing_desktop-future/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "77.0",
+        "duration": "156.0",
         "name": "v8.browsing_desktop-future/browse:social:twitter:2018"
     },
     {
-        "duration": "95.0",
+        "duration": "194.0",
         "name": "v8.browsing_desktop-future/browse:social:twitter_infinite_scroll:2018"
     },
     {
-        "duration": "90.0",
+        "duration": "184.0",
         "name": "v8.browsing_desktop-future/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "72.0",
+        "duration": "146.0",
         "name": "v8.browsing_desktop-future/browse:tools:docs_scrolling"
     },
     {
-        "duration": "108.0",
+        "duration": "218.0",
         "name": "v8.browsing_desktop-future/browse:tools:maps:2019"
     },
     {
-        "duration": "34.0",
+        "duration": "70.0",
         "name": "v8.browsing_desktop-future/browse:tools:sheets:2019"
     },
     {
-        "duration": "71.0",
+        "duration": "150.0",
         "name": "v8.browsing_desktop/browse:media:googleplaystore:2018"
     },
     {
-        "duration": "33.0",
+        "duration": "72.0",
         "name": "v8.browsing_desktop/browse:media:imgur"
     },
     {
-        "duration": "120.0",
+        "duration": "246.0",
         "name": "v8.browsing_desktop/browse:media:pinterest:2018"
     },
     {
-        "duration": "96.0",
+        "duration": "198.0",
         "name": "v8.browsing_desktop/browse:media:tumblr:2018"
     },
     {
-        "duration": "33.0",
+        "duration": "68.0",
         "name": "v8.browsing_desktop/browse:media:youtube:2019"
     },
     {
-        "duration": "92.0",
+        "duration": "188.0",
         "name": "v8.browsing_desktop/browse:media:youtubetv:2019"
     },
     {
-        "duration": "109.0",
+        "duration": "182.0",
         "name": "v8.browsing_desktop/browse:news:cnn:2018"
     },
     {
-        "duration": "79.0",
+        "duration": "164.0",
         "name": "v8.browsing_desktop/browse:news:flipboard:2018"
     },
     {
-        "duration": "33.0",
+        "duration": "72.0",
         "name": "v8.browsing_desktop/browse:news:hackernews:2018"
     },
     {
-        "duration": "113.0",
+        "duration": "232.0",
         "name": "v8.browsing_desktop/browse:news:nytimes:2018"
     },
     {
-        "duration": "81.0",
+        "duration": "168.0",
         "name": "v8.browsing_desktop/browse:news:reddit:2018"
     },
     {
-        "duration": "76.0",
+        "duration": "158.0",
         "name": "v8.browsing_desktop/browse:search:google:2018"
     },
     {
-        "duration": "62.0",
+        "duration": "130.0",
         "name": "v8.browsing_desktop/browse:search:google_india:2018"
     },
     {
-        "duration": "106.0",
+        "duration": "218.0",
         "name": "v8.browsing_desktop/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "88.0",
+        "duration": "182.0",
         "name": "v8.browsing_desktop/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "75.0",
+        "duration": "162.0",
         "name": "v8.browsing_desktop/browse:social:twitter:2018"
     },
     {
-        "duration": "93.0",
+        "duration": "190.0",
         "name": "v8.browsing_desktop/browse:social:twitter_infinite_scroll:2018"
     },
     {
-        "duration": "107.0",
+        "duration": "184.0",
         "name": "v8.browsing_desktop/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "70.0",
+        "duration": "146.0",
         "name": "v8.browsing_desktop/browse:tools:docs_scrolling"
     },
     {
-        "duration": "105.0",
+        "duration": "216.0",
         "name": "v8.browsing_desktop/browse:tools:maps:2019"
     },
     {
-        "duration": "33.0",
+        "duration": "72.0",
         "name": "v8.browsing_desktop/browse:tools:sheets:2019"
     },
     {
-        "duration": "37.0",
+        "duration": "74.0",
         "name": "v8.runtime_stats.top_25/AdsAMPAds_cold"
     },
     {
-        "duration": "53.0",
+        "duration": "106.0",
         "name": "v8.runtime_stats.top_25/AdsAMPAds_hot"
     },
     {
-        "duration": "52.0",
+        "duration": "106.0",
         "name": "v8.runtime_stats.top_25/AdsAMPAds_warm"
     },
     {
-        "duration": "37.0",
+        "duration": "74.0",
         "name": "v8.runtime_stats.top_25/AdsAdSenseAsyncAds_cold"
     },
     {
-        "duration": "53.0",
+        "duration": "108.0",
         "name": "v8.runtime_stats.top_25/AdsAdSenseAsyncAds_hot"
     },
     {
-        "duration": "52.0",
+        "duration": "104.0",
         "name": "v8.runtime_stats.top_25/AdsAdSenseAsyncAds_warm"
     },
     {
-        "duration": "37.0",
+        "duration": "74.0",
         "name": "v8.runtime_stats.top_25/AdsAsyncAdSenseImage_cold"
     },
     {
-        "duration": "43.0",
+        "duration": "88.0",
         "name": "v8.runtime_stats.top_25/AdsAsyncAdSenseImage_hot"
     },
     {
-        "duration": "43.0",
+        "duration": "84.0",
         "name": "v8.runtime_stats.top_25/AdsAsyncAdSenseImage_warm"
     },
     {
-        "duration": "37.0",
+        "duration": "74.0",
         "name": "v8.runtime_stats.top_25/AdsDoubleClickAsyncAds_cold"
     },
     {
-        "duration": "53.0",
+        "duration": "106.0",
         "name": "v8.runtime_stats.top_25/AdsDoubleClickAsyncAds_hot"
     },
     {
-        "duration": "52.0",
+        "duration": "104.0",
         "name": "v8.runtime_stats.top_25/AdsDoubleClickAsyncAds_warm"
     },
     {
-        "duration": "37.0",
+        "duration": "74.0",
         "name": "v8.runtime_stats.top_25/AdsMultipleAdSlots_cold"
     },
     {
-        "duration": "43.0",
+        "duration": "86.0",
         "name": "v8.runtime_stats.top_25/AdsMultipleAdSlots_hot"
     },
     {
-        "duration": "43.0",
+        "duration": "84.0",
         "name": "v8.runtime_stats.top_25/AdsMultipleAdSlots_warm"
     },
     {
-        "duration": "37.0",
+        "duration": "74.0",
         "name": "v8.runtime_stats.top_25/AdsOnScreenDetection_cold"
     },
     {
-        "duration": "43.0",
+        "duration": "86.0",
         "name": "v8.runtime_stats.top_25/AdsOnScreenDetection_hot"
     },
     {
-        "duration": "42.0",
+        "duration": "86.0",
         "name": "v8.runtime_stats.top_25/AdsOnScreenDetection_warm"
     },
     {
-        "duration": "37.0",
+        "duration": "76.0",
         "name": "v8.runtime_stats.top_25/AdsSyncAdSenseImage_cold"
     },
     {
-        "duration": "53.0",
+        "duration": "106.0",
         "name": "v8.runtime_stats.top_25/AdsSyncAdSenseImage_hot"
     },
     {
-        "duration": "52.0",
+        "duration": "106.0",
         "name": "v8.runtime_stats.top_25/AdsSyncAdSenseImage_warm"
     },
     {
-        "duration": "37.0",
+        "duration": "74.0",
         "name": "v8.runtime_stats.top_25/AdsSyncLoadAsyncRenderAdSenseImage_cold"
     },
     {
-        "duration": "43.0",
+        "duration": "86.0",
         "name": "v8.runtime_stats.top_25/AdsSyncLoadAsyncRenderAdSenseImage_hot"
     },
     {
-        "duration": "42.0",
+        "duration": "86.0",
         "name": "v8.runtime_stats.top_25/AdsSyncLoadAsyncRenderAdSenseImage_warm"
     },
     {
-        "duration": "44.0",
+        "duration": "88.0",
         "name": "v8.runtime_stats.top_25/AdsViewOptimizedRendering_cold"
     },
     {
-        "duration": "74.0",
+        "duration": "148.0",
         "name": "v8.runtime_stats.top_25/AdsViewOptimizedRendering_hot"
     },
     {
-        "duration": "64.0",
+        "duration": "130.0",
         "name": "v8.runtime_stats.top_25/AdsViewOptimizedRendering_warm"
     },
     {
-        "duration": "40.0",
+        "duration": "82.0",
         "name": "v8.runtime_stats.top_25/http://edition.cnn.com_cold"
     },
     {
-        "duration": "50.0",
+        "duration": "102.0",
         "name": "v8.runtime_stats.top_25/http://edition.cnn.com_hot"
     },
     {
-        "duration": "47.0",
+        "duration": "96.0",
         "name": "v8.runtime_stats.top_25/http://edition.cnn.com_warm"
     },
     {
-        "duration": "39.0",
+        "duration": "76.0",
         "name": "v8.runtime_stats.top_25/http://hi.wikipedia.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0_cold"
     },
     {
-        "duration": "46.0",
+        "duration": "92.0",
         "name": "v8.runtime_stats.top_25/http://hi.wikipedia.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0_hot"
     },
     {
-        "duration": "45.0",
+        "duration": "88.0",
         "name": "v8.runtime_stats.top_25/http://hi.wikipedia.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0_warm"
     },
     {
-        "duration": "38.0",
+        "duration": "76.0",
         "name": "v8.runtime_stats.top_25/http://inbox.google.com_cold"
     },
     {
-        "duration": "45.0",
+        "duration": "90.0",
         "name": "v8.runtime_stats.top_25/http://inbox.google.com_hot"
     },
     {
-        "duration": "45.0",
+        "duration": "88.0",
         "name": "v8.runtime_stats.top_25/http://inbox.google.com_warm"
     },
     {
-        "duration": "37.0",
+        "duration": "74.0",
         "name": "v8.runtime_stats.top_25/http://maps.google.co.jp/maps/search/restaurant+tokyo_cold"
     },
     {
-        "duration": "44.0",
+        "duration": "88.0",
         "name": "v8.runtime_stats.top_25/http://maps.google.co.jp/maps/search/restaurant+tokyo_hot"
     },
     {
-        "duration": "43.0",
+        "duration": "86.0",
         "name": "v8.runtime_stats.top_25/http://maps.google.co.jp/maps/search/restaurant+tokyo_warm"
     },
     {
-        "duration": "38.0",
+        "duration": "76.0",
         "name": "v8.runtime_stats.top_25/http://meta.discourse.org_cold"
     },
     {
-        "duration": "45.0",
+        "duration": "92.0",
         "name": "v8.runtime_stats.top_25/http://meta.discourse.org_hot"
     },
     {
-        "duration": "44.0",
+        "duration": "88.0",
         "name": "v8.runtime_stats.top_25/http://meta.discourse.org_warm"
     },
     {
-        "duration": "37.0",
+        "duration": "74.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?angular_cold"
     },
     {
-        "duration": "43.0",
+        "duration": "86.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?angular_hot"
     },
     {
-        "duration": "41.0",
+        "duration": "82.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?angular_warm"
     },
     {
-        "duration": "37.0",
+        "duration": "74.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?backbone_cold"
     },
     {
-        "duration": "43.0",
+        "duration": "86.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?backbone_hot"
     },
     {
-        "duration": "42.0",
+        "duration": "84.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?backbone_warm"
     },
     {
-        "duration": "37.0",
+        "duration": "74.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?ember_cold"
     },
     {
-        "duration": "43.0",
+        "duration": "86.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?ember_hot"
     },
     {
-        "duration": "42.0",
+        "duration": "84.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?ember_warm"
     },
     {
-        "duration": "37.0",
+        "duration": "76.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?jquery_cold"
     },
     {
-        "duration": "42.0",
+        "duration": "86.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?jquery_hot"
     },
     {
-        "duration": "43.0",
+        "duration": "86.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?jquery_warm"
     },
     {
-        "duration": "37.0",
+        "duration": "74.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?vanilla_cold"
     },
     {
-        "duration": "44.0",
+        "duration": "86.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?vanilla_hot"
     },
     {
-        "duration": "42.0",
+        "duration": "82.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?vanilla_warm"
     },
     {
-        "duration": "38.0",
+        "duration": "76.0",
         "name": "v8.runtime_stats.top_25/http://reddit.musicplayer.io_cold"
     },
     {
-        "duration": "44.0",
+        "duration": "90.0",
         "name": "v8.runtime_stats.top_25/http://reddit.musicplayer.io_hot"
     },
     {
-        "duration": "43.0",
+        "duration": "88.0",
         "name": "v8.runtime_stats.top_25/http://reddit.musicplayer.io_warm"
     },
     {
-        "duration": "38.0",
+        "duration": "78.0",
         "name": "v8.runtime_stats.top_25/http://weibo.com_cold"
     },
     {
-        "duration": "45.0",
+        "duration": "112.0",
         "name": "v8.runtime_stats.top_25/http://weibo.com_hot"
     },
     {
-        "duration": "44.0",
+        "duration": "90.0",
         "name": "v8.runtime_stats.top_25/http://weibo.com_warm"
     },
     {
-        "duration": "39.0",
+        "duration": "80.0",
         "name": "v8.runtime_stats.top_25/http://world.taobao.com_cold"
     },
     {
-        "duration": "45.0",
+        "duration": "94.0",
         "name": "v8.runtime_stats.top_25/http://world.taobao.com_hot"
     },
     {
-        "duration": "44.0",
+        "duration": "92.0",
         "name": "v8.runtime_stats.top_25/http://world.taobao.com_warm"
     },
     {
-        "duration": "38.0",
+        "duration": "76.0",
         "name": "v8.runtime_stats.top_25/http://www.amazon.com/s/?field-keywords=v8_cold"
     },
     {
-        "duration": "45.0",
+        "duration": "90.0",
         "name": "v8.runtime_stats.top_25/http://www.amazon.com/s/?field-keywords=v8_hot"
     },
     {
-        "duration": "44.0",
+        "duration": "86.0",
         "name": "v8.runtime_stats.top_25/http://www.amazon.com/s/?field-keywords=v8_warm"
     },
     {
-        "duration": "38.0",
+        "duration": "76.0",
         "name": "v8.runtime_stats.top_25/http://www.baidu.com/s?wd=v8_cold"
     },
     {
-        "duration": "45.0",
+        "duration": "90.0",
         "name": "v8.runtime_stats.top_25/http://www.baidu.com/s?wd=v8_hot"
     },
     {
-        "duration": "44.0",
+        "duration": "88.0",
         "name": "v8.runtime_stats.top_25/http://www.baidu.com/s?wd=v8_warm"
     },
     {
-        "duration": "37.0",
+        "duration": "76.0",
         "name": "v8.runtime_stats.top_25/http://www.bing.com/search?q=v8+engine_cold"
     },
     {
-        "duration": "44.0",
+        "duration": "90.0",
         "name": "v8.runtime_stats.top_25/http://www.bing.com/search?q=v8+engine_hot"
     },
     {
-        "duration": "43.0",
+        "duration": "88.0",
         "name": "v8.runtime_stats.top_25/http://www.bing.com/search?q=v8+engine_warm"
     },
     {
-        "duration": "39.0",
+        "duration": "80.0",
         "name": "v8.runtime_stats.top_25/http://www.ebay.fr/sch/i.html?_nkw=v8_cold"
     },
     {
-        "duration": "57.0",
+        "duration": "116.0",
         "name": "v8.runtime_stats.top_25/http://www.ebay.fr/sch/i.html?_nkw=v8_hot"
     },
     {
-        "duration": "54.0",
+        "duration": "112.0",
         "name": "v8.runtime_stats.top_25/http://www.ebay.fr/sch/i.html?_nkw=v8_warm"
     },
     {
-        "duration": "38.0",
+        "duration": "78.0",
         "name": "v8.runtime_stats.top_25/http://www.instagram.com/archdigest_cold"
     },
     {
-        "duration": "45.0",
+        "duration": "94.0",
         "name": "v8.runtime_stats.top_25/http://www.instagram.com/archdigest_hot"
     },
     {
-        "duration": "45.0",
+        "duration": "90.0",
         "name": "v8.runtime_stats.top_25/http://www.instagram.com/archdigest_warm"
     },
     {
-        "duration": "39.0",
+        "duration": "80.0",
         "name": "v8.runtime_stats.top_25/http://www.msn.com/ar-ae_cold"
     },
     {
-        "duration": "47.0",
+        "duration": "96.0",
         "name": "v8.runtime_stats.top_25/http://www.msn.com/ar-ae_hot"
     },
     {
-        "duration": "46.0",
+        "duration": "92.0",
         "name": "v8.runtime_stats.top_25/http://www.msn.com/ar-ae_warm"
     },
     {
-        "duration": "39.0",
+        "duration": "80.0",
         "name": "v8.runtime_stats.top_25/http://www.pinterest.com/categories/popular_cold"
     },
     {
-        "duration": "47.0",
+        "duration": "98.0",
         "name": "v8.runtime_stats.top_25/http://www.pinterest.com/categories/popular_hot"
     },
     {
-        "duration": "45.0",
+        "duration": "94.0",
         "name": "v8.runtime_stats.top_25/http://www.pinterest.com/categories/popular_warm"
     },
     {
-        "duration": "41.0",
+        "duration": "84.0",
         "name": "v8.runtime_stats.top_25/http://www.qq.com_cold"
     },
     {
-        "duration": "50.0",
+        "duration": "102.0",
         "name": "v8.runtime_stats.top_25/http://www.qq.com_hot"
     },
     {
-        "duration": "48.0",
+        "duration": "96.0",
         "name": "v8.runtime_stats.top_25/http://www.qq.com_warm"
     },
     {
-        "duration": "38.0",
+        "duration": "78.0",
         "name": "v8.runtime_stats.top_25/http://www.reddit.com_cold"
     },
     {
-        "duration": "46.0",
+        "duration": "94.0",
         "name": "v8.runtime_stats.top_25/http://www.reddit.com_hot"
     },
     {
-        "duration": "44.0",
+        "duration": "90.0",
         "name": "v8.runtime_stats.top_25/http://www.reddit.com_warm"
     },
     {
-        "duration": "39.0",
+        "duration": "80.0",
         "name": "v8.runtime_stats.top_25/http://www.twitter.com/taylorswift13_cold"
     },
     {
-        "duration": "48.0",
+        "duration": "98.0",
         "name": "v8.runtime_stats.top_25/http://www.twitter.com/taylorswift13_hot"
     },
     {
-        "duration": "57.0",
+        "duration": "94.0",
         "name": "v8.runtime_stats.top_25/http://www.twitter.com/taylorswift13_warm"
     },
     {
-        "duration": "49.0",
+        "duration": "76.0",
         "name": "v8.runtime_stats.top_25/http://www.wikiwand.com/en/hill_cold"
     },
     {
-        "duration": "46.0",
+        "duration": "92.0",
         "name": "v8.runtime_stats.top_25/http://www.wikiwand.com/en/hill_hot"
     },
     {
-        "duration": "44.0",
+        "duration": "88.0",
         "name": "v8.runtime_stats.top_25/http://www.wikiwand.com/en/hill_warm"
     },
     {
-        "duration": "38.0",
+        "duration": "74.0",
         "name": "v8.runtime_stats.top_25/http://www.yahoo.co.jp_cold"
     },
     {
-        "duration": "45.0",
+        "duration": "88.0",
         "name": "v8.runtime_stats.top_25/http://www.yahoo.co.jp_hot"
     },
     {
-        "duration": "44.0",
+        "duration": "88.0",
         "name": "v8.runtime_stats.top_25/http://www.yahoo.co.jp_warm"
     },
     {
-        "duration": "38.0",
+        "duration": "76.0",
         "name": "v8.runtime_stats.top_25/http://yandex.ru/search/?text=v8_cold"
     },
     {
-        "duration": "45.0",
+        "duration": "88.0",
         "name": "v8.runtime_stats.top_25/http://yandex.ru/search/?text=v8_hot"
     },
     {
-        "duration": "45.0",
+        "duration": "86.0",
         "name": "v8.runtime_stats.top_25/http://yandex.ru/search/?text=v8_warm"
     },
     {
-        "duration": "41.0",
+        "duration": "84.0",
         "name": "v8.runtime_stats.top_25/https://adwords.google.com_cold"
     },
     {
-        "duration": "50.0",
+        "duration": "102.0",
         "name": "v8.runtime_stats.top_25/https://adwords.google.com_hot"
     },
     {
-        "duration": "48.0",
+        "duration": "96.0",
         "name": "v8.runtime_stats.top_25/https://adwords.google.com_warm"
     },
     {
-        "duration": "36.0",
+        "duration": "74.0",
         "name": "v8.runtime_stats.top_25/https://cdn.ampproject.org/c/www.bbc.co.uk/news/amp/37344292#log=3_cold"
     },
     {
-        "duration": "51.0",
+        "duration": "102.0",
         "name": "v8.runtime_stats.top_25/https://cdn.ampproject.org/c/www.bbc.co.uk/news/amp/37344292#log=3_hot"
     },
     {
-        "duration": "42.0",
+        "duration": "84.0",
         "name": "v8.runtime_stats.top_25/https://cdn.ampproject.org/c/www.bbc.co.uk/news/amp/37344292#log=3_warm"
     },
     {
-        "duration": "41.0",
+        "duration": "82.0",
         "name": "v8.runtime_stats.top_25/https://en.wikipedia.org/w/index.php?title=Barack_Obama&veaction=edit_cold"
     },
     {
-        "duration": "54.0",
+        "duration": "110.0",
         "name": "v8.runtime_stats.top_25/https://en.wikipedia.org/w/index.php?title=Barack_Obama&veaction=edit_hot"
     },
     {
-        "duration": "49.0",
+        "duration": "122.0",
         "name": "v8.runtime_stats.top_25/https://en.wikipedia.org/w/index.php?title=Barack_Obama&veaction=edit_warm"
     },
     {
-        "duration": "39.0",
+        "duration": "76.0",
         "name": "v8.runtime_stats.top_25/https://www.facebook.com/shakira_cold"
     },
     {
-        "duration": "47.0",
+        "duration": "92.0",
         "name": "v8.runtime_stats.top_25/https://www.facebook.com/shakira_hot"
     },
     {
-        "duration": "45.0",
+        "duration": "88.0",
         "name": "v8.runtime_stats.top_25/https://www.facebook.com/shakira_warm"
     },
     {
-        "duration": "47.0",
+        "duration": "86.0",
         "name": "v8.runtime_stats.top_25/https://www.google.de/search?q=v8_cold"
     },
     {
-        "duration": "44.0",
+        "duration": "88.0",
         "name": "v8.runtime_stats.top_25/https://www.google.de/search?q=v8_hot"
     },
     {
-        "duration": "44.0",
+        "duration": "86.0",
         "name": "v8.runtime_stats.top_25/https://www.google.de/search?q=v8_warm"
     },
     {
-        "duration": "38.0",
+        "duration": "80.0",
         "name": "v8.runtime_stats.top_25/https://www.linkedin.com/m/_cold"
     },
     {
-        "duration": "46.0",
+        "duration": "94.0",
         "name": "v8.runtime_stats.top_25/https://www.linkedin.com/m/_hot"
     },
     {
-        "duration": "45.0",
+        "duration": "92.0",
         "name": "v8.runtime_stats.top_25/https://www.linkedin.com/m/_warm"
     },
     {
-        "duration": "38.0",
+        "duration": "74.0",
         "name": "v8.runtime_stats.top_25/https://www.youtube.com/watch?v=_kZsOISarzg_cold"
     },
     {
-        "duration": "44.0",
+        "duration": "88.0",
         "name": "v8.runtime_stats.top_25/https://www.youtube.com/watch?v=_kZsOISarzg_hot"
     },
     {
-        "duration": "44.0",
+        "duration": "86.0",
         "name": "v8.runtime_stats.top_25/https://www.youtube.com/watch?v=_kZsOISarzg_warm"
     },
     {
-        "duration": "39.0",
+        "duration": "76.0",
         "name": "v8.runtime_stats.top_25/https://www.youtube.com_cold"
     },
     {
-        "duration": "47.0",
+        "duration": "94.0",
         "name": "v8.runtime_stats.top_25/https://www.youtube.com_hot"
     },
     {
-        "duration": "45.0",
+        "duration": "88.0",
         "name": "v8.runtime_stats.top_25/https://www.youtube.com_warm"
     },
     {
-        "duration": "35.0",
+        "duration": "66.0",
         "name": "webrtc/10s_datachannel_transfer"
     },
     {
-        "duration": "32.0",
+        "duration": "58.0",
         "name": "webrtc/canvas_capture_peer_connection"
     },
     {
-        "duration": "42.0",
+        "duration": "78.0",
         "name": "webrtc/codec_constraints_h264"
     },
     {
-        "duration": "42.0",
+        "duration": "78.0",
         "name": "webrtc/codec_constraints_vp8"
     },
     {
-        "duration": "42.0",
+        "duration": "78.0",
         "name": "webrtc/codec_constraints_vp9"
     },
     {
-        "duration": "32.0",
+        "duration": "58.0",
         "name": "webrtc/hd_local_stream_10s"
     },
     {
-        "duration": "75.0",
+        "duration": "132.0",
         "name": "webrtc/multiple_peerconnections"
     },
     {
-        "duration": "38.0",
+        "duration": "34.0",
         "name": "webrtc/pause_play_peerconnections"
     }
 ]
\ No newline at end of file
diff --git a/tools/perf/core/shard_maps/timing_data/win_7_nvidia_gpu_perf_timing.json b/tools/perf/core/shard_maps/timing_data/win_7_nvidia_gpu_perf_timing.json
index d19ee2e..7be2831 100644
--- a/tools/perf/core/shard_maps/timing_data/win_7_nvidia_gpu_perf_timing.json
+++ b/tools/perf/core/shard_maps/timing_data/win_7_nvidia_gpu_perf_timing.json
@@ -1,53 +1,13 @@
 [
     {
-        "duration": "19.0",
-        "name": "rendering.desktop/animometer_webgl_attrib_arrays"
-    },
-    {
-        "duration": "17.0",
-        "name": "rendering.desktop/balls_javascript_canvas"
-    },
-    {
-        "duration": "15.0",
-        "name": "rendering.desktop/canvas_05000_pixels_per_second"
-    },
-    {
-        "duration": "20.0",
-        "name": "rendering.desktop/chip_tune"
-    },
-    {
-        "duration": "17.0",
+        "duration": "34.0",
         "name": "rendering.desktop/css_value_type_shadow"
     },
     {
-        "duration": "18.0",
-        "name": "rendering.desktop/fill_shapes"
-    },
-    {
-        "duration": "27.0",
-        "name": "rendering.desktop/ie_chalkboard"
-    },
-    {
-        "duration": "18.0",
+        "duration": "34.0",
         "name": "rendering.desktop/main_30fps_impl_60fps"
     },
     {
-        "duration": "20.0",
-        "name": "rendering.desktop/new_tilings"
-    },
-    {
-        "duration": "17.0",
-        "name": "rendering.desktop/transform_transitions_js_block"
-    },
-    {
-        "duration": "15.0",
-        "name": "rendering.desktop/twitch_2018"
-    },
-    {
-        "duration": "17.0",
-        "name": "rendering.desktop/web_animations_staggered_infinite_iterations"
-    },
-    {
         "duration": "1988.0",
         "name": "angle_perftests/_gtest_"
     }
diff --git a/tools/perf/core/shard_maps/timing_data/win_7_perf_timing.json b/tools/perf/core/shard_maps/timing_data/win_7_perf_timing.json
index d7fdc6f..280a28a3 100644
--- a/tools/perf/core/shard_maps/timing_data/win_7_perf_timing.json
+++ b/tools/perf/core/shard_maps/timing_data/win_7_perf_timing.json
@@ -1,42 +1,42 @@
 [
     {
-        "duration": "31.0",
+        "duration": "84.0",
         "name": "loading.desktop/AirBnB_warm"
     },
     {
-        "duration": "23.0",
+        "duration": "60.0",
         "name": "loading.desktop/Aljayyash_cold"
     },
     {
-        "duration": "9.0",
+        "duration": "14.0",
         "name": "loading.desktop/AllRecipes_cold"
     },
     {
-        "duration": "22.0",
+        "duration": "50.0",
         "name": "loading.desktop/Baidu_warm"
     },
     {
-        "duration": "22.0",
+        "duration": "54.0",
         "name": "loading.desktop/Naver_cold"
     },
     {
-        "duration": "10.0",
+        "duration": "6.0",
         "name": "loading.desktop/Orange_cold"
     },
     {
-        "duration": "10.0",
+        "duration": "6.0",
         "name": "loading.desktop/Orange_warm"
     },
     {
-        "duration": "24.0",
+        "duration": "82.0",
         "name": "loading.desktop/Taobao_warm"
     },
     {
-        "duration": "22.0",
+        "duration": "44.0",
         "name": "loading.desktop/TheOnion_cold"
     },
     {
-        "duration": "22.0",
+        "duration": "74.0",
         "name": "loading.desktop/ru.wikipedia_warm"
     }
 ]
\ No newline at end of file
diff --git a/tools/perf/core/tbmv3/run_tbmv3_metric.py b/tools/perf/core/tbmv3/run_tbmv3_metric.py
index a24f9983..4b2bc82c 100755
--- a/tools/perf/core/tbmv3/run_tbmv3_metric.py
+++ b/tools/perf/core/tbmv3/run_tbmv3_metric.py
@@ -24,17 +24,15 @@
 
 _CHROMIUM_SRC_PATH  = os.path.join(
     os.path.dirname(__file__), '..', '..', '..', '..')
-_DEFAULT_TP_PATH = os.path.realpath(os.path.join(
-    _CHROMIUM_SRC_PATH, 'out', 'Debug', 'trace_processor_shell'))
-
 
 def _WriteHistogramSetToFile(histograms, outfile):
   with open(outfile, 'w') as f:
     json.dump(histograms.AsDicts(), f, indent=2, sort_keys=True,
               separators=(',', ': '))
+    f.write("\n")
 
 
-def Main():
+def Main(cli_args):
   parser = argparse.ArgumentParser(
     description='[Experimental] Runs TBMv3 metrics on local traces and '
     'produces histogram json.')
@@ -42,12 +40,13 @@
                       help='Trace file you want to compute metric on')
   parser.add_argument('--metric', required=True,
                       help=('Name of the metric you want to run'))
-  parser.add_argument('--trace-processor-path', default=_DEFAULT_TP_PATH,
-                      help='Path to trace processor shell. '
-                      'Default: %(default)s')
+  parser.add_argument(
+      '--trace-processor-path',
+      help='Path to trace processor shell. '
+      'Default: Binary downloaded from cloud storage.')
   parser.add_argument('--outfile', default='results.json',
                       help='Path to output file. Default: %(default)s')
-  args = parser.parse_args()
+  args = parser.parse_args(cli_args)
 
   histograms = trace_processor.RunMetric(args.trace_processor_path,
                                          args.trace, args.metric)
@@ -56,4 +55,4 @@
 
 
 if __name__ == '__main__':
-  sys.exit(Main())
+  sys.exit(Main(sys.argv[1:]))
diff --git a/tools/perf/core/tbmv3/run_tbmv3_metric_unittest.py b/tools/perf/core/tbmv3/run_tbmv3_metric_unittest.py
new file mode 100644
index 0000000..6d9c7424
--- /dev/null
+++ b/tools/perf/core/tbmv3/run_tbmv3_metric_unittest.py
@@ -0,0 +1,61 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+"""Integration tests for run_tbmv3_metric.py.
+
+These test check run_tbmv3_metric works end to end, using the real trace
+processor shell.
+"""
+
+import json
+import os
+import shutil
+import tempfile
+import unittest
+
+from core.tbmv3 import run_tbmv3_metric
+
+from tracing.value import histogram_set
+
+# For testing the TBMv3 workflow we use dummy_metric defined in
+# tools/perf/core/tbmv3/metrics/dummy_metric_*.
+# This metric ignores the trace data and outputs a histogram with
+# the following name and unit:
+DUMMY_HISTOGRAM_NAME = 'dummy::foo'
+DUMMY_HISTOGRAM_UNIT = 'count_biggerIsBetter'
+
+
+class RunTbmv3MetricIntegrationTests(unittest.TestCase):
+  def setUp(self):
+    self.output_dir = tempfile.mkdtemp()
+    self.trace_path = self.CreateEmptyProtoTrace()
+    self.outfile_path = os.path.join(self.output_dir, 'out.json')
+
+  def tearDown(self):
+    shutil.rmtree(self.output_dir)
+
+  def CreateEmptyProtoTrace(self):
+    """Create an empty file as a proto trace."""
+    with tempfile.NamedTemporaryFile(
+        dir=self.output_dir, delete=False) as trace_file:
+      # Open temp file and close it so it's written to disk.
+      pass
+    return trace_file.name
+
+  def testRunTbmv3MetricOnDummyMetric(self):
+    run_tbmv3_metric.Main([
+        '--trace', self.trace_path,
+        '--metric', 'dummy_metric',
+        '--outfile', self.outfile_path,
+    ])
+
+    with open(self.outfile_path) as f:
+      results = json.load(f)
+
+    out_histograms = histogram_set.HistogramSet()
+    out_histograms.ImportDicts(results)
+
+    hist = out_histograms.GetHistogramNamed(DUMMY_HISTOGRAM_NAME)
+    self.assertEqual(hist.unit, DUMMY_HISTOGRAM_UNIT)
+    self.assertEqual(hist.num_values, 1)
+    self.assertEqual(hist.average, 42)
diff --git a/tools/perf/cycletime_contributions.csv b/tools/perf/cycletime_contributions.csv
index 65dc4fd..e3c1a72e 100644
--- a/tools/perf/cycletime_contributions.csv
+++ b/tools/perf/cycletime_contributions.csv
@@ -2,35 +2,35 @@
 View a prettier version of this at,https://docs.google.com/spreadsheets/d/15pJY4cxtM2NVNFKQDgDnoT5PLo0Nm5Td-Ov-5PZefAw
 platform,Android Nexus5 Perf,Android Nexus5X WebView Perf,Win 7 Nvidia GPU Perf,Win 7 Perf,android-go-perf,android-go_webview-perf,android-pixel2-perf,android-pixel2_weblayer-perf,android-pixel2_webview-perf,linux-perf,mac-10_12_laptop_low_end-perf,mac-10_13_laptop_high_end-perf,win-10-perf,win-10_laptop_low_end-perf
 shards,16,16,4,4,19,13,35,4,21,26,26,26,26,26
-idealized cycle time (hours),0.04,0.47,0.31,0.03,0.40,0.16,0.76,0.03,0.28,0.31,0.44,0.35,0.44,0.71
-angle_perftests,0.000,0.000,0.276,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.042,0.000
-base_perftests,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.006,0.000,0.006,0.006,0.000
+idealized cycle time (hours),0.06,0.45,0.14,0.03,0.39,0.16,0.45,0.08,0.28,0.31,0.44,0.35,0.41,0.72
+angle_perftests,0.000,0.000,0.138,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.021,0.000
+base_perftests,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.003,0.000,0.003,0.003,0.000
 blink_perf.accessibility,0.000,0.001,0.000,0.000,0.000,0.000,0.001,0.000,0.001,0.001,0.001,0.001,0.001,0.001
-blink_perf.bindings,0.000,0.015,0.000,0.000,0.000,0.000,0.014,0.000,0.009,0.006,0.009,0.007,0.009,0.011
-blink_perf.canvas,0.000,0.000,0.000,0.000,0.000,0.000,0.016,0.000,0.005,0.006,0.010,0.000,0.009,0.012
-blink_perf.css,0.000,0.007,0.000,0.000,0.000,0.000,0.084,0.000,0.004,0.005,0.007,0.006,0.007,0.010
+blink_perf.bindings,0.000,0.015,0.000,0.000,0.000,0.000,0.013,0.000,0.009,0.006,0.009,0.007,0.009,0.012
+blink_perf.canvas,0.000,0.000,0.000,0.000,0.000,0.000,0.011,0.000,0.005,0.006,0.010,0.000,0.010,0.013
+blink_perf.css,0.000,0.008,0.000,0.000,0.000,0.000,0.007,0.000,0.005,0.005,0.008,0.006,0.007,0.010
 blink_perf.display_locking,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.001,0.000,0.000,0.000
 blink_perf.dom,0.000,0.004,0.000,0.000,0.000,0.000,0.003,0.000,0.002,0.001,0.002,0.002,0.002,0.003
-blink_perf.events,0.000,0.002,0.000,0.000,0.000,0.000,0.005,0.000,0.002,0.001,0.002,0.002,0.002,0.002
-blink_perf.image_decoder,0.000,0.005,0.000,0.000,0.000,0.000,0.006,0.000,0.004,0.002,0.004,0.002,0.003,0.005
-blink_perf.layout,0.000,0.030,0.000,0.000,0.000,0.000,0.030,0.000,0.015,0.009,0.015,0.012,0.015,0.018
-blink_perf.owp_storage,0.000,0.001,0.000,0.000,0.000,0.000,0.001,0.000,0.001,0.001,0.001,0.001,0.002,0.002
-blink_perf.paint,0.000,0.000,0.000,0.000,0.000,0.000,0.008,0.000,0.005,0.003,0.006,0.004,0.004,0.009
-blink_perf.parser,0.000,0.010,0.000,0.000,0.000,0.000,0.012,0.000,0.005,0.004,0.006,0.005,0.006,0.007
-blink_perf.shadow_dom,0.000,0.000,0.000,0.000,0.000,0.000,0.012,0.000,0.004,0.001,0.003,0.002,0.004,0.004
-blink_perf.svg,0.000,0.002,0.000,0.000,0.000,0.000,0.004,0.000,0.002,0.001,0.001,0.001,0.002,0.002
-components_perftests,0.004,0.000,0.000,0.000,0.000,0.000,0.002,0.000,0.000,0.000,0.000,0.000,0.002,0.000
-dawn_perf_tests,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.006,0.006,0.000
-dromaeo,0.000,0.003,0.000,0.000,0.000,0.000,0.003,0.000,0.002,0.002,0.003,0.003,0.003,0.003
+blink_perf.events,0.000,0.002,0.000,0.000,0.000,0.000,0.003,0.000,0.002,0.001,0.002,0.002,0.002,0.003
+blink_perf.image_decoder,0.000,0.006,0.000,0.000,0.000,0.000,0.006,0.000,0.004,0.002,0.004,0.002,0.003,0.005
+blink_perf.layout,0.000,0.030,0.000,0.000,0.000,0.000,0.022,0.000,0.015,0.009,0.015,0.012,0.014,0.019
+blink_perf.owp_storage,0.000,0.002,0.000,0.000,0.000,0.000,0.001,0.000,0.001,0.001,0.002,0.001,0.002,0.002
+blink_perf.paint,0.000,0.000,0.000,0.000,0.000,0.000,0.006,0.000,0.004,0.003,0.006,0.004,0.004,0.009
+blink_perf.parser,0.000,0.012,0.000,0.000,0.000,0.000,0.008,0.000,0.006,0.004,0.006,0.005,0.006,0.007
+blink_perf.shadow_dom,0.000,0.000,0.000,0.000,0.000,0.000,0.007,0.000,0.004,0.001,0.003,0.002,0.004,0.004
+blink_perf.svg,0.000,0.002,0.000,0.000,0.000,0.000,0.004,0.000,0.002,0.001,0.002,0.001,0.002,0.002
+components_perftests,0.002,0.000,0.000,0.000,0.000,0.000,0.001,0.000,0.000,0.000,0.000,0.000,0.001,0.000
+dawn_perf_tests,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.003,0.003,0.000
+dromaeo,0.000,0.003,0.000,0.000,0.000,0.000,0.002,0.000,0.002,0.002,0.003,0.003,0.003,0.003
 dummy_benchmark.noisy_benchmark_1,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000
-dummy_benchmark.stable_benchmark_1,0.000,0.000,0.000,0.000,0.000,0.000,0.002,0.000,0.000,0.000,0.000,0.000,0.000,0.000
-gpu_perftests,0.002,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000
+dummy_benchmark.stable_benchmark_1,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000
+gpu_perftests,0.001,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000
 jetstream,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.004,0.004,0.004,0.004,0.005
 jetstream2,0.000,0.000,0.000,0.000,0.000,0.000,0.008,0.000,0.000,0.003,0.000,0.004,0.003,0.007
-kraken,0.000,0.002,0.000,0.000,0.000,0.000,0.001,0.000,0.001,0.000,0.001,0.001,0.000,0.001
+kraken,0.000,0.001,0.000,0.000,0.000,0.000,0.001,0.000,0.001,0.000,0.001,0.001,0.000,0.001
 load_library_perf_tests,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000
-loading.desktop,0.000,0.000,0.000,0.027,0.000,0.000,0.000,0.000,0.000,0.023,0.043,0.029,0.036,0.061
-loading.mobile,0.006,0.022,0.000,0.000,0.000,0.000,0.035,0.000,0.014,0.000,0.000,0.000,0.000,0.000
+loading.desktop,0.000,0.000,0.000,0.033,0.000,0.000,0.000,0.000,0.000,0.023,0.044,0.029,0.036,0.063
+loading.mobile,0.006,0.021,0.000,0.000,0.000,0.000,0.024,0.000,0.014,0.000,0.000,0.000,0.000,0.000
 media.desktop,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.007,0.010,0.008,0.008,0.014
 media.mobile,0.000,0.000,0.000,0.000,0.000,0.000,0.006,0.000,0.000,0.000,0.000,0.000,0.000,0.000
 media_perftests,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000
@@ -38,28 +38,28 @@
 net_perftests,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.001,0.000,0.001,0.000,0.000
 octane,0.000,0.001,0.000,0.000,0.000,0.000,0.001,0.000,0.001,0.001,0.001,0.001,0.001,0.001
 performance_browser_tests,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.001,0.001,0.001,0.000,0.000
-power.desktop,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.012,0.014,0.012,0.013,0.016
-rasterize_and_record_micro.partial_invalidation,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000
-rasterize_and_record_micro.top_25,0.000,0.016,0.000,0.000,0.000,0.000,0.011,0.000,0.008,0.007,0.008,0.008,0.010,0.013
-rendering.desktop,0.000,0.000,0.031,0.000,0.000,0.000,0.000,0.000,0.000,0.073,0.116,0.086,0.091,0.160
-rendering.mobile,0.000,0.199,0.000,0.000,0.000,0.000,0.189,0.000,0.104,0.000,0.000,0.000,0.000,0.000
+power.desktop,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.011,0.014,0.012,0.013,0.017
+rasterize_and_record_micro.partial_invalidation,0.000,0.001,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000
+rasterize_and_record_micro.top_25,0.000,0.014,0.000,0.000,0.000,0.000,0.011,0.000,0.008,0.008,0.008,0.008,0.010,0.013
+rendering.desktop,0.000,0.000,0.005,0.000,0.000,0.000,0.000,0.000,0.000,0.074,0.117,0.088,0.091,0.162
+rendering.mobile,0.000,0.174,0.000,0.000,0.000,0.000,0.147,0.000,0.102,0.000,0.000,0.000,0.000,0.000
 speedometer,0.000,0.001,0.000,0.000,0.004,0.003,0.001,0.000,0.000,0.001,0.001,0.001,0.001,0.002
 speedometer-future,0.000,0.001,0.000,0.000,0.000,0.000,0.001,0.000,0.000,0.001,0.001,0.001,0.001,0.002
-speedometer2,0.000,0.002,0.000,0.000,0.008,0.006,0.001,0.000,0.001,0.001,0.002,0.002,0.001,0.003
-speedometer2-future,0.000,0.002,0.000,0.000,0.000,0.000,0.001,0.000,0.001,0.001,0.002,0.002,0.001,0.003
-startup.mobile,0.019,0.000,0.000,0.000,0.018,0.000,0.059,0.022,0.000,0.000,0.000,0.000,0.000,0.000
-system_health.common_desktop,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.042,0.052,0.042,0.045,0.067
-system_health.common_mobile,0.008,0.052,0.000,0.000,0.130,0.078,0.050,0.005,0.028,0.000,0.000,0.000,0.000,0.000
-system_health.memory_desktop,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.030,0.044,0.036,0.040,0.055
-system_health.memory_mobile,0.000,0.048,0.000,0.000,0.129,0.074,0.052,0.005,0.031,0.000,0.000,0.000,0.000,0.000
+speedometer2,0.000,0.002,0.000,0.000,0.007,0.005,0.001,0.000,0.001,0.001,0.002,0.002,0.001,0.003
+speedometer2-future,0.000,0.002,0.000,0.000,0.000,0.000,0.001,0.000,0.001,0.001,0.002,0.002,0.002,0.003
+startup.mobile,0.021,0.000,0.000,0.000,0.019,0.000,0.006,0.022,0.000,0.000,0.000,0.000,0.000,0.000
+system_health.common_desktop,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.042,0.052,0.042,0.045,0.066
+system_health.common_mobile,0.026,0.045,0.000,0.000,0.129,0.077,0.041,0.027,0.029,0.000,0.000,0.000,0.000,0.000
+system_health.memory_desktop,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.030,0.044,0.036,0.040,0.056
+system_health.memory_mobile,0.000,0.053,0.000,0.000,0.129,0.074,0.045,0.029,0.032,0.000,0.000,0.000,0.000,0.000
 system_health.webview_startup,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000
 tab_switching.typical_25,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000
-tracing.tracing_with_background_memory_infra,0.000,0.002,0.000,0.000,0.000,0.000,0.002,0.000,0.001,0.002,0.003,0.002,0.003,0.004
-tracing_perftests,0.002,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.001,0.000,0.000,0.000,0.000
-v8.browsing_desktop,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.020,0.027,0.023,0.023,0.036
-v8.browsing_desktop-future,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.022,0.029,0.023,0.023,0.036
-v8.browsing_mobile,0.000,0.036,0.000,0.000,0.107,0.000,0.105,0.000,0.021,0.000,0.000,0.000,0.000,0.000
+tracing.tracing_with_background_memory_infra,0.000,0.002,0.000,0.000,0.000,0.000,0.002,0.000,0.001,0.002,0.003,0.002,0.002,0.004
+tracing_perftests,0.001,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.001,0.000,0.000,0.000,0.000
+v8.browsing_desktop,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.021,0.027,0.022,0.023,0.036
+v8.browsing_desktop-future,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.022,0.028,0.022,0.023,0.037
+v8.browsing_mobile,0.000,0.041,0.000,0.000,0.103,0.000,0.032,0.000,0.020,0.000,0.000,0.000,0.000,0.000
 v8.browsing_mobile-future,0.000,0.000,0.000,0.000,0.000,0.000,0.031,0.000,0.000,0.000,0.000,0.000,0.000,0.000
-v8.runtime_stats.top_25,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.121
+v8.runtime_stats.top_25,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.122
 views_perftests,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000
-webrtc,0.000,0.004,0.000,0.000,0.000,0.000,0.004,0.000,0.003,0.004,0.005,0.004,0.004,0.007
+webrtc,0.000,0.004,0.000,0.000,0.000,0.000,0.004,0.000,0.003,0.004,0.005,0.004,0.004,0.006
diff --git a/tools/perf/generate_perf_sharding.py b/tools/perf/generate_perf_sharding.py
index e803a53..883c5209 100755
--- a/tools/perf/generate_perf_sharding.py
+++ b/tools/perf/generate_perf_sharding.py
@@ -121,6 +121,13 @@
   builder, timing_file_path = args
   data = retrieve_story_timing.FetchAverageStoryTimingData(
       configurations=[builder.name], num_last_days=5)
+  # Running against a reference build doubles our runtime.
+  # Double the expected duration of each story to account
+  # for this. Note that gtest perf tests can't run against
+  # reference builds, so this does not apply to them.
+  if builder.run_reference_build:
+    for story in data:
+      story['duration'] = unicode(float(story['duration']) * 2.0)
   for executable in builder.executables:
     data.append({unicode('duration'): unicode(
                     float(executable.estimated_runtime)),
@@ -214,18 +221,15 @@
        'shards',
        'idealized cycle time (hours)'] + benchmark_names]
   for platform, durations in platforms.iteritems():
-    multiplier = 2.0 if platform.run_reference_build else 1.0
-    estimated_cycle_time = (multiplier * sum(durations.values()) /
-                            60.0 / 60.0 / float(platform.num_shards))
-    # Double all cycle time stats by 2 to account for reference build.
-    columns.append([
-      platform.name,
-      platform.num_shards,
-      '%.2f' % estimated_cycle_time] + [
-          '%.3f' % (multiplier * durations[name] / 60.0 /
-                    60.0 / float(platform.num_shards))
-          for name in benchmark_names]
-    )
+    estimated_cycle_time = (
+        sum(durations.values()) / 60.0 / 60.0 / float(platform.num_shards))
+    columns.append(
+        [platform.name, platform.num_shards,
+         '%.2f' % estimated_cycle_time] + [
+             '%.3f' %
+             (durations[name] / 60.0 / 60.0 / float(platform.num_shards))
+             for name in benchmark_names
+         ])
   # Rotate the columns into rows.
   rows = []
   for row_index in range(len(columns[0])):
diff --git a/ui/android/java/res/values-night/colors.xml b/ui/android/java/res/values-night/colors.xml
index 416b09d..d1744d0 100644
--- a/ui/android/java/res/values-night/colors.xml
+++ b/ui/android/java/res/values-night/colors.xml
@@ -30,6 +30,7 @@
     <color name="default_bg_color_elev_2">@color/default_bg_color_dark_elev_2</color>
     <color name="default_bg_color_elev_3">@color/default_bg_color_dark_elev_3</color>
     <color name="default_bg_color_elev_4">@color/default_bg_color_dark_elev_4</color>
+    <color name="default_bg_color_blue">@color/modern_blue_300</color>
 
     <!-- Bottom sheet colors -->
     <color name="sheet_bg_color">@color/default_bg_color_dark_elev_4</color>
diff --git a/ui/android/java/res/values/colors.xml b/ui/android/java/res/values/colors.xml
index 5f451ef..32d3b902 100644
--- a/ui/android/java/res/values/colors.xml
+++ b/ui/android/java/res/values/colors.xml
@@ -46,6 +46,8 @@
     <color name="modern_primary_color" tools:ignore="UnusedResources">@color/default_bg_color_light</color>
     <color name="modern_secondary_color" tools:ignore="UnusedResources">@color/modern_grey_100</color>
 
+    <color name="default_bg_color_blue" tools:ignore="UnusedResources">@color/modern_blue_600</color>
+
     <!-- Dark background and branding color. -->
     <color name="dark_primary_color" tools:ignore="UnusedResources">
         @color/modern_grey_900
diff --git a/ui/android/java/src/org/chromium/ui/drawable/AnimationLooper.java b/ui/android/java/src/org/chromium/ui/drawable/AnimationLooper.java
index 8472f6f..9b40599 100644
--- a/ui/android/java/src/org/chromium/ui/drawable/AnimationLooper.java
+++ b/ui/android/java/src/org/chromium/ui/drawable/AnimationLooper.java
@@ -10,11 +10,11 @@
 import android.os.Build;
 import android.os.Handler;
 import android.provider.Settings;
-import android.support.graphics.drawable.Animatable2Compat;
-import android.support.graphics.drawable.AnimatedVectorDrawableCompat;
 
 import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
+import androidx.vectordrawable.graphics.drawable.Animatable2Compat;
+import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat;
 
 import org.chromium.base.ContextUtils;
 
diff --git a/ui/events/event_constants.h b/ui/events/event_constants.h
index 6ed1e1d1..ad4ac4d 100644
--- a/ui/events/event_constants.h
+++ b/ui/events/event_constants.h
@@ -59,10 +59,11 @@
                                     // IME without a user action.
                                     // (Linux X11 only)
   EF_IS_REPEAT = 1 << 16,
-  EF_FINAL = 1 << 17,            // Do not remap; the event was created with
-                                 // the desired final values.
-  EF_IS_EXTENDED_KEY = 1 << 18,  // Windows extended key (see WM_KEYDOWN doc)
-  EF_MAX_KEY_EVENT_FLAGS_VALUE = (1 << 19) - 1,
+  EF_FINAL = 1 << 17,             // Do not remap; the event was created with
+                                  // the desired final values.
+  EF_IS_EXTENDED_KEY = 1 << 18,   // Windows extended key (see WM_KEYDOWN doc)
+  EF_IS_STYLUS_BUTTON = 1 << 19,  // Event was generated by a stylus button
+  EF_MAX_KEY_EVENT_FLAGS_VALUE = (1 << 20) - 1,
 };
 
 // Flags specific to mouse events.
diff --git a/ui/events/ozone/evdev/BUILD.gn b/ui/events/ozone/evdev/BUILD.gn
index 45872d1..22f19b9 100644
--- a/ui/events/ozone/evdev/BUILD.gn
+++ b/ui/events/ozone/evdev/BUILD.gn
@@ -67,6 +67,8 @@
     "keyboard_util_evdev.h",
     "mouse_button_map_evdev.cc",
     "mouse_button_map_evdev.h",
+    "stylus_button_event_converter_evdev.cc",
+    "stylus_button_event_converter_evdev.h",
     "tablet_event_converter_evdev.cc",
     "tablet_event_converter_evdev.h",
     "touch_evdev_debug_buffer.cc",
@@ -167,6 +169,7 @@
     "event_device_test_util.h",
     "gamepad_event_converter_evdev_unittest.cc",
     "input_injector_evdev_unittest.cc",
+    "stylus_button_event_converter_evdev_unittest.cc",
     "tablet_event_converter_evdev_unittest.cc",
     "testing/fake_cursor_delegate_evdev.h",
     "touch_event_converter_evdev_unittest.cc",
diff --git a/ui/events/ozone/evdev/device_event_dispatcher_evdev.cc b/ui/events/ozone/evdev/device_event_dispatcher_evdev.cc
index 7819568..9c42500 100644
--- a/ui/events/ozone/evdev/device_event_dispatcher_evdev.cc
+++ b/ui/events/ozone/evdev/device_event_dispatcher_evdev.cc
@@ -7,16 +7,17 @@
 namespace ui {
 
 KeyEventParams::KeyEventParams(int device_id,
+                               int flags,
                                unsigned int code,
                                bool down,
                                bool suppress_auto_repeat,
                                base::TimeTicks timestamp)
     : device_id(device_id),
+      flags(flags),
       code(code),
       down(down),
       suppress_auto_repeat(suppress_auto_repeat),
-      timestamp(timestamp) {
-}
+      timestamp(timestamp) {}
 
 KeyEventParams::KeyEventParams(const KeyEventParams& other) = default;
 
diff --git a/ui/events/ozone/evdev/device_event_dispatcher_evdev.h b/ui/events/ozone/evdev/device_event_dispatcher_evdev.h
index 0254fc1..64441cf 100644
--- a/ui/events/ozone/evdev/device_event_dispatcher_evdev.h
+++ b/ui/events/ozone/evdev/device_event_dispatcher_evdev.h
@@ -25,6 +25,7 @@
 
 struct COMPONENT_EXPORT(EVDEV) KeyEventParams {
   KeyEventParams(int device_id,
+                 int flags,
                  unsigned int code,
                  bool down,
                  bool suppress_auto_repeat,
@@ -34,6 +35,7 @@
   ~KeyEventParams();
 
   int device_id;
+  int flags;
   unsigned int code;
   bool down;
   bool suppress_auto_repeat;
diff --git a/ui/events/ozone/evdev/event_converter_evdev_impl.cc b/ui/events/ozone/evdev/event_converter_evdev_impl.cc
index 2b058821..be580873 100644
--- a/ui/events/ozone/evdev/event_converter_evdev_impl.cc
+++ b/ui/events/ozone/evdev/event_converter_evdev_impl.cc
@@ -190,9 +190,9 @@
   // State transition: !(down) -> (down)
   key_state_.set(key, down);
 
-  dispatcher_->DispatchKeyEvent(KeyEventParams(input_device_.id, key, down,
-                                               false /* suppress_auto_repeat */,
-                                               timestamp));
+  dispatcher_->DispatchKeyEvent(
+      KeyEventParams(input_device_.id, ui::EF_NONE, key, down,
+                     false /* suppress_auto_repeat */, timestamp));
 }
 
 void EventConverterEvdevImpl::ReleaseKeys() {
diff --git a/ui/events/ozone/evdev/event_device_info.cc b/ui/events/ozone/evdev/event_device_info.cc
index 86a0b29..0a569c7 100644
--- a/ui/events/ozone/evdev/event_device_info.cc
+++ b/ui/events/ozone/evdev/event_device_info.cc
@@ -32,6 +32,13 @@
   {0x045e, 0x0b05},  // Xbox One Elite Series 2 gamepad
 };
 
+constexpr struct {
+  uint16_t vendor;
+  uint16_t product_id;
+} kStylusButtonDevices[] = {
+    {0x413c, 0x81d5},  // Dell Active Pen PN579X
+};
+
 bool GetEventBits(int fd,
                   const base::FilePath& path,
                   unsigned int type,
@@ -442,6 +449,16 @@
          HasKeyEvent(BTN_STYLUS2);
 }
 
+bool EventDeviceInfo::IsStylusButtonDevice() const {
+  for (const auto& device_id : kStylusButtonDevices) {
+    if (input_id_.vendor == device_id.vendor &&
+        input_id_.product == device_id.product_id)
+      return true;
+  }
+
+  return false;
+}
+
 bool IsInKeyboardBlockList(input_id input_id_) {
   for (const auto& blocklist_id : kKeyboardBlocklist) {
     if (input_id_.vendor == blocklist_id.vendor &&
@@ -457,6 +474,8 @@
     return false;
   if (IsInKeyboardBlockList(input_id_))
     return false;
+  if (IsStylusButtonDevice())
+    return false;
 
   // Check first 31 keys: If we have all of them, consider it a full
   // keyboard. This is exactly what udev does for ID_INPUT_KEYBOARD.
diff --git a/ui/events/ozone/evdev/event_device_info.h b/ui/events/ozone/evdev/event_device_info.h
index 78eb4af2..da6637a 100644
--- a/ui/events/ozone/evdev/event_device_info.h
+++ b/ui/events/ozone/evdev/event_device_info.h
@@ -148,6 +148,9 @@
   // Determine whether there's a gamepad on this device.
   bool HasGamepad() const;
 
+  // Determine if this is a dedicated device for a stylus button.
+  bool IsStylusButtonDevice() const;
+
   // The device type (internal or external.)
   InputDeviceType device_type() const { return device_type_; }
 
diff --git a/ui/events/ozone/evdev/event_device_info_unittest.cc b/ui/events/ozone/evdev/event_device_info_unittest.cc
index 7921494..686882c 100644
--- a/ui/events/ozone/evdev/event_device_info_unittest.cc
+++ b/ui/events/ozone/evdev/event_device_info_unittest.cc
@@ -286,4 +286,19 @@
   EXPECT_EQ(ui::InputDeviceType::INPUT_DEVICE_BLUETOOTH, devinfo.device_type());
 }
 
+TEST(EventDeviceInfoTest, DellActivePen_Button) {
+  EventDeviceInfo devinfo;
+  EXPECT_TRUE(CapabilitiesToDeviceInfo(kDellActivePenButton, &devinfo));
+
+  EXPECT_FALSE(devinfo.HasKeyboard());
+  EXPECT_FALSE(devinfo.HasMouse());
+  EXPECT_FALSE(devinfo.HasTouchpad());
+  EXPECT_FALSE(devinfo.HasTouchscreen());
+  EXPECT_FALSE(devinfo.HasTablet());
+  EXPECT_FALSE(devinfo.HasGamepad());
+  EXPECT_TRUE(devinfo.IsStylusButtonDevice());
+
+  EXPECT_EQ(ui::InputDeviceType::INPUT_DEVICE_BLUETOOTH, devinfo.device_type());
+}
+
 }  // namespace ui
diff --git a/ui/events/ozone/evdev/event_device_test_util.cc b/ui/events/ozone/evdev/event_device_test_util.cc
index d28c823..c87016b 100644
--- a/ui/events/ozone/evdev/event_device_test_util.cc
+++ b/ui/events/ozone/evdev/event_device_test_util.cc
@@ -994,6 +994,26 @@
     kXboxEliteAxes,
     base::size(kXboxEliteAxes),
 };
+const DeviceCapabilities kDellActivePenButton = {
+    /* path */
+    "/sys/devices/virtual/misc/uhid/0005:413C:81D5.0004/input/input13/event11",
+    /* name */ "Dell Active Pen PN579X",
+    /* phys */ "f8:94:c2:b9:dd:b2",
+    /* uniq */ "90:7f:61:28:8d:09",
+    /* bustype */ "0005",
+    /* vendor */ "413c",
+    /* product */ "81d5",
+    /* version */ "0f08",
+    /* prop */ "0",
+    /* ev */ "100013",
+    /* key */ "7f80000000000000 e0b0ffdf01cfffff fffffffffffffffe",
+    /* rel */ "0",
+    /* abs */ "0",
+    /* msc */ "10",
+    /* sw */ "0",
+    /* led */ "0",
+    /* ff */ "0",
+};
 
 const DeviceAbsoluteAxis kDrallionStylusAxes[] = {
     {ABS_X, {0, 0, 30931, 0, 0, 100}},
diff --git a/ui/events/ozone/evdev/event_device_test_util.h b/ui/events/ozone/evdev/event_device_test_util.h
index 585eb43..0f12c4a 100644
--- a/ui/events/ozone/evdev/event_device_test_util.h
+++ b/ui/events/ozone/evdev/event_device_test_util.h
@@ -89,6 +89,7 @@
 extern const DeviceCapabilities kKohakuStylus;
 extern const DeviceCapabilities kXboxElite;
 extern const DeviceCapabilities kDrallionStylus;
+extern const DeviceCapabilities kDellActivePenButton;
 }  // namspace ui
 
 #endif  // UI_EVENTS_OZONE_EVDEV_EVENT_DEVICE_TEST_UTIL_H_
diff --git a/ui/events/ozone/evdev/event_factory_evdev.cc b/ui/events/ozone/evdev/event_factory_evdev.cc
index addb6705..73fe306 100644
--- a/ui/events/ozone/evdev/event_factory_evdev.cc
+++ b/ui/events/ozone/evdev/event_factory_evdev.cc
@@ -223,7 +223,7 @@
   TRACE_EVENT1("evdev", "EventFactoryEvdev::DispatchKeyEvent", "device",
                params.device_id);
   keyboard_.OnKeyChange(params.code, params.down, params.suppress_auto_repeat,
-                        params.timestamp, params.device_id);
+                        params.timestamp, params.device_id, params.flags);
 }
 
 void EventFactoryEvdev::DispatchMouseMoveEvent(
diff --git a/ui/events/ozone/evdev/input_device_factory_evdev.cc b/ui/events/ozone/evdev/input_device_factory_evdev.cc
index 0638c51..18a1e034 100644
--- a/ui/events/ozone/evdev/input_device_factory_evdev.cc
+++ b/ui/events/ozone/evdev/input_device_factory_evdev.cc
@@ -22,6 +22,7 @@
 #include "ui/events/ozone/evdev/event_converter_evdev_impl.h"
 #include "ui/events/ozone/evdev/event_device_info.h"
 #include "ui/events/ozone/evdev/gamepad_event_converter_evdev.h"
+#include "ui/events/ozone/evdev/stylus_button_event_converter_evdev.h"
 #include "ui/events/ozone/evdev/tablet_event_converter_evdev.h"
 #include "ui/events/ozone/evdev/touch_event_converter_evdev.h"
 #include "ui/events/ozone/gamepad/gamepad_provider_ozone.h"
@@ -124,6 +125,12 @@
         std::move(fd), params.path, params.id, devinfo, params.dispatcher));
   }
 
+  if (devinfo.IsStylusButtonDevice()) {
+    return base::WrapUnique<EventConverterEvdev>(
+        new StylusButtonEventConverterEvdev(
+            std::move(fd), params.path, params.id, devinfo, params.dispatcher));
+  }
+
   // Everything else: use EventConverterEvdevImpl.
   return base::WrapUnique<EventConverterEvdevImpl>(
       new EventConverterEvdevImpl(std::move(fd), params.path, params.id,
diff --git a/ui/events/ozone/evdev/input_injector_evdev.cc b/ui/events/ozone/evdev/input_injector_evdev.cc
index f6976d7..f9d747f 100644
--- a/ui/events/ozone/evdev/input_injector_evdev.cc
+++ b/ui/events/ozone/evdev/input_injector_evdev.cc
@@ -81,7 +81,7 @@
   int evdev_code = NativeCodeToEvdevCode(native_keycode);
 
   dispatcher_->DispatchKeyEvent(
-      KeyEventParams(kDeviceIdForInjection, evdev_code, down,
+      KeyEventParams(kDeviceIdForInjection, ui::EF_NONE, evdev_code, down,
                      suppress_auto_repeat, EventTimeForNow()));
 }
 
diff --git a/ui/events/ozone/evdev/keyboard_evdev.cc b/ui/events/ozone/evdev/keyboard_evdev.cc
index afcaa53..b17c36b 100644
--- a/ui/events/ozone/evdev/keyboard_evdev.cc
+++ b/ui/events/ozone/evdev/keyboard_evdev.cc
@@ -35,7 +35,8 @@
                                 bool down,
                                 bool suppress_auto_repeat,
                                 base::TimeTicks timestamp,
-                                int device_id) {
+                                int device_id,
+                                int flags) {
   if (key > KEY_MAX)
     return;
 
@@ -47,7 +48,7 @@
   key_state_.set(key, down);
   auto_repeat_handler_.UpdateKeyRepeat(key, down, suppress_auto_repeat,
                                        device_id);
-  DispatchKey(key, down, is_repeat, timestamp, device_id);
+  DispatchKey(key, down, is_repeat, timestamp, device_id, flags);
 }
 
 void KeyboardEvdev::SetCapsLockEnabled(bool enabled) {
@@ -136,15 +137,17 @@
                                 bool down,
                                 bool repeat,
                                 base::TimeTicks timestamp,
-                                int device_id) {
+                                int device_id,
+                                int flags) {
   DomCode dom_code =
       KeycodeConverter::NativeKeycodeToDomCode(EvdevCodeToNativeCode(key));
   if (dom_code == DomCode::NONE)
     return;
-  int flags = modifiers_->GetModifierFlags();
+  int modifier_flags = modifiers_->GetModifierFlags();
   DomKey dom_key;
   KeyboardCode key_code;
-  if (!keyboard_layout_engine_->Lookup(dom_code, flags, &dom_key, &key_code))
+  if (!keyboard_layout_engine_->Lookup(dom_code, modifier_flags, &dom_key,
+                                       &key_code))
     return;
   if (!repeat) {
     int flag = ModifierDomKeyToEventFlag(dom_key);
@@ -152,7 +155,7 @@
   }
 
   KeyEvent event(down ? ET_KEY_PRESSED : ET_KEY_RELEASED, key_code, dom_code,
-                 modifiers_->GetModifierFlags(), dom_key, timestamp);
+                 flags | modifiers_->GetModifierFlags(), dom_key, timestamp);
   event.set_source_device_id(device_id);
   callback_.Run(&event);
 }
diff --git a/ui/events/ozone/evdev/keyboard_evdev.h b/ui/events/ozone/evdev/keyboard_evdev.h
index d22ce28..8c2ea9c1 100644
--- a/ui/events/ozone/evdev/keyboard_evdev.h
+++ b/ui/events/ozone/evdev/keyboard_evdev.h
@@ -47,7 +47,8 @@
                    bool down,
                    bool suppress_auto_repeat,
                    base::TimeTicks timestamp,
-                   int device_id);
+                   int device_id,
+                   int flags);
 
   // Handle Caps Lock modifier.
   void SetCapsLockEnabled(bool enabled);
@@ -74,7 +75,8 @@
                    bool down,
                    bool repeat,
                    base::TimeTicks timestamp,
-                   int device_id) override;
+                   int device_id,
+                   int flags) override;
 
   // Aggregated key state. There is only one bit of state per key; we do not
   // attempt to count presses of the same key on multiple keyboards.
diff --git a/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc b/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc
index 21593cb5..33faf34 100644
--- a/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc
+++ b/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc
@@ -527,9 +527,9 @@
         continue;
 
       // Dispatch key press or release to keyboard.
-      dispatcher_->DispatchKeyEvent(
-          KeyEventParams(id_, key, value, false /* suppress_auto_repeat */,
-                         StimeToTimeTicks(timestamp)));
+      dispatcher_->DispatchKeyEvent(KeyEventParams(
+          id_, ui::EF_NONE, key, value, false /* suppress_auto_repeat */,
+          StimeToTimeTicks(timestamp)));
     }
   }
 
diff --git a/ui/events/ozone/evdev/stylus_button_event_converter_evdev.cc b/ui/events/ozone/evdev/stylus_button_event_converter_evdev.cc
new file mode 100644
index 0000000..cd4636a
--- /dev/null
+++ b/ui/events/ozone/evdev/stylus_button_event_converter_evdev.cc
@@ -0,0 +1,72 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/events/ozone/evdev/stylus_button_event_converter_evdev.h"
+
+#include <errno.h>
+#include <linux/input.h>
+
+#include "base/trace_event/trace_event.h"
+#include "ui/events/event_utils.h"
+#include "ui/events/ozone/evdev/device_event_dispatcher_evdev.h"
+
+namespace ui {
+
+namespace {
+
+const int kKeyReleaseValue = 0;
+
+}  // namespace
+
+StylusButtonEventConverterEvdev::StylusButtonEventConverterEvdev(
+    base::ScopedFD fd,
+    base::FilePath path,
+    int id,
+    const EventDeviceInfo& devinfo,
+    DeviceEventDispatcherEvdev* dispatcher)
+    : EventConverterEvdev(fd.get(),
+                          path,
+                          id,
+                          devinfo.device_type(),
+                          devinfo.name(),
+                          devinfo.phys(),
+                          devinfo.vendor_id(),
+                          devinfo.product_id(),
+                          devinfo.version()),
+      input_device_fd_(std::move(fd)),
+      dispatcher_(dispatcher) {}
+
+StylusButtonEventConverterEvdev::~StylusButtonEventConverterEvdev() {}
+
+void StylusButtonEventConverterEvdev::OnFileCanReadWithoutBlocking(int fd) {
+  TRACE_EVENT1("evdev",
+               "StylusButtonEventConverterEvdev::OnFileCanReadWithoutBlocking",
+               "fd", fd);
+
+  while (true) {
+    input_event input;
+    ssize_t read_size = read(fd, &input, sizeof(input));
+    if (read_size != sizeof(input)) {
+      if (errno == EINTR || errno == EAGAIN)
+        return;
+      if (errno != ENODEV)
+        PLOG(ERROR) << "error reading device " << path_.value();
+      Stop();
+      return;
+    }
+
+    ProcessEvent(input);
+  }
+}
+
+void StylusButtonEventConverterEvdev::ProcessEvent(const input_event& input) {
+  if (input.type == EV_KEY && input.code == KEY_F19) {
+    bool down = input.value != kKeyReleaseValue;
+    dispatcher_->DispatchKeyEvent(KeyEventParams(
+        input_device_.id, ui::EF_IS_STYLUS_BUTTON, input.code, down,
+        true /* suppress_auto_repeat */, TimeTicksFromInputEvent(input)));
+  }
+}
+
+}  // namespace ui
diff --git a/ui/events/ozone/evdev/stylus_button_event_converter_evdev.h b/ui/events/ozone/evdev/stylus_button_event_converter_evdev.h
new file mode 100644
index 0000000..a5e6698
--- /dev/null
+++ b/ui/events/ozone/evdev/stylus_button_event_converter_evdev.h
@@ -0,0 +1,49 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_EVENTS_OZONE_EVDEV_STYLUS_BUTTON_EVENT_CONVERTER_EVDEV_H_
+#define UI_EVENTS_OZONE_EVDEV_STYLUS_BUTTON_EVENT_CONVERTER_EVDEV_H_
+
+#include "base/component_export.h"
+#include "base/files/file_path.h"
+#include "base/files/scoped_file.h"
+#include "base/macros.h"
+#include "ui/events/ozone/evdev/event_converter_evdev.h"
+#include "ui/events/ozone/evdev/event_device_info.h"
+
+namespace ui {
+
+class DeviceEventDispatcherEvdev;
+
+class COMPONENT_EXPORT(EVDEV) StylusButtonEventConverterEvdev
+    : public EventConverterEvdev {
+ public:
+  StylusButtonEventConverterEvdev(base::ScopedFD fd,
+                                  base::FilePath path,
+                                  int id,
+                                  const EventDeviceInfo& devinfo,
+                                  DeviceEventDispatcherEvdev* dispatcher);
+
+  ~StylusButtonEventConverterEvdev() override;
+
+  // EventConverterEvdev
+  void OnFileCanReadWithoutBlocking(int fd) override;
+
+  void ProcessEvent(const struct input_event& input);
+
+ private:
+  friend class MockStylusButtonEventConverterEvdev;
+
+  // Input device file descriptor.
+  const base::ScopedFD input_device_fd_;
+
+  // Callbacks for dispatching events.
+  DeviceEventDispatcherEvdev* const dispatcher_;
+
+  DISALLOW_COPY_AND_ASSIGN(StylusButtonEventConverterEvdev);
+};
+
+}  // namespace ui
+
+#endif  // UI_EVENTS_OZONE_EVDEV_STYLUS_BUTTON_EVENT_CONVERTER_EVDEV_H_
diff --git a/ui/events/ozone/evdev/stylus_button_event_converter_evdev_unittest.cc b/ui/events/ozone/evdev/stylus_button_event_converter_evdev_unittest.cc
new file mode 100644
index 0000000..50e2684
--- /dev/null
+++ b/ui/events/ozone/evdev/stylus_button_event_converter_evdev_unittest.cc
@@ -0,0 +1,243 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/events/ozone/evdev/stylus_button_event_converter_evdev.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <linux/input.h>
+#include <unistd.h>
+
+#include <memory>
+#include <utility>
+#include <vector>
+
+#include "base/bind.h"
+#include "base/files/file_util.h"
+#include "base/files/scoped_file.h"
+#include "base/memory/ptr_util.h"
+#include "base/posix/eintr_wrapper.h"
+#include "base/run_loop.h"
+#include "base/stl_util.h"
+#include "base/time/time.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/events/event.h"
+#include "ui/events/ozone/device/device_manager.h"
+#include "ui/events/ozone/evdev/event_converter_test_util.h"
+#include "ui/events/ozone/evdev/event_device_test_util.h"
+#include "ui/events/ozone/evdev/event_factory_evdev.h"
+#include "ui/events/ozone/layout/stub/stub_keyboard_layout_engine.h"
+#include "ui/events/platform/platform_event_dispatcher.h"
+#include "ui/events/platform/platform_event_source.h"
+#include "ui/events/test/scoped_event_test_tick_clock.h"
+
+namespace {
+
+const char kTestDevicePath[] = "/dev/input/test-device";
+
+}  // namespace
+
+namespace ui {
+
+class MockStylusButtonEventConverterEvdev
+    : public StylusButtonEventConverterEvdev {
+ public:
+  MockStylusButtonEventConverterEvdev(base::ScopedFD fd,
+                                      base::FilePath path,
+                                      const EventDeviceInfo& devinfo,
+                                      DeviceEventDispatcherEvdev* dispatcher);
+  ~MockStylusButtonEventConverterEvdev() override {}
+
+  void ConfigureReadMock(struct input_event* queue,
+                         long read_this_many,
+                         long queue_index);
+
+  // Actually dispatch the event reader code.
+  void ReadNow() {
+    OnFileCanReadWithoutBlocking(read_pipe_);
+    base::RunLoop().RunUntilIdle();
+  }
+
+ private:
+  int read_pipe_;
+  int write_pipe_;
+
+  std::vector<std::unique_ptr<Event>> dispatched_events_;
+
+  DISALLOW_COPY_AND_ASSIGN(MockStylusButtonEventConverterEvdev);
+};
+
+MockStylusButtonEventConverterEvdev::MockStylusButtonEventConverterEvdev(
+    base::ScopedFD fd,
+    base::FilePath path,
+    const EventDeviceInfo& devinfo,
+    DeviceEventDispatcherEvdev* dispatcher)
+    : StylusButtonEventConverterEvdev(std::move(fd),
+                                      path,
+                                      1,
+                                      devinfo,
+                                      dispatcher) {
+  int fds[2];
+
+  if (pipe(fds))
+    PLOG(FATAL) << "failed pipe";
+
+  EXPECT_TRUE(base::SetNonBlocking(fds[0]) || base::SetNonBlocking(fds[1]))
+      << "failed to set non-blocking: " << strerror(errno);
+
+  read_pipe_ = fds[0];
+  write_pipe_ = fds[1];
+}
+
+void MockStylusButtonEventConverterEvdev::ConfigureReadMock(
+    struct input_event* queue,
+    long read_this_many,
+    long queue_index) {
+  int nwrite = HANDLE_EINTR(write(write_pipe_, queue + queue_index,
+                                  sizeof(struct input_event) * read_this_many));
+  DCHECK(nwrite ==
+         static_cast<int>(sizeof(struct input_event) * read_this_many))
+      << "write() failed, errno: " << errno;
+}
+
+}  // namespace ui
+
+// Test fixture.
+class StylusButtonEventConverterEvdevTest : public testing::Test {
+ public:
+  StylusButtonEventConverterEvdevTest() {}
+
+  // Overridden from testing::Test:
+  void SetUp() override {
+    device_manager_ = ui::CreateDeviceManagerForTest();
+    keyboard_layout_engine_ = std::make_unique<ui::StubKeyboardLayoutEngine>();
+    event_factory_ = ui::CreateEventFactoryEvdevForTest(
+        nullptr, device_manager_.get(), keyboard_layout_engine_.get(),
+        base::BindRepeating(
+            &StylusButtonEventConverterEvdevTest::DispatchEventForTest,
+            base::Unretained(this)));
+    dispatcher_ =
+        ui::CreateDeviceEventDispatcherEvdevForTest(event_factory_.get());
+  }
+
+  ui::MockStylusButtonEventConverterEvdev* CreateDevice(
+      const ui::DeviceCapabilities& caps) {
+    int evdev_io[2];
+    if (pipe(evdev_io))
+      PLOG(FATAL) << "failed pipe";
+    base::ScopedFD events_in(evdev_io[0]);
+    events_out_.reset(evdev_io[1]);
+
+    ui::EventDeviceInfo devinfo;
+    CapabilitiesToDeviceInfo(caps, &devinfo);
+    return new ui::MockStylusButtonEventConverterEvdev(
+        std::move(events_in), base::FilePath(kTestDevicePath), devinfo,
+        dispatcher_.get());
+  }
+
+  unsigned size() { return dispatched_events_.size(); }
+  ui::KeyEvent* dispatched_event(unsigned index) {
+    DCHECK_GT(dispatched_events_.size(), index);
+    ui::Event* ev = dispatched_events_[index].get();
+    DCHECK(ev->IsKeyEvent());
+    return ev->AsKeyEvent();
+  }
+
+  void DispatchEventForTest(ui::Event* event) {
+    std::unique_ptr<ui::Event> cloned_event = ui::Event::Clone(*event);
+    dispatched_events_.push_back(std::move(cloned_event));
+  }
+
+ private:
+  std::unique_ptr<ui::DeviceManager> device_manager_;
+  std::unique_ptr<ui::KeyboardLayoutEngine> keyboard_layout_engine_;
+  std::unique_ptr<ui::EventFactoryEvdev> event_factory_;
+  std::unique_ptr<ui::DeviceEventDispatcherEvdev> dispatcher_;
+
+  std::vector<std::unique_ptr<ui::Event>> dispatched_events_;
+
+  base::ScopedFD events_out_;
+
+  DISALLOW_COPY_AND_ASSIGN(StylusButtonEventConverterEvdevTest);
+};
+
+TEST_F(StylusButtonEventConverterEvdevTest, DellActivePenSingleClick) {
+  std::unique_ptr<ui::MockStylusButtonEventConverterEvdev> dev =
+      base::WrapUnique(CreateDevice(ui::kDellActivePenButton));
+
+  struct input_event mock_kernel_queue[] = {
+      {{0, 0}, EV_MSC, MSC_SCAN, 0x700e3},
+      {{0, 0}, EV_KEY, KEY_LEFTMETA, 1},
+      {{0, 0}, EV_MSC, MSC_SCAN, 0x7006f},
+      {{0, 0}, EV_KEY, KEY_F20, 1},
+      {{0, 0}, EV_SYN, SYN_REPORT, 0},
+      {{0, 0}, EV_MSC, MSC_SCAN, 0x7006f},
+      {{0, 0}, EV_KEY, KEY_F20, 0},
+      {{0, 0}, EV_SYN, SYN_REPORT, 0},
+      {{0, 0}, EV_MSC, MSC_SCAN, 0x700e3},
+      {{0, 0}, EV_KEY, KEY_LEFTMETA, 0},
+      {{0, 0}, EV_SYN, SYN_REPORT, 0},
+  };
+
+  for (unsigned i = 0; i < base::size(mock_kernel_queue); ++i) {
+    dev->ProcessEvent(mock_kernel_queue[i]);
+  }
+  EXPECT_EQ(0u, size());
+}
+
+TEST_F(StylusButtonEventConverterEvdevTest, DellActivePenDoubleClick) {
+  std::unique_ptr<ui::MockStylusButtonEventConverterEvdev> dev =
+      base::WrapUnique(CreateDevice(ui::kDellActivePenButton));
+
+  struct input_event mock_kernel_queue[] = {
+      {{0, 0}, EV_MSC, MSC_SCAN, 0x700e3},
+      {{0, 0}, EV_KEY, KEY_LEFTMETA, 1},
+      {{0, 0}, EV_MSC, MSC_SCAN, 0x7006e},
+      {{0, 0}, EV_KEY, KEY_F19, 1},
+      {{0, 0}, EV_SYN, SYN_REPORT, 0},
+      {{0, 0}, EV_MSC, MSC_SCAN, 0x7006e},
+      {{0, 0}, EV_KEY, KEY_F19, 0},
+      {{0, 0}, EV_SYN, SYN_REPORT, 0},
+      {{0, 0}, EV_MSC, MSC_SCAN, 0x700e3},
+      {{0, 0}, EV_KEY, KEY_LEFTMETA, 0},
+      {{0, 0}, EV_SYN, SYN_REPORT, 0},
+  };
+
+  for (unsigned i = 0; i < base::size(mock_kernel_queue); ++i) {
+    dev->ProcessEvent(mock_kernel_queue[i]);
+  }
+  EXPECT_EQ(2u, size());
+
+  ui::KeyEvent* event = dispatched_event(0);
+  EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
+  EXPECT_TRUE(event->flags() & ui::EF_IS_STYLUS_BUTTON);
+
+  event = dispatched_event(1);
+  EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
+  EXPECT_TRUE(event->flags() & ui::EF_IS_STYLUS_BUTTON);
+}
+
+TEST_F(StylusButtonEventConverterEvdevTest, DellActivePenLongPress) {
+  std::unique_ptr<ui::MockStylusButtonEventConverterEvdev> dev =
+      base::WrapUnique(CreateDevice(ui::kDellActivePenButton));
+
+  struct input_event mock_kernel_queue[] = {
+      {{0, 0}, EV_MSC, MSC_SCAN, 0x700e3},
+      {{0, 0}, EV_KEY, KEY_LEFTMETA, 1},
+      {{0, 0}, EV_MSC, MSC_SCAN, 0x7006d},
+      {{0, 0}, EV_KEY, KEY_F18, 1},
+      {{0, 0}, EV_SYN, SYN_REPORT, 0},
+      {{0, 0}, EV_MSC, MSC_SCAN, 0x7006d},
+      {{0, 0}, EV_KEY, KEY_F18, 0},
+      {{0, 0}, EV_SYN, SYN_REPORT, 0},
+      {{0, 0}, EV_MSC, MSC_SCAN, 0x700e3},
+      {{0, 0}, EV_KEY, KEY_LEFTMETA, 0},
+      {{0, 0}, EV_SYN, SYN_REPORT, 0},
+  };
+
+  for (unsigned i = 0; i < base::size(mock_kernel_queue); ++i) {
+    dev->ProcessEvent(mock_kernel_queue[i]);
+  }
+  EXPECT_EQ(0u, size());
+}
diff --git a/ui/events/ozone/keyboard/event_auto_repeat_handler.cc b/ui/events/ozone/keyboard/event_auto_repeat_handler.cc
index 4f88691..9304b80a 100644
--- a/ui/events/ozone/keyboard/event_auto_repeat_handler.cc
+++ b/ui/events/ozone/keyboard/event_auto_repeat_handler.cc
@@ -7,6 +7,7 @@
 #include "base/bind.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "ui/events/base_event_utils.h"
+#include "ui/events/event_constants.h"
 
 namespace ui {
 
@@ -95,7 +96,7 @@
     return;
 
   delegate_->DispatchKey(repeat_key_, true /* down */, true /* repeat */,
-                         EventTimeForNow(), repeat_device_id_);
+                         EventTimeForNow(), repeat_device_id_, ui::EF_NONE);
 
   ScheduleKeyRepeat(repeat_interval_);
 }
diff --git a/ui/events/ozone/keyboard/event_auto_repeat_handler.h b/ui/events/ozone/keyboard/event_auto_repeat_handler.h
index 0d3953b..eb10aa2 100644
--- a/ui/events/ozone/keyboard/event_auto_repeat_handler.h
+++ b/ui/events/ozone/keyboard/event_auto_repeat_handler.h
@@ -24,7 +24,8 @@
                              bool down,
                              bool repeat,
                              base::TimeTicks timestamp,
-                             int device_id) = 0;
+                             int device_id,
+                             int flags) = 0;
   };
 
   explicit EventAutoRepeatHandler(Delegate* delegate);
diff --git a/ui/file_manager/file_manager/foreground/css/file_manager.css b/ui/file_manager/file_manager/foreground/css/file_manager.css
index 55ca1e5..66dff60 100644
--- a/ui/file_manager/file_manager/foreground/css/file_manager.css
+++ b/ui/file_manager/file_manager/foreground/css/file_manager.css
@@ -184,16 +184,6 @@
   border-radius: 20px 0 0 20px;
 }
 
-html[class*='col-resize'] #directory-tree[files-ng]
-    .tree-item .tree-item .tree-row > .file-row {
-  transition: all 500ms;
-}
-
-#directory-tree[files-ng][clipped]
-    .tree-item .tree-item .tree-row > .file-row {
-  padding-inline-start: 0 !important;
-}
-
 #directory-tree .tree-row > .expand-icon {
   flex: none;
   height: 36px;
diff --git a/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js b/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js
index fb91477..2c6b3ed 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js
@@ -1178,6 +1178,10 @@
         util.iconSetToCSSBackgroundImageValue(volumeInfo.iconSet);
     if (backgroundImage !== 'none') {
       icon.setAttribute('style', 'background-image: ' + backgroundImage);
+    } else if (directorytree.FILES_NG_ENABLED) {
+      if (VolumeManagerCommon.shouldProvideIcons(volumeInfo.volumeType)) {
+        icon.setAttribute('use-generic-provided-icon', '');
+      }
     }
 
     icon.setAttribute('volume-type-icon', volumeInfo.volumeType);
@@ -2368,20 +2372,9 @@
    * the splitter or from the DOM window.
    */
   relayout() {
-    this.setTreeClippedAttribute_();
     cr.dispatchSimpleEvent(this, 'relayout', true);
   }
 
-  /**
-   * Sets the tree 'clipped' attribute. TODO(crbug.com/992819): the breakpoint
-   * in the design is unspecified. Punt: use 135px for now.
-   * @private
-   */
-  setTreeClippedAttribute_() {
-    const width = parseFloat(window.getComputedStyle(this).width);
-    this.toggleAttribute('clipped', width < 135);
-  }
-
   // DirectoryTree is always expanded.
   /** @return {boolean} */
   get expanded() {
diff --git a/ui/file_manager/file_manager/main.html b/ui/file_manager/file_manager/main.html
index 5ce98b3..7ce34ea 100644
--- a/ui/file_manager/file_manager/main.html
+++ b/ui/file_manager/file_manager/main.html
@@ -30,7 +30,7 @@
     <script src="foreground/js/main_scripts.js" defer></script>
   </head>
 
-  <body aria-label="$i18n{FILEMANAGER_APP_NAME}" tabindex="-1">
+  <body aria-label="$i18n{FILEMANAGER_APP_NAME}" tabindex="-1" class="files-ng">
     <custom-style>
       <style>
         .dialog-footer cr-input {
@@ -337,7 +337,7 @@
       </cr-menu>
     </menus>
 
-    <div class="dialog-header" role="contentinfo">
+    <div class="dialog-header files-ng" role="contentinfo">
       <div id="location-breadcrumbs" class="breadcrumbs"></div>
       <div id="read-only-indicator" hidden>
         <span id="read-only-icon"></span>
@@ -475,7 +475,7 @@
     <div class="dialog-container">
       <div class="dialog-navigation-list">
         <div class="dialog-navigation-list-contents" role="navigation">
-          <tree id="directory-tree" role="tree" tabindex="21"></tree>
+          <tree id="directory-tree" role="tree" tabindex="21" files-ng></tree>
         </div>
         <div class="dialog-navigation-list-footer" hidden>
           <div id="progress-center" hidden>
diff --git a/ui/file_manager/integration_tests/file_manager/directory_tree.js b/ui/file_manager/integration_tests/file_manager/directory_tree.js
index 2e14b31..9411c85 100644
--- a/ui/file_manager/integration_tests/file_manager/directory_tree.js
+++ b/ui/file_manager/integration_tests/file_manager/directory_tree.js
@@ -323,94 +323,6 @@
   };
 
   /**
-   * Tests that the directory tree element has a clipped attribute when the
-   * tree is narrowed in width due to a window.resize event.
-   */
-  testcase.directoryTreeClippedWindowResize = async () => {
-    // Open FilesApp on Downloads.
-    const appId = await setupAndWaitUntilReady(RootPath.DOWNLOADS);
-
-    // Verify the directory tree is not initially clipped.
-    await remoteCall.waitForElement(appId, '#directory-tree:not([clipped])');
-
-    // Change the directory tree to a narrow width and fire window.resize.
-    const navigationList = '.dialog-navigation-list';
-    await remoteCall.callRemoteTestUtil(
-        'setElementStyles', appId, [navigationList, {width: '100px'}]);
-    await remoteCall.callRemoteTestUtil('fakeResizeEvent', appId, []);
-
-    // Check: the directory tree should report that it is clipped.
-    await remoteCall.waitForElement(appId, '#directory-tree[clipped]');
-
-    // Change the directory tree to a wider width and fire window.resize.
-    await remoteCall.callRemoteTestUtil(
-        'setElementStyles', appId, [navigationList, {width: '300px'}]);
-    await remoteCall.callRemoteTestUtil('fakeResizeEvent', appId, []);
-
-    // Check: the directory tree should report that it is not clipped.
-    await remoteCall.waitForElementLost(appId, '#directory-tree[clipped]');
-  };
-
-  /**
-   * Tests that the directory tree element has a clipped attribute when the
-   * tree is narrowed in width due to the splitter.
-   */
-  testcase.directoryTreeClippedSplitterResize = async () => {
-    const splitter = '#navigation-list-splitter';
-
-    /**
-     * Creates a left button mouse event |name| targeted at the splitter,
-     * located at position (x,y) relative to the splitter bounds.
-     * @param {string} name The mouse event name.
-     * @param {number} x The event.clientX location.
-     * @param {number} y The event.clientY location.
-     * @return {!Array<*>} remoteCall fakeEvent arguments array.
-     */
-    function createSplitterMouseEvent(name, x, y) {
-      const fakeEventArguments = [splitter, name];
-
-      fakeEventArguments.push({
-        // Event properties of the fakeEvent.
-        'bubbles': true,
-        'composed': true,
-        'button': 0,  // Main button: left usually.
-        'clientX': x,
-        'clientY': y,
-      });
-
-      return fakeEventArguments;
-    }
-
-    // Open FilesApp on Downloads.
-    const appId = await setupAndWaitUntilReady(RootPath.DOWNLOADS);
-
-    // Verify the directory tree is not initially clipped.
-    await remoteCall.waitForElement(appId, '#directory-tree:not([clipped])');
-
-    // Send a mouse down to the splitter element.
-    await remoteCall.waitForElement(appId, splitter);
-    const mouseDown = createSplitterMouseEvent('mousedown', 0, 0);
-    chrome.test.assertTrue(
-        await remoteCall.callRemoteTestUtil('fakeEvent', appId, mouseDown));
-
-    // Mouse is down: move it to the left.
-    const moveLeft = createSplitterMouseEvent('mousemove', -200, 0);
-    chrome.test.assertTrue(
-        await remoteCall.callRemoteTestUtil('fakeEvent', appId, moveLeft));
-
-    // Check: the directory tree should report that it is clipped.
-    await remoteCall.waitForElement(appId, '#directory-tree[clipped]');
-
-    // Mouse is down: move it to the right.
-    const moveRight = createSplitterMouseEvent('mousemove', 200, 0);
-    chrome.test.assertTrue(
-        await remoteCall.callRemoteTestUtil('fakeEvent', appId, moveRight));
-
-    // Check: the directory tree should report that it is not clipped.
-    await remoteCall.waitForElementLost(appId, '#directory-tree[clipped]');
-  };
-
-  /**
    * Adds folders with the name prefix /path/to/sub-folders, it appends "-$X"
    * suffix for each folder.
    *
diff --git a/ui/gfx/BUILD.gn b/ui/gfx/BUILD.gn
index 8518d98..cc6d666c 100644
--- a/ui/gfx/BUILD.gn
+++ b/ui/gfx/BUILD.gn
@@ -127,7 +127,6 @@
     "shadow_value.h",
     "skbitmap_operations.cc",
     "skbitmap_operations.h",
-    "surface_origin.h",
     "sys_color_change_listener.cc",
     "sys_color_change_listener.h",
     "text_constants.h",
@@ -546,6 +545,7 @@
     "gpu_fence_handle.h",
     "native_pixmap.h",
     "overlay_transform.h",
+    "surface_origin.h",
   ]
 
   if (!is_ios) {
diff --git a/ui/gl/direct_composition_child_surface_win.cc b/ui/gl/direct_composition_child_surface_win.cc
index 5c0a9680..4375450bf 100644
--- a/ui/gl/direct_composition_child_surface_win.cc
+++ b/ui/gl/direct_composition_child_surface_win.cc
@@ -217,7 +217,9 @@
       }
       g_current_surface = nullptr;
     }
-    if (draw_texture_) {
+    // We're in the middle of |dcomp_surface_| draw only if |draw_texture_| is
+    // not null.
+    if (dcomp_surface_ && draw_texture_) {
       HRESULT hr = dcomp_surface_->ResumeDraw();
       if (FAILED(hr)) {
         DLOG(ERROR) << "ResumeDraw failed with error " << std::hex << hr;
diff --git a/ui/ozone/platform/wayland/host/wayland_keyboard.cc b/ui/ozone/platform/wayland/host/wayland_keyboard.cc
index fbadb0e..7da3270 100644
--- a/ui/ozone/platform/wayland/host/wayland_keyboard.cc
+++ b/ui/ozone/platform/wayland/host/wayland_keyboard.cc
@@ -125,7 +125,7 @@
 
   // TODO(tonikitoo,msisov): Handler 'repeat' parameter below.
   keyboard->DispatchKey(key, down, false /*repeat*/, EventTimeForNow(),
-                        device_id);
+                        device_id, EF_NONE);
 }
 
 void WaylandKeyboard::Modifiers(void* data,
@@ -174,7 +174,8 @@
                                   bool down,
                                   bool repeat,
                                   base::TimeTicks timestamp,
-                                  int device_id) {
+                                  int device_id,
+                                  int flags) {
   DomCode dom_code =
       KeycodeConverter::NativeKeycodeToDomCode(EvdevCodeToNativeCode(key));
   if (dom_code == ui::DomCode::NONE)
diff --git a/ui/ozone/platform/wayland/host/wayland_keyboard.h b/ui/ozone/platform/wayland/host/wayland_keyboard.h
index 1e5fd7a..497a955 100644
--- a/ui/ozone/platform/wayland/host/wayland_keyboard.h
+++ b/ui/ozone/platform/wayland/host/wayland_keyboard.h
@@ -77,7 +77,8 @@
                    bool down,
                    bool repeat,
                    base::TimeTicks timestamp,
-                   int device_id) override;
+                   int device_id,
+                   int flags) override;
 
   WaylandConnection* connection_ = nullptr;
   wl::Object<wl_keyboard> obj_;
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/ContentViewRenderView.java b/weblayer/browser/java/org/chromium/weblayer_private/ContentViewRenderView.java
index ca9f78f..cbb1fbcc 100644
--- a/weblayer/browser/java/org/chromium/weblayer_private/ContentViewRenderView.java
+++ b/weblayer/browser/java/org/chromium/weblayer_private/ContentViewRenderView.java
@@ -14,6 +14,7 @@
 import android.view.TextureView;
 import android.view.View;
 import android.view.ViewGroup;
+import android.view.inputmethod.InputMethodManager;
 import android.webkit.ValueCallback;
 import android.widget.FrameLayout;
 
@@ -47,6 +48,10 @@
     public static final int MODE_SURFACE_VIEW = 0;
     public static final int MODE_TEXTURE_VIEW = 1;
 
+    // A child view of this class. Parent of SurfaceView/TextureView.
+    // Needed to support not resizing the surface when soft keyboard is showing.
+    private final SurfaceParent mSurfaceParent;
+
     // This is mode that is requested by client.
     private SurfaceData mRequested;
     // This is the mode that last supplied the Surface to the compositor.
@@ -60,8 +65,14 @@
     private WebContents mWebContents;
 
     private int mBackgroundColor;
-    private int mWidth;
-    private int mHeight;
+
+    // This is the size of the surfaces, so the "physical" size for the compositor.
+    // This is the size of the |mSurfaceParent| view, which is the immediate parent
+    // of the SurfaceView/TextureView. Note this does not always match the size of
+    // this ContentViewRenderView; when the soft keyboard is displayed,
+    // ContentViewRenderView will shrink in height, but |mSurfaceParent| will not.
+    private int mPhysicalWidth;
+    private int mPhysicalHeight;
 
     private int mWebContentsHeightDelta;
 
@@ -516,6 +527,35 @@
         public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {}
     }
 
+    // This is a child of ContentViewRenderView and parent of SurfaceView/TextureView.
+    // This exists to avoid resizing SurfaceView/TextureView when the soft keyboard is displayed.
+    private class SurfaceParent extends FrameLayout {
+        public SurfaceParent(Context context) {
+            super(context);
+        }
+
+        @Override
+        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+            int existingHeight = getMeasuredHeight();
+            // If width is the same and height shrinks, then check if we should
+            // avoid this resize for displaying the soft keyboard.
+            if (getMeasuredWidth() == MeasureSpec.getSize(widthMeasureSpec)
+                    && existingHeight > MeasureSpec.getSize(heightMeasureSpec)
+                    && shouldAvoidSurfaceResizeForSoftKeyboard()) {
+                // Just set the height to the current height.
+                heightMeasureSpec =
+                        MeasureSpec.makeMeasureSpec(existingHeight, MeasureSpec.EXACTLY);
+            }
+            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+        }
+
+        @Override
+        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+            mPhysicalWidth = w;
+            mPhysicalHeight = h;
+        }
+    }
+
     /**
      * Constructs a new ContentViewRenderView.
      * This should be called and the {@link ContentViewRenderView} should be added to the view
@@ -525,6 +565,9 @@
      */
     public ContentViewRenderView(Context context) {
         super(context);
+        mSurfaceParent = new SurfaceParent(context);
+        addView(mSurfaceParent,
+                new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
         setBackgroundColor(Color.WHITE);
     }
 
@@ -556,7 +599,7 @@
         if (mRequested == null) {
             SurfaceEventListenerImpl listener = new SurfaceEventListenerImpl();
             mRequested = new SurfaceData(
-                    mode, this, listener, mBackgroundColor, this::evictCachedSurface);
+                    mode, mSurfaceParent, listener, mBackgroundColor, this::evictCachedSurface);
             listener.setRequestData(mRequested);
         }
         assert mRequested.getMode() == mode;
@@ -574,13 +617,11 @@
 
     private void updateWebContentsSize() {
         if (mWebContents == null) return;
-        mWebContents.setSize(mWidth, mHeight - mWebContentsHeightDelta);
+        mWebContents.setSize(getWidth(), getHeight() - mWebContentsHeightDelta);
     }
 
     @Override
     protected void onSizeChanged(int w, int h, int oldw, int oldh) {
-        mWidth = w;
-        mHeight = h;
         updateWebContentsSize();
     }
 
@@ -653,7 +694,7 @@
         if (webContents != null) {
             updateWebContentsSize();
             ContentViewRenderViewJni.get().onPhysicalBackingSizeChanged(
-                    mNativeContentViewRenderView, webContents, mWidth, mHeight);
+                    mNativeContentViewRenderView, webContents, mPhysicalWidth, mPhysicalHeight);
         }
         ContentViewRenderViewJni.get().setCurrentWebContents(
                 mNativeContentViewRenderView, webContents);
@@ -678,6 +719,19 @@
         return mNativeContentViewRenderView;
     }
 
+    private boolean shouldAvoidSurfaceResizeForSoftKeyboard() {
+        // TextureView is more common with embedding use cases that should lead to resize.
+        boolean usingSurfaceView = mCurrent != null && mCurrent.getMode() == MODE_SURFACE_VIEW;
+        if (!usingSurfaceView) return false;
+
+        boolean isFullWidth = isAttachedToWindow() && getWidth() == getRootView().getWidth();
+        if (!isFullWidth) return false;
+
+        InputMethodManager inputMethodManager =
+                (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
+        return inputMethodManager.isActive();
+    }
+
     @NativeMethods
     interface Natives {
         long init(ContentViewRenderView caller, WindowAndroid rootWindow);